home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / FSYMINIT.C < prev    next >
C/C++ Source or Header  |  1990-09-07  |  3KB  |  95 lines

  1. /*
  2.     fsyminit.c
  3.  
  4.     % fsym_Init() sfile initialization function
  5.  
  6.     C-scape 3.2
  7.     Copyright (c) 1986-1989 by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     ---------------------
  12.     12/20/88 jmd    split from fsym.c, changed empty funcs to NULL
  13.       4/08/89 jdc    added full names
  14.      4/21/89 jdc    rewrote for non-global fsymlists
  15.      5/28/89 jdc    added var type stuff
  16.      7/07/89 jdc    all lists get open if is_lnf
  17.      7/20/89 jdc    fixed for fptr, dptr change per ted
  18.  
  19.     11/89/89 jmd    changed void * to VOID *
  20.      1/20/90 jdc    speeded data retrieval
  21.      1/24/90 jdc    fixed retroactive bug
  22.      3/28/90 jmd    ansi-fied
  23.      9/07/90 jmd    renamed oslist funcs
  24. */
  25.  
  26. #include "sed.h"
  27. #include "sfile.h"
  28.  
  29. boolean fsym_Init(fsyminit_struct *fsyminit_list, oslist_type *oslist_array)
  30. {
  31.     int i, list, datasize, handle, ffhandle, is_lnf = FALSE;
  32.     char *name;
  33.  
  34.     for (list = 0; list < TOT_FSYM_COUNT; list++) {
  35.         oslist_array[list] = NULL;        /* some lists may not exist */
  36.     }
  37.     for (i = 0, list = 0;; i++) {
  38.  
  39.         if (fsyminit_list[i].name == NULL) {
  40.             break;
  41.         }
  42.         else if (*(name = fsyminit_list[i].name) == FSYM_CHAR) {
  43.  
  44.             datasize = FSYM_DATASIZE;
  45.             sscanf(name + 1, "%d", &list);
  46.             if (list == FSYM_TY) {
  47.                  /* field funcs with var type for LNF */
  48.                 /* open the ffuncs list here the type list is opened below */
  49.                 
  50.                 if ((oslist_array[FSYM_FF] = oslist_Open(FSYM_LIST_START_SIZE, FSYM_DATASIZE + sizeof(int))) == NULL) {
  51.                     goto QUIT;
  52.                 }
  53.                 datasize = 0;
  54.                 is_lnf = TRUE;
  55.             }
  56.             if ((oslist_array[list] = oslist_Open(FSYM_LIST_START_SIZE, datasize)) == NULL) {
  57.                 goto QUIT;
  58.             }
  59.         }
  60.         else {
  61.             if ((handle = oslist_SetSym(oslist_array[list], fsyminit_list[i].name, 
  62.                 (fsyminit_list[i].fptr == FNULL) ? (VOID *)&(fsyminit_list[i].dptr) : (VOID *)&(fsyminit_list[i].fptr))) < 0) {
  63.                 goto QUIT;
  64.             }
  65.             if (list == FSYM_TY) {
  66.                 /* put the ffuncs name in here the type is in above */
  67.                 if ((ffhandle = oslist_SetSym(oslist_array[FSYM_FF], 
  68.                     fsyminit_list[i].name + strlen(fsyminit_list[i].name) + 1, 
  69.                     (fsyminit_list[i].fptr == FNULL) ? (VOID *)&(fsyminit_list[i].dptr) : (VOID *)&(fsyminit_list[i].fptr))) < 0) {
  70.                                                                               
  71.                     goto QUIT;
  72.                 }
  73.                 /* put the type handle into the ffuncs data */
  74.                 *((int *)((char *)oslist_GetData(oslist_array[FSYM_FF], ffhandle) + FSYM_DATASIZE)) = handle;
  75.             }
  76.         }
  77.     }
  78.     if (is_lnf) {            /* LNF needs all lists */
  79.  
  80.         for (list = 0; list < TOT_FSYM_COUNT; list++) {
  81.             if (oslist_array[list] == NULL
  82.                 && (oslist_array[list] = oslist_Open(FSYM_LIST_START_SIZE, FSYM_DATASIZE)) == NULL) {
  83.                     goto QUIT;
  84.             }
  85.         }
  86.     }
  87.     return(TRUE);
  88.  
  89. QUIT:
  90.     for (list = 0; list < TOT_FSYM_COUNT; list++) {
  91.         oslist_Close(oslist_array[list]);
  92.     }
  93.     return(FALSE);
  94. }    
  95.