summaryrefslogtreecommitdiff
path: root/gs/src/genconf.c
diff options
context:
space:
mode:
authorHenry Stiles <henry.stiles@artifex.com>1998-07-28 06:22:20 +0000
committerHenry Stiles <henry.stiles@artifex.com>1998-07-28 06:22:20 +0000
commit5fbdbaab7335a147a3a7890b5c6fc123926815db (patch)
tree154edc89b06c38333fd6d4b9abaf0ee8740ddf6a /gs/src/genconf.c
parent14cf10e3738f95f7864978c5a4778b50fb39524b (diff)
downloadghostpdl-5fbdbaab7335a147a3a7890b5c6fc123926815db.tar.gz
This commit was generated by cvs2svn to compensate for changes in r257,
which included commits to RCS files with non-trunk default branches. git-svn-id: http://svn.ghostscript.com/ghostpcl/trunk/ghostpcl@258 06663e23-700e-0410-b217-a244a6096597
Diffstat (limited to 'gs/src/genconf.c')
-rw-r--r--gs/src/genconf.c1066
1 files changed, 566 insertions, 500 deletions
diff --git a/gs/src/genconf.c b/gs/src/genconf.c
index e446f6f25..8fa2b71b6 100644
--- a/gs/src/genconf.c
+++ b/gs/src/genconf.c
@@ -1,20 +1,20 @@
/* Copyright (C) 1993, 1996 Aladdin Enterprises. All rights reserved.
-
- This file is part of Aladdin Ghostscript.
-
- Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND. No author
- or distributor accepts any responsibility for the consequences of using it,
- or for whether it serves any particular purpose or works at all, unless he
- or she says so in writing. Refer to the Aladdin Ghostscript Free Public
- License (the "License") for full details.
-
- Every copy of Aladdin Ghostscript must include a copy of the License,
- normally in a plain ASCII text file named PUBLIC. The License grants you
- the right to copy, modify and redistribute Aladdin Ghostscript, but only
- under certain conditions described in the License. Among other things, the
- License requires that the copyright notice and this notice be preserved on
- all copies.
-*/
+
+ This file is part of Aladdin Ghostscript.
+
+ Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND. No author
+ or distributor accepts any responsibility for the consequences of using it,
+ or for whether it serves any particular purpose or works at all, unless he
+ or she says so in writing. Refer to the Aladdin Ghostscript Free Public
+ License (the "License") for full details.
+
+ Every copy of Aladdin Ghostscript must include a copy of the License,
+ normally in a plain ASCII text file named PUBLIC. The License grants you
+ the right to copy, modify and redistribute Aladdin Ghostscript, but only
+ under certain conditions described in the License. Among other things, the
+ License requires that the copyright notice and this notice be preserved on
+ all copies.
+ */
/* genconf.c */
/* Generate configuration files */
@@ -29,13 +29,15 @@
/* (e.g., some Linux versions). */
void *
mrealloc(void *old_ptr, size_t old_size, size_t new_size)
-{ void *new_ptr = malloc(new_size);
- if ( new_ptr == NULL )
- return NULL;
- /* We have to pass in the old size, since we have no way to */
- /* determine it otherwise. */
- memcpy(new_ptr, old_ptr, min(old_size, new_size));
- return new_ptr;
+{
+ void *new_ptr = malloc(new_size);
+
+ if (new_ptr == NULL)
+ return NULL;
+ /* We have to pass in the old size, since we have no way to */
+ /* determine it otherwise. */
+ memcpy(new_ptr, old_ptr, min(old_size, new_size));
+ return new_ptr;
}
/*
@@ -46,15 +48,15 @@ mrealloc(void *old_ptr, size_t old_size, size_t new_size)
* (3) the VMS shell is radically different from all others.
*
* Usage:
- * genconf [-Z] [-n [name_prefix | -]] [@]xxx.dev*
- * [-f gconfigf.h] [-h gconfig.h]
- * [-p[l|L][u][e] pattern] [-l|o|lo|ol out.tr]
+ * genconf [-Z] [-n [name_prefix | -]] [@]xxx.dev*
+ * [-f gconfigf.h] [-h gconfig.h]
+ * [-p[l|L][u][e] pattern] [-l|o|lo|ol out.tr]
* & in the pattern acts as an escape character as follows:
- * &p produces a %;
- * &s produces a space;
- * && produces a \;
- * &- produces a -;
- * &x, for any other character x, is an error.
+ * &p produces a %;
+ * &s produces a space;
+ * && produces a \;
+ * &- produces a -;
+ * &x, for any other character x, is an error.
*/
/* DEFAULT_PREFIX should be DEFAULT_NAME_PREFIX. */
@@ -62,62 +64,66 @@ mrealloc(void *old_ptr, size_t old_size, size_t new_size)
/* Structures for accumulating information. */
typedef struct string_item_s {
- const char *str;
- int index;
+ const char *str;
+ int index;
} string_item;
+
/* The values of uniq_mode are bit masks. */
typedef enum {
- uniq_all = 1, /* keep all occurrences (default) */
- uniq_first = 2, /* keep only first occurrence */
- uniq_last = 4 /* keep only last occurrence */
+ uniq_all = 1, /* keep all occurrences (default) */
+ uniq_first = 2, /* keep only first occurrence */
+ uniq_last = 4 /* keep only last occurrence */
} uniq_mode;
typedef struct string_list_s {
- /* The following are set at creation time. */
- int max_count;
- uniq_mode mode;
- /* The following are updated dynamically. */
- int count;
- string_item *items;
+ /* The following are set at creation time. */
+ int max_count;
+ uniq_mode mode;
+ /* The following are updated dynamically. */
+ int count;
+ string_item *items;
} string_list;
+
#define max_pattern 60
typedef struct string_pattern_s {
- bool upper_case;
- bool drop_extn;
- char pattern[max_pattern + 1];
+ bool upper_case;
+ bool drop_extn;
+ char pattern[max_pattern + 1];
} string_pattern;
typedef struct config_s {
- int debug;
- const char *name_prefix;
- const char *file_prefix;
- /* file_names and file_contents are special.... */
- string_list file_names;
- string_list file_contents;
- string_list resources;
- string_list devs;
- string_list fonts;
- string_list headers;
- string_list libs;
- string_list libpaths;
- string_list objs;
- string_pattern lib_p;
- string_pattern libpath_p;
- string_pattern obj_p;
+ int debug;
+ const char *name_prefix;
+ const char *file_prefix;
+ /* file_names and file_contents are special.... */
+ string_list file_names;
+ string_list file_contents;
+ string_list resources;
+ string_list devs;
+ string_list fonts;
+ string_list headers;
+ string_list libs;
+ string_list libpaths;
+ string_list objs;
+ string_pattern lib_p;
+ string_pattern libpath_p;
+ string_pattern obj_p;
} config;
+
/* These lists grow automatically if needed, so we could start out with */
/* small allocations. */
-static const config init_config = {
- 0, /* debug */
- DEFAULT_PREFIX, /* name_prefix */
- "", /* file_prefix */
- { 200 }, /* file_names */
- { 200 }, /* file_contents */
- { 100, uniq_first }, /* resources */
- { 100, uniq_first }, /* devs */
- { 50, uniq_first }, /* fonts */
- { 20, uniq_first }, /* headers */
- { 20, uniq_last }, /* libs */
- { 10, uniq_first }, /* libpaths */
- { 400, uniq_first } /* objs */
+static const config init_config =
+{
+ 0, /* debug */
+ DEFAULT_PREFIX, /* name_prefix */
+ "", /* file_prefix */
+ {200}, /* file_names */
+ {200}, /* file_contents */
+ {100, uniq_first}, /* resources */
+ {100, uniq_first}, /* devs */
+ {50, uniq_first}, /* fonts */
+ {20, uniq_first}, /* headers */
+ {20, uniq_last}, /* libs */
+ {10, uniq_first}, /* libpaths */
+ {400, uniq_first} /* objs */
};
/* Forward definitions */
@@ -132,408 +138,455 @@ void write_list(P3(FILE *, const string_list *, const char *));
void write_list_pattern(P3(FILE *, const string_list *, const string_pattern *));
main(int argc, char *argv[])
-{ config conf;
- int i;
-
- /* Allocate string lists. */
- conf = init_config;
- alloc_list(&conf.file_names);
- alloc_list(&conf.file_contents);
- alloc_list(&conf.resources);
- alloc_list(&conf.devs);
- alloc_list(&conf.fonts);
- alloc_list(&conf.headers);
- alloc_list(&conf.libs);
- alloc_list(&conf.libpaths);
- alloc_list(&conf.objs);
-
- /* Initialize patterns. */
- conf.lib_p.upper_case = false;
- conf.lib_p.drop_extn = false;
- strcpy(conf.lib_p.pattern, "%s\n");
- conf.libpath_p = conf.lib_p;
- conf.obj_p = conf.lib_p;
-
- /* Process command line arguments. */
- for ( i = 1; i < argc; i++ )
- { const char *arg = argv[i];
- FILE *out;
- int lib = 0, obj = 0;
- if ( *arg != '-' )
- { read_dev(&conf, arg);
- continue;
- }
- if ( i == argc - 1 )
- { fprintf(stderr, "Missing argument after %s.\n",
- arg);
- exit(1);
- }
- switch ( arg[1] )
+{
+ config conf;
+ int i;
+
+ /* Allocate string lists. */
+ conf = init_config;
+ alloc_list(&conf.file_names);
+ alloc_list(&conf.file_contents);
+ alloc_list(&conf.resources);
+ alloc_list(&conf.devs);
+ alloc_list(&conf.fonts);
+ alloc_list(&conf.headers);
+ alloc_list(&conf.libs);
+ alloc_list(&conf.libpaths);
+ alloc_list(&conf.objs);
+
+ /* Initialize patterns. */
+ conf.lib_p.upper_case = false;
+ conf.lib_p.drop_extn = false;
+ strcpy(conf.lib_p.pattern, "%s\n");
+ conf.libpath_p = conf.lib_p;
+ conf.obj_p = conf.lib_p;
+
+ /* Process command line arguments. */
+ for (i = 1; i < argc; i++) {
+ const char *arg = argv[i];
+ FILE *out;
+ int lib = 0, obj = 0;
+
+ if (*arg != '-') {
+ read_dev(&conf, arg);
+ continue;
+ }
+ if (i == argc - 1) {
+ fprintf(stderr, "Missing argument after %s.\n",
+ arg);
+ exit(1);
+ }
+ switch (arg[1]) {
+ case 'C': /* change directory, by analogy with make */
+ conf.file_prefix =
+ (argv[i + 1][0] == '-' ? "" : argv[i + 1]);
+ ++i;
+ continue;
+ case 'n':
+ conf.name_prefix =
+ (argv[i + 1][0] == '-' ? "" : argv[i + 1]);
+ ++i;
+ continue;
+ case 'p':
{
- case 'C': /* change directory, by analogy with make */
- conf.file_prefix =
- (argv[i + 1][0] == '-' ? "" : argv[i + 1]);
- ++i;
- continue;
- case 'n':
- conf.name_prefix =
- (argv[i + 1][0] == '-' ? "" : argv[i + 1]);
- ++i;
- continue;
- case 'p':
- { string_pattern *pat;
- switch ( *(arg += 2) )
- {
- case 'l': pat = &conf.lib_p; break;
- case 'L': pat = &conf.libpath_p; break;
- default: pat = &conf.obj_p; arg--;
- }
- pat->upper_case = false;
- pat->drop_extn = false;
- if ( argv[i + 1][0] == '-' )
- strcpy(pat->pattern, "%s\n");
- else
- { char *p, *q;
- for ( p = pat->pattern, q = argv[++i];
- (*p++ = *q++) != 0;
- )
- if ( p[-1] == '&' )
- switch ( *q )
- {
- case 'p': p[-1] = '%'; q++; break;
- case 's': p[-1] = ' '; q++; break;
- case '&': p[-1] = '\\'; q++; break;
- case '-': p[-1] = '-'; q++; break;
- default:
+ string_pattern *pat;
+
+ switch (*(arg += 2)) {
+ case 'l':
+ pat = &conf.lib_p;
+ break;
+ case 'L':
+ pat = &conf.libpath_p;
+ break;
+ default:
+ pat = &conf.obj_p;
+ arg--;
+ }
+ pat->upper_case = false;
+ pat->drop_extn = false;
+ if (argv[i + 1][0] == '-')
+ strcpy(pat->pattern, "%s\n");
+ else {
+ char *p, *q;
+
+ for (p = pat->pattern, q = argv[++i];
+ (*p++ = *q++) != 0;
+ )
+ if (p[-1] == '&')
+ switch (*q) {
+ case 'p':
+ p[-1] = '%';
+ q++;
+ break;
+ case 's':
+ p[-1] = ' ';
+ q++;
+ break;
+ case '&':
+ p[-1] = '\\';
+ q++;
+ break;
+ case '-':
+ p[-1] = '-';
+ q++;
+ break;
+ default:
fprintf(stderr,
- "& not followed by ps&-: &%c\n",
+ "& not followed by ps&-: &%c\n",
*q);
exit(1);
}
- p[-1] = '\n';
- *p = 0;
- }
- for ( ; ; )
- switch ( *++arg )
- {
- case 'u': pat->upper_case = true; break;
- case 'e': pat->drop_extn = true; break;
- case 0: goto pbreak;
- default:
+ p[-1] = '\n';
+ *p = 0;
+ }
+ for (;;)
+ switch (*++arg) {
+ case 'u':
+ pat->upper_case = true;
+ break;
+ case 'e':
+ pat->drop_extn = true;
+ break;
+ case 0:
+ goto pbreak;
+ default:
fprintf(stderr, "Unknown switch %s.\n", arg);
exit(1);
}
-pbreak: if ( pat == &conf.obj_p )
- { conf.lib_p = *pat;
- conf.libpath_p = *pat;
- }
- continue;
- case 'Z':
- conf.debug = 1;
- continue;
- }
+ pbreak:if (pat == &conf.obj_p) {
+ conf.lib_p = *pat;
+ conf.libpath_p = *pat;
+ }
+ continue;
+ case 'Z':
+ conf.debug = 1;
+ continue;
}
- /* Must be an output file. */
- out = fopen(argv[++i], "w");
- if ( out == 0 )
- { fprintf(stderr, "Can't open %s for output.\n",
- argv[i]);
- exit(1);
+ }
+ /* Must be an output file. */
+ out = fopen(argv[++i], "w");
+ if (out == 0) {
+ fprintf(stderr, "Can't open %s for output.\n",
+ argv[i]);
+ exit(1);
+ }
+ switch (arg[1]) {
+ case 'f':
+ fputs("/* This file was generated automatically by genconf.c. */\n", out);
+ fputs("/* For documentation, see gsconfig.c. */\n", out);
+ {
+ char template[80];
+
+ sprintf(template,
+ "font_(\"0.font_%%s\",%sf_%%s,zf_%%s)\n",
+ conf.name_prefix);
+ write_list(out, &conf.fonts, template);
}
- switch ( arg[1] )
+ break;
+ case 'h':
+ fputs("/* This file was generated automatically by genconf.c. */\n", out);
{
- case 'f':
- fputs("/* This file was generated automatically by genconf.c. */\n", out);
- fputs("/* For documentation, see gsconfig.c. */\n", out);
- { char template[80];
- sprintf(template,
- "font_(\"0.font_%%s\",%sf_%%s,zf_%%s)\n",
- conf.name_prefix);
- write_list(out, &conf.fonts, template);
- }
- break;
- case 'h':
- fputs("/* This file was generated automatically by genconf.c. */\n", out);
- { char template[80];
- sprintf(template, "device_(%s%%s_device)\n",
- conf.name_prefix);
- write_list(out, &conf.devs, template);
- }
- sort_uniq(&conf.resources);
- write_list(out, &conf.resources, "%s\n");
- write_list(out, &conf.headers, "#include \"%s\"\n");
- break;
- case 'l':
- lib = 1;
- obj = arg[2] == 'o';
- goto lo;
- case 'o':
- obj = 1;
- lib = arg[2] == 'l';
-lo: if ( obj )
- { sort_uniq(&conf.objs);
- write_list_pattern(out, &conf.objs, &conf.obj_p);
- }
- if ( lib )
- { sort_uniq(&conf.libs);
- write_list_pattern(out, &conf.libpaths, &conf.libpath_p);
- write_list_pattern(out, &conf.libs, &conf.lib_p);
- }
- break;
- default:
- fclose(out);
- fprintf(stderr, "Unknown switch %s.\n", argv[i]);
- exit(1);
+ char template[80];
+
+ sprintf(template, "device_(%s%%s_device)\n",
+ conf.name_prefix);
+ write_list(out, &conf.devs, template);
}
+ sort_uniq(&conf.resources);
+ write_list(out, &conf.resources, "%s\n");
+ write_list(out, &conf.headers, "#include \"%s\"\n");
+ break;
+ case 'l':
+ lib = 1;
+ obj = arg[2] == 'o';
+ goto lo;
+ case 'o':
+ obj = 1;
+ lib = arg[2] == 'l';
+ lo:if (obj) {
+ sort_uniq(&conf.objs);
+ write_list_pattern(out, &conf.objs, &conf.obj_p);
+ }
+ if (lib) {
+ sort_uniq(&conf.libs);
+ write_list_pattern(out, &conf.libpaths, &conf.libpath_p);
+ write_list_pattern(out, &conf.libs, &conf.lib_p);
+ }
+ break;
+ default:
fclose(out);
+ fprintf(stderr, "Unknown switch %s.\n", argv[i]);
+ exit(1);
}
+ fclose(out);
+ }
- exit(0);
+ exit(0);
}
/* Allocate and initialize a string list. */
int
-alloc_list(string_list *list)
-{ list->count = 0;
- list->items =
- (string_item *)calloc(list->max_count, sizeof(string_item));
- assert(list->items != NULL);
- return 0;
+alloc_list(string_list * list)
+{
+ list->count = 0;
+ list->items =
+ (string_item *) calloc(list->max_count, sizeof(string_item));
+ assert(list->items != NULL);
+ return 0;
}
/* Read an entire file into memory. */
/* We use the 'index' of the file_contents string_item to record the union */
/* of the uniq_modes of all (direct and indirect) items in the file. */
string_item *
-read_file(config *pconf, const char *fname)
-{ char *cname = malloc(strlen(fname) + strlen(pconf->file_prefix) + 1);
- int i;
- FILE *in;
- int end, nread;
- char *cont;
- string_item *item;
-
- if ( cname == 0 )
- { fprintf(stderr, "Can't allocate space for file name %s%s.\n",
- pconf->file_prefix, fname);
- exit(1);
- }
- strcpy(cname, pconf->file_prefix);
- strcat(cname, fname);
- for ( i = 0; i < pconf->file_names.count; ++i )
- if ( !strcmp(pconf->file_names.items[i].str, cname) )
- { free(cname);
- return &pconf->file_contents.items[i];
- }
- /* Try to open the file in binary mode, to avoid the overhead */
- /* of unnecessary EOL conversion in the C library. */
- in = fopen(cname, "rb");
- if ( in == 0 )
- { in = fopen(cname, "r");
- if ( in == 0 )
- { fprintf(stderr, "Can't read %s.\n", cname);
- exit(1);
- }
+read_file(config * pconf, const char *fname)
+{
+ char *cname = malloc(strlen(fname) + strlen(pconf->file_prefix) + 1);
+ int i;
+ FILE *in;
+ int end, nread;
+ char *cont;
+ string_item *item;
+
+ if (cname == 0) {
+ fprintf(stderr, "Can't allocate space for file name %s%s.\n",
+ pconf->file_prefix, fname);
+ exit(1);
+ }
+ strcpy(cname, pconf->file_prefix);
+ strcat(cname, fname);
+ for (i = 0; i < pconf->file_names.count; ++i)
+ if (!strcmp(pconf->file_names.items[i].str, cname)) {
+ free(cname);
+ return &pconf->file_contents.items[i];
}
- fseek(in, 0L, 2 /*SEEK_END*/);
- end = ftell(in);
- cont = malloc(end + 1);
- if ( cont == 0 )
- { fprintf(stderr, "Can't allocate %d bytes to read %s.\n",
- end + 1, cname);
- exit(1);
+ /* Try to open the file in binary mode, to avoid the overhead */
+ /* of unnecessary EOL conversion in the C library. */
+ in = fopen(cname, "rb");
+ if (in == 0) {
+ in = fopen(cname, "r");
+ if (in == 0) {
+ fprintf(stderr, "Can't read %s.\n", cname);
+ exit(1);
}
- rewind(in);
- nread = fread(cont, 1, end, in);
- fclose(in);
- cont[nread] = 0;
- if ( pconf->debug )
- printf("File %s = %d bytes.\n", cname, nread);
- add_item(&pconf->file_names, cname);
- item = add_item(&pconf->file_contents, cont);
- item->index = 0; /* union of uniq_modes */
- return item;
+ }
+ fseek(in, 0L, 2 /*SEEK_END */ );
+ end = ftell(in);
+ cont = malloc(end + 1);
+ if (cont == 0) {
+ fprintf(stderr, "Can't allocate %d bytes to read %s.\n",
+ end + 1, cname);
+ exit(1);
+ }
+ rewind(in);
+ nread = fread(cont, 1, end, in);
+ fclose(in);
+ cont[nread] = 0;
+ if (pconf->debug)
+ printf("File %s = %d bytes.\n", cname, nread);
+ add_item(&pconf->file_names, cname);
+ item = add_item(&pconf->file_contents, cont);
+ item->index = 0; /* union of uniq_modes */
+ return item;
}
/* Read and parse a .dev file. */
/* Return the union of all its uniq_modes. */
int
-read_dev(config *pconf, const char *arg)
-{ string_item *item;
- const char *in;
+read_dev(config * pconf, const char *arg)
+{
+ string_item *item;
+ const char *in;
+
#define max_token 256
- char *token = malloc(max_token + 1);
- char *category = malloc(max_token + 1);
- int len;
-
- if ( pconf->debug )
- printf("Reading %s;\n", arg);
- item = read_file(pconf, arg);
- if ( item->index == uniq_first )
- { /* Don't need to read the file again. */
- if ( pconf->debug )
- printf("Skipping duplicate file.\n");
- return uniq_first;
- }
- in = item->str;
- strcpy(category, "obj");
- while ( (len = read_token(token, max_token, &in)) > 0 )
- item->index |= add_entry(pconf, category, token);
- free(category);
+ char *token = malloc(max_token + 1);
+ char *category = malloc(max_token + 1);
+ int len;
+
+ if (pconf->debug)
+ printf("Reading %s;\n", arg);
+ item = read_file(pconf, arg);
+ if (item->index == uniq_first) { /* Don't need to read the file again. */
+ if (pconf->debug)
+ printf("Skipping duplicate file.\n");
+ return uniq_first;
+ }
+ in = item->str;
+ strcpy(category, "obj");
+ while ((len = read_token(token, max_token, &in)) > 0)
+ item->index |= add_entry(pconf, category, token);
+ free(category);
#undef max_token
- if ( len < 0 )
- { fprintf(stderr, "Token too long: %s.\n", token);
- exit(1);
- }
- if ( pconf->debug )
- printf("Finished %s.\n", arg);
- free(token);
- return item->index;
+ if (len < 0) {
+ fprintf(stderr, "Token too long: %s.\n", token);
+ exit(1);
+ }
+ if (pconf->debug)
+ printf("Finished %s.\n", arg);
+ free(token);
+ return item->index;
}
/* Read a token from a string that contains the contents of a file. */
int
read_token(char *token, int max_len, const char **pin)
-{ const char *in = *pin;
- int len = 0;
-
- while ( len < max_len )
- { char ch = *in;
- if ( ch == 0 )
- break;
- ++in;
- if ( isspace(ch) )
- { if ( len > 0 )
- break;
- continue;
- }
- token[len++] = ch;
+{
+ const char *in = *pin;
+ int len = 0;
+
+ while (len < max_len) {
+ char ch = *in;
+
+ if (ch == 0)
+ break;
+ ++in;
+ if (isspace(ch)) {
+ if (len > 0)
+ break;
+ continue;
}
- token[len] = 0;
- *pin = in;
- return (len >= max_len ? -1 /* token too long */ : len);
+ token[len++] = ch;
+ }
+ token[len] = 0;
+ *pin = in;
+ return (len >= max_len ? -1 /* token too long */ : len);
}
/* Add an entry to a configuration. */
/* Return its uniq_mode. */
int
-add_entry(config *pconf, char *category, const char *item)
-{ if ( item[0] == '-' ) /* set category */
- { strcpy(category, item + 1);
- return 0;
- }
- else /* add to current category */
- {
+add_entry(config * pconf, char *category, const char *item)
+{
+ if (item[0] == '-') { /* set category */
+ strcpy(category, item + 1);
+ return 0;
+ } else { /* add to current category */
#define max_str 120
- char str[max_str];
- char template[80];
- const char *pat = 0;
- string_list *list = &pconf->resources;
-
- if ( pconf->debug )
- printf("Adding %s %s;\n", category, item);
- /* Handle a few resources specially; just queue the rest. */
- switch ( category[0] )
- {
+ char str[max_str];
+ char template[80];
+ const char *pat = 0;
+ string_list *list = &pconf->resources;
+
+ if (pconf->debug)
+ printf("Adding %s %s;\n", category, item);
+ /* Handle a few resources specially; just queue the rest. */
+ switch (category[0]) {
#define is_cat(str) !strcmp(category, str)
- case 'd':
- if ( is_cat("dev") )
- { list = &pconf->devs; break; }
- goto err;
- case 'e':
- if ( is_cat("emulator") )
- { pat = "emulator_(\"%s\")"; break; }
- goto err;
- case 'f':
- if ( is_cat("font") )
- { list = &pconf->fonts; break; }
- goto err;
- case 'h':
- if ( is_cat("header") )
- { list = &pconf->headers; break; }
- goto err;
- case 'i':
- if ( is_cat("include") )
- { int len = strlen(item);
- strcpy(str, item);
- if ( len < 5 || strcmp(str + len - 4, ".dev") )
- strcat(str, ".dev");
- return read_dev(pconf, str);
- }
- if ( is_cat("includef") )
- { strcpy(str, item);
- strcat(str, ".dvc");
- return read_dev(pconf, str);
- }
- if ( is_cat("init") )
- { pat = "init_(%s%%s_init)"; }
- else if ( is_cat("iodev") )
- { pat = "io_device_(%siodev_%%s)"; }
- else
- goto err;
- sprintf(template, pat, pconf->name_prefix);
- pat = template;
- break;
- case 'l':
- if ( is_cat("lib") )
- { list = &pconf->libs; break; }
- if ( is_cat("libpath") )
- { list = &pconf->libpaths; break; }
- goto err;
- case 'o':
- if ( is_cat("obj") )
- { list = &pconf->objs;
- strcpy(template, pconf->file_prefix);
- strcat(template, "%s");
- pat = template;
- break;
- }
- if ( is_cat("oper") )
- { pat = "oper_(%s_op_defs)"; break; }
- goto err;
- case 'p':
- if ( is_cat("ps") )
- { pat = "psfile_(\"%s.ps\")"; break; }
- goto err;
-#undef is_cat
- default:
-err: fprintf(stderr, "Unknown category %s.\n", category);
- exit(1);
+ case 'd':
+ if (is_cat("dev")) {
+ list = &pconf->devs;
+ break;
+ }
+ goto err;
+ case 'e':
+ if (is_cat("emulator")) {
+ pat = "emulator_(\"%s\")";
+ break;
+ }
+ goto err;
+ case 'f':
+ if (is_cat("font")) {
+ list = &pconf->fonts;
+ break;
+ }
+ goto err;
+ case 'h':
+ if (is_cat("header")) {
+ list = &pconf->headers;
+ break;
+ }
+ goto err;
+ case 'i':
+ if (is_cat("include")) {
+ int len = strlen(item);
+
+ strcpy(str, item);
+ if (len < 5 || strcmp(str + len - 4, ".dev"))
+ strcat(str, ".dev");
+ return read_dev(pconf, str);
+ }
+ if (is_cat("includef")) {
+ strcpy(str, item);
+ strcat(str, ".dvc");
+ return read_dev(pconf, str);
+ }
+ if (is_cat("init")) {
+ pat = "init_(%s%%s_init)";
+ } else if (is_cat("iodev")) {
+ pat = "io_device_(%siodev_%%s)";
+ } else
+ goto err;
+ sprintf(template, pat, pconf->name_prefix);
+ pat = template;
+ break;
+ case 'l':
+ if (is_cat("lib")) {
+ list = &pconf->libs;
+ break;
+ }
+ if (is_cat("libpath")) {
+ list = &pconf->libpaths;
+ break;
}
- if ( pat )
- { sprintf(str, pat, item);
- assert(strlen(str) < max_str);
- add_item(list, str);
+ goto err;
+ case 'o':
+ if (is_cat("obj")) {
+ list = &pconf->objs;
+ strcpy(template, pconf->file_prefix);
+ strcat(template, "%s");
+ pat = template;
+ break;
}
- else
- add_item(list, item);
- return list->mode;
+ if (is_cat("oper")) {
+ pat = "oper_(%s_op_defs)";
+ break;
+ }
+ goto err;
+ case 'p':
+ if (is_cat("ps")) {
+ pat = "psfile_(\"%s.ps\")";
+ break;
+ }
+ goto err;
+#undef is_cat
+ default:
+ err:fprintf(stderr, "Unknown category %s.\n", category);
+ exit(1);
}
+ if (pat) {
+ sprintf(str, pat, item);
+ assert(strlen(str) < max_str);
+ add_item(list, str);
+ } else
+ add_item(list, item);
+ return list->mode;
+ }
}
/* Add an item to a list. */
string_item *
-add_item(string_list *list, const char *str)
-{ char *rstr = malloc(strlen(str) + 1);
- int count = list->count;
- string_item *item;
-
- strcpy(rstr, str);
- if ( count >= list->max_count )
- { list->max_count <<= 1;
- list->items =
- (string_item *)mrealloc(list->items,
- (list->max_count >> 1) *
- sizeof(string_item),
- list->max_count *
- sizeof(string_item));
- assert(list->items != NULL);
- }
- item = &list->items[count];
- item->index = count;
- item->str = rstr;
- list->count++;
- return item;
+add_item(string_list * list, const char *str)
+{
+ char *rstr = malloc(strlen(str) + 1);
+ int count = list->count;
+ string_item *item;
+
+ strcpy(rstr, str);
+ if (count >= list->max_count) {
+ list->max_count <<= 1;
+ list->items =
+ (string_item *) mrealloc(list->items,
+ (list->max_count >> 1) *
+ sizeof(string_item),
+ list->max_count *
+ sizeof(string_item));
+ assert(list->items != NULL);
+ }
+ item = &list->items[count];
+ item->index = count;
+ item->str = rstr;
+ list->count++;
+ return item;
}
/* Remove duplicates from a list of string_items. */
@@ -543,98 +596,111 @@ add_item(string_list *list, const char *str)
#define psi2 ((const string_item *)p2)
int
cmp_index(const void *p1, const void *p2)
-{ int cmp = psi1->index - psi2->index;
- return (cmp < 0 ? -1 : cmp > 0 ? 1 : 0);
+{
+ int cmp = psi1->index - psi2->index;
+
+ return (cmp < 0 ? -1 : cmp > 0 ? 1 : 0);
}
int
cmp_str(const void *p1, const void *p2)
-{ return strcmp(psi1->str, psi2->str);
+{
+ return strcmp(psi1->str, psi2->str);
}
#undef psi1
#undef psi2
void
-sort_uniq(string_list *list)
-{ string_item *strlist = list->items;
- int count = list->count;
- const string_item *from;
- string_item *to;
- int i;
- bool last = list->mode == uniq_last;
-
- if ( count == 0 )
- return;
- qsort((char *)strlist, count, sizeof(string_item), cmp_str);
- for ( from = to = strlist + 1, i = 1; i < count; from++, i++ )
- if ( strcmp(from->str, to[-1].str) )
+sort_uniq(string_list * list)
+{
+ string_item *strlist = list->items;
+ int count = list->count;
+ const string_item *from;
+ string_item *to;
+ int i;
+ bool last = list->mode == uniq_last;
+
+ if (count == 0)
+ return;
+ qsort((char *)strlist, count, sizeof(string_item), cmp_str);
+ for (from = to = strlist + 1, i = 1; i < count; from++, i++)
+ if (strcmp(from->str, to[-1].str))
*to++ = *from;
- else if ( (last ? from->index > to[-1].index :
- from->index < to[-1].index)
- )
+ else if ((last ? from->index > to[-1].index :
+ from->index < to[-1].index)
+ )
to[-1] = *from;
- count = to - strlist;
- list->count = count;
- qsort((char *)strlist, count, sizeof(string_item), cmp_index);
+ count = to - strlist;
+ list->count = count;
+ qsort((char *)strlist, count, sizeof(string_item), cmp_index);
}
/* Write a list of strings using a template. */
void
-write_list(FILE *out, const string_list *list, const char *pstr)
-{ string_pattern pat;
- pat.upper_case = false;
- pat.drop_extn = false;
- strcpy(pat.pattern, pstr);
- write_list_pattern(out, list, &pat);
+write_list(FILE * out, const string_list * list, const char *pstr)
+{
+ string_pattern pat;
+
+ pat.upper_case = false;
+ pat.drop_extn = false;
+ strcpy(pat.pattern, pstr);
+ write_list_pattern(out, list, &pat);
}
void
-write_list_pattern(FILE *out, const string_list *list, const string_pattern *pat)
-{ int i;
- char macname[40];
- int plen = strlen(pat->pattern);
- *macname = 0;
- for ( i = 0; i < list->count; i++ )
- { const char *lstr = list->items[i].str;
- int len = strlen(lstr);
- char *str = malloc(len + 1);
- int xlen = plen + len * 3;
- char *xstr = malloc(xlen + 1);
- char *alist;
- strcpy(str, lstr);
- if ( pat->drop_extn )
- { char *dot = str + len;
- while ( dot > str && *dot != '.' ) dot--;
- if ( dot > str ) *dot = 0, len = dot - str;
- }
- if ( pat->upper_case )
- { char *ptr = str;
- for ( ; *ptr; ptr++ )
- if ( islower(*ptr) ) *ptr = toupper(*ptr);
- }
- /* We repeat str for the benefit of patterns that */
- /* need the argument substituted in more than one place. */
- sprintf(xstr, pat->pattern, str, str, str);
- /* Check to make sure the item is within the scope of */
- /* an appropriate #ifdef, if necessary. */
- alist = strchr(xstr, '(');
- if ( alist != 0 && alist != xstr && alist[-1] == '_' )
- { *alist = 0;
- if ( strcmp(xstr, macname) )
- { if (*macname )
- fputs("#endif\n", out);
- fprintf(out, "#ifdef %s\n", xstr);
- strcpy(macname, xstr);
- }
- *alist = '(';
- }
- else
- { if ( *macname )
- { fputs("#endif\n", out);
- *macname = 0;
- }
- }
- fputs(xstr, out);
- free(xstr);
- free(str);
+write_list_pattern(FILE * out, const string_list * list, const string_pattern * pat)
+{
+ int i;
+ char macname[40];
+ int plen = strlen(pat->pattern);
+
+ *macname = 0;
+ for (i = 0; i < list->count; i++) {
+ const char *lstr = list->items[i].str;
+ int len = strlen(lstr);
+ char *str = malloc(len + 1);
+ int xlen = plen + len * 3;
+ char *xstr = malloc(xlen + 1);
+ char *alist;
+
+ strcpy(str, lstr);
+ if (pat->drop_extn) {
+ char *dot = str + len;
+
+ while (dot > str && *dot != '.')
+ dot--;
+ if (dot > str)
+ *dot = 0, len = dot - str;
+ }
+ if (pat->upper_case) {
+ char *ptr = str;
+
+ for (; *ptr; ptr++)
+ if (islower(*ptr))
+ *ptr = toupper(*ptr);
+ }
+ /* We repeat str for the benefit of patterns that */
+ /* need the argument substituted in more than one place. */
+ sprintf(xstr, pat->pattern, str, str, str);
+ /* Check to make sure the item is within the scope of */
+ /* an appropriate #ifdef, if necessary. */
+ alist = strchr(xstr, '(');
+ if (alist != 0 && alist != xstr && alist[-1] == '_') {
+ *alist = 0;
+ if (strcmp(xstr, macname)) {
+ if (*macname)
+ fputs("#endif\n", out);
+ fprintf(out, "#ifdef %s\n", xstr);
+ strcpy(macname, xstr);
+ }
+ *alist = '(';
+ } else {
+ if (*macname) {
+ fputs("#endif\n", out);
+ *macname = 0;
+ }
}
- if ( *macname )
- fputs("#endif\n", out);
+ fputs(xstr, out);
+ free(xstr);
+ free(str);
+ }
+ if (*macname)
+ fputs("#endif\n", out);
}