xref: /Universal-ctags/parsers/jprop.c (revision 16a2541c0698bd8ee03c1be8172ef3191f6e695a)
154809f23SMasatake YAMATO /*
254809f23SMasatake YAMATO *
354809f23SMasatake YAMATO *   Copyright (c) 2016, Masatake YAMATO
454809f23SMasatake YAMATO *   Copyright (c) 2016, Red Hat, K.K.
554809f23SMasatake YAMATO *
654809f23SMasatake YAMATO *   This source code is released for free distribution under the terms of the
754809f23SMasatake YAMATO *   GNU General Public License version 2 or (at your option) any later version.
854809f23SMasatake YAMATO *
954809f23SMasatake YAMATO *   This module contains functions for generating tags for java properties
1054809f23SMasatake YAMATO *   https://docs.oracle.com/javase/7/docs/api/java/util/Properties.html
1154809f23SMasatake YAMATO */
1254809f23SMasatake YAMATO 
1354809f23SMasatake YAMATO #include "general.h"	/* must always come first */
1454809f23SMasatake YAMATO #include "parse.h"
1554809f23SMasatake YAMATO #include "read.h"
1654809f23SMasatake YAMATO #include "vstring.h"
1754809f23SMasatake YAMATO 
1854809f23SMasatake YAMATO typedef enum {
1954809f23SMasatake YAMATO 	K_KEY
2054809f23SMasatake YAMATO } javaPropertiesKind;
2154809f23SMasatake YAMATO 
22e112e8abSMasatake YAMATO static kindDefinition JavaPropertiesKinds [] = {
23ce990805SThomas Braun 	{ true, 'k', "key", "keys" },
2454809f23SMasatake YAMATO };
2554809f23SMasatake YAMATO 
skipWhiteSpace(const unsigned char * line)2654809f23SMasatake YAMATO static const unsigned char *skipWhiteSpace (const unsigned char *line)
2754809f23SMasatake YAMATO {
2854809f23SMasatake YAMATO 	while (*line == ' '
2954809f23SMasatake YAMATO 	       || *line == '\t'
3054809f23SMasatake YAMATO 	       || *line == '\f')
3154809f23SMasatake YAMATO 		line++;
3254809f23SMasatake YAMATO 	return line;
3354809f23SMasatake YAMATO }
3454809f23SMasatake YAMATO 
doesValueContinue(const unsigned char * line)35ce990805SThomas Braun static bool doesValueContinue (const unsigned char *line)
3654809f23SMasatake YAMATO {
37ce990805SThomas Braun 	bool in_escaping = false;
3854809f23SMasatake YAMATO 	while (*line != '\0')
3954809f23SMasatake YAMATO 	{
4054809f23SMasatake YAMATO 		if (in_escaping)
41ce990805SThomas Braun 			in_escaping = false;
4254809f23SMasatake YAMATO 		else if (*line == '\\')
43ce990805SThomas Braun 			in_escaping = true;
4454809f23SMasatake YAMATO 		line++;
4554809f23SMasatake YAMATO 	}
4654809f23SMasatake YAMATO 	return in_escaping;
4754809f23SMasatake YAMATO }
4854809f23SMasatake YAMATO 
extractKey(const unsigned char * line,vString * key)4954809f23SMasatake YAMATO static const unsigned char * extractKey (const unsigned char *line, vString *key)
5054809f23SMasatake YAMATO {
51ce990805SThomas Braun 	bool in_escaping = false;
5254809f23SMasatake YAMATO 
5354809f23SMasatake YAMATO 	while (*line != '\0')
5454809f23SMasatake YAMATO 	{
5554809f23SMasatake YAMATO 		if (in_escaping)
5654809f23SMasatake YAMATO 		{
5754809f23SMasatake YAMATO 			vStringPut (key, *line);
58ce990805SThomas Braun 			in_escaping = false;
5954809f23SMasatake YAMATO 		}
6054809f23SMasatake YAMATO 		else if (*line == ':' || *line == '='
6154809f23SMasatake YAMATO 			 || *line == ' ' || *line == '\t' || *line == '\f')
6254809f23SMasatake YAMATO 		{
6354809f23SMasatake YAMATO 			line++;
6454809f23SMasatake YAMATO 			break;
6554809f23SMasatake YAMATO 		}
6654809f23SMasatake YAMATO 		else if (*line == '\\')
6754809f23SMasatake YAMATO 		{
6854809f23SMasatake YAMATO 			vStringPut (key, *line);
69ce990805SThomas Braun 			in_escaping = true;
7054809f23SMasatake YAMATO 		}
7154809f23SMasatake YAMATO 		else
7254809f23SMasatake YAMATO 			vStringPut (key, *line);
7354809f23SMasatake YAMATO 		line++;
7454809f23SMasatake YAMATO 	}
7554809f23SMasatake YAMATO 	return line;
7654809f23SMasatake YAMATO }
7754809f23SMasatake YAMATO 
findJavaPropertiesTags(void)7854809f23SMasatake YAMATO static void findJavaPropertiesTags (void)
7954809f23SMasatake YAMATO {
8054809f23SMasatake YAMATO 	const unsigned char *line;
81ce990805SThomas Braun 	bool in_value = false;
82ce990805SThomas Braun 	bool value_continues;
8354809f23SMasatake YAMATO 	static vString *key;
8454809f23SMasatake YAMATO 
8554809f23SMasatake YAMATO 	if (key == NULL)
8654809f23SMasatake YAMATO 		key = vStringNew ();
8754809f23SMasatake YAMATO 	else
8854809f23SMasatake YAMATO 		vStringClear (key);
8954809f23SMasatake YAMATO 
9054809f23SMasatake YAMATO 	while ((line = readLineFromInputFile ()) != NULL)
9154809f23SMasatake YAMATO 	{
9254809f23SMasatake YAMATO 		if (in_value)
9354809f23SMasatake YAMATO 		{
9454809f23SMasatake YAMATO 			value_continues = doesValueContinue (line);
9554809f23SMasatake YAMATO 			if (!value_continues)
96ce990805SThomas Braun 				in_value = false;
9754809f23SMasatake YAMATO 			continue;
9854809f23SMasatake YAMATO 		}
9954809f23SMasatake YAMATO 
10054809f23SMasatake YAMATO 		line = skipWhiteSpace (line);
10154809f23SMasatake YAMATO 		if (*line == '\0'
10254809f23SMasatake YAMATO 		    || *line == '!' || *line == '#')
10354809f23SMasatake YAMATO 			continue;
10454809f23SMasatake YAMATO 
10554809f23SMasatake YAMATO 		line = extractKey (line, key);
106*16a2541cSMasatake YAMATO 		makeSimpleTag (key, K_KEY);
10754809f23SMasatake YAMATO 		vStringClear (key);
10854809f23SMasatake YAMATO 
10954809f23SMasatake YAMATO 		value_continues = doesValueContinue (line);
11054809f23SMasatake YAMATO 		if (value_continues)
111ce990805SThomas Braun 			in_value = true;
11254809f23SMasatake YAMATO 	}
11354809f23SMasatake YAMATO }
11454809f23SMasatake YAMATO 
11554809f23SMasatake YAMATO extern parserDefinition*
JavaPropertiesParser(void)11654809f23SMasatake YAMATO JavaPropertiesParser (void)
11754809f23SMasatake YAMATO {
11854809f23SMasatake YAMATO 	static const char *const extensions [] = { "properties", NULL };
11954809f23SMasatake YAMATO 	parserDefinition* const def = parserNew ("JavaProperties");
12054809f23SMasatake YAMATO 
12109ae690fSMasatake YAMATO 	def->kindTable = JavaPropertiesKinds;
12254809f23SMasatake YAMATO 	def->kindCount = ARRAY_SIZE (JavaPropertiesKinds);
12354809f23SMasatake YAMATO 	def->extensions = extensions;
12454809f23SMasatake YAMATO 	def->parser = findJavaPropertiesTags;
12554809f23SMasatake YAMATO 	return def;
12654809f23SMasatake YAMATO }
127