home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / driver / util / flmt.c < prev    next >
C/C++ Source or Header  |  1993-06-06  |  6KB  |  311 lines

  1. /*
  2. **    This file generated by localize 2.9 (AmigaDOS 2.1) from util/flmt.c
  3. */
  4. /**** flmt.c        (c) Georg Hessmann 11.02.90         ****/
  5.  
  6.  
  7. #include "defines.h"
  8.  
  9. /* standard includes */
  10. #include <stdio.h>
  11. #include "globals.h"
  12.  
  13. #ifdef ANSI
  14. #  include <stdlib.h>
  15. #  include <string.h>
  16. #  ifdef AMIGA
  17. #    ifdef LATTICE
  18. #      include <dos.h>
  19. #    endif
  20. #  endif
  21. #  ifdef ATARI
  22. #    include <tos.h>
  23. #  endif 
  24. #endif 
  25.  
  26. #include "flmt.h"
  27. #include "globals.i"
  28.  
  29. #ifdef AMIGA
  30. #  ifdef LATTICE
  31. #    define perror(x)    poserr(x)
  32. #  endif 
  33. #endif 
  34.  
  35.  
  36. #ifndef FALSE
  37. #  define FALSE        0
  38. #endif 
  39. #ifndef TRUE
  40. #  define TRUE        (!FALSE)
  41. #endif 
  42.  
  43.  
  44.  
  45. /*
  46.  * Fuer die locale-Library:
  47.  *
  48.  * Hier duerfen *nur* die MSG_#? Nummern eingebunden werden!
  49.  * Achtung:
  50.  * Es muss/sollte 'multiple-include' erlaubt sein!
  51.  */
  52. #include "local.i"
  53.  
  54. #undef  CATCOMP_ARRAY
  55. #undef  CATCOMP_BLOCK
  56. #undef  CATCOMP_STRINGS
  57. #define CATCOMP_NUMBERS
  58. #include "localstr.h"
  59.  
  60.  
  61.  
  62. /********* lokal funktions ************/
  63.     /* read the directory structure                    */
  64. static int   freaddir            Args((union direntry *dir,
  65.                           int version,
  66.                           FILE *f));
  67.     /* read a four byte number <hihi lohi hilo lolo>        */
  68. static int   freadlong            Args((long *buf,
  69.                           FILE *f));
  70.     /* read a two byte number <hi lo>                */
  71. static int   freadshort            Args((unsigned short *buf,
  72.                           FILE *f));
  73.  
  74.  
  75. #ifdef AZTEC_C
  76. #pragma regcall( freaddir(a0,d0,a1) )
  77. #pragma regcall( freadlong(a0,a1) )
  78. #pragma regcall( freadshort(a0,a1) )
  79. #endif
  80.  
  81.  
  82. #ifdef OLDDD
  83. /* open a flib and test the magic-number */
  84. FILE *open_flib(char *name, char *mode, int *version)
  85. {
  86.   FILE *f;
  87.   long magic;
  88.  
  89.   if ((f = fopen(name,mode)) == NULL) {
  90.     Logging(MSG_CANT_OPEN_FONTLIB,name);
  91.     return NULL;
  92.   }
  93.   if (!freadlong(&magic,f) || (magic != LIBMAGIC && magic != OLD_LIBMAGIC)) {
  94.     fclose(f);
  95.     Warning(MSG_NOT_A_FONTLIB,name);
  96.     return NULL;
  97.   }
  98.   if (magic == LIBMAGIC) {
  99.     *version = NEW_VERSION;
  100.   }
  101.   else {
  102.     *version = OLD_VERSION;
  103.     Logging(MSG_OLD_FONTLIB,name);
  104.   }
  105.  
  106.   return f;
  107. }
  108. #endif
  109.  
  110. /* open a flib and test the magic-number */
  111. FILE *open_flib(char *name, char *mode, int *version, short levels)
  112. {
  113.   FILE *f;
  114.   long magic;
  115.  
  116.   if ((f = fopen(name,mode)) == NULL) {
  117.     return NULL;
  118.   }
  119.   if (!freadlong(&magic,f) ||
  120.     (magic != LIBMAGIC && magic != OLD_LIBMAGIC && magic != LNKMAGIC)) {
  121.         fclose(f);
  122.         return NULL;
  123.   }
  124.   if (magic == LNKMAGIC) {
  125.     char link_name[DOSNAMESIZE], newname[DOSNAMESIZE], *ptr, *p;
  126.     
  127.     (void)fread(link_name,sizeof(char),DOSNAMESIZE,f);
  128.     fclose(f);
  129.     if (link_name[0] != '<') {
  130.         return NULL;
  131.     }
  132.     ptr = strrchr(link_name,'>');
  133.     if (ptr == NULL) {
  134.         return NULL;
  135.     }
  136.     levels++;
  137.     if (levels > MAXLINKLEVELS) {
  138.         Warning(MSG_TOO_MANY_FONTLIB_LEVELS);
  139.         return NULL;
  140.     }
  141.     *ptr = '\0';
  142.     ptr = link_name;
  143.     ptr++;
  144.     strcpy(newname, name);
  145.     /* is 'ptr' (target of the link) a relative path ? */
  146.     if (
  147. #ifdef AMIGA
  148.         strchr(ptr,':') == NULL
  149. #else
  150. # ifdef ATARI
  151.         !((*ptr & 0x40) == 0x40 && *(ptr + 1) == ':')
  152. # else
  153.         *ptr != '/'
  154. # endif
  155. #endif
  156.         ) {
  157.         /* if yes, take the dir of the link-file and append the target name */
  158.         if ((p = strrchr(newname,'/')) == NULL) {
  159.           p = strchr(newname,':');
  160.           /* if the link-file has no dir -> ok, we are already in the right dir */
  161.         }
  162.         if (p != NULL) {
  163.           *(p+1) = '\0';
  164.           strcat(newname, ptr);
  165.           ptr = strcpy(link_name, newname);
  166.         }
  167.     }
  168.     f = open_flib(ptr,mode,version,levels);
  169.   }
  170.   else {
  171.     if (magic == LIBMAGIC) {
  172.         *version = NEW_VERSION;
  173.     }
  174.     else {
  175.         *version = OLD_VERSION;
  176.     }
  177.   }
  178.  
  179.   return f;
  180. }
  181.  
  182. /* read the directory from the flib (file-pointer must be on the first dir) */
  183. /* only this directory entries a correct where "where != 0" the others are unused */
  184. int read_dir(FILE *f, struct dir *directory)
  185. {
  186.   long alloc;
  187.   union direntry dir;
  188.   struct dirlist *direntr, *old_direntry;
  189.   int i, j, nr;
  190.  
  191.   if (!freadlong(&alloc,f)) {
  192.     Warning(MSG_ERROR_READING_FONTLIB_DIR);
  193.     return FALSE;
  194.   }
  195.   direntr = old_direntry = NULL;
  196.   for (i=0, nr=0; i<alloc && !feof(f); i++) {
  197.     if (!freaddir(&dir,directory->version,f)) {
  198.         Warning(MSG_ERROR_READING_FONTLIB_DIR);
  199.         return FALSE;
  200.     }
  201.     if ((directory->version == NEW_VERSION && dir.new.where != 0) ||    /* used entry */
  202.         (directory->version == OLD_VERSION && dir.old.where != 0)) {
  203.         nr++;
  204.         direntr = (struct dirlist *)xmalloc(sizeof(struct dirlist));
  205.         for (j=0; j<NEWFILENAMELEN; j++) {    /* clear the string */
  206.             direntr->dirent.mname[j] = '\0';
  207.         }
  208.         if (old_direntry == NULL ) {
  209.             directory->dirlist = direntr;
  210.         }
  211.         else {
  212.             old_direntry->next = direntr;
  213.         }
  214.         if (directory->version == NEW_VERSION) {
  215.             direntr->dirent = dir.new;
  216.         }
  217.         else {
  218.             strncpy(direntr->dirent.mname,dir.old.mname,FILENAMELEN);
  219.             direntr->dirent.size     = dir.old.size;
  220.             direntr->dirent.where    = dir.old.where;
  221.             direntr->dirent.checksum = 0;
  222.         }
  223.         old_direntry = direntr;
  224.     }
  225.   }
  226.   if (direntr != NULL) {
  227.     direntr->next = NULL;
  228.   }
  229.   directory->total    = nr;
  230.   directory->alloc    = alloc;
  231.   if (nr == 0) {
  232.     directory->dirlist = NULL;
  233.   }
  234.   return TRUE;
  235. }
  236.  
  237.  
  238.  
  239. struct dirlist *findmod (struct dir *directory, char *mname)
  240.   struct dirlist *temp;
  241.  
  242.   /* find the module */
  243.   for (temp = directory->dirlist; temp != NULL
  244.     && stricmp(temp->dirent.mname,mname) != 0; temp = temp->next);
  245.  
  246.   return temp;
  247. }
  248.  
  249.  
  250. /* read the directory structure                */
  251. static int freaddir(union direntry *dir, int version, FILE *f)
  252. {
  253.   if (version == OLD_VERSION) {
  254.     if (fread(dir->old.mname,FILENAMELEN,1,f) != 1) {
  255.         return FALSE;
  256.     }
  257.     dir->new.mname[FILENAMELEN] = '\0';
  258.     if (!freadlong(&(dir->old.size),f)) {
  259.         return FALSE;
  260.     }
  261.     if (!freadlong(&(dir->old.where),f)) {
  262.         return FALSE;
  263.     }
  264.   }
  265.   else {
  266.     if (fread(dir->new.mname,1,NEWFILENAMELEN,f) != NEWFILENAMELEN) {
  267.         return FALSE;
  268.     }
  269.     if (!freadshort(&(dir->new.checksum),f)) {
  270.         return FALSE;
  271.     }
  272.     if (!freadlong(&(dir->new.size),f)) {
  273.         return FALSE;
  274.     }
  275.     if (!freadlong(&(dir->new.where),f)) {
  276.         return FALSE;
  277.     }    
  278.   }
  279.   return TRUE;
  280. }
  281.  
  282.  
  283.  
  284. /* read a four byte number <hihi lohi hilo lolo> */
  285. static int freadlong(long *buf, FILE *f)
  286. {
  287.   unsigned char b[4];
  288.  
  289.   if (fread((char *)b,1,4,f) != 4) {
  290.     return FALSE;
  291.   }
  292.   *buf = (long)(((unsigned long)b[0]) << 24) | (((unsigned long)b[1]) << 16) | 
  293.             (((unsigned long)b[2]) << 8) | ((unsigned long)b[3]);
  294.  
  295.   return TRUE;
  296. }
  297.  
  298. /* read a two byte number <hi lo> */
  299. static int freadshort(unsigned short *buf, FILE *f)
  300. {
  301.   unsigned char b[2];
  302.  
  303.   if (fread((char *)b,1,2,f) != 2) {
  304.     return FALSE;
  305.   }
  306.   *buf = (unsigned short) (((unsigned short)b[0]) << 8) | ((unsigned short)b[1]);
  307.  
  308.   return TRUE;
  309. }
  310.