home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / FUNCS / FNTICKER.C < prev    next >
C/C++ Source or Header  |  1990-12-08  |  6KB  |  249 lines

  1. /*
  2.      fnticker.c  2/3/87
  3.  
  4.     % ticker_funcs
  5.  
  6.     Ticker tape field functions.
  7.     i.e.  field variable is longer than record.
  8.  
  9.     NOTE:  This routine is OBSOLETE.  There is no reason to use
  10.     ticker_funcs as C-scape now allows ANY field to be wider
  11.     than its displayed width by using menu_Printf's Field width option.
  12.  
  13.     ALSO, the field var_size is incorrect, this func won't work in sleds.    
  14.  
  15.     the variable is interpreted as follows:
  16.     byte 0,1:     length to the string
  17.     byte 2,3:     offset within the string
  18.     byte 4..n    the string.
  19.  
  20.     The various 'tick_' macros (in CSCAPE.H) are used to
  21.     construct the tick_ variable
  22.  
  23.     The length of the tick_ array should be at least
  24.     2*sizeof(int) + 1 + the length of the string.
  25.  
  26.     NOTE: the length and offset are INTEGERS not unsigned
  27.           as indicated in the manual.  It is ok for the field
  28.           to contain non-writeable positions.
  29.  
  30.     C-scape 3.2
  31.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  32.     ALL RIGHTS RESERVED.
  33.  
  34.     Revision History:
  35.     -----------------
  36.     11/15/87 jmd    changed memcpy to memmove
  37.      4/06/88 jmd     added call to sed_DoSpecial
  38.      7/23/88 jmd    added oakland.h
  39.      9/15/88 jmd     removed vid_Cursor calls
  40.      9/17/88 jmd     added std_ funcs
  41.     10/14/88 jdc    added var_size element to field_funcs_struct
  42.  
  43.      6/07/89 jmd    added test for mouse code (later removed)
  44.      3/28/90 jmd    ansi-fied
  45.     12/08/90 pmcm    changed std_fenter to stdNoCur_fenter
  46. */
  47.  
  48. #include <stdio.h>
  49. #include <ctype.h>
  50. #include <string.h>
  51.  
  52. #include "cscape.h"
  53. #include "fnfunc.h"            /* for field functions */
  54. #include "strdecl.h"        /* for C-scape string functions */
  55. #include "scancode.h"
  56.  
  57. #include "oakpriv.h"        /* for memmove() macro */
  58.  
  59. OSTATIC void tick_adjust(sed_type sed, char *tick, int delta);
  60. OSTATIC void tick_PushRight(sed_type sed, char *tick, char c);
  61. OSTATIC void tick_PullRight(sed_type sed, char *tick);
  62.  
  63. OGLOBAL field_funcs_struct ticker_funcs = {
  64.     stdNoCur_fenter,
  65.     string_fexit,
  66.     ticker_fkey,
  67.     ticker_senter,
  68.     FNULL,
  69.     0
  70. };
  71.  
  72. void ticker_fkey(sed_type sed)
  73. {
  74.     int     scancode;
  75.     char     *tick;
  76.  
  77.     tick = (char *) sed_GetCurrVar(sed);
  78.  
  79.     scancode = kb_Read();
  80.  
  81.     if (sed_DoSpecial(sed, scancode))
  82.         return;
  83.     if (special_key(sed, scancode))
  84.         return;
  85.     if (inter_field(sed, scancode))
  86.         return;
  87.     if (inter_page(sed, scancode))
  88.         return;
  89.  
  90.     switch(scancode) {
  91.     case RIGHT:
  92.         if (!sed_IsEnd(sed)) {
  93.             sed_IncChar(sed);
  94.         }
  95.         else {
  96.             tick_adjust(sed, tick, 1);
  97.         }
  98.         break;
  99.     case LEFT:
  100.         if (!sed_IsHome(sed)) {
  101.             sed_DecChar(sed);
  102.         }
  103.         else {
  104.             tick_adjust(sed, tick, -1);
  105.         }
  106.         break;
  107.  
  108.     case HOME:
  109.         sed_GoHome(sed);
  110.         tick_adjust(sed, tick, -(tick_GetLen(tick)));
  111.         break;
  112.     case END:
  113.         sed_GoEnd(sed);
  114.         tick_adjust(sed, tick, tick_GetLen(tick));
  115.         break;
  116.     case INS:
  117.         if (kb_Insert()) {
  118.             sed_SetCursorType(sed, CURSOR_HALF);
  119.         }
  120.         else {
  121.             sed_SetCursorType(sed, CURSOR_NORMAL);
  122.         }
  123.         break;
  124.     case BACKSPACE:
  125.         if (!sed_IsHome(sed)) {
  126.             sed_DecChar(sed);
  127.             tick_PullRight(sed, tick);
  128.         }
  129.         else if (tick_GetOffset(tick) != 0) {
  130.             tick_adjust(sed, tick, -1);
  131.             tick_PullRight(sed, tick);
  132.         }
  133.         break;
  134.     case DEL:
  135.         tick_PullRight(sed, tick);
  136.         break;
  137.  
  138.     default:
  139.         if (isprint(ascii(scancode))) {
  140.             if (kb_Insert()) {
  141.                 tick_PushRight(sed, tick, (char) ascii(scancode));
  142.             }
  143.             else {
  144.                 sed_Overwrite(sed, ascii(scancode));
  145.             }
  146.             if (!sed_IsEnd(sed)) {
  147.                 tick_adjust(sed, tick, 0);    /* copy changes into var */
  148.                 sed_IncChar(sed);
  149.             }
  150.             else {
  151.                 tick_adjust(sed, tick, 1);
  152.             }
  153.         }
  154.         break;
  155.     }
  156. }
  157.  
  158. void ticker_senter(sed_type sed, int fieldno)
  159. /*
  160.     Copy the native ticker into the record string.
  161. */
  162. {
  163.     char *tick;
  164.  
  165.     tick = (char *) sed_GetVar(sed, fieldno);
  166.  
  167.     /* pad the tick string */
  168.     strpad(tick_GetString(tick), tick_GetLen(tick));
  169.  
  170.     sed_SetRecord(sed, tick_GetString(tick) + tick_GetOffset(tick), fieldno);
  171. }
  172.  
  173. static void tick_adjust(sed_type sed, char *tick, int delta)
  174. /*
  175.     Adjust the tick to a new offset;
  176. */
  177. {
  178.     char *p, *q;
  179.  
  180.     /* check boundaries */
  181.     if (tick_GetOffset(tick) + delta < 0) {
  182.         delta = -(tick_GetOffset(tick));
  183.     }
  184.  
  185.     if (tick_GetOffset(tick) + delta + sed_GetCurrRecordLen(sed) > tick_GetLen(tick)) {
  186.         delta = tick_GetLen(tick) - (tick_GetOffset(tick) + sed_GetCurrRecordLen(sed));
  187.     }
  188.  
  189.     /* copy record into variable */
  190.     p = tick_GetString(tick) + tick_GetOffset(tick);
  191.     q = sed_GetCurrRecord(sed);
  192.     while(*q) {
  193.         *p++ = *q++;
  194.     }
  195.  
  196.     if (delta == 0) {
  197.         return;
  198.     }
  199.  
  200.     /* set new_offset */
  201.     tick_SetOffset(tick, tick_GetOffset(tick) + delta);
  202.      sed_RepaintField(sed, sed_GetFieldNo(sed));
  203. }
  204.  
  205. static void tick_PushRight(sed_type sed, char *tick, char c)
  206. /*
  207.     inserts c at the current position, pushes the
  208.             characters to the right:
  209. */
  210. {
  211.     char *p;
  212.     int cnt, off;
  213.  
  214.     /* move over the other stuff */
  215.  
  216.     off = tick_GetOffset(tick) + sed_GetRecordPos(sed);
  217.     cnt = tick_GetLen(tick) - off;
  218.     p = tick_GetString(tick) + off;
  219.  
  220.     memmove(p + 1, p, cnt);
  221.     p[cnt] = '\0';
  222.  
  223.     *p = c;
  224.  
  225.      sed_RepaintField(sed, sed_GetFieldNo(sed));
  226. }
  227.  
  228. static void tick_PullRight(sed_type sed, char *tick)
  229. /*
  230.     deletes character at the current position, pull the
  231.             characters from the right:
  232.     Put a space at the end.
  233. */
  234. {
  235.     char *p;
  236.     int cnt, off;
  237.  
  238.     /* move over the other stuff */
  239.  
  240.     off = tick_GetOffset(tick) + sed_GetRecordPos(sed);
  241.     cnt = tick_GetLen(tick) - off;
  242.     p = tick_GetString(tick) + off;
  243.  
  244.     memmove(p, p + 1, cnt);
  245.     p[cnt - 1] = ' ';
  246.  
  247.      sed_RepaintField(sed, sed_GetFieldNo(sed));
  248. }
  249.