home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / FUNCS / FNDATE.C < prev    next >
C/C++ Source or Header  |  1990-09-11  |  4KB  |  228 lines

  1. /*
  2.     fndate.c    jdc     3/10/87
  3.  
  4.     % date_funcs
  5.  
  6.     Date editing functions.
  7.     The field variable should be a struct tm *.
  8.  
  9.     C-scape 3.2
  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.      1/25/90 jmd    converted kb_Check to kb_CheckWait
  28.      2/26/90 pmcm/mla changed month and day init in senter
  29.      3/14/90 jmd    moved formatting before validation
  30.      3/16/90 jmd    added support for KEY_INVALID in fexit
  31.      3/28/90 jmd    ansi-fied
  32.      8/27/90 jmd    removed errmsg global variable
  33.      9/11/90 pmcm    changed sed_SetMouseCode to kb_Stuff
  34. */
  35.  
  36. #include <stdio.h>
  37. #include <string.h>
  38. #include <ctype.h>
  39.  
  40. #include "cscape.h"
  41. #include "ostdlib.h"        /* for atoi() */
  42. #include "scancode.h"
  43.  
  44. #include "fnfunc.h"            /* for field functions */
  45.  
  46. #include <time.h>
  47. #include "cstime.h"
  48.  
  49. OGLOBAL field_funcs_struct date_funcs = {
  50.     std_fenter,
  51.     date_fexit,
  52.     date_fkey,
  53.     date_senter,
  54.     date_sexit,
  55.     sizeof(struct tm)
  56. };
  57.  
  58. void date_fkey(sed_type sed)
  59. {
  60.     int   scancode, key;
  61.  
  62.     scancode = kb_Read();
  63.  
  64.     if (sed_DoSpecial(sed, scancode))
  65.         return;
  66.     if (special_key(sed, scancode))
  67.         return;
  68.     if (inter_field(sed, scancode))
  69.         return;
  70.     if (inter_page(sed, scancode))
  71.         return;
  72.  
  73.     switch(scancode) {
  74.     case RIGHT:
  75.         sed_IncChar(sed);
  76.         break;
  77.     case LEFT:
  78.         sed_DecChar(sed);
  79.         break;
  80.     case HOME:
  81.         sed_GoHome(sed);
  82.         break;
  83.     case END:
  84.         sed_GoEnd(sed);
  85.         break;
  86.     case INS:
  87.         break;
  88.     case BACKSPACE:
  89.         sed_Overwrite(sed,'0');
  90.         sed_DecChar(sed);
  91.         break;
  92.     case DEL:
  93.         sed_Overwrite(sed,'0');
  94.         break;
  95.     default:
  96.         key = ascii(scancode);
  97.         if (isdigit(key)) {
  98.             if (sed_GetBaton(sed) == SED_FIRST) {
  99.                 /* clear record on first keystroke */
  100.                 sed_SetCurrRecord(sed, "000000");
  101.                 sed_UpdateCurrField(sed);
  102.             }
  103.             sed_Overwrite(sed, key);
  104.             sed_IncChar(sed);
  105.         }
  106.         break;
  107.     }
  108.  
  109.     /* reset baton */
  110.     sed_SetBaton(sed, -1);
  111. }
  112.  
  113. boolean date_fexit(sed_type sed)
  114. {
  115.     struct tm *t;
  116.  
  117.  
  118.     if (sed_GetBaton(sed) != SED_ABORT) {
  119.  
  120.         /* format the field's record */
  121.         std_format(sed);
  122.  
  123.         t = (struct tm *) sed_GetCurrVar(sed);
  124.  
  125.         date_sexit(sed, sed_GetFieldNo(sed));
  126.  
  127.         if (!tm_IsDateValid(t)) {
  128.  
  129.             /* Invalid entry: notify fkey function via mouse code */
  130.             kb_Stuff(KEY_INVALID);
  131.             return(FALSE);
  132.         }
  133.     }
  134.  
  135.     return(std_fexit(sed));
  136. }
  137.  
  138. void date_senter(sed_type sed, int fieldno)
  139. /*
  140.     Convert native type to string for record.
  141. */
  142. {
  143.     struct tm *t;
  144.     int year, mon, day;
  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.         day = (t->tm_mday <= 0) ? 1 : t->tm_mday;
  152.     }
  153.     else {
  154.         day = 1;
  155.         mon = 1;
  156.         year = 0;
  157.     }
  158.  
  159.     switch (ocountry.date_fmt) {
  160.  
  161.     case DDMMYY:
  162.         sprintf(sed_GetScratchPad(sed), "%02d%02d%02d", day,mon,year);
  163.         break;
  164.     case YYMMDD:
  165.         sprintf(sed_GetScratchPad(sed), "%02d%02d%02d", year,mon,day);
  166.         break;
  167.     default:
  168.         sprintf(sed_GetScratchPad(sed), "%02d%02d%02d", mon,day,year);
  169.         break;
  170.     }
  171.     sed_SetRecord(sed, sed_GetScratchPad(sed), fieldno);
  172.  
  173.     std_senter(sed, fieldno);
  174. }
  175.  
  176. void date_sexit(sed_type sed, int fieldno)
  177. /*
  178.     Converts record back to native type.
  179. */
  180. {
  181.     char   *buf;
  182.     int     f1, f2, f3;
  183.     struct tm *t;
  184.  
  185.     if (sed_GetBaton(sed) == SED_ABORT) {
  186.         return;
  187.     }
  188.  
  189.     t = (struct tm *) sed_GetVar(sed,fieldno);
  190.  
  191.     buf = sed_GetScratchPad(sed);
  192.  
  193.     strcpy(buf,sed_GetRecord(sed, fieldno));
  194.  
  195.     f1 = atoi(buf+4);
  196.     *(buf+4) = '\0';
  197.     f2 = atoi(buf+2);
  198.     *(buf+2) = '\0';
  199.     f3 = atoi(buf);
  200.  
  201.     if (f1 != 0    || f2 != 0 || f3 !=0) {
  202.         switch (ocountry.date_fmt){
  203.         case DDMMYY:
  204.             t->tm_year = f1 + 1900;
  205.             t->tm_mon  = f2 - 1;
  206.             t->tm_mday = f3;
  207.             break;
  208.         case YYMMDD:
  209.             t->tm_mday = f1;
  210.             t->tm_mon  = f2 - 1;
  211.             t->tm_year = f3 + 1900;
  212.             break;
  213.         default:
  214.             t->tm_year = f1 + 1900;
  215.             t->tm_mday = f2;
  216.             t->tm_mon  = f3 - 1;
  217.             break;
  218.         }
  219.     }
  220.     else {
  221.         t->tm_year = t->tm_mon = t->tm_mday = 0;
  222.     }
  223. }
  224.  
  225.  
  226.  
  227.  
  228.