sync with changes to 1.9.18 tree
[samba.git] / source / utils / make_printerdef.c
1  /*
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    Create printer definition files.
5
6    Copyright (C) Jean-Francois.Micouleau@utc.fr, 10/26/97 - 1998
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23 #include "includes.h"
24
25 /*
26 #define DEBUGIT
27 */
28 char *files_to_copy;
29 char *driverfile, *datafile, *helpfile, *languagemonitor, *datatype;
30 char buffer[50][255];
31 char sub_dir[50][2][255];
32
33 void usage(char *name)
34 {
35  fprintf(stderr,"%s: printer.def \"Printer Name\"\n", name);
36 }
37
38 /*
39    This function split a line in two parts
40    on both side of the equal sign
41    "entry=value"
42 */
43 char *scan(char *chaine,char **entry)
44 {
45   char *value;
46   char *temp;
47   int i=0;
48  
49   *entry=(char *)malloc(255*sizeof(char));
50   value=(char *)malloc(255*sizeof(char));
51   strcpy(*entry,chaine);
52   temp=chaine;
53   while( temp[i]!='=' && temp[i]!='\0') {
54         i++;
55   }
56   (*entry)[i]='\0'; 
57   strcpy(value,temp+i+1);      
58   return (value);
59 }
60
61 void build_subdir()
62 {
63   int i=0;
64   char *entry;
65   char *data;
66  
67   while (*buffer[i]!='\0') { 
68     data=scan(buffer[i],&entry);
69 #ifdef DEBUGIT
70     fprintf(stderr,"\tentry=data %s:%s\n",entry,data);
71 #endif      
72
73     if (strcmp(data,"11")==0) {
74       strcpy(sub_dir[i][0],entry);
75       strcpy(sub_dir[i][1],"");
76     }
77     if (strcmp(data,"23")==0) {
78       strcpy(sub_dir[i][0],entry);
79       strcpy(sub_dir[i][1],"color\\");
80     }
81 #ifdef DEBUGIT
82     fprintf(stderr,"\tsubdir %s:%s\n",sub_dir[i][0],sub_dir[i][1]);
83 #endif      
84     i++;
85   }
86 }
87
88 /*
89    Lockup an entry in a file
90    Return all the lines between the entry and the next one or the end of file
91    An entry is something between braces.
92 */
93 void lookup_entry(FILE *fichier,char *chaine)
94 {
95   int found=0,pointeur=0,i=0;
96   char *temp,*temp2;
97   
98   temp=(char *)malloc(255*sizeof(char));
99   temp2=(char *)malloc(255*sizeof(char));
100   
101   *buffer[0]='\0';
102   
103   strcpy(temp2,"[");
104   strcat(temp2,chaine);
105   strcat(temp2,"]");
106   
107   rewind(fichier);
108 #ifdef DEBUGIT
109   fprintf(stderr,"\tLooking for %s\n",chaine);
110 #endif
111   
112   while (!feof(fichier) && found==0) {
113         *temp='\0';
114         fgets(temp,255,fichier);
115         if (strncmp(temp,temp2,strlen(temp2))==0) found=1;
116   }
117
118
119   while (!feof(fichier) && found==1) {
120         *temp='\0';
121         fgets(temp,255,fichier);
122         if (*temp=='[') {
123                 found=2;
124                 *buffer[pointeur]='\0';
125         }
126         else {
127                 strcpy(buffer[pointeur],temp);
128                 i=strlen(buffer[pointeur])-1;
129                 while (buffer[pointeur][i]=='\r' || buffer[pointeur][i]=='\n')
130                         buffer[pointeur][i--]='\0';
131                 pointeur++;
132         }  
133   }
134 #ifdef DEBUGIT
135   fprintf(stderr,"\t\tFound %d entries\n",pointeur-1);
136 #endif
137 }
138
139
140
141 char *find_desc(FILE *fichier,char *text)
142 {
143   char *chaine;
144   char *long_desc;
145   char *short_desc;
146   char *crap = NULL;
147   char *p;
148
149   int found=0;
150
151   chaine=(char *)malloc(255*sizeof(char));
152   long_desc=(char *)malloc(40*sizeof(char));
153   short_desc=(char *)malloc(40*sizeof(char));
154
155   while (!feof(fichier) && found==0)
156   {
157     fgets(chaine,255,fichier);
158
159     long_desc=strtok(chaine,"=");
160     crap=strtok(NULL,",\r");
161
162     p=long_desc;
163     while(*p!='"' && *p!='\0')
164      p++;
165     if (*p=='"' && *(p+1)!='\0') p++;       
166     long_desc=p;
167
168     if (*p!='\0')
169     {
170       p++;
171       while(*p!='\"')
172        p++;
173       *p='\0';
174     }
175     if (!strcmp(text,long_desc)) 
176         found=1;
177   }
178   free(chaine);
179   if (!found || !crap) return(NULL);
180   while(*crap==' ') crap++;
181   strcpy(short_desc,crap);
182   return(short_desc);
183 }
184
185 void scan_copyfiles(FILE *fichier, char *chaine)
186 {
187   char *part;
188   int i;
189   char direc[255];
190 #ifdef DEBUGIT
191   fprintf(stderr,"In scan_copyfiles Lookup up of %s\n",chaine);
192 #endif 
193   fprintf(stderr,"\nCopy the following files to your printer$ share location:\n");
194   part=strtok(chaine,",");
195   do {
196      /* If the entry start with a @ then it's a file to copy
197      else it's an entry refering to files to copy
198      the main difference is when it's an entry
199      you can have a directory to append before the file name
200     */
201     if (*part=='@') {
202       if (strlen(files_to_copy) != 0)
203         strcat(files_to_copy,",");
204       strcat(files_to_copy,&part[1]);
205       fprintf(stderr,"%s\n",&part[1]);
206     } else {
207       lookup_entry(fichier,part);
208       i=0;
209       strcpy(direc,"");
210       while (*sub_dir[i][0]!='\0') {
211 #ifdef DEBUGIT
212         fprintf(stderr,"\tsubdir %s:%s\n",sub_dir[i][0],sub_dir[i][1]);
213 #endif      
214         if (strcmp(sub_dir[i][0],part)==0)
215                 strcpy(direc,sub_dir[i][1]);
216         i++;
217       } 
218       i=0;
219       while (*buffer[i]!='\0') {
220         part = &buffer[i][strlen(buffer[i])-1];
221         if (*part == '=')
222           *part = '\0';
223         if (strlen(files_to_copy) != 0)
224           strcat(files_to_copy,",");
225         strcat(files_to_copy,direc);
226         strcat(files_to_copy,buffer[i]);
227         fprintf(stderr,"%s%s\n",direc,buffer[i]);
228         i++;
229       } 
230     }
231     part=strtok(NULL,",");
232   }
233   while (part!=NULL);
234   fprintf(stderr,"\n");
235 }
236
237
238 void scan_short_desc(FILE *fichier, char *short_desc)
239 {
240   int i=0;
241   char *chaine;
242   char *temp;
243   char *copyfiles=0,*datasection=0;
244  
245   helpfile=0;
246   languagemonitor=0;
247   datatype="RAW";
248   chaine=(char *)malloc(255*sizeof(char));
249   temp=(char *)malloc(255*sizeof(char));
250   
251   driverfile=short_desc;
252   datafile=short_desc;
253
254   lookup_entry(fichier,short_desc);
255
256   while(*buffer[i]!='\0') {
257 #ifdef DEBUGIT
258     fprintf(stderr,"\tLookup up of %s\n",buffer[i]);
259 #endif
260     if (strncmp(buffer[i],"CopyFiles",9)==0) 
261         copyfiles=scan(buffer[i],&temp);
262     else if (strncmp(buffer[i],"DataSection",11)==0) 
263         datasection=scan(buffer[i],&temp);
264     else if (strncmp(buffer[i],"DataFile",8)==0) 
265         datafile=scan(buffer[i],&temp);
266     else if (strncmp(buffer[i],"DriverFile",10)==0) 
267         driverfile=scan(buffer[i],&temp);
268     else if (strncmp(buffer[i],"HelpFile",8)==0) 
269         helpfile=scan(buffer[i],&temp);
270     else if (strncmp(buffer[i],"LanguageMonitor",15)==0) 
271         languagemonitor=scan(buffer[i],&temp);
272     else if (strncmp(buffer[i],"DefaultDataType",15)==0) 
273         datatype=scan(buffer[i],&temp);
274     i++;        
275   }
276
277   if (datasection) {
278     lookup_entry(fichier,datasection);
279
280     i = 0;
281     while(*buffer[i]!='\0') {
282 #ifdef DEBUGIT
283       fprintf(stderr,"\tLookup up of %s\n",buffer[i]);
284 #endif
285       if (strncmp(buffer[i],"CopyFiles",9)==0) 
286           copyfiles=scan(buffer[i],&temp);
287       else if (strncmp(buffer[i],"DataSection",11)==0) 
288           datasection=scan(buffer[i],&temp);
289       else if (strncmp(buffer[i],"DataFile",8)==0) 
290           datafile=scan(buffer[i],&temp);
291       else if (strncmp(buffer[i],"DriverFile",10)==0) 
292           driverfile=scan(buffer[i],&temp);
293       else if (strncmp(buffer[i],"HelpFile",8)==0) 
294           helpfile=scan(buffer[i],&temp);
295       else if (strncmp(buffer[i],"LanguageMonitor",15)==0) 
296           languagemonitor=scan(buffer[i],&temp);
297       else if (strncmp(buffer[i],"DefaultDataType",15)==0) 
298           datatype=scan(buffer[i],&temp);
299       i++;      
300     }
301   }
302
303   if (languagemonitor && (*languagemonitor == '%')) {
304     ++languagemonitor;
305     languagemonitor[strlen(languagemonitor)-1] = '\0';
306     lookup_entry(fichier,"Strings");
307     i = 0;
308     while(*buffer[i]!='\0') {
309 #ifdef DEBUGIT
310       fprintf(stderr,"\tLookup up of %s\n",buffer[i]);
311 #endif
312       if (strncmp(buffer[i],languagemonitor,strlen(languagemonitor))==0)
313       {
314         temp = strtok(buffer[i],"=");
315         temp = strtok(NULL,",");
316         if (*temp == '"') ++temp;
317         strcpy(languagemonitor,temp);
318         break;
319       }
320       i++;      
321     }
322   }
323
324   if (i) fprintf(stderr,"End of section found\n");
325  
326   fprintf(stderr,"CopyFiles: %s\n",copyfiles);
327   fprintf(stderr,"Datasection: %s\n",datasection);
328   fprintf(stderr,"Datafile: %s\n",datafile);
329   fprintf(stderr,"Driverfile: %s\n",driverfile);
330   fprintf(stderr,"Helpfile: %s\n",helpfile);
331   fprintf(stderr,"LanguageMonitor: %s\n",languagemonitor);
332   if (copyfiles) scan_copyfiles(fichier,copyfiles);
333 }
334
335 int main(int argc, char *argv[])
336 {
337   char *short_desc;
338   FILE *inf_file;
339
340   if (argc!=3)
341   {
342     usage(argv[0]);
343     return(-1);
344   }
345
346   inf_file=fopen(argv[1],"r");  
347   if (!inf_file)
348   {
349     fprintf(stderr,"Description file not found, bye\n");
350     return(-1);
351   }
352
353   short_desc=find_desc(inf_file,argv[2]);
354   if (short_desc==NULL)
355   {
356     fprintf(stderr,"Printer not found\n");
357     return(-1);
358   }
359   else fprintf(stderr,"Found:%s\n",short_desc);
360
361   lookup_entry(inf_file,"DestinationDirs");
362   build_subdir();
363
364   files_to_copy=(char *)malloc(2048*sizeof(char));
365   *files_to_copy='\0';
366   scan_short_desc(inf_file,short_desc);
367   fprintf(stdout,"%s:%s:%s:",
368     argv[2],driverfile,datafile);
369   fprintf(stdout,"%s:",
370     helpfile?helpfile:"");
371   fprintf(stdout,"%s:",
372     languagemonitor?languagemonitor:"");
373   fprintf(stdout,"%s:",datatype);
374   fprintf(stdout,"%s\n",files_to_copy);
375   return 0;
376 }
377