home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / misc / lingua12 / lingua.c < prev    next >
C/C++ Source or Header  |  1993-05-21  |  8KB  |  225 lines

  1. /* --------------------------------------------*\
  2. | lingua.c (version 1.2) -- (C) SichemSoft 1993 |
  3. | Roghorst 160, 6708 KS Wageningen, Netherlands |
  4. | utility for language independent applications |
  5. | author: Anneke Sicherer-Roetman, date: 930521 |
  6. \* --------------------------------------------*/
  7.  
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include "lingua.h"
  11.  
  12. /* opens file with error checking */
  13. static FILE *openfile(char *name,char *mode)
  14. {
  15.    FILE *fp;
  16.  
  17.    fp=fopen(name,mode);
  18.    if (!fp) printf("%s not opened\n",name);
  19.    return fp;
  20. } /* openfile */
  21.  
  22. /* writes array size in text area of file */
  23. unsigned writesize(FILE *fp,unsigned long pos,unsigned size)
  24. {
  25.    unsigned long filpos; unsigned checksum; register int i;
  26.  
  27.    filpos=ftell(fp); fseek(fp,pos,SEEK_SET);
  28.    fwrite(&size,sizeof(size),1,fp);
  29.    fseek(fp,filpos,SEEK_SET);
  30.    for (i=0,checksum=0; i<sizeof(size); i++)
  31.       checksum+=((char*)(&size))[i]^UIT_ENCRYPT;
  32.    return checksum;
  33. }
  34.  
  35. /* main text processing routine */
  36. int main(int argc,char *argv[])
  37. {
  38.    FILE *txt,*etf,*header;
  39.    char fname[81],buf[256],linefeed[3],*p,*q;
  40.    unsigned long memoffset=0,filoffset=0,offset=0;
  41.    unsigned long filpos1=0,filpos2=0,filpos3=0;
  42.    unsigned memcount=0,filcount=0,lines=0,len=0,l=0;
  43.    unsigned checksum=0,headlen=0,arrsize=0;
  44.    unsigned array=FALSE,multi=FALSE,file=FALSE;
  45.  
  46.    /* copyright message and arguments check */
  47.    puts("Lingua v1.2 - (C)1993 SichemSoft Wageningen Netherlands");
  48.    if (argc!=2 && argc!=3) {
  49.       puts("lingua <file> [<version>]"); return 1;
  50.    }
  51.  
  52.    /* open all files */
  53.    strcpy(fname,argv[1]);
  54.    if (!strchr(fname,'.')) strcat(fname,".txt");
  55.    if ((txt=openfile(fname,"r"))==NULL) return 2;
  56.    if ((header=openfile("ui_text.h","w"))==NULL) return 2;
  57.    strcpy(strchr(fname,'.')+1,"etf");
  58.    if ((etf=openfile(fname,writeRA))==NULL) return 2;
  59.  
  60.    /* start of UI_TEXT.H */
  61.    fputs("/* ui_text.h */\n\n",header);
  62.    fputs("int ui_loadtext(char *fname,char *vers);\n",header);
  63.    fputs("void ui_unloadtext(void);\n",header);
  64.    fputs("char *ui_filetext(unsigned pos);\n",header);
  65.    fputs("char **ui_filearray(unsigned pos);\n",header);
  66.    fputs("extern char **ui_text;\n\n",header);
  67.  
  68.    /* start of .ETF (filename+version), checksum and counters */
  69.    fprintf(etf,"%s%s\032",fname,argc==3?argv[2]:"");
  70.    headlen=strlen(fname)+strlen(argc==3?argv[2]:"")+1;
  71.    filpos1=ftell(etf);
  72.    fwrite(&checksum,sizeof(checksum),1,etf);
  73.    fwrite(&memcount,sizeof(memcount),1,etf);
  74.    fwrite(&filcount,sizeof(memcount),1,etf);
  75.    fwrite(&memoffset,sizeof(memoffset),1,etf);
  76.  
  77.    /* count lines, determine offsets and write to .ETF and UI_TEXT.H */
  78.    while (fgets(buf,255,txt)) {
  79.       l=strlen(buf)-1; if (buf[l]=='\n') buf[l]='\0';
  80.       lines++;
  81.       if (!buf[0]) continue;
  82.       if (buf[0]=='#') { /* comment */
  83.          if (!strcmp(buf+1,"FILE")) {
  84.             if (file) goto fatal;
  85.             file=TRUE; filpos2=ftell(etf);
  86.          }
  87.          continue;
  88.       }
  89.       p=strchr(buf,' '); if (!p) goto fatal;
  90.       *p=0; p++; while (*p==' ') p++;
  91.       len=strlen(p); if (!strcmp(p,"-")) len=0;
  92.       l=strlen(buf)-1;
  93.       if (buf[l]=='[') { /* array identifier */
  94.          if (l>0) { /* first element */
  95.             buf[l]='\0'; array=TRUE; multi=FALSE;
  96.             if (file) fprintf(header,"#define %-30s (ui_filearray(%u))\n",buf,filcount);
  97.             else      fprintf(header,"#define %-30s (ui_text+%u)\n",buf,memcount);
  98.          } else { /* next element */
  99.             if (!array) goto fatal;
  100.          }
  101.          if (file) {
  102.             fwrite(&filoffset,sizeof(filoffset),1,etf);
  103.             filoffset+=len+1; filcount++;
  104.             if (l>0) filoffset+=sizeof(arrsize);
  105.          } else {
  106.             fwrite(&memoffset,sizeof(memoffset),1,etf);
  107.             memoffset+=len+1; memcount++;
  108.          }
  109.       } else if (buf[l]=='/') { /* multi line text */
  110.          if (l>0) { /* first line */
  111.             buf[l]='\0'; multi=TRUE; array=FALSE;
  112.             if (file) {
  113.                fprintf(header,"#define %-30s ui_filetext(%u)\n",buf,filcount);
  114.                fwrite(&filoffset,sizeof(filoffset),1,etf);
  115.                filoffset+=len+1; filcount++;
  116.             } else {
  117.                fprintf(header,"#define %-30s ui_text[%u]\n",buf,memcount);
  118.                fwrite(&memoffset,sizeof(memoffset),1,etf);
  119.                memoffset+=len+1; memcount++;
  120.             }
  121.          } else { /* next line */
  122.             if (file) filoffset+=len+strlen(lf);
  123.                  else memoffset+=len+strlen(lf);
  124.             if (!multi) goto fatal;
  125.          }
  126.       } else { /* normal identifier */
  127.          array=FALSE; multi=FALSE;
  128.          if (file) {
  129.             fprintf(header,"#define %-30s ui_filetext(%u)\n",buf,filcount);
  130.             fwrite(&filoffset,sizeof(filoffset),1,etf);
  131.             filoffset+=len+1; filcount++;
  132.          } else {
  133.             fprintf(header,"#define %-30s ui_text[%u]\n",buf,memcount);
  134.             fwrite(&memoffset,sizeof(memoffset),1,etf);
  135.             memoffset+=len+1; memcount++;
  136.          }
  137.       }
  138.    }
  139.    if (file) fwrite(&filoffset,sizeof(filoffset),1,etf);
  140.  
  141.    /* encrypt lines and write to .ETF */
  142.    rewind(txt); array=multi=file=FALSE;
  143.    strcpy(linefeed,lf); for (l=0; linefeed[l]; l++) linefeed[l]^=UIT_ENCRYPT;
  144.    while (fgets(buf,255,txt)) {
  145.       l=strlen(buf)-1; if (buf[l]=='\n') buf[l]='\0';
  146.       if (!buf[0]) continue;
  147.       if (buf[0]=='#') { /* comment */
  148.          if (!strcmp(buf+1,"FILE")) file=TRUE;
  149.          continue;
  150.       }
  151.       p=strchr(buf,' ');
  152.       *p=0; p++; while (*p==' ') p++;
  153.       len=strlen(p); if (!strcmp(p,"-")) p[0]='\0';
  154.       for (q=p; *q=='_'; q++) *q=' ';
  155.       for (q=p+len-1; *q=='_'; q--) *q=' ';
  156.       l=strlen(buf)-1; len=strlen(p)+1;
  157.       if (buf[l]=='[') { /* array identifier */
  158.          if (file) {
  159.             if (l>0) {
  160.                filpos3=ftell(etf);
  161.                fwrite(&arrsize,sizeof(arrsize),1,etf);
  162.                array=TRUE; arrsize=1;
  163.             } else arrsize++;
  164.          }
  165.          if (multi) putc('\0'^UIT_ENCRYPT,etf);
  166.          multi=FALSE;
  167.       } else if (buf[l]=='/') { /* multi line text */
  168.          if (l==0 && multi) { fputs(linefeed,etf); checksum+=lfchk; }
  169.          if (l>0) {
  170.             if (file && array) {
  171.                checksum+=writesize(etf,filpos3,arrsize);
  172.                array=FALSE;
  173.             }
  174.             if (multi) putc('\0'^UIT_ENCRYPT,etf);
  175.             multi=TRUE;
  176.          }
  177.       } else { /* normal identifier */
  178.          if (file && array) {
  179.             checksum+=writesize(etf,filpos3,arrsize);
  180.             array=FALSE;
  181.          }
  182.          if (multi) putc('\0'^UIT_ENCRYPT,etf);
  183.          multi=FALSE;
  184.       }
  185.       for (q=p; *q; q++) {
  186.          checksum+=(unsigned char)(*q); *q^=UIT_ENCRYPT; putc(*q,etf);
  187.       }
  188.       if (!multi) putc('\0'^UIT_ENCRYPT,etf);
  189.    }
  190.    if (multi) putc('\0'^UIT_ENCRYPT,etf);
  191.    if (file && array) checksum+=writesize(etf,filpos3,arrsize);
  192.  
  193.    /* write checksum and number of items and bytes to .ETF */
  194.    fseek(etf,filpos1,SEEK_SET);
  195.    fwrite(&checksum,sizeof(checksum),1,etf);
  196.    fwrite(&memcount,sizeof(memcount),1,etf);
  197.    fwrite(&filcount,sizeof(memcount),1,etf);
  198.    fwrite(&memoffset,sizeof(memoffset),1,etf);
  199.  
  200.    /* correct file item offsets */
  201.    if (filcount) {
  202.       fseek(etf,filpos2,SEEK_SET);
  203.       offset=headlen+sizeof(checksum)+sizeof(memcount)+sizeof(filcount)+
  204.              sizeof(memoffset)+memcount*sizeof(memoffset)+
  205.              (filcount+1)*sizeof(filoffset)+memoffset;
  206.       for (l=0; l<filcount+1; l++) {
  207.          filpos2=ftell(etf);
  208.          fread(&filoffset,sizeof(filoffset),1,etf);
  209.          fseek(etf,filpos2,SEEK_SET); filoffset+=offset;
  210.          fwrite(&filoffset,sizeof(filoffset),1,etf);
  211.          fseek(etf,0,SEEK_CUR); /* to enable read after write ! */
  212.       }
  213.    }
  214.  
  215.    /* close all files */
  216.    fclose(txt); fclose(etf); fclose(header);
  217.    printf("%u memory items (%lu bytes), ",memcount,memoffset);
  218.    printf("%u file items (%lu bytes)\n",filcount,filoffset-offset);
  219.  
  220.    return 0;
  221.  
  222. fatal: printf("fatal error in text file at line %d\n",lines);
  223.    return 3;
  224. }
  225.