1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
/*
*
* Copyright (c) 2016, Masatake YAMATO
* Copyright (c) 2016, Red Hat, K.K.
*
* This source code is released for free distribution under the terms of the
* GNU General Public License version 2 or (at your option) any later version.
*
* This module contains functions for generating tags for java properties
* https://docs.oracle.com/javase/7/docs/api/java/util/Properties.html
*/
#include "general.h" /* must always come first */
#include "parse.h"
#include "read.h"
#include "vstring.h"
typedef enum {
K_KEY
} javaPropertiesKind;
static kindDefinition JavaPropertiesKinds [] = {
{ true, 'k', "key", "keys" },
};
static const unsigned char *skipWhiteSpace (const unsigned char *line)
{
while (*line == ' '
|| *line == '\t'
|| *line == '\f')
line++;
return line;
}
static bool doesValueContinue (const unsigned char *line)
{
bool in_escaping = false;
while (*line != '\0')
{
if (in_escaping)
in_escaping = false;
else if (*line == '\\')
in_escaping = true;
line++;
}
return in_escaping;
}
static const unsigned char * extractKey (const unsigned char *line, vString *key)
{
bool in_escaping = false;
while (*line != '\0')
{
if (in_escaping)
{
vStringPut (key, *line);
in_escaping = false;
}
else if (*line == ':' || *line == '='
|| *line == ' ' || *line == '\t' || *line == '\f')
{
line++;
break;
}
else if (*line == '\\')
{
vStringPut (key, *line);
in_escaping = true;
}
else
vStringPut (key, *line);
line++;
}
return line;
}
static void findJavaPropertiesTags (void)
{
const unsigned char *line;
bool in_value = false;
bool value_continues;
static vString *key;
if (key == NULL)
key = vStringNew ();
else
vStringClear (key);
while ((line = readLineFromInputFile ()) != NULL)
{
if (in_value)
{
value_continues = doesValueContinue (line);
if (!value_continues)
in_value = false;
continue;
}
line = skipWhiteSpace (line);
if (*line == '\0'
|| *line == '!' || *line == '#')
continue;
line = extractKey (line, key);
makeSimpleTag (key, K_KEY);
vStringClear (key);
value_continues = doesValueContinue (line);
if (value_continues)
in_value = true;
}
}
extern parserDefinition*
JavaPropertiesParser (void)
{
static const char *const extensions [] = { "properties", NULL };
parserDefinition* const def = parserNew ("JavaProperties");
def->kindTable = JavaPropertiesKinds;
def->kindCount = ARRAY_SIZE (JavaPropertiesKinds);
def->extensions = extensions;
def->parser = findJavaPropertiesTags;
return def;
}
|