]> cygwin.com Git - cygwin-apps/setup.git/blob - inilex.l
2003-07-27 Robert Collins <rbtcollins@hotmail.com>
[cygwin-apps/setup.git] / inilex.l
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>
14 * Maintained by Robert Collins <rbtcollins@hotmail.com>
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
22 #include "win32.h"
23 #include <string.h>
24
25 #include "ini.h"
26 #include "iniparse.h"
27 #include "String++.h"
28 #include "IniParseFeedback.h"
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);
33 static void ignore_line (void);
34
35 %}
36
37 /*%option debug */
38 %option noyywrap
39 %option yylineno
40 %option never-interactive
41
42 %x descriptionstate
43 %x eolstate
44
45 STR [!a-zA-Z0-9_./:\+-]+
46
47 %%
48
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';
60 ((unsigned char *) yylval) [i / 2] += val << ((i % 2) ? 0 : 4);
61 }
62 return MD5;
63 }
64
65 \"[^"]*\" { yylval = new char [strlen (yytext+1) + 1];
66 strcpy (yylval, yytext+1);
67 yylval[strlen (yylval)-1] = 0;
68 return STRING; }
69
70 "setup-timestamp:" return SETUP_TIMESTAMP;
71 "setup-version:" return SETUP_VERSION;
72 "Package:" return PACKAGENAME;
73 [vV]"ersion:" return PACKAGEVERSION;
74 "install:"|"Filename:" return INSTALL;
75 "source:" return SOURCE;
76 "sdesc:" return SDESC;
77 "ldesc:" return LDESC;
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;
85 "Binary:" return BINARYPACKAGE;
86 "Build-Depends:" return BUILDDEPENDS;
87 "Build-Depends-Indep:" return BUILDDEPENDS; /* technicallyincorrect :[ */
88 "Standards-Version:" return STANDARDSVERSION;
89 "Format:" return FORMAT;
90 "Directory:" return DIRECTORY;
91 "Files:" return FILES;
92
93 "category:"|"Section:" return CATEGORY;
94 "Priority:" return PRIORITY;
95 "requires:" return REQUIRES;
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;
103
104 "apath:" return APATH;
105 "ppath:" return PPATH;
106
107 "include-setup:" return INCLUDE_SETUP;
108
109 "download-url:" return DOWNLOAD_URL;
110
111 ^{STR}":" ignore_line ();
112
113 "[curr]" return T_CURR;
114 "[test]" return T_TEST;
115 "[exp]" return T_TEST;
116 "[prev]" return T_PREV;
117
118 "(" return OPENBRACE;
119 ")" return CLOSEBRACE;
120 "[" return OPENSQUARE;
121 "]" return CLOSESQUARE;
122 "<<" return LT;
123 ">>" return GT;
124 ">=" return GTEQUAL;
125 "<=" return LTEQUAL;
126 ">" return GT;
127 "<" return LT;
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; }
136 {STR} { yylval = new char [strlen(yytext) + 1];
137 strcpy (yylval, yytext);
138 return STRING; }
139
140 [ \t\r]+ /* do nothing */;
141
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; }
150
151 \n { return NL; }
152 . { return *yytext;}
153
154 %%
155
156 #include "io_stream.h"
157
158 static io_stream *input_stream = 0;
159 extern IniDBBuilder *iniBuilder;
160 static IniParseFeedback *iniFeedback;
161
162 void
163 ini_init(io_stream *stream, IniDBBuilder *aBuilder, IniParseFeedback &aFeedback)
164 {
165 input_stream = stream;
166 iniBuilder = aBuilder;
167 iniFeedback = &aFeedback;
168 YY_FLUSH_BUFFER;
169 yylineno = 1;
170 }
171
172 static int
173 ini_getchar(char *buf, int max_size)
174 {
175 if (input_stream)
176 {
177 ssize_t len = input_stream->read (buf, max_size);
178 if (len < 1)
179 {
180 len = 0;
181 input_stream = 0;
182 }
183 else
184 iniFeedback->progress (input_stream->tell(), input_stream->get_size());
185 return len;
186 }
187 return 0;
188 }
189
190 static void
191 ignore_line ()
192 {
193 char c;
194 while ((c = yyinput ()))
195 {
196 if (c == EOF)
197 return;
198 if (c == '\n')
199 return;
200 }
201 }
202
203 int
204 yybol ()
205 {
206 return !!YY_AT_BOL ();
207 }
This page took 0.045309 seconds and 5 git commands to generate.