home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / MENUUNPF.C < prev    next >
Text File  |  1990-09-28  |  4KB  |  190 lines

  1. /*
  2.     menuunpf.c     6/10/88
  3.  
  4.     % menu_UnPrintf
  5.  
  6.     C-scape 3.2
  7.     Copyright (c) 1988, by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     -----------------
  12.     12/14/88 jmd    Now uses fields directly
  13.  
  14.      3/29/89 jmd    Added CSPRIV modifier
  15.      4/10/89 jmd    rewrote without sprintf return dependency
  16.      4/21/89 jmd    now uses @fD syntax
  17.      6/05/89 jmd    Added dflag (switches between fD and fd)
  18.      7/26/89 jmd    expandedd dflag, added bob support (dflag 2)
  19.      8/02/89 jdc    Added @ quoting in field_GetSpec
  20.     12/17/89 jdc    added field highlighted char
  21.  
  22.      3/28/90 jmd    ansi-fied
  23.      4/05/90 jdc    added % quoting (menupriv.h)
  24.      4/19/90 jdc    fixed quoting
  25.      9/28/90 jdc    fixed a very old bug in field_GetSpec by adding "rlen--;"
  26. */
  27.  
  28. #include "menu.h"
  29.  
  30. OSTATIC int CSPRIV field_GetSpec(field_type field, char *s);
  31.  
  32. char *menu_UnPrintf(menu_type menu, int fieldno, char *buf, int row, int col, int dflag)
  33. /*
  34.     Recreates a menu definition string for a field,
  35.     using @p[row, col] if row != -1.
  36.     Places the string in the scratch pad.
  37.     "@p[2,4]@f{name}w10pD3[#####]"
  38.     if dflag is TRUE, @fd is translated to @fD
  39.     dflag:
  40.     0   generate @fd
  41.     1   generate @fD
  42.     2   use @fd     but no 'd' if only one NULL data pointer
  43.         also use @fb
  44.     tok buffer should be big enough to hold field + "@p[]@f..."
  45.     field_UnPrintf(field, buf);
  46. */
  47. {
  48.     char         *s, *name, wids[10], highs[10], dps[10];
  49.     field_type     field;
  50.  
  51.     field = menu_GetField(menu, fieldno);
  52.     name = menu_GetFieldName(menu, fieldno);
  53.  
  54.     /* field width */
  55.     if (field_GetWidth(field) == field_GetMergeLen(field)) {
  56.         wids[0] = '\0';
  57.     }
  58.     else {
  59.         sprintf(wids, "w%d", field_GetWidth(field));
  60.     }
  61.  
  62.     /* field highlighted char */
  63.     if (field_IsHiCharOn(field)) {
  64.         sprintf(highs, "h%d", field_GetHiChar(field));
  65.     }
  66.     else {
  67.         highs[0] = '\0';
  68.     }
  69.     
  70.     /* data pointers */
  71.     if (field_GetDataCount(field) > 1) {
  72.         sprintf(dps, "%c%d", ((dflag == 1) ? 'D' : 'd'), field_GetDataCount(field));
  73.     }
  74.     else {
  75.         if (dflag == 2 && field_GetData(field, 0) == NULL) {
  76.             dps[0] = '\0';
  77.         }
  78.         else {
  79.             dps[0] = (dflag == 1) ? (char) 'D' : (char) 'd';
  80.             dps[1] = (char)'\0';
  81.         }
  82.     }
  83.  
  84.     /* Create the field definition, part 1 */
  85.     /*                          {    n } w p    d b h */
  86.     sprintf(buf, "@p[%d,%d]@f%s%s%s%s%s%s%s%s[",
  87.                 (row == -1) ? field_GetRow(field) : row, 
  88.                 (col == -1) ? field_GetCol(field) : col,
  89.                 (name != NULL) ? "{" : "",
  90.                 (name != NULL) ? name : "",
  91.                 (name != NULL) ? "}" : "",
  92.                  wids, 
  93.                 (field_GetProtected(field)) ? "p" : "",
  94.                  dps, 
  95.                 (dflag == 2 && field_GetBob(field) != NULL) ? "b" : "",
  96.                 highs);
  97.  
  98.     /* part two */
  99.     s = buf + strlen(buf);
  100.     s += field_GetSpec(field, s);
  101.     *s++ = ']';
  102.     *s = '\0';
  103.  
  104.     return(buf);    
  105. }
  106.  
  107. static int CSPRIV field_GetSpec(field_type field, char *s)
  108. /* 
  109.     build field spec 
  110.     returns length of spec.
  111. */
  112. {
  113.     char   *merge;
  114.     char     c, last;
  115.     int     mpos, recpos, mlen, rlen, rcount, slen, len;
  116.  
  117.     mlen = field_GetMergeLen(field);
  118.     rlen = field_GetRecordLen(field);
  119.     merge = field_GetMerge(field);
  120.     rcount = 0;
  121.     last = '\0';
  122.  
  123.     for (mpos = 0, recpos = 0, slen = 0; mpos < mlen; mpos++) {
  124.         if (rlen > 0 && field_GetR2M(field, recpos) == mpos) {
  125.             c = (char) '#';
  126.             recpos++;
  127.             rlen--;
  128.         }
  129.         else {
  130.             c = merge[mpos];
  131.         }
  132.         /* see if we can use repeat */
  133.         if (last == '\0' || c == last) {
  134.             rcount++;
  135.         }
  136.         else if (rcount > 6) {
  137.             if (fspec_isquotable(last)) {
  138.                 sprintf(s, "@[%d,@%c]", rcount, last);
  139.             }
  140.             else {
  141.                 sprintf(s, "@[%d,%c]", rcount, last);
  142.             }
  143.             len = strlen(s);
  144.             slen += len;
  145.             s += len;
  146.             rcount = 1;
  147.         }
  148.         else {
  149.             while (rcount > 0) {
  150.                 if (fspec_isquotable(last)) {
  151.                     *s++ = '@';
  152.                     slen++;
  153.                 }
  154.                 *s++ = last;
  155.                 slen++;
  156.                 rcount--;
  157.             }
  158.             rcount = 1;
  159.         }
  160.  
  161.         last = c;        
  162.     }
  163.     /* finish up */
  164.     if (rcount > 6) {
  165.         if (fspec_isquotable(last)) {
  166.             sprintf(s, "@[%d,@%c]", rcount, last);
  167.         }
  168.         else {
  169.             sprintf(s, "@[%d,%c]", rcount, last);
  170.         }
  171.         len = strlen(s);
  172.         slen += len;
  173.         s += len;
  174.         rcount = 0;
  175.     }
  176.     else {
  177.         while (rcount > 0) {
  178.             if (fspec_isquotable(last)) {
  179.                 *s++ = '@';
  180.                 slen++;
  181.             }
  182.             *s++ = last;
  183.             slen++;
  184.             rcount--;
  185.         }
  186.     }
  187.     return(slen);
  188. }
  189.  
  190.