File: jprop.c

package info (click to toggle)
codelite 17.0.0%2Bdfsg-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 136,384 kB
  • sloc: cpp: 491,550; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 805; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (126 lines) | stat: -rw-r--r-- 2,582 bytes parent folder | download | duplicates (8)
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;
}