Subversion Repositories shark

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 pj 1
 
2
#include <stdio.h>
3
#include <string.h>
4
#include <unistd.h>
5
 
6
#include "hconf.h"
7
 
8
static void visitcase(struct menuentry *menuent);
9
static void visitmenu(struct menuentry *menuent);
10
 
11
static void (*writevar)(struct variable *);
12
 
13
static void visitcase(struct menuentry *menuent)
14
{
15
  struct _case *list;
16
  list=menuent->x._case.list;
17
  while (list!=NULL) {
18
    if (!strcmp(list->value,menuent->x._case.var->value)) {      
19
      visitmenu(list->list);
20
      break;
21
    }
22
    list=list->next;
23
  }
24
  return;
25
}
26
 
27
static void visitmenu(struct menuentry *menuent)
28
{
29
  struct menuentry *ptr;
30
 
31
  ptr=menuent;
32
  while (ptr!=NULL) {
33
    switch(ptr->type) {
34
 
35
    case CASEENTRY: visitcase(ptr);break;
36
    case SUBMENUENTRY: visitmenu(ptr->x.submenu.menu->entries); break;
37
 
38
    case BOOLENTRY: writevar(ptr->x.bool.var); break;
39
    case TRISTATEENTRY: writevar(ptr->x.tristate.var); break;
40
    case RANGEENTRY: writevar(ptr->x.range.var); break;
41
    case CHOICEENTRY: writevar(ptr->x.choice.act->var); break;
42
    }
43
 
44
    ptr=ptr->next;
45
  }
46
 
47
  return;
48
}
49
 
50
/*
51
 *
52
 *
53
 *
54
 */
55
 
56
static FILE *fout;
57
static FILE *ftable[MAXFILETABLE];
58
 
59
static void write_hvar(struct variable *var)
60
{
61
  FILE *myfout;
62
  int t;
63
 
64
  if (var->fileindex!=NOFILEINDEX) myfout=ftable[var->fileindex];
65
  else myfout=fout;
66
 
67
  t=var->type;
68
  var->type=PRINTEDVAR;  
69
 
70
  switch (t) {
71
  case TRISTATEVAR:
72
    if (*var->value=='m')
73
      { fprintf(myfout,"#define %s 0\n",var->name); return; }
74
  case BOOLVAR:
75
    if (*var->value=='y')
76
      { fprintf(myfout,"#define %s 1\n",var->name); return; }
77
    fprintf(myfout,"#undef %s\n",var->name);
78
    return;
79
  case CHOICEVAR:
80
    fprintf(myfout,"#define %s 1\n",var->name);
81
    return;
82
  case RANGEVAR:
83
    fprintf(myfout,"#define %s %s\n",var->name,var->value);
84
    return;
85
  }
86
  return;
87
}
88
 
89
#if 0
90
static void write_makvar(struct variable *var)
91
{
92
  return;
93
}
94
#endif
95
 
96
/* -- */
97
 
98
char hmessage[]=
99
"/*\n"
100
" * This file is generated by a script\n"
101
" *\n"
102
" * (run 'make config' to change)\n"
103
" */\n"
104
"\n";
105
 
106
static int write_h(char *filename)
107
{
108
  int i;
109
 
110
  fout=fopen(filename,"wt");
111
  if (fout==NULL) return -1;
112
  fprintf(fout,"%s",hmessage);
113
  for (i=0;i<maxfileindex;i++) {
114
    ftable[i]=fopen(filetable[i],"wt");
115
    if (ftable[i]==NULL) return -3;
116
    fprintf(ftable[i],"%s",hmessage);    
117
  }
118
 
119
  writevar=write_hvar;
120
  visitmenu(mainmenu->entries);
121
 
122
  fprintf(fout,"\n");
123
  for (i=0;i<maxfileindex;i++) fprintf(ftable[i],"\n");
124
 
125
  for (i=0;i<nextvariable;i++)
126
    if (vartable[i].type!=PRINTEDVAR)
127
      fprintf(fout,"/* var %s %s */\n",vartable[i].name,vartable[i].value);
128
 
129
  fclose(fout);
130
  for (i=0;i<maxfileindex;i++) fclose(ftable[i]);
131
  return 0;
132
}
133
 
134
static int write_mak(char *filename)
135
{
136
  char buffer[256];
137
  int i;
138
  off_t pos;
139
 
140
  /* truncate file if necessary... */
141
  pos=0;
142
  fout=fopen(filename,"rt");
143
  if (fout!=NULL) {
144
    while (fgets(buffer,sizeof(buffer),fout)!=NULL)
145
      if (!strcmp(buffer,"# by a script (do not edit by hand)\n")) {
146
        pos=ftell(fout);
147
        break;
148
      }
149
    fclose(fout);
150
    if (pos) truncate(filename,pos);
151
  }
152
 
153
  /* open file */
154
  fout=fopen(filename,"at");
155
  if (fout==NULL) return -1;
156
 
157
  /* write all vars */
158
  if (!pos) {
159
    fprintf(fout,"\n#\n# the following lines are generated\n");
160
    fprintf(fout,"# by a script (do not edit by hand)\n#\n\n");
161
  }
162
  else fprintf(fout,"#\n\n");
163
 
164
  for (i=0;i<nextvariable;i++)
165
    fprintf(fout,"%s=%s\n",vartable[i].name,vartable[i].value);
166
 
167
  /* close file */
168
  fclose(fout);
169
  return 0;
170
}
171
 
172
/* -- */
173
 
174
int writeconfig(char *srcfilename)
175
{
176
  char buffer[256];
177
  char *ptr;
178
 
179
  ptr=strstr(srcfilename,".in");  
180
  if (ptr!=NULL) *ptr='\0';
181
  else {
182
    ptr=strchr(srcfilename,'.');
183
    if (ptr!=NULL) *ptr='\0';
184
  }
185
 
186
  strcpy(buffer,srcfilename);
187
  strcat(buffer,".h");
188
  write_h(buffer);
189
 
190
  return 0;
191
}
192
 
193
int writeconfigmak(char *srcfilename)
194
{
195
  char buffer[256];
196
  char *ptr;
197
 
198
  ptr=strstr(srcfilename,".in");  
199
  if (ptr!=NULL) *ptr='\0';
200
  else {
201
    ptr=strchr(srcfilename,'.');
202
    if (ptr!=NULL) *ptr='\0';
203
  }
204
 
205
  strcpy(buffer,srcfilename);
206
  strcat(buffer,".mak");
207
  write_mak(buffer);
208
 
209
  return 0;
210
}