1: /* $Header: suffix.c,v 1.2 85/03/21 10:19:36 nicklin Exp $ */
   2: 
   3: /*
   4:  * Author: Peter J. Nicklin
   5:  */
   6: #include <stdio.h>
   7: #include "Mkmf.h"
   8: #include "hash.h"
   9: #include "macro.h"
  10: #include "null.h"
  11: #include "suffix.h"
  12: #include "yesno.h"
  13: 
  14: static int SFX1[SFXTABSIZE];        /* single character suffixes */
  15: static int INC1[SFXTABSIZE];        /* include file types for 1 char sfx */
  16: static SFXBLK *SFX2[SFXTABSIZE];    /* 2+ character suffixes */
  17: 
  18: /*
  19:  * buildsfxtable() converts a suffix list into a hash table for fast lookup.
  20:  * Returns YES if successful, otherwise NO.
  21:  */
  22: buildsfxtable()
  23: {
  24:     extern HASH *MDEFTABLE;     /* macro definition table */
  25:     extern SUFFIX DEFSFX[];     /* default suffix list */
  26:     HASHBLK *htb;           /* hash table block */
  27:     HASHBLK *htlookup();        /* find hash table entry */
  28:     int i;              /* suffix list counter */
  29:     int installsfx();       /* install suffix in hash table */
  30:     int sfxbuftotable();        /* feed suffixes to installsfx() */
  31: 
  32:     /* default suffix list */
  33:     for (i = 0; DEFSFX[i].suffix != NULL; i++)
  34:         if (installsfx(DEFSFX[i].suffix, DEFSFX[i].sfxtyp,
  35:             DEFSFX[i].inctyp) == NO)
  36:             return(NO);
  37: 
  38:     /* supplementary suffix definitions */
  39:     if ((htb = htlookup(MSUFFIX, MDEFTABLE)) != NULL)
  40:         {
  41:         if (sfxbuftotable(htb->h_def) == NO)
  42:             return(NO);
  43:         }
  44:     return(YES);
  45: }
  46: 
  47: 
  48: 
  49: /*
  50:  * installsfx() installs a suffix in one of two suffix tables: SFX1 for
  51:  * one character suffixes, and SFX2 for two or more character suffixes.
  52:  * For a suffix that already exists, only its type and corresponding
  53:  * included file type is updated. Returns integer YES if successful,
  54:  * otherwise NO.
  55:  */
  56: installsfx(suffix, sfxtyp, inctyp)
  57:     char *suffix;           /* suffix string */
  58:     int sfxtyp;         /* suffix type */
  59:     int inctyp;         /* include file type */
  60: {
  61:     char *malloc();         /* memory allocator */
  62:     char *strsav();         /* save a string somewhere */
  63:     int sfxindex;           /* index into suffix tables */
  64:     SFXBLK *sfxblk;         /* suffix list block */
  65: 
  66:     if (*suffix == '.')
  67:         suffix++;
  68:     sfxindex = suffix[0];
  69:     if (suffix[0] == '\0' || suffix[1] == '\0')
  70:         {
  71:         SFX1[sfxindex] = sfxtyp;    /* 0 or 1 character suffix */
  72:         INC1[sfxindex] = inctyp;
  73:         }
  74:     else    {               /* 2+ character suffix */
  75:         if ((sfxblk = (SFXBLK *) malloc(sizeof(SFXBLK))) == NULL)
  76:             return(NO);
  77:         if ((sfxblk->sfx.suffix = strsav(suffix)) == NULL)
  78:             return(NO);
  79:         sfxblk->sfx.sfxtyp = sfxtyp;
  80:         sfxblk->sfx.inctyp = inctyp;
  81:         sfxblk->next = SFX2[sfxindex];
  82:         SFX2[sfxindex] = sfxblk;
  83:         }
  84:     return(YES);
  85: }
  86: 
  87: 
  88: 
  89: /*
  90:  * lookuptypeofinclude() returns the include file type for suffix, or 0 if
  91:  * unknown suffix.
  92:  */
  93: lookuptypeofinclude(suffix)
  94:     char *suffix;           /* suffix string */
  95: {
  96:     SFXBLK *sfxblk;         /* suffix block pointer */
  97: 
  98:     if (suffix[0] == '\0' || suffix[1] == '\0')
  99:         return(INC1[*suffix]);      /* 0 or 1 char suffix */
 100:                         /* 2+ character suffix */
 101:     for (sfxblk = SFX2[*suffix]; sfxblk != NULL; sfxblk = sfxblk->next)
 102:         if (EQUAL(suffix, sfxblk->sfx.suffix))
 103:             return(sfxblk->sfx.inctyp);
 104:     return(0);
 105: }
 106: 
 107: 
 108: 
 109: /*
 110:  * lookupsfx() returns the suffix type, or 0 if unknown suffix.
 111:  */
 112: lookupsfx(suffix)
 113:     char *suffix;           /* suffix string */
 114: {
 115:     SFXBLK *sfxblk;         /* suffix block pointer */
 116: 
 117:     if (suffix[0] == '\0' || suffix[1] == '\0')
 118:         return(SFX1[*suffix]);      /* 0 or 1 char suffix */
 119:                         /* 2+ character suffix */
 120:     for (sfxblk = SFX2[*suffix]; sfxblk != NULL; sfxblk = sfxblk->next)
 121:         if (EQUAL(suffix, sfxblk->sfx.suffix))
 122:             return(sfxblk->sfx.sfxtyp);
 123:     return(0);
 124: }
 125: 
 126: 
 127: 
 128: /*
 129:  * sfxbuftotable() parses a buffer containing suffixes and presents them
 130:  * to installsfx() for installation into the appropriate hash table.
 131:  * The suffix type may be altered by attaching a modifier :suffixtype.
 132:  *	:h	--> header file type
 133:  *	:o	--> object file type
 134:  *	:s	--> source file type (default)
 135:  *	:x	--> executable file type
 136:  *	:	--> unknown file type
 137:  * The include file type may be altered by attaching an additional
 138:  * modifier includetype.
 139:  *	C	--> C source code
 140:  *	F	--> Fortran, Ratfor, Efl source code
 141:  *	P	--> Pascal source code
 142:  * If the suffix is object file type, the OBJSFX default object suffix
 143:  * is modified accordingly. Returns YES if successful, otherwise NO.
 144:  */
 145: sfxbuftotable(sfxbuf)
 146:     char *sfxbuf;           /* buffer conatining suffixes */
 147: {
 148:     extern char OBJSFX[];       /* object file name suffix */
 149:     char *gettoken();       /* get next token */
 150:     char *rindex();         /* find last occurrence of character */
 151:     char *sfxtyp;           /* suffix type */
 152:     char *strcpy();         /* string copy */
 153:     char suffix[SUFFIXSIZE+2];  /* suffix + modifier */
 154:     int installsfx();       /* install suffix in hash table */
 155: 
 156:     while ((sfxbuf = gettoken(suffix, sfxbuf)) != NULL)
 157:         if ((sfxtyp = rindex(suffix, ':')) == NULL)
 158:             {
 159:             if (installsfx(suffix, SFXSRC, INCLUDE_NONE) == NO)
 160:                 return(NO);
 161:             }
 162:         else    {
 163:             *sfxtyp = '\0';
 164:             if (installsfx(suffix, sfxtyp[1], sfxtyp[2]) == NO)
 165:                 return(NO);
 166:             if (sfxtyp[1] == SFXOBJ)
 167:                 strcpy(OBJSFX, suffix);
 168:             }
 169:     return(YES);
 170: }

Defined functions

buildsfxtable defined in line 22; used 2 times
installsfx defined in line 56; used 5 times
lookupsfx defined in line 112; used 4 times
sfxbuftotable defined in line 145; used 2 times

Defined variables

INC1 defined in line 15; used 2 times
SFX1 defined in line 14; used 2 times
SFX2 defined in line 16; used 4 times
Last modified: 1985-07-03
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 779
Valid CSS Valid XHTML 1.0 Strict