#include <stdlib.h>
#include <string.h>
+#include "win32.h"
#include "ini.h"
#include "iniparse.h"
-#include "win32.h"
-#include "filemanip.h"
+#include "PackageTrust.h"
-extern "C" int yyerror (char *s, ...);
-extern "C" int yylex ();
+extern int yyerror (String const &s);
+int yylex ();
#include "port.h"
+#include "IniDBBuilder.h"
+
#define YYERROR_VERBOSE 1
+#define YYINITDEPTH 1000
/*#define YYDEBUG 1*/
-static Package *cp;
-static int trust;
-extern unsigned int setup_timestamp;
-extern char *setup_version;
+IniDBBuilder *iniBuilder;
extern int yylineno;
-#define cpt (cp->info+trust)
-
+void add_correct_version();
%}
%token STRING
-%token SETUP_TIMESTAMP SETUP_VERSION VERSION INSTALL SOURCE SDESC LDESC
+%token SETUP_TIMESTAMP SETUP_VERSION PACKAGEVERSION INSTALL SOURCE SDESC LDESC
%token CATEGORY REQUIRES
%token APATH PPATH INCLUDE_SETUP EXCLUDE_PACKAGE DOWNLOAD_URL
%token T_PREV T_CURR T_TEST T_UNKNOWN
+%token MD5
%%
;
setup_header
- : SETUP_TIMESTAMP STRING '\n' { setup_timestamp = strtoul ($2, 0, 0); }
- | SETUP_VERSION STRING '\n' { setup_version = _strdup ($2); }
+ : SETUP_TIMESTAMP STRING '\n' { iniBuilder->buildTimestamp ($2); }
+ | SETUP_VERSION STRING '\n' { iniBuilder->buildVersion ($2); }
| '\n'
| error { yyerror ("unrecognized line in setup.ini headers (do you have the latest setup?)"); } '\n'
;
;
package
- : '@' STRING '\n' { new_package($2); }
+ : '@' STRING '\n' { iniBuilder->buildPackage ($2);}
lines
;
lines
- : simple_line '\n' lines
+ : lines '\n' simple_line
| simple_line
;
simple_line
- : VERSION STRING { cpt->version = $2; }
- | SDESC STRING { cp->sdesc = $2; }
- | LDESC STRING { cp->ldesc = $2; }
+ : PACKAGEVERSION STRING { iniBuilder->buildPackageVersion ($2); }
+ | SDESC STRING { iniBuilder->buildPackageSDesc($2); }
+ | LDESC STRING { iniBuilder->buildPackageLDesc($2); }
| CATEGORY categories
| REQUIRES requires
- | INSTALL STRING STRING { cpt->install = $2;
- cpt->install_size = atoi($3);
- if (!cpt->version)
- {
- fileparse f;
- if (parse_filename ($2, f))
- cpt->version = strdup (f.ver);
- }
- }
- | SOURCE STRING STRING { cpt->source = $2;
- cpt->source_size = atoi($3); }
- | T_PREV { trust = TRUST_PREV; }
- | T_CURR { trust = TRUST_CURR; }
- | T_TEST { trust = TRUST_TEST; }
- | EXCLUDE_PACKAGE { cp->exclude = EXCLUDE_BY_SETUP; }
- | T_UNKNOWN { trust = TRUST_UNKNOWN; }
+ | INSTALL STRING STRING MD5 { iniBuilder->buildPackageInstall ($2, $3, (unsigned char *)$4); }
+ | INSTALL STRING STRING { iniBuilder->buildPackageInstall ($2, $3); }
+ | SOURCE STRING STRING MD5 { iniBuilder->buildPackageSource ($2, $3, (unsigned char *)$4); }
+ | SOURCE STRING STRING { iniBuilder->buildPackageSource ($2, $3); }
+ | T_PREV { iniBuilder->buildPackageTrust (TRUST_PREV); }
+ | T_CURR { iniBuilder->buildPackageTrust (TRUST_CURR); }
+ | T_TEST { iniBuilder->buildPackageTrust (TRUST_TEST); }
+ | T_UNKNOWN { iniBuilder->buildPackageTrust (TRUST_UNKNOWN); }
| /* empty */
- | error '\n' { yylineno --;
- yyerror ("unrecognized line in package %s (do you have the latest setup?)", cp->name);
- yylineno ++;
- }
+ | error { yyerror (String("unrecognized line ") + yylineno + " (do you have the latest setup?)");
+ }
;
requires
- : STRING { new_requirement(cp, $1); } requires
- | STRING { new_requirement(cp, $1); }
+ : STRING { iniBuilder->buildPackageRequirement($1); } requires
+ | STRING { iniBuilder->buildPackageRequirement($1); }
;
categories
- : STRING { add_category (cp, register_category ($1));
- } categories
- | STRING { add_category (cp, register_category ($1)); }
+ : STRING { iniBuilder->buildPackageCategory ($1); } categories
+ | STRING { iniBuilder->buildPackageCategory ($1); }
;
%%
-
-Package *package = NULL;
-int npackages = 0;
-static int maxpackages = 0;
-Category *category = NULL;
-int ncategories = 0;
-
-Package *
-new_package (char *name)
-{
- if (package == NULL)
- maxpackages = npackages = 0;
- if (npackages >= maxpackages)
- {
- maxpackages += 100;
- if (package)
- package = (Package *) realloc (package, (1 + maxpackages) * sizeof (Package));
- else
- package = (Package *) malloc ((1 + maxpackages) * sizeof (Package));
- memset (package + npackages, 0, (1 + maxpackages - npackages) * sizeof (Package));
- }
- cp = getpkgbyname (name);
- if (!cp)
- {
- cp = package + npackages;
- npackages++;
- cp->name = strdup (name);
- trust = TRUST_CURR;
- }
-
- return cp;
-}
-
-void
-new_requirement (Package *package, char *dependson)
-{
- Dependency *dp;
- if (!dependson)
- return;
- dp = (Dependency *) malloc (sizeof (Dependency));
- dp->next = cp->required;
- dp->package = dependson;
- cp->required = dp;
-}
-
-Category *
-register_category (char *name)
-{
- Category *tempcat;
- if (category == NULL)
- ncategories = 0;
- tempcat = getcategorybyname (name);
- if (!tempcat)
- {
- Category *sortcat = category;
- tempcat = new (Category);
- memset (tempcat, '\0', sizeof (Category));
- tempcat->name = strdup (name);
- if (!sortcat || strcasecmp(sortcat->name, name) > 0)
- {
- tempcat->next = category;
- category = tempcat;
- }
- else
- {
- tempcat->next = sortcat->next;
- sortcat->next = tempcat;
- while (sortcat->next &&
- strcasecmp(sortcat->next->name, tempcat->name) < 0)
- {
- tempcat->next = sortcat->next;
- sortcat->next = tempcat;
- }
- }
- ncategories++;
- }
- return tempcat;
-}
-
-void
-add_category (Package *pkg, Category *cat)
-{
- /* add a new record for the package list */
- /* TODO: alpabetical inserts ? */
- Category *tempcat;
- CategoryPackage *templink;
- tempcat = new (Category);
- memset (tempcat, '\0', sizeof (Category));
- tempcat->next = pkg->category;
- tempcat->name = cat->name;
- pkg->category = tempcat;
-
- templink = new (CategoryPackage);
- templink->next = cat->packages;
- templink->pkgname = pkg->name;
- cat->packages = templink;
-
- /* hack to ensure we allocate enough space */
- ncategories++;
-}