xref: /Universal-ctags/main/flags.c (revision 4b5f2b4154ebc8e2bb8cb3f31b20ef6f70ad8fcb)
1d4c6f1e6SMasatake YAMATO /*
2d4c6f1e6SMasatake YAMATO *
3d4c6f1e6SMasatake YAMATO *   Copyright (c) 2000-2003, Darren Hiebert
4d4c6f1e6SMasatake YAMATO *
5d4c6f1e6SMasatake YAMATO *   This source code is released for free distribution under the terms of the
60ce38835Sviccuad *   GNU General Public License version 2 or (at your option) any later version.
7d4c6f1e6SMasatake YAMATO *
8d4c6f1e6SMasatake YAMATO *   This module contains functions to process command line options.
9d4c6f1e6SMasatake YAMATO */
10d4c6f1e6SMasatake YAMATO 
11d4c6f1e6SMasatake YAMATO /*
12d4c6f1e6SMasatake YAMATO *   INCLUDE FILES
13d4c6f1e6SMasatake YAMATO */
14d4c6f1e6SMasatake YAMATO #include "general.h"  /* must always come first */
15d4c6f1e6SMasatake YAMATO 
16d4c6f1e6SMasatake YAMATO #include <string.h>
17d4c6f1e6SMasatake YAMATO #include <stdio.h>
18d4c6f1e6SMasatake YAMATO 
19db2bf481SMasatake YAMATO #include "ctags.h"
20bf281e9cSMasatake YAMATO #include "flags_p.h"
21d4c6f1e6SMasatake YAMATO #include "vstring.h"
22d4c6f1e6SMasatake YAMATO #include "routines.h"
23d4c6f1e6SMasatake YAMATO 
flagsEval(const char * flags_original,flagDefinition * defs,unsigned int ndefs,void * data)24*4b5f2b41SMasatake YAMATO extern const char *flagsEval (const char* flags_original, flagDefinition* defs, unsigned int ndefs, void* data)
25d4c6f1e6SMasatake YAMATO {
26d4c6f1e6SMasatake YAMATO 	unsigned int i, j;
27c9b9c620SMasatake YAMATO 	char *flags;
28*4b5f2b41SMasatake YAMATO 	const char *optscript = NULL;
29d4c6f1e6SMasatake YAMATO 
30c9b9c620SMasatake YAMATO 	if (!flags_original)
31*4b5f2b41SMasatake YAMATO 		return NULL;
32d4c6f1e6SMasatake YAMATO 
33c9b9c620SMasatake YAMATO 	flags = eStrdup (flags_original);
34d4c6f1e6SMasatake YAMATO 	for (i = 0 ; flags [i] != '\0' ; ++i)
35d4c6f1e6SMasatake YAMATO 	{
36*4b5f2b41SMasatake YAMATO 		if (flags [i] == LONG_FLAGS_OPEN && flags [i + 1] == LONG_FLAGS_OPEN)
37*4b5f2b41SMasatake YAMATO 		{
38*4b5f2b41SMasatake YAMATO 			optscript = flags_original + i;
39*4b5f2b41SMasatake YAMATO 			break;
40*4b5f2b41SMasatake YAMATO 		}
41*4b5f2b41SMasatake YAMATO 		else if (flags [i] == LONG_FLAGS_OPEN)
42d4c6f1e6SMasatake YAMATO 		{
43d4c6f1e6SMasatake YAMATO 			const char* aflag = flags + i + 1;
447a6d336dSMasatake YAMATO 			char* needle_close_paren = strchr(aflag, LONG_FLAGS_CLOSE);
45d4c6f1e6SMasatake YAMATO 			const char* param;
4653a21889SMasatake YAMATO 			char* needle_equal;
47d4c6f1e6SMasatake YAMATO 
48d4c6f1e6SMasatake YAMATO 			if (needle_close_paren == NULL)
49d4c6f1e6SMasatake YAMATO 			{
50dc057f5eSMasatake YAMATO 				error (WARNING, "long flags specifier opened with `%c' is not closed `%c': \"%s\"",
51dc057f5eSMasatake YAMATO 				       LONG_FLAGS_OPEN, LONG_FLAGS_CLOSE, flags_original);
52d4c6f1e6SMasatake YAMATO 				break;
53d4c6f1e6SMasatake YAMATO 			}
54d4c6f1e6SMasatake YAMATO 
55d4c6f1e6SMasatake YAMATO 			*needle_close_paren = '\0';
5653a21889SMasatake YAMATO 			needle_equal = strchr(aflag, '=');
5753a21889SMasatake YAMATO 			if ((needle_equal == NULL || (needle_equal >= needle_close_paren)))
58d4c6f1e6SMasatake YAMATO 			{
5953a21889SMasatake YAMATO 				needle_equal = NULL;
60d4c6f1e6SMasatake YAMATO 				param = NULL;
61d4c6f1e6SMasatake YAMATO 			}
62d4c6f1e6SMasatake YAMATO 			else
63d4c6f1e6SMasatake YAMATO 			{
6453a21889SMasatake YAMATO 				param = needle_equal + 1;
6553a21889SMasatake YAMATO 				*needle_equal = '\0';
66d4c6f1e6SMasatake YAMATO 			}
67d4c6f1e6SMasatake YAMATO 
68d4c6f1e6SMasatake YAMATO 			for ( j = 0 ; j < ndefs ; ++j )
693b5d9090SMasatake YAMATO 				if (defs[j].longStr && (strcmp(aflag, defs[j].longStr) == 0))
703b5d9090SMasatake YAMATO 					defs[j].longProc(aflag, param, data);
71d4c6f1e6SMasatake YAMATO 
7253a21889SMasatake YAMATO 			if (needle_equal)
7353a21889SMasatake YAMATO 				*needle_equal = '=';
747a6d336dSMasatake YAMATO 			*needle_close_paren = LONG_FLAGS_CLOSE;
75d4c6f1e6SMasatake YAMATO 
76d4c6f1e6SMasatake YAMATO 			i = needle_close_paren - flags;
77d4c6f1e6SMasatake YAMATO 		}
78d4c6f1e6SMasatake YAMATO 		else for (j = 0 ; j < ndefs ; ++j)
793b5d9090SMasatake YAMATO 			if (flags[i] == defs[j].shortChar)
803b5d9090SMasatake YAMATO 				defs[j].shortProc(flags[i], data);
81d4c6f1e6SMasatake YAMATO 	}
82c9b9c620SMasatake YAMATO 	eFree (flags);
83*4b5f2b41SMasatake YAMATO 	return optscript;
84d4c6f1e6SMasatake YAMATO }
853fac0fc6SMasatake YAMATO 
flagsColprintTableNew(void)86d4a3a6e8SMasatake YAMATO extern struct colprintTable * flagsColprintTableNew (void)
873fac0fc6SMasatake YAMATO {
88d4a3a6e8SMasatake YAMATO 	return colprintTableNew ("L:LETTER", "L:NAME", "L:DESCRIPTION", NULL);
89d4a3a6e8SMasatake YAMATO }
903fac0fc6SMasatake YAMATO 
flagsColprintAddDefinitions(struct colprintTable * table,flagDefinition * def,unsigned int ndefs)91d4a3a6e8SMasatake YAMATO extern void flagsColprintAddDefinitions (struct colprintTable *table, flagDefinition* def,
92d4a3a6e8SMasatake YAMATO 										 unsigned int ndefs)
93d4a3a6e8SMasatake YAMATO {
94d4a3a6e8SMasatake YAMATO 	vString *longName = vStringNew ();
95d4a3a6e8SMasatake YAMATO 
96d4a3a6e8SMasatake YAMATO 	for (unsigned int i = 0; i < ndefs; i++)
97d4a3a6e8SMasatake YAMATO 	{
98d4a3a6e8SMasatake YAMATO 		struct colprintLine * line;
99d4a3a6e8SMasatake YAMATO 		char shortChar;
1003fac0fc6SMasatake YAMATO 		const char *paramName;
101d4a3a6e8SMasatake YAMATO 		const char *description;
102d4a3a6e8SMasatake YAMATO 
103d4a3a6e8SMasatake YAMATO 
104d4a3a6e8SMasatake YAMATO 		line = colprintTableGetNewLine(table);
105d4a3a6e8SMasatake YAMATO 
106d4a3a6e8SMasatake YAMATO 		shortChar = def[i].shortChar;
107d4a3a6e8SMasatake YAMATO 		if (shortChar == '\0')
108d4a3a6e8SMasatake YAMATO 			shortChar = '-';
109d4a3a6e8SMasatake YAMATO 		colprintLineAppendColumnChar (line, shortChar);
110d4a3a6e8SMasatake YAMATO 
111db2bf481SMasatake YAMATO 		vStringCopyS (longName, def[i].longStr? def[i].longStr: RSV_NONE);
1123fac0fc6SMasatake YAMATO 		paramName = def[i].paramName;
1133fac0fc6SMasatake YAMATO 		if (paramName)
114d4a3a6e8SMasatake YAMATO 		{
115d4a3a6e8SMasatake YAMATO 			vStringPut (longName, '=');
116d4a3a6e8SMasatake YAMATO 			vStringCatS (longName, paramName);
1173fac0fc6SMasatake YAMATO 		}
118d4a3a6e8SMasatake YAMATO 		colprintLineAppendColumnVString (line, longName);
119d4a3a6e8SMasatake YAMATO 		vStringClear(longName);
120d4a3a6e8SMasatake YAMATO 
121d4a3a6e8SMasatake YAMATO 		description = def[i].description? def[i].description: "";
122d4a3a6e8SMasatake YAMATO 		colprintLineAppendColumnCString (line, description);
123d4a3a6e8SMasatake YAMATO 	}
124d4a3a6e8SMasatake YAMATO 
125d4a3a6e8SMasatake YAMATO 	vStringDelete(longName);
126d4a3a6e8SMasatake YAMATO }
127d4a3a6e8SMasatake YAMATO 
flagsColprintCompareLines(struct colprintLine * a,struct colprintLine * b)128d4a3a6e8SMasatake YAMATO static int flagsColprintCompareLines(struct colprintLine *a , struct colprintLine *b)
129d4a3a6e8SMasatake YAMATO {
130d4a3a6e8SMasatake YAMATO 	const char *a_letter = colprintLineGetColumn (a, 0);
131d4a3a6e8SMasatake YAMATO 	const char *b_letter = colprintLineGetColumn (b, 0);
132d4a3a6e8SMasatake YAMATO 
133d4a3a6e8SMasatake YAMATO 	if (a_letter[0] != '-' && b_letter[0] == '-')
134d4a3a6e8SMasatake YAMATO 		return -1;
135d4a3a6e8SMasatake YAMATO 	else if (a_letter[0] == '-' && b_letter[0] != '-')
136d4a3a6e8SMasatake YAMATO 		return 1;
137d4a3a6e8SMasatake YAMATO 	else if (a_letter[0] != '-' && b_letter[0] != '-')
138d4a3a6e8SMasatake YAMATO 		return strcmp(a_letter, b_letter);
139d4a3a6e8SMasatake YAMATO 
140d4a3a6e8SMasatake YAMATO 
141d4a3a6e8SMasatake YAMATO 	const char *a_name = colprintLineGetColumn (a, 1);
142d4a3a6e8SMasatake YAMATO 	const char *b_name = colprintLineGetColumn (b, 1);
143d4a3a6e8SMasatake YAMATO 
144d4a3a6e8SMasatake YAMATO 	if (a_name[0] != '_' && b_name[0] == '_')
145d4a3a6e8SMasatake YAMATO 		return -1;
146d4a3a6e8SMasatake YAMATO 	else if (a_name[0] == '_' && b_name[0] != '_')
147d4a3a6e8SMasatake YAMATO 		return 1;
148d4a3a6e8SMasatake YAMATO 
149d4a3a6e8SMasatake YAMATO 	return strcmp(a_name, b_name);
150d4a3a6e8SMasatake YAMATO }
151d4a3a6e8SMasatake YAMATO 
flagsColprintTablePrint(struct colprintTable * table,bool withListHeader,bool machinable,FILE * fp)152d4a3a6e8SMasatake YAMATO extern void flagsColprintTablePrint (struct colprintTable *table,
153d4a3a6e8SMasatake YAMATO 									 bool withListHeader, bool machinable, FILE *fp)
154d4a3a6e8SMasatake YAMATO {
155d4a3a6e8SMasatake YAMATO 	colprintTableSort (table, flagsColprintCompareLines);
156d4a3a6e8SMasatake YAMATO 	colprintTablePrint (table, 0, withListHeader, machinable, fp);
1573fac0fc6SMasatake YAMATO }
158