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

  1. /*
  2.     fndate.c    jdc     3/10/87
  3.  
  4.     % date_funcs
  5.  
  6.     Date editting functions.
  7.     The field variable should be a struct tm *.
  8.  
  9.     C-scape 3.1
  10.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  11.     ALL RIGHTS RESERVED.
  12.  
  13.     Revision History:
  14.     -----------------
  15.      4/06/88 jmd     added call to sed_DoSpecial
  16.      5/12/88 jmd    added calls to sed_GetScratchPad()
  17.      8/20/88 jmd    removed some unused variables
  18.      9/17/88 jmd     added std_ funcs, errmsg
  19.     10/09/88 jmd     added SED_ABORT support
  20.     10/14/88 jdc    added var_size element to field_funcs_struct
  21.     12/22/88 jmd     added SED_FIRST support
  22.  
  23.      6/01/89 gam    added ocountry stuff
  24.      6/07/89 jmd    added test for mouse code (later removed)
  25.      6/05/89 gam    fixed reference to COUNTRY
  26. */
  27.  
  28. #include <stdio.h>
  29. #include <string.h>
  30. #include <ctype.h>
  31.  
  32. #include "cscape.h"
  33. #include "ostdlib.h"        /* for atoi() */
  34. #include "scancode.h"
  35.  
  36. #include <time.h>
  37. #include "cstime.h"
  38.  
  39. /* error message (global variable can be changed by programmer) */
  40. char *fndate_errmsg = "Invalid date";
  41.  
  42. OGLOBAL field_funcs_struct date_funcs = {
  43.     std_fenter,
  44.     date_fexit,
  45.     date_fkey,
  46.     date_senter,
  47.     date_sexit,
  48.     sizeof(struct tm)
  49. };
  50.  
  51. void date_fkey(sed)
  52.     sed_type sed;
  53. {
  54.     int   scancode, key;
  55.  
  56.     scancode = kb_Read();
  57.  
  58.     if (sed_DoSpecial(sed, scancode))
  59.         return;
  60.     if (special_key(sed, scancode))
  61.         return;
  62.     if (inter_field(sed, scancode))
  63.         return;
  64.     if (inter_page(sed, scancode))
  65.         return;
  66.  
  67.     switch(scancode) {
  68.     case RIGHT:
  69.         sed_IncChar(sed);
  70.         break;
  71.     case LEFT:
  72.         sed_DecChar(sed);
  73.         break;
  74.     case HOME:
  75.         sed_GoHome(sed);
  76.         break;
  77.     case END:
  78.         sed_GoEnd(sed);
  79.         break;
  80.     case INS:
  81.         break;
  82.     case BACKSPACE:
  83.         sed_Overwrite(sed,'0');
  84.         sed_DecChar(sed);
  85.         break;
  86.     case DEL:
  87.         sed_Overwrite(sed,'0');
  88.         break;
  89.     default:
  90.         key = ascii(scancode);
  91.         if (isdigit(key)) {
  92.             if (sed_GetBaton(sed) == SED_FIRST) {
  93.                 /* clear record on first keystroke */
  94.                 sed_SetCurrRecord(sed, "000000");
  95.                 sed_UpdateCurrField(sed);
  96.             }
  97.             sed_Overwrite(sed, key);
  98.             sed_IncChar(sed);
  99.         }
  100.         break;
  101.     }
  102.  
  103.     /* reset baton */
  104.     sed_SetBaton(sed, -1);
  105. }
  106.  
  107. boolean date_fexit(sed)
  108.     sed_type sed;
  109. {
  110.     struct tm *t;
  111.  
  112.  
  113.     if (sed_GetBaton(sed) != SED_ABORT) {
  114.         t = (struct tm *) sed_GetCurrVar(sed);
  115.  
  116.         date_sexit(sed, sed_GetFieldNo(sed));
  117.  
  118.         if (tm_IsDateValid(t)) {
  119.             sed_BorderPrompt(sed, NULL);
  120.             return(TRUE);
  121.         }
  122.         else {
  123.             tone();
  124.             sed_BorderPrompt(sed, fndate_errmsg);
  125.             /* wait for a keystroke */
  126.             while (!kb_Check())
  127.                 ;
  128.             sed_BorderPrompt(sed, sed_GetCurrFieldData(sed, 0));
  129.             return(FALSE);
  130.         }
  131.     }
  132.  
  133.     return(std_fexit(sed));
  134. }
  135.  
  136. void date_senter(sed, fieldno)
  137.     sed_type sed;
  138.     int fieldno;
  139. /*
  140.     Convert native type to string for record.
  141. */
  142. {
  143.     struct tm *t;
  144.     int year, mon;
  145.  
  146.     t = (struct tm *) sed_GetVar(sed,fieldno);
  147.  
  148.     if(t->tm_year > 0) {
  149.         year = t->tm_year - 1900;
  150.         mon = t->tm_mon + 1;
  151.     }
  152.     else mon = year = 0;
  153.  
  154.     switch (ocountry.date_fmt) {
  155.  
  156.     case DDMMYY:
  157.         sprintf(sed_GetScratchPad(sed), "%02d%02d%02d", t->tm_mday,mon,year);
  158.         break;
  159.     case YYMMDD:
  160.         sprintf(sed_GetScratchPad(sed), "%02d%02d%02d", year,mon,t->tm_mday);
  161.         break;
  162.     default:
  163.         sprintf(sed_GetScratchPad(sed), "%02d%02d%02d", mon,t->tm_mday,year);
  164.         break;
  165.     }
  166.     sed_SetRecord(sed, sed_GetScratchPad(sed), fieldno);
  167.  
  168.     std_senter(sed, fieldno);
  169. }
  170.  
  171. void date_sexit(sed, fieldno)
  172.     sed_type sed;
  173.     int fieldno;
  174. /*
  175.     Converts record back to native type.
  176. */
  177. {
  178.     char   *buf;
  179.     int     f1, f2, f3;
  180.     struct tm *t;
  181.  
  182.     if (sed_GetBaton(sed) == SED_ABORT) {
  183.         return;
  184.     }
  185.  
  186.     t = (struct tm *) sed_GetVar(sed,fieldno);
  187.  
  188.     buf = sed_GetScratchPad(sed);
  189.  
  190.     strcpy(buf,sed_GetRecord(sed, fieldno));
  191.  
  192.     f1 = atoi(buf+4);
  193.     *(buf+4) = '\0';
  194.     f2 = atoi(buf+2);
  195.     *(buf+2) = '\0';
  196.     f3 = atoi(buf);
  197.  
  198.     if (f1 != 0    || f2 != 0 || f3 !=0) {
  199.         switch (ocountry.date_fmt){
  200.         case DDMMYY:
  201.             t->tm_year = f1 + 1900;
  202.             t->tm_mon  = f2 - 1;
  203.             t->tm_mday = f3;
  204.             break;
  205.         case YYMMDD:
  206.             t->tm_mday = f1;
  207.             t->tm_mon  = f2 - 1;
  208.             t->tm_year = f3 + 1900;
  209.             break;
  210.         default:
  211.             t->tm_year = f1 + 1900;
  212.             t->tm_mday = f2;
  213.             t->tm_mon  = f3 - 1;
  214.             break;
  215.         }
  216.     }
  217.     else {
  218.         t->tm_year = t->tm_mon = t->tm_mday = 0;
  219.     }
  220. }
  221.  
  222.  
  223.  
  224.  
  225.