source: trunk/essentials/dev-lang/perl/vms/munchconfig.c@ 3221

Last change on this file since 3221 was 3181, checked in by bird, 19 years ago

perl 5.8.8

File size: 12.9 KB
Line 
1/* munchconfig.c
2
3 A very, very (very!) simple program to process a config_h.sh file on
4 non-unix systems.
5
6 usage:
7 munchconfig config.sh config_h.sh [foo=bar [baz=xyzzy [...]]] >config.h
8
9 which is to say, it takes as its firt parameter a config.sh (or
10 equivalent), as its second a config_h.sh (or equvalent), and a list of
11 optional tag=value pairs.
12
13 It spits the processed config.h out to STDOUT.
14
15 */
16
17#include <stdio.h>
18#include <errno.h>
19#include <stdlib.h>
20#include <string.h>
21#include <ctype.h>
22
23/* The failure code to exit with */
24#ifndef EXIT_FAILURE
25#ifdef VMS
26#define EXIT_FAILURE 0
27#else
28#define EXIT_FAILURE -1
29#endif
30#endif
31
32/* The biggest line we can read in from a file */
33#define LINEBUFFERSIZE 1024
34#define NUMTILDESUBS 30
35#define NUMCONFIGSUBS 1000
36#define TOKENBUFFERSIZE 80
37
38typedef struct {
39 char Tag[TOKENBUFFERSIZE];
40 char Value[512];
41} Translate;
42
43void tilde_sub(char [], Translate [], int);
44
45int
46main(int argc, char *argv[])
47{
48 FILE *ConfigSH, *Config_H;
49 char LineBuffer[LINEBUFFERSIZE], *TempValue, *StartTilde, *EndTilde;
50 char SecondaryLineBuffer[LINEBUFFERSIZE], OutBuf[LINEBUFFERSIZE];
51 char TokenBuffer[TOKENBUFFERSIZE];
52 int LineBufferLength, TempLength, DummyVariable, LineBufferLoop;
53 int TokenBufferLoop, ConfigSubLoop, GotIt, OutBufPos;
54 Translate TildeSub[NUMTILDESUBS]; /* Holds the tilde (~FOO~) */
55 /* substitutions */
56 Translate ConfigSub[NUMCONFIGSUBS]; /* Holds the substitutions from */
57 /* config.sh */
58 int TildeSubCount = 0, ConfigSubCount = 0; /* # of tilde substitutions */
59 /* and config substitutions, */
60 /* respectively */
61 if (argc < 3) {
62 printf("Usage: munchconfig config.sh config_h.sh [foo=bar [baz=xyzzy [...]]]\n");
63 exit(EXIT_FAILURE);
64 }
65
66
67 /* First, open the input files */
68 if (NULL == (ConfigSH = fopen(argv[1], "r"))) {
69 printf("Error %i trying to open config.sh file %s\n", errno, argv[1]);
70 exit(EXIT_FAILURE);
71 }
72
73 if (NULL == (Config_H = fopen(argv[2], "r"))) {
74 printf("Error %i trying to open config_h.sh file %s\n", errno, argv[2]);
75 exit(EXIT_FAILURE);
76 }
77
78 /* Any tag/value pairs on the command line? */
79 if (argc > 3) {
80 int i;
81 char WorkString[LINEBUFFERSIZE];
82 for (i=3; i < argc && argv[i]; i++) {
83
84 /* Local copy */
85 strcpy(WorkString, argv[i]);
86 /* Stick a NULL over the = */
87 TempValue = strchr(WorkString, '=');
88 *TempValue++ = '\0';
89
90 /* Copy the tag and value into the holding array */
91 strcpy(TildeSub[TildeSubCount].Tag, WorkString);
92 strcpy(TildeSub[TildeSubCount].Value, TempValue);
93 TildeSubCount++;
94 }
95 }
96
97 /* Now read in the config.sh file. */
98 while(fgets(LineBuffer, LINEBUFFERSIZE - 1, ConfigSH)) {
99 /* Force a trailing null, just in case */
100 LineBuffer[LINEBUFFERSIZE - 1] = '\0';
101
102 LineBufferLength = strlen(LineBuffer);
103
104 /* Chop trailing control characters */
105 while((LineBufferLength > 0) && (LineBuffer[LineBufferLength-1] < ' ')) {
106 LineBuffer[LineBufferLength - 1] = '\0';
107 LineBufferLength--;
108 }
109
110 /* If it's empty, then try again */
111 if (!*LineBuffer)
112 continue;
113
114 /* If the line begins with a '#' or ' ', skip */
115 if ((LineBuffer[0] == ' ') || (LineBuffer[0] == '#'))
116 continue;
117
118 /* We've got something. Guess we need to actually handle it */
119 /* Do the tilde substitution */
120 tilde_sub(LineBuffer, TildeSub, TildeSubCount);
121
122 /* Stick a NULL over the = */
123 TempValue = strchr(LineBuffer, '=');
124 *TempValue++ = '\0';
125 /* And another over the leading ', which better be there */
126 *TempValue++ = '\0';
127
128 /* Check to see if there's a trailing ' or ". If not, add a newline to
129 the buffer and grab another line. */
130 TempLength = strlen(TempValue);
131 while ((TempValue[TempLength-1] != '\'') &&
132 (TempValue[TempLength-1] != '"')) {
133 fgets(SecondaryLineBuffer, LINEBUFFERSIZE - 1, ConfigSH);
134 /* Force a trailing null, just in case */
135 SecondaryLineBuffer[LINEBUFFERSIZE - 1] = '\0';
136 /* Go substitute */
137 tilde_sub(SecondaryLineBuffer, TildeSub, TildeSubCount);
138 /* Tack a nweline on the end of our primary buffer */
139 strcat(TempValue, "\n");
140 /* Concat the new line we just read */
141 strcat(TempValue, SecondaryLineBuffer);
142
143 /* Refigure the length */
144 TempLength = strlen(TempValue);
145
146 /* Chop trailing control characters */
147 while((TempLength > 0) && (TempValue[TempLength-1] < ' ')) {
148 TempValue[TempLength - 1] = '\0';
149 TempLength--;
150 }
151 }
152
153 /* And finally one over the trailing ' */
154 TempValue[TempLength-1] = '\0';
155
156 /* Is there even anything left? */
157 if(*TempValue) {
158 /* Copy the tag over */
159 strcpy(ConfigSub[ConfigSubCount].Tag, LineBuffer);
160 /* Copy the value over */
161 strcpy(ConfigSub[ConfigSubCount].Value, TempValue);
162
163 /* Up the count */
164 ConfigSubCount++;
165
166 }
167 }
168
169 /* Okay, we've read in all the substititions from our config.sh */
170 /* equivalent. Read in the config_h.sh equiv and start the substitution */
171
172 /* First, eat all the lines until we get to one with !GROK!THIS! in it */
173 while(!strstr(fgets(LineBuffer, LINEBUFFERSIZE, Config_H),
174 "!GROK!THIS!")) {
175
176 /* Dummy statement to shut up any compiler that'll whine about an empty */