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

  1. /*
  2.     fntime.c    
  3.  
  4.     % time_funcs
  5.  
  6.     Time 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.      3/12/87 jdc    created
  16.      4/06/88 jmd     added call to sed_DoSpecial
  17.      5/12/88 jmd    added calls to sed_GetScratchPad()
  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/07/89 jmd    added test for mouse code (later removed)
  24.  
  25.      1/25/90 jmd    converted kb_Check to kb_CheckWait
  26.      1/31/90 jmd    don't reset baton on MOU_CLICK
  27.      3/14/90 jmd    moved formatting before validation
  28.      3/16/90 jmd    added support for KEY_INVALID in fexit
  29.      3/28/90 jmd    ansi-fied
  30.      7/11/90 jdc    added record len check for senter, sexit
  31.      8/01/90 jdc    now uses time_fmt field in ocountry struct for 24/12 hour
  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.  
  41. #include "cscape.h"
  42. #include "ostdlib.h"        /* for atoi() */
  43.  
  44. #include "scancode.h"
  45. #include "fnfunc.h"            /* for field functions */
  46.  
  47. #include <time.h>
  48. #include "cstime.h"
  49.  
  50. OGLOBAL field_funcs_struct time_funcs = {
  51.     std_fenter,
  52.     time_fexit,
  53.     time_fkey,
  54.     time_senter,
  55.     time_sexit,
  56.     sizeof(struct tm)
  57. };
  58.  
  59. void time_fkey(sed_type sed)
  60. {
  61.     int   scancode, key;
  62.  
  63.     scancode = kb_Read();
  64.  
  65.     if (sed_DoSpecial(sed, scancode))
  66.         return;
  67.     if (special_key(sed, scancode))
  68.         return;
  69.     if (inter_field(sed, scancode))
  70.         return;
  71.     if (inter_page(sed, scancode))
  72.         return;
  73.  
  74.     switch(scancode) {
  75.     case ESC:
  76.         sed_SetBaton(sed, 0);
  77.         sed_ToggleExit(sed);
  78.         break;
  79.     case RIGHT:
  80.         sed_IncChar(sed);
  81.         break;
  82.     case LEFT:
  83.         sed_DecChar(sed);
  84.         break;
  85.     case HOME:
  86.         sed_GoHome(sed);
  87.         break;
  88.     case END:
  89.         sed_GoEnd(sed);
  90.         break;
  91.     case INS:
  92.         break;
  93.     case BACKSPACE:
  94.         sed_Overwrite(sed,'0');
  95.         sed_DecChar(sed);
  96.         break;
  97.     case DEL:
  98.         sed_Overwrite(sed,'0');
  99.         break;
  100.     default:
  101.         key = ascii(scancode);
  102.         if (isdigit(key)) {
  103.             if (sed_GetBaton(sed) == SED_FIRST) {
  104.                 /* clear record on first keystroke */
  105.                 sed_SetCurrRecord(sed, "000000");
  106.                 sed_UpdateCurrField(sed);
  107.             }
  108.             sed_Overwrite(sed, key);
  109.             sed_IncChar(sed);
  110.         }
  111.         break;
  112.     }
  113.  
  114.     /* reset baton */
  115.     if (scancode != MOU_CLICK) {
  116.         sed_SetBaton(sed, -1);
  117.     }
  118. }
  119.  
  120. boolean time_fexit(sed_type sed)
  121. {
  122.     if (sed_GetBaton(sed) != SED_ABORT) {
  123.  
  124.         /* format the field's record */
  125.         std_format(sed);
  126.         time_sexit(sed, sed_GetFieldNo(sed));
  127.  
  128.         if (!tm_IsTimeValid((struct tm *) sed_GetCurrVar(sed))) {
  129.  
  130.             /* Invalid entry: notify fkey function via mouse code */
  131.             kb_Stuff(KEY_INVALID);
  132.             return(FALSE);
  133.         }
  134.     }
  135.  
  136.     return(std_fexit(sed));
  137. }
  138.  
  139. void time_senter(sed_type sed, int fieldno)
  140. /*
  141.     Convert native type to string for record.
  142.  
  143.     uses ocountry_struct (fncntry.h) time_fmt field to determine
  144.     military or standard time.
  145. */
  146. {
  147.     struct tm *t;
  148.     int len, hour, am = TRUE;
  149.     char buff[10];
  150.  
  151.     t = (struct tm *) sed_GetVar(sed,fieldno);
  152.     hour = t->tm_hour;
  153.  
  154.     if (ocountry.time_fmt == TIME_12) {
  155.  
  156.         if (hour >= 12) {
  157.             am = FALSE;
  158.         }
  159.         if (hour == 0) {
  160.             hour = 12;
  161.         }
  162.         else if (hour > 12) {
  163.             hour -= 12;
  164.         }
  165.     }
  166.  
  167.     sprintf(buff, "%02d%02d%02d", hour, t->tm_min, t->tm_sec);
  168.  
  169.     if (ocountry.time_fmt == TIME_12 
  170.     && (len = sed_GetRecordLen(sed, fieldno)) >= 4) {
  171.  
  172.         strcpy(buff + len - 2, (am) ? "am" : "pm");
  173.     }
  174.  
  175.     sed_SetRecord(sed, buff, fieldno);
  176.  
  177.     std_senter(sed, fieldno);
  178. }
  179.  
  180. void time_sexit(sed_type sed, int fieldno)
  181. /*
  182.     Converts record back to native type.
  183.  
  184.     if no 'a' or 'p' character exsist in the record then it assumes
  185.     military time REGARDLESS of the ocountry_struct.
  186. */
  187. {
  188.     char buff[10];
  189.     struct tm *t;
  190.     int time_fmt = TIME_24, am = TRUE, i;
  191.  
  192.     if (sed_GetBaton(sed) == SED_ABORT) {
  193.         return;
  194.     }
  195.  
  196.     t = (struct tm *) sed_GetVar(sed,fieldno);
  197.  
  198.     strcpy(buff, sed_GetRecord(sed, fieldno));
  199.  
  200.     for (i = sed_GetRecordLen(sed, fieldno) - 1; 
  201.          i >= 0 && !isdigit(buff[i]); i--) {
  202.  
  203.         if (buff[i] == 'p') {
  204.             am = FALSE;
  205.             time_fmt = TIME_12;
  206.         }
  207.         else if (buff[i] == 'a') time_fmt = TIME_12;
  208.     }
  209.     if (i < 0) return;
  210.  
  211.     t->tm_sec = 0;
  212.     t->tm_min = 0;
  213.  
  214.     i++;
  215.        buff[i] = '\0';
  216.  
  217.     if (i >= 6) {
  218.         i -= 2;
  219.         t->tm_sec = atoi(buff + i);
  220.         buff[i] = '\0';
  221.     }
  222.     if (i == 4) {
  223.         i -= 2;
  224.         t->tm_min = atoi(buff + i);
  225.         buff[i] = '\0';
  226.     }
  227.     t->tm_hour = atoi(buff);
  228.  
  229.     if (time_fmt == TIME_12) {
  230.  
  231.         if (!am) t->tm_hour += 12;
  232.         t->tm_hour -= 1;
  233.     }
  234. }
  235.  
  236.  
  237.  
  238.