Mercurial > hg > xemacs-beta
diff netinstall/iniparse.y @ 448:3078fd1074e8 r21-2-39
Import from CVS: tag r21-2-39
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:38:25 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/netinstall/iniparse.y Mon Aug 13 11:38:25 2007 +0200 @@ -0,0 +1,134 @@ +%{ +/* + * Copyright (c) 2000, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * A copy of the GNU General Public License can be found at + * http://www.gnu.org/ + * + * Written by DJ Delorie <dj@cygnus.com> + * + */ + +/* Parse the setup.ini files. inilex.l provides the tokens for this. */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "win32.h" + +#include "ini.h" +#include "iniparse.h" + +#include "port.h" + +#define YYERROR_VERBOSE 1 +/*#define YYDEBUG 1*/ + +static Package *cp; +static int trust; +extern unsigned int setup_timestamp; +extern char *setup_version; +extern int yylineno; +extern int CDECL yyerror (char *s, ...); + +#define cpt (cp->info+trust) + +%} + +%token STRING +%token SETUP_TIMESTAMP SETUP_VERSION VERSION INSTALL SOURCE SDESC LDESC TYPE +%token T_PREV T_CURR T_TEST T_UNKNOWN + +%% + +whole_file + : setup_headers packages + ; + +setup_headers + : setup_header setup_headers + | /* empty */ + ; + +setup_header + : SETUP_TIMESTAMP STRING '\n' { setup_timestamp = strtoul ($2, 0, 0); } + | SETUP_VERSION STRING '\n' { setup_version = strdup ($2); } + | '\n' + | error { yyerror ("unrecognized line in setup.ini headers (do you have the latest setup?)"); } '\n' + ; + +packages + : package packages + | /* empty */ + ; + +package + : '@' STRING '\n' { new_package($2); } + lines + ; + +lines + : simple_line '\n' lines + | simple_line + ; + +simple_line + : VERSION STRING { cpt->version = $2; } + | SDESC STRING { cp->sdesc = $2; } + | LDESC STRING { cp->ldesc = $2; } + | INSTALL STRING STRING { cpt->install = $2; + cpt->install_size = atoi($3); } + | SOURCE STRING STRING { cpt->source = $2; + cpt->source_size = atoi($3); } + | TYPE STRING { if (!strcmp ($2, "cygwin")) + cp->type = TY_CYGWIN; + else if (!strcmp ($2, "native")) + cp->type = TY_NATIVE; + else + cp->type = TY_GENERIC; } + | T_PREV { trust = TRUST_PREV; } + | T_CURR { trust = TRUST_CURR; } + | T_TEST { trust = TRUST_TEST; } + | T_UNKNOWN { trust = TRUST_UNKNOWN; } + | /* empty */ + | error '\n' { yylineno --; + yyerror ("unrecognized line in package %s (do you have the latest setup?)", cp->name); + yylineno ++; + } + ; + +%% + +Package *package = 0; +Package *xemacs_package = 0; +int npackages = 0; +static int maxpackages = 0; + +Package * +new_package (char *name) +{ + if (package == 0) + maxpackages = npackages = 0; + if (npackages >= maxpackages) + { + maxpackages += 10; + if (package) + package = (Package *) realloc (package, maxpackages * sizeof (Package)); + else + package = (Package *) malloc (maxpackages * sizeof (Package)); + } + cp = package + npackages; + npackages ++; + + memset (cp, 0, sizeof (Package)); + cp->name = name; + + trust = TRUST_CURR; + + return cp; +}