home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / LINGUA12.ZIP / UI_TEXT.C < prev    next >
C/C++ Source or Header  |  1993-05-21  |  6KB  |  176 lines

  1. /* --------------------------------------------*\
  2. | ui_text.c (version 1.2) - (C) SichemSoft 1993 |
  3. | Roghorst 160, 6708 KS Wageningen, Netherlands |
  4. | module  for language independent applications |
  5. | author: Anneke Sicherer-Roetman, date: 930521 |
  6. \* --------------------------------------------*/
  7.  
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11. #include "lingua.h"
  12. #include "files.inc"
  13.  
  14. char **ui_text;                       /* pointers into memory text buffer */
  15. static char *ui_textbuffer;           /* memory text buffer */
  16. static unsigned long *ui_file;        /* pointers into file */
  17. static char *ui_filebuffer;           /* file text buffer */
  18. static char **ui_fileptr;             /* pointers into array from file */
  19. static unsigned itemchecksum=0;       /* for checksumming file items */
  20.  
  21. /* converts string to all lower case (common ANSI extension) */
  22. static char *strlwr(char *s)
  23. {
  24.    char *p;
  25.    for (p=s; *s; s++) if (isupper(*s)) *s=tolower(*s);
  26.    return p;
  27. }
  28.  
  29. /* decrypts text and computes checksum */
  30. static unsigned decrypt(char *buffer,unsigned long size)
  31. {
  32.    register unsigned long offset;
  33.    unsigned checksum;
  34.    char *q;
  35.  
  36.    for (offset=0,checksum=0,q=buffer; offset<size; offset++,q++) {
  37.       *q^=UIT_ENCRYPT; checksum+=(unsigned char)(*q);
  38.    }
  39.    return checksum;
  40. }
  41.  
  42. /* loads text from file into ui_filebuffer */
  43. static char *loadtext(unsigned long pos,unsigned size)
  44. {
  45.    static unsigned long oldpos=(unsigned long)(-1L);
  46.  
  47.    if (pos==oldpos) return ui_filebuffer;
  48.    if (!fileseek(pos)) return NULL;
  49.    if (ui_filebuffer) free(ui_filebuffer);
  50.    ui_filebuffer=(char *)malloc(size*sizeof(char));
  51.    if (!ui_filebuffer) return NULL;
  52.    if (!fileread(ui_filebuffer,size*sizeof(char))) return NULL;
  53.    itemchecksum=decrypt(ui_filebuffer,size);
  54.    oldpos=pos; /* next time only load if necessary */
  55.    return ui_filebuffer;
  56. }
  57.  
  58. /* loads text (no array) from file into ui_filebuffer */
  59. /* note: the programmer should not call this routine directly */
  60. char *ui_filetext(unsigned pos)
  61. {
  62.    return loadtext(ui_file[pos],ui_file[pos+1]-ui_file[pos]);
  63. }
  64.  
  65. /* loads text array from file into ui_filebuffer */
  66. /* note: the programmer should not call this routine directly */
  67. char **ui_filearray(unsigned pos)
  68. {
  69.    unsigned size; register int i;
  70.  
  71.    if (!fileseek(ui_file[pos])) return NULL;
  72.    if (!fileread(&size,sizeof(size))) return NULL;
  73.    if (!loadtext(filetell(),ui_file[pos+size]-ui_file[pos]-sizeof(size)))
  74.       return NULL;
  75.    if (ui_fileptr) free(ui_fileptr);
  76.    ui_fileptr=(char **)malloc(size*sizeof(char*));
  77.    if (!ui_fileptr) return NULL;
  78.    ui_fileptr[0]=ui_filebuffer;
  79.    for (i=1; i<size; i++)
  80.       ui_fileptr[i]=ui_filebuffer+ui_file[pos+i]-ui_file[pos]-sizeof(size);
  81.    return ui_fileptr;
  82. }
  83.  
  84. /* opens file, loads text and offsets into memory */
  85. /* call this routine at the very beginning of the application */
  86. int ui_loadtext(char *fname,char *vers)
  87. /* fname is name of desired .etf file without extension
  88.    vers is optional version number, may also be "" */
  89. {
  90.    char *q;
  91.    unsigned len,i,memcount,filcount;
  92.    unsigned checksum,checksum1=0,checksum2=0;
  93.    char buf[256],file[81];
  94.    unsigned long offset,size;
  95.  
  96.    if (ui_text || ui_file) return FALSE;
  97.  
  98.    /* open encrypted text file */
  99.    strcpy(file,fname);
  100.    if (!strchr(file,'.')) strcat(file,".etf");
  101.    if (!fileopen(file)) return FALSE;
  102.  
  103.    /* read file header */
  104.    if (!vers) vers="";
  105.    q=strrchr(file,'\\'); if (q) q++; else q=file;
  106.    len=strlen(q)+strlen(vers);
  107.    if (!fileread(buf,(len+1)*sizeof(char))) return FALSE;
  108.    strlwr(buf); strlwr(q); strlwr(vers);
  109.    if (strncmp(buf,q,strlen(q))) return FALSE;
  110.    if (strncmp(buf+strlen(q),vers,strlen(vers))) return FALSE;
  111.  
  112.    /* read number of items */
  113.    if (!fileread(&checksum,sizeof(checksum))) return FALSE;
  114.    if (!fileread(&memcount,sizeof(memcount))) return FALSE;
  115.    if (!fileread(&filcount,sizeof(filcount))) return FALSE;
  116.    if (!fileread(&size,sizeof(size))) return FALSE;
  117.    if (memcount) {
  118.       /* reserve space */
  119.       ui_text=(char **)malloc(memcount*sizeof(char *));
  120.       if (!ui_text) return FALSE;
  121.       ui_textbuffer=(char *)malloc(size*sizeof(char));
  122.       if (!ui_textbuffer) return FALSE;
  123.  
  124.       /* read offsets and compute pointers */
  125.       for (i=0; i<memcount; i++) {
  126.          if (!fileread(&offset,sizeof(offset))) return FALSE;
  127.          ui_text[i]=ui_textbuffer+offset;
  128.       }
  129.    }
  130.  
  131.    if (filcount) {
  132.       /* reserve space */
  133.       ui_file=(unsigned long *)malloc((filcount+1)*sizeof(unsigned long));
  134.       if (!ui_file) return FALSE;
  135.  
  136.       /* read offsets of file items */
  137.       for (i=0; i<filcount+1; i++) {
  138.          if (!fileread(&offset,sizeof(offset))) return FALSE;
  139.          ui_file[i]=offset;
  140.       }
  141.    }
  142.  
  143.    if (memcount) {
  144.       /* read text lines and decrypt */
  145.       if (!fileread(ui_textbuffer,size*sizeof(char))) return FALSE;
  146.       checksum1=decrypt(ui_textbuffer,size);
  147.    }
  148.  
  149.    if (filcount) {
  150.       /* read file items and decrypt for checksumming */
  151.       for (i=0; i<filcount; i++) {
  152.          q=ui_filetext(i); if (!q) return FALSE;
  153.          checksum2+=itemchecksum;
  154.       }
  155.    }
  156.  
  157.    /* close file if no file items present */
  158.    if (!filcount) fileclose();
  159.  
  160.    /* succesful load if checksum is ok */
  161.    return (checksum==checksum1+checksum2);
  162. } /* ui_loadtext */
  163.  
  164. /* frees all space and closes file if necessary */
  165. /* call this routine at the very end of the application */
  166. void ui_unloadtext(void)
  167. {
  168.    if (ui_text) { free(ui_text); ui_text=NULL; }
  169.    if (ui_textbuffer) { free(ui_textbuffer);  ui_textbuffer=NULL; }
  170.    if (ui_file) { free(ui_file); ui_file=NULL; }
  171.    if (ui_filebuffer) { free(ui_filebuffer); ui_filebuffer=NULL; }
  172.    if (ui_fileptr) { free(ui_fileptr); ui_fileptr=NULL; }
  173.    fileclose();
  174. } /* ui_unloadtext */
  175.  
  176.