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

  1. /*
  2.     menusave.c
  3.  
  4.     % sf_savemenu
  5.  
  6.     C-scape 3.2
  7.     Copyright (c) 1988-1989 by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     -----------------
  12.     11/02/89 jdc    fixed trailing '\n' color problem
  13.     11/02/89 jdc    fixed the big one
  14.      1/20/90 jdc    speeded data retrieval (oslists)
  15.      1/24/90 jdc    fixed oslist stuff
  16.      3/28/90 jmd    ansi-fied
  17.      9/07/90 jmd    renamed oslist funcs
  18. */
  19.  
  20. #include "sed.h"
  21. #include "sfile.h"
  22. #include "sfilpriv.h"
  23.  
  24. #include "teddecl.h"
  25.  
  26. boolean sf_savemenu(sfile_type sfile, menu_type menu)
  27. /*
  28. */
  29. {
  30.     int i, j, dp_count, reg, sel, label, len, row, col, child;
  31.     tb_type tb;
  32.     obj_type bob;
  33.     bfile_type bfile;
  34.     iarray funcnamea;
  35.     char buf[22], *fstrs[3], *sbuf;
  36.     byte attr;
  37.     bblock_type b, ob;
  38.             
  39.     bfile = sfile->bfile;
  40.     sbuf = sfile->buf;
  41.     tb = menu_GetTextbuf(menu);
  42.     funcnamea = menu->funcnamea;
  43.  
  44.     /* menu info: fieldcount, textbuf size - 1, wrapwidth, tabsize, insert, 
  45.         limit, maxsize, newlinechar, tabchar
  46.     */
  47.     sprintf(sbuf, "%d %ld %d %d %d %d %ld %d %d\n",
  48.         menu->fieldcount, tb->size, tb->width, tb->tab_size,
  49.         tb->insert, tb->limit, tb->max_size, (int)(tb->newline_char), 
  50.         (int)(tb->tab_char));
  51.  
  52.     if (!bfile_Write(bfile, sbuf, strlen(sbuf))) {
  53.         return(FALSE);
  54.     }
  55. /* field info 
  56.     reg, sel, label (unused), data ptr count, child, 
  57.     func sym, func type, var sym, m_UnPrintf, data strings
  58. */
  59.     for (i = 0; i < menu->fieldcount; i++) {
  60.         dp_count = menu_GetDataCount(menu, i);
  61.         child = label = 0;
  62.         row = col = -1;
  63.         if ((bob = menu_GetFieldBob(menu, i)) != NULL) {
  64.             child = TRUE;
  65.             /* the bob's virtual field position comes from the bob position
  66.                 if it is dependent, the bob might have been moved since load
  67.             */
  68.             if (bob_IsDepend(bob) && menu->sedptr != NULL) {
  69.  
  70.                 row = win_GetYmin(bob) + sed_GetYoffset(menu->sedptr);
  71.                 col = win_GetXmin(bob) + sed_GetXoffset(menu->sedptr);
  72.                 if ((row -= win_GetYmin(menu->sedptr)) < 0) row = 0;
  73.                 if ((col -= win_GetXmin(menu->sedptr)) < 0) col = 0;
  74.             }
  75.         }            
  76.         if (menu_IsMarked(menu, i)) {
  77.             reg = (int)menu_GetFieldRegAttr(menu, i);
  78.             sel = (int)menu_GetFieldSelAttr(menu, i);
  79.         }
  80.         else {
  81.             reg = sel = -1;
  82.         }
  83.  
  84.         sprintf(sbuf, "%d %d %d %d %d\n", reg, sel, label, dp_count, child);
  85.         if (!bfile_Write(bfile, sbuf, strlen(sbuf))) {
  86.             return(FALSE);
  87.         }
  88.  
  89.         /* if there is an funcname iarray pull names that way,
  90.             else search off func directly 
  91.         */
  92.         if (funcnamea == NULL) {
  93.             fstrs[0] = fsym_NullCheck(sfile_FindFieldFuncName(sfile, menu_GetFuncs(menu, i)));
  94.             fstrs[1] = fstrs[2] = FSYM_NULLSTR;
  95.         }
  96.         else {
  97.             fstrs[0] = fsym_NullCheck(menu_GetFieldFuncName(menu, sfile, i));
  98.             fstrs[1] = fsym_NullCheck(menu_GetFieldFuncType(menu, sfile, i));
  99.             fstrs[2] = fsym_NullCheck(menu_GetVarName(menu, i));
  100.         }
  101.         sprintf(sbuf, "%s\n%s\n%s\n%s\n", fstrs[0], fstrs[1], fstrs[2],
  102.             menu_UnPrintf(menu, i, menu_GetScratchPad(menu), row, col, 1));
  103.  
  104.         if (!bfile_Write(bfile, sbuf, strlen(sbuf))) {
  105.             return(FALSE);
  106.         }
  107.  
  108.         /* write the data pointers (strings only please) */
  109.         for (j = 0; j < dp_count; j++) {
  110.             sprintf(sbuf, "%s\n", fsym_NullCheck((char *) menu_GetFieldData(menu, i, j)));
  111.             if (!bfile_Write(bfile, sbuf, strlen(sbuf))) {
  112.                 return(FALSE);
  113.             }
  114.         }
  115.  
  116.         if (bob != NULL && !sf_saveobj(sfile, bob)) {
  117.             return(FALSE);
  118.         }
  119.     }
  120.     /* textbuffer */
  121.     tb_Rewind(tb);
  122.     for (ob = tb->bbc->b; ob != NULL; ) {
  123.         b = ob;
  124.         for (i = 0, attr = b->attr; b != NULL && b->attr == attr; b = b->next) {
  125.             if (i + bblen(b) > SFILE_BUFLEN) {
  126.                 break;
  127.             }
  128.             i += bblen(b);
  129.         }
  130.         if (b == NULL) {
  131.             i--;    /* supress last '\n' */
  132.         }
  133.         sprintf(buf, "%d %d\n", i, (int)attr);
  134.         if (!bfile_Write(bfile, buf, strlen(buf))) {
  135.             return(FALSE);
  136.         }
  137.         if (i == 0) {
  138.             break;
  139.         }
  140.         else {
  141.             for ( ; i > 0; ) {
  142.  
  143.                 len = (bblen(ob) > i) ? i : bblen(ob);
  144.                 if (!bfile_Write(bfile, ob->start, len)) {
  145.                     return(FALSE);
  146.                 }
  147.                  i -= len;
  148.                 if (i <= 0) {
  149.                     break;
  150.                 }
  151.                 ob = ob->next;
  152.             }
  153.             if (b == NULL) {        /* last time, take care of '\n' */
  154.  
  155.                 sprintf(buf, "0 %d\n", (int)attr);
  156.                 if (!bfile_Write(bfile, buf, strlen(buf))) {
  157.                     return(FALSE);
  158.                 }
  159.                 break;
  160.             }
  161.         }
  162.         ob = ob->next;
  163.     }
  164.     
  165.     return(TRUE);    
  166. }
  167.  
  168. char *sfile_GetFieldFuncType(sfile_type sfile, int ffhandle)
  169. {
  170.     if (sfile->oslist_array[FSYM_TY] == NULL) {
  171.         return(NULL);
  172.     }
  173.     return(oslist_GetSym(sfile->oslist_array[FSYM_TY], 
  174.         *((int *)((char *)oslist_GetData(sfile->oslist_array[FSYM_FF], 
  175.         ffhandle) + FSYM_DATASIZE))));
  176. }
  177.