typo fixed
[metatemplate.git] / metatemplate.c
1 /*
2  *   metatemplate.c
3  *   metatemplate Vers. vERSIOn
4  *                    Copyright (C)  cOPYDATe  cOPYRIGHt
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  *     CONTACT:    cONTACt
21  *                 cONTAC2t
22  *
23  */
24
25 /*
26  * TODO:
27  *    verificare se e' corretto pensare che il nome del file da includere
28  *    e' tirato dentro in una botta sola 
29  *
30  */
31
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include <ctype.h>
36
37 #include "ffilter.h"
38
39 #define OUTPHP "./Pho"
40 #define OUTTEM "./Template"
41 #define OUTPRE "./Preview"
42 #define OUTOBJ "./Obj"
43
44 #define ST_FUORI 0
45 #define ST_HDINC 1
46 #define ST_HDOBJ 2
47 #define ST_INOBJ 3
48 #define ST_ININC 4
49 #define ST_HDELE 5
50 #define ST_HDELO 6
51 #define ST_INELE 7
52 #define ST_HDGTO 8
53
54 /*
55   bla bla bla
56 <!--MIOBJ:nomeoggetto--> 
57    <!--MI:nomeelemento--> elemento <!--/MI-->
58    <!--MI:nomeelemento2--> elemento2 <!--/MI-->
59    <!--MO:nomeelemento2-->Oggetto senza riferimento nel template<!--/MO-->
60    <!--MI:#--> parte solamente per preview <!--/MI-->
61    <!--MI:nomeelemento2--> elemento2 <!--/MI-->  
62    ....
63   <!--MI:nomeelementoN--> elementoN <!--/MI-->  
64   ble ble ble
65   ...........
66   blu blu blu
67 <!--/MIOBJ-->
68   ...........
69 <!--MINCL:nomeinclude-->
70   ...........
71   bli bli bli
72 <!--/MINCL-->
73   ...........
74   blo blo blo
75 <!--MIGTO:nomeoggetto--> 
76   blu blu blu
77   ...........
78  */
79
80 /* -- primo passaggio per estrarre le include definite nel sorgente -- */
81 #define W_PREOPINCL      0
82 #define W_PRECLINCL      1
83 char *keyprest[] = { "\n<!--MINCL:", "<!--/MINCL-->\n", NULL };
84
85 #define W_PRECLOSEI      0
86 char *keyprecl[] = { "-->", NULL };
87
88 /* -- secondo passaggio per il resto -- */
89 #define W_OPENMIGTO      0
90 #define W_OPENMINCL      1
91 #define W_CLOSMINCL      2
92 #define W_OPENMI         3
93 #define W_OPENMO         4
94
95 #define W_OPENMIOBJ      3
96 char *keyout[] = { "\n<!--MIGTO:", "\n<!--MINCL:", "<!--/MINCL-->\n", "\n<!--MIOBJ:", NULL };
97
98 #define W_CLOSETAG       0
99 char *keyclose[] = { "-->", NULL };
100
101 #define W_CLOSMIOBJ      5
102 char *keyele[] = { "\n<!--MIGTO:", "\n<!--MINCL:", "<!--/MINCL-->\n",
103                    "\n<!--MI:",    "\n<!--MO:", 
104                    "<!--/MIOBJ-->\n", NULL };
105
106 #define W_CLOSMI         5
107 #define W_CLOSMO         6
108 char *keyclele[] = { "\n<!--MIGTO:", "\n<!--MINCL:", "<!--/MINCL-->\n", 
109                      "\n<!--MI:",    "\n<!--MO:", 
110                      "<!--/MI-->\n", "<!--/MO-->\n", NULL };
111
112 #define NMAXFINC        16
113 FILE *fobji[NMAXFINC];
114 FILE *fobjp[NMAXFINC];
115 FILE *fobjt[NMAXFINC];
116 int nfinc = 0;
117
118 #define NMAXELE         16
119 #define LENMXELE     (10240 * 50)
120 char elem[NMAXELE][LENMXELE];
121 char eprefix[256];
122 int elempref[NMAXELE],dummy[NMAXELE],nelem = 0;
123
124
125 void appendfile(FILE *fap,FILE *fin)
126 {
127   int c;
128
129   while ((c = fgetc(fin)) != EOF)
130     fputc(c,fap);
131 }
132
133 char *addslash(char *s)
134 {
135   static char bf[2048];
136   char *p = bf;
137
138   for (; *s ; s++) {
139     if (*s == '\'' || *s == '\\') 
140       *p++ = '\\';
141     *p++ = *s;
142   }
143   *p = '\0';
144   // fprintf(stderr,"ADDSLA[%s]\n", bf);
145   return (bf);
146 }
147
148 char *tomaiu(char *s)
149 {
150   static char bf[2048];
151   char *p = bf;
152
153   for (; *s ; s++,p++)
154     *p = toupper(*s);
155   *p = '\0';
156   
157   return (bf);
158 }      
159
160 void outspace(FILE *fp,int nele)
161 {
162   int i;
163
164   for (i = 0 ; i < (nele*3) ; i++)
165     fputc(' ',fp);
166 }
167
168 void outtag(FILE *fp,char *s,int nele)
169 {
170   static int st = 0, c = 0;
171   static char bf[512];
172   int i;
173
174   for (i = 0 ; s[i] != '\0' ; i++) {
175     switch(st) {
176     case 0:
177       if (s[i] == '#') {
178         bf[0] = '#';
179         c = 1;
180         st = 1;
181       }
182       break;
183     case 1:
184       if (isalnum(s[i]) || s[i] == '_') 
185         bf[c++] = s[i];
186       else if (s[i] == '#') {
187         if (c == 1)
188           break;
189         bf[c++] = '#';
190         bf[c++] = '\0';
191         outspace(fp,nele);
192         fprintf(fp,"%s\n",tomaiu(bf));
193         st = 0;
194       }
195       else 
196         st = 0;
197       break;
198     }
199   }
200 }
201
202 int main(int argc, char **argv)
203 {
204   FIFILE *ff;
205   FILE *fpho,*ftemp,*fprev;
206   FILE *fpinfo;
207
208   char nome[256],bf[256],srcfile[512],nomefile[512],nomeobj[256],maiuobj[256];
209   int i,n,k,st = ST_FUORI,inobj = 0;
210   int nextst;
211   char **nextkeys;
212
213   fpinfo = stdout;
214
215   if (argc != 2)
216     exit(1);
217
218   eprefix[0] = '\0';
219   strcpy(nome,argv[1]);
220   for (n = 0 ; nome[n] != '.' && nome[n] != '\0' ; n++);
221   if (nome[n] == '\0') 
222     sprintf(srcfile,"%s.html",nome);
223   else {
224     strcpy(srcfile,nome);
225     nome[n] = '\0';
226   }
227
228   fprintf(fpinfo,"-------- includes creation --------\n");
229 /* -- PRIMO PASSAGGIO PER ESTRARRE LE INCLUDE DEFINITE NEL SORGENTE -- */
230   /* sprintf(nomefile,"%s.html",nome); */
231   if ((ff = ffopen(srcfile,keyprest)) == NULL)
232     exit(2);
233   while ((n = ffgetbin(bf,255,ff)) > -1) {
234     k = ffkstat(ff);
235     switch(st) {
236     case ST_FUORI:
237       for (i = 0 ; i < nfinc ; i++) 
238         fprintf(fobji[i],"%s",bf);
239       if (k == W_PREOPINCL) {
240         st = ST_HDINC;
241         ffchankeys(ff,keyprecl);
242       }
243       else if (k == W_PRECLINCL) {
244         if (nfinc == 0)
245           exit(3);
246         nfinc--;
247         fclose(fobji[nfinc]);
248       }
249       break;
250     case ST_HDINC:
251       if (nfinc == NMAXFINC || k != W_PRECLOSEI) {
252         exit(4);
253       }
254       sprintf(nomefile,"%s/%s.inc",OUTOBJ,bf);
255       if ((fobji[nfinc] = fopen(nomefile,"w")) == NULL)
256         exit (5);
257       fprintf(fpinfo,"created [%s]\n",nomefile);
258       nfinc++;
259       st = ST_FUORI;
260       ffchankeys(ff,keyprest);
261       break;
262     }
263   }
264   if (nfinc != 0)
265     exit(6);
266   ffclose(ff);
267
268   /* -- SECONDO PASSAGGIO PER IL RESTO -- */
269   fprintf(fpinfo,"-------- objects creation  --------\n");
270   /* sprintf(nomefile,"%s.html",nome); */
271   if ((ff = ffopen(srcfile,keyout)) == NULL)
272     exit(7);
273   sprintf(nomefile,"%s/%s.tmpl",OUTTEM,nome);
274   if ((ftemp = fopen(nomefile,"w")) == NULL)
275     exit(8);
276   sprintf(nomefile,"%s/%s.php",OUTPRE,nome);
277   if ((fprev = fopen(nomefile,"w")) == NULL)
278     exit(9);
279   st = ST_FUORI;
280   while ((n = ffgetbin(bf,255,ff)) > -1) {
281     //    fprintf(stderr,"BIN [%s]\n",bf);
282     k = ffkstat(ff);
283     // fprintf(stderr,"BF: [%s]  K: %d\n",bf,k);
284
285     switch(st) {
286     case ST_FUORI:
287       outtag(fpinfo,bf,nelem + inobj);
288       fprintf(ftemp,"%s",bf);
289       fprintf(fprev,"%s",bf);
290       if (k == W_OPENMIOBJ) {
291         st = ST_HDOBJ;
292         ffchankeys(ff,keyclose);
293       }
294       else if (k == W_OPENMIGTO || k == W_OPENMINCL) {
295         nextst = st;
296         nextkeys = ffgetkeys(ff);
297         ffchankeys(ff,keyclose);      
298         if (k == W_OPENMIGTO)
299           st = ST_HDGTO;
300         else
301           st = ST_HDINC;
302       }
303       break;
304     case ST_HDGTO:
305       sprintf(nomefile,"%s/%s.inc",OUTOBJ,bf);
306       if (!ffinclude(ff,nomefile)) {
307         fprintf(stderr,"Non trovato il file da includere %s\n",nomefile);
308         exit (10);
309       }
310       /* PIPPO CHECK */
311       if (k == W_CLOSETAG) {
312         st = nextst;    
313         ffchankeys(ff,nextkeys);
314       }
315       break;
316
317     case ST_HDINC:
318       /* PIPPO CHECK */
319       if (k == W_CLOSETAG) {
320         st = nextst;    
321         ffchankeys(ff,nextkeys);
322       }
323       break;
324
325
326     case ST_HDOBJ:
327       strcpy(nomeobj,bf);
328       strcpy(maiuobj,tomaiu(nomeobj));
329       sprintf(nomefile,"%s/%s.pho",OUTPHP,bf);
330       if ((fpho = fopen(nomefile,"w")) == NULL)
331         exit (11);
332       fprintf(fpho,"<?php /* generated from file \"%s.html\" */\n",nome);
333       fprintf(fpho,"  $%s = array();\n",nomeobj);
334       fprintf(fpinfo,"obj: %s\n",bf);
335       // inobj = 1;
336       /* PIPPO CHECK */
337       if (k == W_CLOSETAG) {
338         st = ST_INOBJ;
339         ffchankeys(ff,keyele);
340       }
341       break;
342     case ST_INOBJ:
343       outtag(fpinfo,bf,nelem + inobj);
344       fprintf(ftemp,"%s",bf);
345       fprintf(fprev,"%s",bf);
346       if (k == W_OPENMI) {
347         st = ST_HDELE;
348         ffchankeys(ff,keyclose);
349       }
350       else if (k == W_OPENMO) {
351         st = ST_HDELO;
352         ffchankeys(ff,keyclose);
353       }
354       else if (k == W_CLOSMIOBJ) {
355         fprintf(fpho,"?>");
356         fclose(fpho);
357
358         st = ST_FUORI;
359         ffchankeys(ff,keyout);
360         inobj = 0;
361         fprintf(fpinfo,"obj close\n");
362       }
363       else if (k == W_OPENMIGTO || k == W_OPENMINCL) {
364         nextst = st;
365         nextkeys = ffgetkeys(ff);
366         ffchankeys(ff,keyclose);      
367         if (k == W_OPENMIGTO)
368           st = ST_HDGTO;
369         else
370           st = ST_HDINC;
371       }
372       break;
373     case ST_HDELE:
374     case ST_HDELO:
375       if (!strcmp(bf,"#")) {
376         dummy[nelem] = 1;
377         outspace(fpinfo,nelem + inobj);
378         fprintf(fpinfo,"ele dummy:[%s]\n",bf);
379       }
380       else {
381         dummy[nelem] = 0;
382         elempref[nelem] = strlen(eprefix);
383         if (nelem == 0) {
384           /* strcpy(eprefix,nomeobj);
385              strcat(eprefix,"_"); */
386           strcpy(eprefix,bf);
387           if (st == ST_HDELE) {
388             fprintf(ftemp,"#%s_%s#",maiuobj,tomaiu(eprefix));
389           }
390           outspace(fpinfo,nelem + inobj);
391           if (st == ST_HDELE) 
392             printf("#%s_%s# ele:[%s]\n",
393                    maiuobj,tomaiu(eprefix),eprefix);
394           else
395             printf("ele:[%s] virtual\n",eprefix);
396         }
397         else {
398           strcat(eprefix,"_");
399           strcat(eprefix,bf);
400           outspace(fpinfo,nelem + inobj);
401           if (st == ST_HDELE) 
402             printf("#%s# ele:[%s]\n",
403                    tomaiu(eprefix),eprefix);
404           else
405             printf("ele:[%s] virtual\n",eprefix);
406         }
407         
408
409         if (nelem > 0) {
410           if (st == ST_HDELE) {
411             sprintf(bf,"#%s#",tomaiu(eprefix));
412             strcat(elem[nelem-1],bf);
413           }
414         }
415         sprintf(elem[nelem],"  $%s['%s'] = '",nomeobj,eprefix);
416       }
417       nelem++;
418       
419 /* magari lo mettiamo nella chiusura 
420         if (st == ST_HDELE) {
421           fprintf(ftemp,"#%s_%s#",maiuobj,tomaiu(bf));
422         }
423 */
424       /* PIPPO CHECK */
425       if (k == W_CLOSETAG) {
426         st = ST_INELE;
427         ffchankeys(ff,keyclele);
428       }
429       break;
430     case ST_INELE:
431       outtag(fpinfo,bf,nelem + inobj);
432       fprintf(fprev,"%s",bf);
433       if (!dummy[nelem-1])
434         strcat(elem[nelem-1],addslash(bf));
435
436       if (k == W_OPENMI) {
437         st = ST_HDELE;
438         ffchankeys(ff,keyclose);
439       }
440       else if (k == W_OPENMO) {
441         st = ST_HDELO;
442         ffchankeys(ff,keyclose);
443       }
444       else if (k == W_CLOSMI || k == W_CLOSMO) {
445         nelem--;
446         outspace(fpinfo,nelem + inobj);
447         fprintf(fpinfo,"ele close\n");
448         if (!dummy[nelem]) {
449           strcat(elem[nelem],"';\n");
450           fputs(elem[nelem],fpho);
451           eprefix[elempref[nelem]] = '\0';
452         }
453         if (nelem == 0) {
454           st = ST_INOBJ;
455           ffchankeys(ff,keyele);
456         }
457       }
458       else if (k == W_OPENMIGTO || k == W_OPENMINCL) {
459         nextst = st;
460         nextkeys = ffgetkeys(ff);
461         ffchankeys(ff,keyclose);      
462         if (k == W_OPENMIGTO)
463           st = ST_HDGTO;
464         else
465           st = ST_HDINC;
466       }
467       break;
468     }
469   }
470   fclose(ftemp);
471   fclose(fprev);
472   ffclose(ff);
473       
474   exit(0);
475   return (1);
476 }