1c1f9ae0dSMasatake YAMATO /*
2c1f9ae0dSMasatake YAMATO * Copyright (c) 1996-2003, Darren Hiebert
3c1f9ae0dSMasatake YAMATO *
4c1f9ae0dSMasatake YAMATO * This source code is released into the public domain.
5c1f9ae0dSMasatake YAMATO *
6c1f9ae0dSMasatake YAMATO * This module contains functions for reading tag files.
7c1f9ae0dSMasatake YAMATO */
8c1f9ae0dSMasatake YAMATO
9c1f9ae0dSMasatake YAMATO /*
10c1f9ae0dSMasatake YAMATO * INCLUDE FILES
11c1f9ae0dSMasatake YAMATO */
12c1f9ae0dSMasatake YAMATO
13c1f9ae0dSMasatake YAMATO #include "printtags.h"
14c1f9ae0dSMasatake YAMATO #include <stdio.h>
15c1f9ae0dSMasatake YAMATO
16*edacac16SMasatake YAMATO
17*edacac16SMasatake YAMATO /*
18*edacac16SMasatake YAMATO * DATA DEFINITIONS
19*edacac16SMasatake YAMATO */
20*edacac16SMasatake YAMATO
21*edacac16SMasatake YAMATO static tagPrintProcs printFILEProcs = {
22*edacac16SMasatake YAMATO .printStr = (int (*) (const char *, void *))fputs,
23*edacac16SMasatake YAMATO .printChar = (int (*) (int, void *))fputc,
24*edacac16SMasatake YAMATO };
25*edacac16SMasatake YAMATO
26*edacac16SMasatake YAMATO
27c1f9ae0dSMasatake YAMATO /*
28c1f9ae0dSMasatake YAMATO * FUNCTION DEFINITIONS
29c1f9ae0dSMasatake YAMATO */
30c1f9ae0dSMasatake YAMATO
ultostr(char dst[21],unsigned long d)31c1f9ae0dSMasatake YAMATO static void ultostr (char dst [21], unsigned long d)
32c1f9ae0dSMasatake YAMATO {
33c1f9ae0dSMasatake YAMATO int o [20];
34c1f9ae0dSMasatake YAMATO int i;
35c1f9ae0dSMasatake YAMATO
36c1f9ae0dSMasatake YAMATO if (d == 0)
37c1f9ae0dSMasatake YAMATO {
38c1f9ae0dSMasatake YAMATO dst [0] = '0';
39c1f9ae0dSMasatake YAMATO dst [1] = '\0';
40c1f9ae0dSMasatake YAMATO return;
41c1f9ae0dSMasatake YAMATO }
42c1f9ae0dSMasatake YAMATO
43c1f9ae0dSMasatake YAMATO for (i = 0; d != 0; i++, d = d/10)
44c1f9ae0dSMasatake YAMATO o [i] = d % 10;
45c1f9ae0dSMasatake YAMATO
46c1f9ae0dSMasatake YAMATO for (int j = i - 1; j >= 0; j--)
47c1f9ae0dSMasatake YAMATO dst [i - j - 1] = o[j] + '0';
48c1f9ae0dSMasatake YAMATO dst [i] = '\0';
49c1f9ae0dSMasatake YAMATO }
50c1f9ae0dSMasatake YAMATO
printValue(const char * val,int printingWithEscaping,int (* print_str)(const char *,void *),int (* print_char)(int,void *),void * outfp)51c1f9ae0dSMasatake YAMATO static void printValue (const char *val, int printingWithEscaping,
52c1f9ae0dSMasatake YAMATO int (* print_str) (const char *, void *),
53c1f9ae0dSMasatake YAMATO int (* print_char) (int, void *),
54c1f9ae0dSMasatake YAMATO void *outfp)
55c1f9ae0dSMasatake YAMATO {
56c1f9ae0dSMasatake YAMATO if (printingWithEscaping)
57c1f9ae0dSMasatake YAMATO {
58c1f9ae0dSMasatake YAMATO for(; *val != '\0'; val++)
59c1f9ae0dSMasatake YAMATO {
60c1f9ae0dSMasatake YAMATO switch (*val)
61c1f9ae0dSMasatake YAMATO {
62c1f9ae0dSMasatake YAMATO case '\t': print_str ("\\t", outfp); break;
63c1f9ae0dSMasatake YAMATO case '\r': print_str ("\\r", outfp); break;
64c1f9ae0dSMasatake YAMATO case '\n': print_str ("\\n", outfp); break;
65c1f9ae0dSMasatake YAMATO case '\\': print_str ("\\\\", outfp); break;
66c1f9ae0dSMasatake YAMATO /* Universal-CTags extensions */
67c1f9ae0dSMasatake YAMATO case '\a': print_str ("\\a", outfp); break;
68c1f9ae0dSMasatake YAMATO case '\b': print_str ("\\b", outfp); break;
69c1f9ae0dSMasatake YAMATO case '\v': print_str ("\\v", outfp); break;
70c1f9ae0dSMasatake YAMATO case '\f': print_str ("\\f", outfp); break;
71c1f9ae0dSMasatake YAMATO default:
72c1f9ae0dSMasatake YAMATO if ((0x01 <= *val && *val <= 0x1F) || *val == 0x7F)
73c1f9ae0dSMasatake YAMATO {
74c1f9ae0dSMasatake YAMATO char c[5] = {
75c1f9ae0dSMasatake YAMATO [0] = '\\',
76c1f9ae0dSMasatake YAMATO [1] = 'x',
77c1f9ae0dSMasatake YAMATO };
78c1f9ae0dSMasatake YAMATO c [2] = (*val / 16) % 16;
79c1f9ae0dSMasatake YAMATO #if 0
80c1f9ae0dSMasatake YAMATO if (c [2] == 0)
81c1f9ae0dSMasatake YAMATO {
82c1f9ae0dSMasatake YAMATO c [2] = *val % 16;
83c1f9ae0dSMasatake YAMATO c [2] += ( c [2] < 10 )? '0': 'A' - 9;
84c1f9ae0dSMasatake YAMATO c [3] = '\0';
85c1f9ae0dSMasatake YAMATO }
86c1f9ae0dSMasatake YAMATO else
87c1f9ae0dSMasatake YAMATO #endif
88c1f9ae0dSMasatake YAMATO {
89c1f9ae0dSMasatake YAMATO c [2] += ( c [2] < 10 )? '0': 'A' - 9;
90c1f9ae0dSMasatake YAMATO c [3] = *val % 16;
91c1f9ae0dSMasatake YAMATO c [3] += ( c [3] < 10 )? '0': 'A' - 9;
92c1f9ae0dSMasatake YAMATO c [4] = '\0';
93c1f9ae0dSMasatake YAMATO }
94c1f9ae0dSMasatake YAMATO print_str (c, outfp);
95c1f9ae0dSMasatake YAMATO }
96c1f9ae0dSMasatake YAMATO else
97c1f9ae0dSMasatake YAMATO print_char (*val, outfp);
98c1f9ae0dSMasatake YAMATO }
99c1f9ae0dSMasatake YAMATO }
100c1f9ae0dSMasatake YAMATO }
101c1f9ae0dSMasatake YAMATO else
102c1f9ae0dSMasatake YAMATO print_str (val, outfp);
103c1f9ae0dSMasatake YAMATO }
104c1f9ae0dSMasatake YAMATO
tagsPrintTag(const tagEntry * entry,int printingExtensionFields,int printingLineNumber,int printingWithEscaping,int pseudoTag,int (* print_str)(const char *,void *),int (* print_char)(int,void *),void * outfp)105c1f9ae0dSMasatake YAMATO static void tagsPrintTag (const tagEntry *entry,
106c1f9ae0dSMasatake YAMATO int printingExtensionFields,
107c1f9ae0dSMasatake YAMATO int printingLineNumber,
108c1f9ae0dSMasatake YAMATO int printingWithEscaping,
109c1f9ae0dSMasatake YAMATO int pseudoTag,
110c1f9ae0dSMasatake YAMATO int (* print_str) (const char *, void *),
111c1f9ae0dSMasatake YAMATO int (* print_char) (int, void *),
112c1f9ae0dSMasatake YAMATO void *outfp)
113c1f9ae0dSMasatake YAMATO {
114c1f9ae0dSMasatake YAMATO int i;
115c1f9ae0dSMasatake YAMATO int first = 1;
116c1f9ae0dSMasatake YAMATO const char* separator = ";\"";
117c1f9ae0dSMasatake YAMATO const char* const empty = "";
118c1f9ae0dSMasatake YAMATO /* "sep" returns a value only the first time it is evaluated */
119c1f9ae0dSMasatake YAMATO #define sep (first ? (first = 0, separator) : empty)
120c1f9ae0dSMasatake YAMATO
121c1f9ae0dSMasatake YAMATO if (entry->name == NULL
122c1f9ae0dSMasatake YAMATO || entry->file == NULL
123c1f9ae0dSMasatake YAMATO || entry->address.pattern == NULL)
124c1f9ae0dSMasatake YAMATO return;
125c1f9ae0dSMasatake YAMATO if (pseudoTag)
126c1f9ae0dSMasatake YAMATO print_str (entry->name, outfp);
127c1f9ae0dSMasatake YAMATO else if (*entry->name == '!' && printingWithEscaping)
128c1f9ae0dSMasatake YAMATO {
129c1f9ae0dSMasatake YAMATO print_str ("\\x21", outfp);
130c1f9ae0dSMasatake YAMATO printValue (entry->name + 1, printingWithEscaping,
131c1f9ae0dSMasatake YAMATO print_str, print_char, outfp);
132c1f9ae0dSMasatake YAMATO }
133c1f9ae0dSMasatake YAMATO else if (*entry->name == ' ' && printingWithEscaping)
134c1f9ae0dSMasatake YAMATO {
135c1f9ae0dSMasatake YAMATO print_str ("\\x20", outfp);
136c1f9ae0dSMasatake YAMATO printValue (entry->name + 1, printingWithEscaping,
137c1f9ae0dSMasatake YAMATO print_str, print_char, outfp);
138c1f9ae0dSMasatake YAMATO }
139c1f9ae0dSMasatake YAMATO else
140c1f9ae0dSMasatake YAMATO printValue (entry->name, printingWithEscaping,
141c1f9ae0dSMasatake YAMATO print_str, print_char, outfp);
142c1f9ae0dSMasatake YAMATO
143c1f9ae0dSMasatake YAMATO print_char ('\t', outfp);
144c1f9ae0dSMasatake YAMATO printValue (entry->file, printingWithEscaping,
145c1f9ae0dSMasatake YAMATO print_str, print_char, outfp);
146c1f9ae0dSMasatake YAMATO print_char ('\t', outfp);
147c1f9ae0dSMasatake YAMATO print_str (entry->address.pattern, outfp);
148c1f9ae0dSMasatake YAMATO
149c1f9ae0dSMasatake YAMATO if (printingExtensionFields)
150c1f9ae0dSMasatake YAMATO {
151c1f9ae0dSMasatake YAMATO if (entry->kind != NULL && entry->kind [0] != '\0')
152c1f9ae0dSMasatake YAMATO {
153c1f9ae0dSMasatake YAMATO print_str (sep, outfp);
154c1f9ae0dSMasatake YAMATO print_str ("\tkind:", outfp);
155c1f9ae0dSMasatake YAMATO printValue (entry->kind, printingWithEscaping,
156c1f9ae0dSMasatake YAMATO print_str, print_char, outfp);
157c1f9ae0dSMasatake YAMATO first = 0;
158c1f9ae0dSMasatake YAMATO }
159c1f9ae0dSMasatake YAMATO if (entry->fileScope)
160c1f9ae0dSMasatake YAMATO {
161c1f9ae0dSMasatake YAMATO print_str (sep, outfp);
162c1f9ae0dSMasatake YAMATO print_str ("\tfile:", outfp);
163c1f9ae0dSMasatake YAMATO first = 0;
164c1f9ae0dSMasatake YAMATO }
165c1f9ae0dSMasatake YAMATO if (printingLineNumber && entry->address.lineNumber > 0)
166c1f9ae0dSMasatake YAMATO {
167c1f9ae0dSMasatake YAMATO print_str (sep, outfp);
168c1f9ae0dSMasatake YAMATO print_str ("\tline:", outfp);
169c1f9ae0dSMasatake YAMATO char buf [20 + 1]; /* 20 comes from UINNT64_MAX, 1 is for \0. */
170c1f9ae0dSMasatake YAMATO ultostr (buf, entry->address.lineNumber);
171c1f9ae0dSMasatake YAMATO print_str (buf, outfp);
172c1f9ae0dSMasatake YAMATO first = 0;
173c1f9ae0dSMasatake YAMATO }
174c1f9ae0dSMasatake YAMATO for (i = 0 ; i < entry->fields.count ; ++i)
175c1f9ae0dSMasatake YAMATO {
176c1f9ae0dSMasatake YAMATO if (entry->fields.list [i].key)
177c1f9ae0dSMasatake YAMATO {
178c1f9ae0dSMasatake YAMATO print_str (sep, outfp);
179c1f9ae0dSMasatake YAMATO print_char ('\t', outfp);
180c1f9ae0dSMasatake YAMATO print_str (entry->fields.list [i].key, outfp);
181c1f9ae0dSMasatake YAMATO print_char (':', outfp);
182c1f9ae0dSMasatake YAMATO if (entry->fields.list [i].value)
183c1f9ae0dSMasatake YAMATO printValue (entry->fields.list [i].value,
184c1f9ae0dSMasatake YAMATO printingWithEscaping, print_str, print_char, outfp);
185c1f9ae0dSMasatake YAMATO first = 0;
186c1f9ae0dSMasatake YAMATO }
187c1f9ae0dSMasatake YAMATO }
188c1f9ae0dSMasatake YAMATO }
189c1f9ae0dSMasatake YAMATO print_char ('\n', outfp);
190c1f9ae0dSMasatake YAMATO #undef sep
191c1f9ae0dSMasatake YAMATO }
192c1f9ae0dSMasatake YAMATO
tagsPrint(const tagEntry * entry,tagPrintOptions * opt,tagPrintProcs * procs,void * outfp)193c1f9ae0dSMasatake YAMATO extern int tagsPrint (const tagEntry *entry,
194c1f9ae0dSMasatake YAMATO tagPrintOptions *opt, tagPrintProcs *procs, void *outfp)
195c1f9ae0dSMasatake YAMATO {
196*edacac16SMasatake YAMATO if (!procs)
197*edacac16SMasatake YAMATO procs = &printFILEProcs;
198*edacac16SMasatake YAMATO
199c1f9ae0dSMasatake YAMATO tagsPrintTag (entry,
200c1f9ae0dSMasatake YAMATO opt->extensionFields,
201c1f9ae0dSMasatake YAMATO opt->lineNumber,
202c1f9ae0dSMasatake YAMATO opt->escaping,
203c1f9ae0dSMasatake YAMATO 0,
204c1f9ae0dSMasatake YAMATO procs->printStr,
205c1f9ae0dSMasatake YAMATO procs->printChar,
206c1f9ae0dSMasatake YAMATO outfp);
207c1f9ae0dSMasatake YAMATO return 1; /* TODO */
208c1f9ae0dSMasatake YAMATO }
209c1f9ae0dSMasatake YAMATO
tagsPrintPseudoTag(const tagEntry * entry,tagPrintOptions * opt,tagPrintProcs * procs,void * outfp)210c1f9ae0dSMasatake YAMATO extern int tagsPrintPseudoTag (const tagEntry *entry,
211c1f9ae0dSMasatake YAMATO tagPrintOptions *opt, tagPrintProcs *procs, void *outfp)
212c1f9ae0dSMasatake YAMATO {
213*edacac16SMasatake YAMATO if (!procs)
214*edacac16SMasatake YAMATO procs = &printFILEProcs;
215*edacac16SMasatake YAMATO
216c1f9ae0dSMasatake YAMATO tagsPrintTag (entry,
217c1f9ae0dSMasatake YAMATO opt->extensionFields,
218c1f9ae0dSMasatake YAMATO opt->lineNumber,
219c1f9ae0dSMasatake YAMATO opt->escaping,
220c1f9ae0dSMasatake YAMATO 1,
221c1f9ae0dSMasatake YAMATO procs->printStr,
222c1f9ae0dSMasatake YAMATO procs->printChar,
223c1f9ae0dSMasatake YAMATO outfp);
224c1f9ae0dSMasatake YAMATO return 1; /* TODO */
225c1f9ae0dSMasatake YAMATO }
226