home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 1.ddi / FUNCS.EXE / CSCAPE / SOURCE / FNTOGINT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-07  |  4.5 KB  |  209 lines

  1. /*
  2.     fntogint.c
  3.  
  4.     % togint_funcs, like toggle_funcs except the variable is an int
  5.  
  6.     A field has multiple choices.
  7.     The Space bar changes the selection.
  8.     First letter searching.
  9.     The Variable is the number of the selected choice.
  10.  
  11.     The choices are contained in the field's second data pointer in
  12.     the form "choice 1, choice 2, choice 3"  (commas delimit).
  13.  
  14.     The cursor is turned off.
  15.  
  16.     Also toggles choice when clicked with a mouse.
  17.     (if mouse handler is attached to sed)
  18.  
  19.     C-scape 3.1
  20.     Copyright (c) 1989 by Oakland Group, Inc.
  21.     ALL RIGHTS RESERVED.
  22.  
  23.     Revision History:
  24.     -----------------
  25. */
  26.  
  27. #include <stdio.h>
  28. #include <string.h>
  29. #include <ctype.h>
  30.  
  31. #include "cscape.h"
  32. #include "fnfunc.h"            /* for field functions */
  33. #include "scancode.h"
  34.  
  35. #include "oakpriv.h"        /* for memmove() macro */
  36.  
  37. OGLOBAL field_funcs_struct togint_funcs = { 
  38.     stdNoCur_fenter,
  39.     std_fexit,
  40.     togint_fkey,
  41.     togint_senter,
  42.     togint_sexit,
  43.     sizeof(int)
  44. };
  45.  
  46. #define    DELIMITER    ','
  47. #define TOGINT_CHOICE_COUNT        100
  48.  
  49. char *togint_GetChoice(_arg4(char *, char *, int, int));
  50.  
  51. void togint_fkey(sed)
  52.     sed_type sed;
  53. /*
  54.     Cycle through list of changes when the SPACE bar is pressed.
  55.     (or when mouse is clicked on the field)
  56. */
  57. {
  58.     int     scancode, i, fieldno;
  59.     char    *list, key, choice;
  60.  
  61.     scancode = kb_Read();
  62.  
  63.     if (sed_DoSpecial(sed, scancode))
  64.         return;
  65.     if (special_key(sed, scancode))
  66.         return;
  67.     if (inter_field(sed, scancode))
  68.         return;
  69.     if (inter_page(sed, scancode))
  70.         return;
  71.  
  72.     /* reset baton */
  73.     sed_SetBaton(sed, -1);
  74.  
  75.     if ((list = (char *) sed_GetFieldData(sed, sed_GetFieldNo(sed), 1)) == NULL) {
  76.         return;
  77.     }
  78.  
  79.     fieldno = sed_GetFieldNo(sed);
  80.  
  81.     /* toggle on mouse click or spacebar */
  82.     if (scancode == MOU_CLICK || (ascii(scancode)) == ' ') {
  83.  
  84.         for (i = 0; i < TOGINT_CHOICE_COUNT; i++) {
  85.  
  86.             if (strncmp(togint_GetChoice(list, sed_GetScratchPad(sed), 
  87.                 i, sed_GetRecordLen(sed, fieldno)), 
  88.                 sed_GetCurrRecord(sed), 
  89.                 sed_GetRecordLen(sed, fieldno)) == 0) {
  90.  
  91.                 togint_GetChoice(list, sed_GetScratchPad(sed), i + 1, 
  92.                     sed_GetRecordLen(sed, fieldno));
  93.                 sed_SetCurrRecord(sed, sed_GetScratchPad(sed));
  94.                 sed_UpdateCurrField(sed);
  95.                 break;
  96.             }
  97.         }
  98.     }
  99.     /* do first letter search */
  100.     else {
  101.         key = tolower(ascii(scancode));
  102.         for (i = 0; i < TOGINT_CHOICE_COUNT; i++) {
  103.  
  104.             choice = tolower(*togint_GetChoice(list, sed_GetScratchPad(sed), 
  105.                 i, sed_GetRecordLen(sed, fieldno)));
  106.  
  107.             if (choice == key) {
  108.                 sed_SetCurrRecord(sed, sed_GetScratchPad(sed));
  109.                 sed_UpdateCurrField(sed);
  110.                 break;
  111.             }
  112.         }
  113.     }
  114. }
  115.  
  116. char *togint_GetChoice(list, string, index, slen)
  117.     char *list;
  118.     char *string;
  119.     int index;
  120.     int slen;
  121. /*
  122.     Copies the next choice from the list into string.
  123.     Returns string.
  124.     List is of the form:
  125.     "choice 1,choice 2,choice 3"  (commas delimit).
  126. */
  127. {
  128.     int start_off, off, word_off;
  129.     int len, len1, count;
  130.     
  131.     /* skip leading DELIMITERS */
  132.     for (start_off = 0; list[start_off] == DELIMITER; start_off++) {
  133.         ;
  134.     }
  135.  
  136.     for (word_off = off = start_off, count = 0, len1 = -1;; off++) {
  137.  
  138.         if (list[off] == DELIMITER || list[off] == '\0') {
  139.             if ((len = off - word_off) > slen) {
  140.                 len = slen;
  141.             }
  142.             if (len1 == -1) {
  143.                 len1 = len;
  144.             }
  145.             if (count == index) {
  146.                  memmove(string, list + word_off, len);
  147.                  string[len] = '\0';
  148.                  return(string);
  149.              }
  150.             if (list[off] == '\0') {
  151.                  memmove(string, list + start_off, len1);
  152.                  string[len1] = '\0';
  153.                  return(string);
  154.             }
  155.             count++;
  156.             word_off = off + 1;
  157.         }
  158.     }
  159. }
  160.  
  161. void togint_senter(sed, fieldno)
  162.     sed_type sed;
  163.     int fieldno;
  164. /*
  165.     This function goes from the native int to the record string.
  166. */
  167. {
  168.     char *list;
  169.  
  170.     if ((list = (char *) sed_GetFieldData(sed, fieldno, 1)) == NULL) {
  171.         return;
  172.     }
  173.  
  174.     togint_GetChoice(list, sed_GetScratchPad(sed), 
  175.         *(int *)sed_GetVar(sed, fieldno), sed_GetRecordLen(sed, fieldno));
  176.     sed_SetRecord(sed, sed_GetScratchPad(sed), fieldno);
  177.  
  178.     std_senter(sed, fieldno);
  179. }
  180.  
  181. void togint_sexit(sed, fieldno)
  182.     sed_type sed;
  183.     int fieldno;
  184. /*
  185.     Converts the record string into a int.
  186. */
  187. {
  188.     int i;
  189.     char *list;
  190.  
  191.     if (sed_GetBaton(sed) != SED_ABORT) {
  192.  
  193.         if ((list = (char *) sed_GetFieldData(sed, fieldno, 1)) == NULL) {
  194.             return;
  195.         }
  196.         for (i = 0; i < TOGINT_CHOICE_COUNT; i++) {
  197.             if (strncmp(togint_GetChoice(list, sed_GetScratchPad(sed), 
  198.                 i, sed_GetRecordLen(sed, fieldno)), sed_GetRecord(sed, fieldno), 
  199.                 sed_GetRecordLen(sed, fieldno)) == 0) {
  200.  
  201.                 *(int *)sed_GetVar(sed, fieldno) = i;
  202.                 return;
  203.             }
  204.         }
  205.         *(int *)sed_GetVar(sed, fieldno) = 0;
  206.     }
  207. }
  208.  
  209.