]>
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> | |
14 | * | |
15 | */ | |
16 | ||
17 | /* Parse the setup.ini files. inilex.l provides the tokens for this. */ | |
18 | ||
b11b49f3 | 19 | #include <stdio.h> |
23c9e63c | 20 | #include <stdlib.h> |
cb2a4b55 | 21 | #include <string.h> |
23c9e63c | 22 | |
55e204f6 | 23 | #include "win32.h" |
7b606ae5 RC |
24 | #include "package_db.h" |
25 | #include "category.h" | |
23c9e63c DD |
26 | #include "ini.h" |
27 | #include "iniparse.h" | |
0af2d779 CF |
28 | #include "filemanip.h" |
29 | ||
bb849dbd | 30 | extern "C" int yyerror (char const *s, ...); |
0af2d779 | 31 | extern "C" int yylex (); |
23c9e63c | 32 | |
13d27274 DD |
33 | #include "port.h" |
34 | ||
bb849dbd RC |
35 | #include "package_meta.h" |
36 | #include "package_version.h" | |
37 | #include "cygpackage.h" | |
38 | ||
b11b49f3 DD |
39 | #define YYERROR_VERBOSE 1 |
40 | /*#define YYDEBUG 1*/ | |
41 | ||
bb849dbd | 42 | static packagemeta *cp = 0; |
23c9e63c | 43 | extern unsigned int setup_timestamp; |
13d27274 | 44 | extern char *setup_version; |
b11b49f3 | 45 | extern int yylineno; |
23c9e63c | 46 | |
bb849dbd RC |
47 | char * parse_mirror = 0; |
48 | static packagedb db; | |
49 | static cygpackage *cpv = 0; | |
50 | static int trust; | |
23c9e63c | 51 | |
bb849dbd | 52 | void add_correct_version(); |
23c9e63c DD |
53 | %} |
54 | ||
55 | %token STRING | |
13d27274 | 56 | %token SETUP_TIMESTAMP SETUP_VERSION VERSION INSTALL SOURCE SDESC LDESC |
38c97581 | 57 | %token CATEGORY REQUIRES |
c46a33a9 | 58 | %token APATH PPATH INCLUDE_SETUP EXCLUDE_PACKAGE DOWNLOAD_URL |
b11b49f3 | 59 | %token T_PREV T_CURR T_TEST T_UNKNOWN |
23c9e63c DD |
60 | |
61 | %% | |
62 | ||
63 | whole_file | |
64 | : setup_headers packages | |
65 | ; | |
66 | ||
67 | setup_headers | |
68 | : setup_header setup_headers | |
69 | | /* empty */ | |
70 | ; | |
71 | ||
72 | setup_header | |
73 | : SETUP_TIMESTAMP STRING '\n' { setup_timestamp = strtoul ($2, 0, 0); } | |
13d27274 | 74 | | SETUP_VERSION STRING '\n' { setup_version = _strdup ($2); } |
89725f30 | 75 | | '\n' |
13d27274 | 76 | | error { yyerror ("unrecognized line in setup.ini headers (do you have the latest setup?)"); } '\n' |
23c9e63c DD |
77 | ; |
78 | ||
79 | packages | |
80 | : package packages | |
81 | | /* empty */ | |
82 | ; | |
83 | ||
84 | package | |
bb849dbd | 85 | : '@' STRING '\n' { cp = &db.registerpackage($2); cpv = new cygpackage ($2); trust = TRUST_CURR;} |
23c9e63c | 86 | lines |
23c9e63c DD |
87 | ; |
88 | ||
89 | lines | |
90 | : simple_line '\n' lines | |
91 | | simple_line | |
92 | ; | |
93 | ||
94 | simple_line | |
bb849dbd RC |
95 | : VERSION STRING { cpv->set_canonical_version ($2); |
96 | add_correct_version ();} | |
97 | | SDESC STRING { cpv->set_sdesc ($2); } | |
98 | | LDESC STRING { cpv->set_ldesc ($2); } | |
8f53e82a | 99 | | CATEGORY categories |
38c97581 | 100 | | REQUIRES requires |
bb849dbd RC |
101 | | INSTALL STRING STRING { if (!cpv->Canonical_version ()) |
102 | { | |
103 | fileparse f; | |
104 | if (parse_filename ($2, f)) | |
0af2d779 | 105 | { |
bb849dbd RC |
106 | cpv->set_canonical_version (f.ver); |
107 | add_correct_version (); | |
0af2d779 | 108 | } |
bb849dbd RC |
109 | } |
110 | ||
111 | if (!cpv->bin.size) | |
112 | { | |
113 | cpv->bin.size = atoi($3); | |
114 | cpv->bin.set_canonical ($2); | |
115 | } | |
116 | cpv->bin.sites.registerbykey (parse_mirror); | |
0af2d779 | 117 | } |
bb849dbd RC |
118 | | SOURCE STRING STRING { if (!cpv->src.size) |
119 | { | |
120 | cpv->src.size = atoi($3); | |
121 | cpv->src.set_canonical ($2); | |
122 | } | |
123 | cpv->src.sites.registerbykey (parse_mirror); } | |
124 | | T_PREV { trust = TRUST_PREV; cpv = new cygpackage (cp->name); } | |
125 | | T_CURR { trust = TRUST_CURR; cpv = new cygpackage (cp->name); } | |
126 | | T_TEST { trust = TRUST_TEST; cpv = new cygpackage (cp->name); } | |
b11b49f3 | 127 | | T_UNKNOWN { trust = TRUST_UNKNOWN; } |
23c9e63c | 128 | | /* empty */ |
b11b49f3 | 129 | | error '\n' { yylineno --; |
13d27274 | 130 | yyerror ("unrecognized line in package %s (do you have the latest setup?)", cp->name); |
b11b49f3 DD |
131 | yylineno ++; |
132 | } | |
23c9e63c DD |
133 | ; |
134 | ||
38c97581 | 135 | requires |
bb849dbd RC |
136 | : STRING { cpv->new_requirement($1); } requires |
137 | | STRING { cpv->new_requirement($1); } | |
38c97581 CF |
138 | ; |
139 | ||
8f53e82a | 140 | categories |
4fe323f9 | 141 | : STRING { cp->add_category (db.categories.registerbykey ($1)); |
8f53e82a | 142 | } categories |
4fe323f9 | 143 | | STRING { cp->add_category (db.categories.registerbykey ($1)); } |
8f53e82a RC |
144 | ; |
145 | ||
23c9e63c DD |
146 | %% |
147 | ||
bb849dbd RC |
148 | void |
149 | add_correct_version() | |
23c9e63c | 150 | { |
bb849dbd RC |
151 | int merged = 0; |
152 | for (size_t n = 1; !merged && n <= cp->versions.number (); n++) | |
153 | if (!strcasecmp(cp->versions.getnth(n)->Canonical_version(), cpv->Canonical_version())) | |
154 | { | |
155 | /* ASSUMPTIONS: | |
156 | categories and requires are consistent for the same version across | |
157 | all mirrors | |
158 | */ | |
159 | /* Copy the binary mirror across if this site claims to have an install */ | |
160 | if (cpv->bin.sites.number ()) | |
161 | cp->versions.getnth(n)->bin.sites.registerbykey (cpv->bin.sites.getnth(1)->key); | |
162 | /* Ditto for src */ | |
163 | if (cpv->src.sites.number ()) | |
164 | cp->versions.getnth(n)->src.sites.registerbykey (cpv->src.sites.getnth(1)->key); | |
165 | cpv = (cygpackage *)cp->versions.getnth (n); | |
166 | merged = 1; | |
167 | } | |
168 | if (!merged) | |
169 | cp->add_version (*cpv); | |
170 | /* trust setting */ | |
171 | switch (trust) | |
172 | { | |
173 | case TRUST_CURR: | |
174 | if (cp->currtimestamp < setup_timestamp) | |
175 | { | |
176 | cp->currtimestamp = setup_timestamp; | |
177 | cp->curr = cpv; | |
178 | } | |
179 | break; | |
180 | case TRUST_PREV: | |
181 | if (cp->prevtimestamp < setup_timestamp) | |
23c9e63c | 182 | { |
bb849dbd RC |
183 | cp->prevtimestamp = setup_timestamp; |
184 | cp->prev = cpv; | |
c46a33a9 | 185 | } |
bb849dbd RC |
186 | break; |
187 | case TRUST_TEST: | |
188 | if (cp->exptimestamp < setup_timestamp) | |
c46a33a9 | 189 | { |
bb849dbd RC |
190 | cp->exptimestamp = setup_timestamp; |
191 | cp->exp = cpv; | |
23c9e63c | 192 | } |
bb849dbd RC |
193 | break; |
194 | } | |
8f53e82a | 195 | } |