]>
Commit | Line | Data |
---|---|---|
23c9e63c DD |
1 | %{ |
2 | /* | |
3 | * Copyright (c) 2000, Red Hat, Inc. | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify | |
6 | * it under the terms of the GNU General Public License as published by | |
7 | * the Free Software Foundation; either version 2 of the License, or | |
8 | * (at your option) any later version. | |
9 | * | |
10 | * A copy of the GNU General Public License can be found at | |
11 | * http://www.gnu.org/ | |
12 | * | |
13 | * Written by DJ Delorie <dj@cygnus.com> | |
aa1e3b4d | 14 | * Maintained by Robert Collins <rbtcollins@hotmail.com> |
23c9e63c DD |
15 | * |
16 | */ | |
17 | ||
18 | /* tokenize the setup.ini files. We parse a string which we've | |
19 | previously downloaded. The program must call ini_init() to specify | |
20 | that string. */ | |
21 | ||
b11b49f3 | 22 | #include "win32.h" |
23c9e63c DD |
23 | #include <string.h> |
24 | ||
25 | #include "ini.h" | |
26 | #include "iniparse.h" | |
3c054baf | 27 | #include "String++.h" |
aa1e3b4d | 28 | #include "IniParseFeedback.h" |
23c9e63c DD |
29 | |
30 | #define YY_INPUT(buf,result,max_size) { result = ini_getchar(buf, max_size); } | |
31 | ||
32 | static int ini_getchar(char *buf, int max_size); | |
b24c88b3 | 33 | static void ignore_line (void); |
23c9e63c DD |
34 | |
35 | %} | |
36 | ||
b11b49f3 | 37 | /*%option debug */ |
23c9e63c | 38 | %option noyywrap |
b11b49f3 DD |
39 | %option yylineno |
40 | %option never-interactive | |
41 | ||
aa1e3b4d RC |
42 | %x descriptionstate |
43 | %x eolstate | |
44 | ||
b1ff53ed | 45 | STR [!a-zA-Z0-9_./:\+-]+ |
23c9e63c DD |
46 | |
47 | %% | |
48 | ||
58ee6135 RC |
49 | [0123456789abcdef]{32,32} { |
50 | yylval = (char *) new unsigned char[16]; | |
51 | for (int i=0; i< 16; ++i) | |
52 | ((unsigned char *) yylval) [i] = 0; | |
53 | for (int i=0; i< 32; ++i) | |
54 | { | |
55 | unsigned char val = (unsigned char) yytext[i]; | |
56 | if (val > '9') | |
57 | val = val - 'a' + 10; | |
58 | else | |
59 | val = val - '0'; | |
076654e7 | 60 | ((unsigned char *) yylval) [i / 2] += val << ((i % 2) ? 0 : 4); |
58ee6135 RC |
61 | } |
62 | return MD5; | |
63 | } | |
64 | ||
5e0464a1 RC |
65 | \"[^"]*\" { yylval = new char [strlen (yytext+1) + 1]; |
66 | strcpy (yylval, yytext+1); | |
23c9e63c DD |
67 | yylval[strlen (yylval)-1] = 0; |
68 | return STRING; } | |
69 | ||
70 | "setup-timestamp:" return SETUP_TIMESTAMP; | |
13d27274 | 71 | "setup-version:" return SETUP_VERSION; |
aa1e3b4d RC |
72 | "Package:" return PACKAGENAME; |
73 | [vV]"ersion:" return PACKAGEVERSION; | |
74 | "install:"|"Filename:" return INSTALL; | |
23c9e63c DD |
75 | "source:" return SOURCE; |
76 | "sdesc:" return SDESC; | |
77 | "ldesc:" return LDESC; | |
aa1e3b4d RC |
78 | "Description:" BEGIN (descriptionstate); return DESCTAG; |
79 | "Size:" return FILESIZE; | |
80 | "MD5sum:" return MD5LINE; | |
81 | "Installed-Size:" return INSTALLEDSIZE; | |
82 | "Maintainer:" BEGIN (eolstate); return MAINTAINER; | |
83 | "Architecture:" return ARCHITECTURE; | |
84 | "Source:" return SOURCEPACKAGE; | |
233a3e17 RC |
85 | "Binary:" return BINARYPACKAGE; |
86 | "Build-Depends:" return BUILDDEPENDS; | |
b1ff53ed | 87 | "Build-Depends-Indep:" return BUILDDEPENDS; /* technicallyincorrect :[ */ |
233a3e17 RC |
88 | "Standards-Version:" return STANDARDSVERSION; |
89 | "Format:" return FORMAT; | |
90 | "Directory:" return DIRECTORY; | |
91 | "Files:" return FILES; | |
aa1e3b4d RC |
92 | |
93 | "category:"|"Section:" return CATEGORY; | |
94 | "Priority:" return PRIORITY; | |
38c97581 | 95 | "requires:" return REQUIRES; |
aa1e3b4d RC |
96 | "Depends:" return DEPENDS; |
97 | "Pre-Depends:" return PREDEPENDS; | |
98 | "Recommends:" return RECOMMENDS; | |
99 | "Suggests:" return SUGGESTS; | |
100 | "Conflicts:" return CONFLICTS; | |
101 | "Replaces:" return REPLACES; | |
102 | "Provides:" return PROVIDES; | |
38c97581 | 103 | |
c46a33a9 CF |
104 | "apath:" return APATH; |
105 | "ppath:" return PPATH; | |
106 | ||
107 | "include-setup:" return INCLUDE_SETUP; | |
108 | ||
c46a33a9 CF |
109 | "download-url:" return DOWNLOAD_URL; |
110 | ||
b11b49f3 DD |
111 | ^{STR}":" ignore_line (); |
112 | ||
23c9e63c DD |
113 | "[curr]" return T_CURR; |
114 | "[test]" return T_TEST; | |
13d27274 | 115 | "[exp]" return T_TEST; |
23c9e63c DD |
116 | "[prev]" return T_PREV; |
117 | ||
aa1e3b4d RC |
118 | "(" return OPENBRACE; |
119 | ")" return CLOSEBRACE; | |
b1ff53ed RC |
120 | "[" return OPENSQUARE; |
121 | "]" return CLOSESQUARE; | |
aa1e3b4d RC |
122 | "<<" return LT; |
123 | ">>" return GT; | |
124 | ">=" return GTEQUAL; | |
125 | "<=" return LTEQUAL; | |
b1ff53ed RC |
126 | ">" return GT; |
127 | "<" return LT; | |
aa1e3b4d RC |
128 | "=" return EQUAL; |
129 | \, return COMMA; | |
130 | "|" return OR; | |
131 | "@" return AT; | |
132 | ||
133 | {STR}"@"{STR} { yylval = new char [strlen(yytext) + 1]; | |
134 | strcpy (yylval, yytext); | |
135 | return EMAIL; } | |
5e0464a1 RC |
136 | {STR} { yylval = new char [strlen(yytext) + 1]; |
137 | strcpy (yylval, yytext); | |
23c9e63c DD |
138 | return STRING; } |
139 | ||
fb2cd8f6 | 140 | [ \t\r]+ /* do nothing */; |
b11b49f3 | 141 | |
aa1e3b4d RC |
142 | ^"#".*\n /* do nothing */; |
143 | <descriptionstate>[^\n]+ { yylval = new char [strlen(yytext) + 1]; | |
144 | strcpy (yylval, yytext); | |
145 | return STRTOEOL; } | |
146 | <descriptionstate>\n { return NL; } | |
147 | <descriptionstate>"\n"+ {BEGIN(INITIAL); return PARAGRAPH;} | |
148 | <eolstate>[^\n]+ {return STRING; } | |
149 | <eolstate>\n {BEGIN(INITIAL); return NL; } | |
23c9e63c | 150 | |
aa1e3b4d RC |
151 | \n { return NL; } |
152 | . { return *yytext;} | |
23c9e63c DD |
153 | |
154 | %% | |
155 | ||
341988b9 RC |
156 | #include "io_stream.h" |
157 | ||
158 | static io_stream *input_stream = 0; | |
076654e7 | 159 | extern IniDBBuilder *iniBuilder; |
aa1e3b4d | 160 | static IniParseFeedback *iniFeedback; |
341988b9 | 161 | |
23c9e63c | 162 | void |
aa1e3b4d | 163 | ini_init(io_stream *stream, IniDBBuilder *aBuilder, IniParseFeedback &aFeedback) |
23c9e63c | 164 | { |
341988b9 | 165 | input_stream = stream; |
076654e7 | 166 | iniBuilder = aBuilder; |
aa1e3b4d | 167 | iniFeedback = &aFeedback; |
0d4e0aad CF |
168 | YY_FLUSH_BUFFER; |
169 | yylineno = 1; | |
23c9e63c DD |
170 | } |
171 | ||
172 | static int | |
173 | ini_getchar(char *buf, int max_size) | |
174 | { | |
341988b9 | 175 | if (input_stream) |
23c9e63c | 176 | { |
341988b9 RC |
177 | ssize_t len = input_stream->read (buf, max_size); |
178 | if (len < 1) | |
179 | { | |
180 | len = 0; | |
181 | input_stream = 0; | |
23c9e63c | 182 | } |
aa1e3b4d RC |
183 | else |
184 | iniFeedback->progress (input_stream->tell(), input_stream->get_size()); | |
341988b9 | 185 | return len; |
23c9e63c | 186 | } |
341988b9 | 187 | return 0; |
23c9e63c | 188 | } |
b11b49f3 DD |
189 | |
190 | static void | |
191 | ignore_line () | |
192 | { | |
193 | char c; | |
341988b9 | 194 | while ((c = yyinput ())) |
b11b49f3 DD |
195 | { |
196 | if (c == EOF) | |
197 | return; | |
198 | if (c == '\n') | |
199 | return; | |
200 | } | |
201 | } | |
0d4e0aad CF |
202 | |
203 | int | |
204 | yybol () | |
205 | { | |
206 | return !!YY_AT_BOL (); | |
207 | } |