home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / MENULOAD.C < prev    next >
C/C++ Source or Header  |  1990-10-04  |  6KB  |  212 lines

  1. /*
  2.     menuload.c
  3.  
  4.     % sf_loadmenu
  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.      8/16/89 jdc    fixed adding unresolved funcs bug
  13.     11/02/89 jdc    fixed trailing '\n' color problem
  14.      1/20/89 jdc    speeded data retrieval (oslists)
  15.      1/23/89 jdc    added default defines
  16.      2/07/90 jdc    added child bob object naming
  17.      3/28/90 jmd    ansi-fied
  18.      4/17/90 jdc    renamed _bfile_gets to bf_gets
  19.      4/17/90 jdc    fixed pointer math bug (chopped unlinked ffuncs names)
  20.      5/04/90 jdc    added loaddefault_funcs
  21.      6/14/90 jdc    added error check for menu_Printf
  22.      8/12/90 jdc    added opendata arg to sf_loadobj
  23.      9/07/90 jmd    renamed oslist funcs
  24.     10/04/90 jmd    added test for menu_putTB failure
  25. */
  26.  
  27. #include "sed.h"    /* sfile.h wants the whole shmear */
  28. #include "tbpriv.h"
  29. #include "menupriv.h"
  30.  
  31. #include "fndecl.h"        /* for string_funcs */
  32.  
  33. #include "sfile.h"
  34. #include "sfilpriv.h"
  35.  
  36. OGLOBAL field_funcs_ptr        loaddefault_funcs = &string_funcs;
  37.  
  38. menu_type sf_loadmenu(sfile_type sfile)
  39. /*
  40. */
  41. {
  42.     unsigned int len, fldno;
  43.     int         i, j, dpcount, fcount, insert, limit;
  44.     int            tabchar, newlchar;
  45.     long         size;
  46.     tb_type     tb;
  47.     menu_type     menu;
  48.     char        *s, *fstrs[4], *sbuf;
  49.     int         child, reg, sel, label, handle, is_lnf;
  50.     obj_type     bob;
  51.     bfile_type    bfile;
  52.     field_funcs_ptr    funcs;
  53.     int attr, old_attr;
  54.  
  55.     sbuf = sfile->buf;
  56.  
  57.     if ((menu = menu_Open()) == NULL) {
  58.         return(NULL);
  59.     }
  60.     /* if in LNF then we keep track of ffunc types and varible names */
  61.     is_lnf = (sfile->oslist_array[FSYM_TY] == NULL) ? FALSE:TRUE;
  62.     if (is_lnf && ((menu->funcnamea = ia_Open(SED_FSYM_COUNT)) == NULL
  63.         || (menu->varnamea = ia_Open(SED_FSYM_COUNT)) == NULL
  64.         || (menu->functypea = ia_Open(SED_FSYM_COUNT)) == NULL)) {
  65.         goto ERROR;
  66.     }
  67.     /* data pointers AND variable names are stored here */
  68.     menu->dptrlist = oslist_Open(2, 0);
  69.  
  70.     tb = menu_GetTextbuf(menu);
  71.  
  72.     bfile = sfile->bfile;
  73.     if (bf_gets(bfile, sbuf, SFILE_BUFLEN, '\0') == 0) {
  74.         goto ERROR;
  75.     }
  76.  
  77.     /*    menu info: fieldcount, textbuf size - 1, wrapwidth, tabsize, insert, 
  78.         limit, maxsize, newlinechar, tabchar
  79.     */
  80.     sscanf(sbuf, "%d %ld %d %d %d %d %ld %d %d",
  81.         &fcount, &size, &(tb->width), &(tb->tab_size), &insert, &limit, 
  82.         &(tb->max_size), &tabchar, &newlchar);
  83.  
  84.     tb->limit = limit;
  85.     tb->tab_char = (byte)tabchar;
  86.     tb->newline_char = (byte)newlchar;
  87.  
  88.     /* field info 
  89.         reg, sel, label (unused), data ptr count, chile, 
  90.         func sym, func type, var sym, m_UnPrintf, data strings
  91.     */
  92.     for (i = 0; i < fcount; i++) {
  93.         if (bf_gets(bfile, sbuf, SFILE_BUFLEN, '\0') == 0) {
  94.             goto ERROR;
  95.         }
  96.         sscanf(sbuf, "%d %d %d %d %d", ®, &sel, &label, &dpcount, &child);
  97.  
  98.         /* ffunc, ffunc type, var, field spec */
  99.         for (j = 0, s = sbuf; j < 4; j++, s += len) {
  100.             if ((len = bf_gets(bfile, s, SFILE_BUFLEN, '\0')) == 0) {
  101.                 goto ERROR;
  102.             }
  103.             fstrs[j] = s;
  104.         }
  105.         /* Create the field */
  106.         if ((funcs = sfile_FindFieldFunc(sfile, fstrs[0], &handle)) == NULL) {
  107.             funcs = loaddefault_funcs;
  108.         }
  109.         if (!menu_Printf(menu, fstrs[3], NULL, funcs)) {
  110.             goto ERROR;
  111.         }
  112.         fldno = menu_GetFieldCount(menu) - 1;
  113.  
  114.         if (is_lnf) {
  115.             if (handle == -1) {
  116.                 handle = sfile_PutFieldFunc(sfile, fstrs[0], funcs, fstrs[1]);
  117.             }
  118.             /* Put the handle into the funcname array */
  119.             menu_SetFieldFuncHandle(menu, i, handle);
  120.  
  121.             /* add the func type */
  122.             handle = menu_PutFieldFuncType(menu, sfile, fstrs[1]);
  123.             menu_SetFieldFuncTypeHandle(menu, i, handle);
  124.  
  125.             /* add the varname */
  126.             handle = menu_PutVarName(menu, fstrs[2]);
  127.             menu_SetVarNameHandle(menu, i, handle);
  128.         }
  129.  
  130.         /* data pointers */
  131.         for (j = 0; j < dpcount; j++) {
  132.             if (bf_gets(bfile, sbuf, SFILE_BUFLEN, '\0') == 0) {
  133.                 goto ERROR;
  134.             }
  135.             if (!strcmp(sbuf, FSYM_NULLSTR)) {
  136.                 s = NULL;
  137.             }
  138.             else {
  139.                 s = menu_PutDPL(menu, sbuf);
  140.             }
  141.             menu_SetFieldData(menu, fldno, j, s);
  142.         }
  143.         
  144.         if (reg > 0 || sel > 0) {
  145.             menu_MarkField(menu, fldno, (char)reg, (char)sel);
  146.         }
  147.         if (child) {
  148.             if ((bob = sf_loadobj(sfile, menu_GetFieldName(menu, fldno), NULL)) == NULL) {
  149.                 goto ERROR;
  150.             }
  151.             menu_SetFieldBob(menu, i, bob);
  152.         }
  153.      }
  154.  
  155.     /* textbuffer */
  156.     for (old_attr = -1; size > 0; old_attr = attr, size -= (long)len) {
  157.  
  158.         if (bf_gets(bfile, sbuf, SFILE_BUFLEN, '\0') == 0) {
  159.             goto ERROR;
  160.         }
  161.         sscanf(sbuf, "%d %d\n", &len, &attr);
  162.  
  163.         if (len <= 0) {        /* color trailing '\n' */
  164.  
  165.             if (attr != old_attr) {
  166.                 bbc_Attr(tb->bbc, (long) tb->len - 1L, (byte) attr, 1L);
  167.             }
  168.             break;
  169.         }
  170.         else {
  171.             if (old_attr == -1) {
  172.                 old_attr = attr;
  173.             }
  174.             if (bfile_Read(bfile, sbuf, len) == 0) {
  175.                 goto ERROR;
  176.             }
  177.             if (!menu_putTB(menu, (int)tb->bbc->b->row, tb->col, sbuf, 0x00, len, 
  178.                 (byte)attr, (byte)old_attr, TB_COLOR)) {
  179.                 goto ERROR;
  180.             }
  181.         }
  182.     }
  183.     tb_Rewind(tb); 
  184.  
  185.     /* fixes text calc of rowcount */
  186.     tb->insert = insert;
  187.  
  188.     menu_Flush(menu);
  189.  
  190.     return(menu);    
  191.  
  192. ERROR:
  193.     menu_Destroy(menu);
  194.     return(NULL);
  195. }
  196.  
  197. int sfile_PutFieldFunc(sfile_type sfile, char *funcname, field_funcs_ptr funcs, char *typename)
  198. {
  199.     int ffhandle;
  200.  
  201.     /* add the func sym */
  202.     ffhandle = oslist_SetSym(sfile->oslist_array[FSYM_FF], funcname, (VOID *)&funcs);
  203.  
  204.     if (sfile->oslist_array[FSYM_TY] != NULL) {
  205.         /* add the type sym, if necessary */
  206.  
  207.         *((int *)((char *)oslist_GetData(sfile->oslist_array[FSYM_FF], ffhandle)
  208.             + FSYM_DATASIZE)) = oslist_SetSym(sfile->oslist_array[FSYM_TY], typename, NULL);
  209.     }
  210.     return(ffhandle);
  211. }
  212.