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