Initial import of the CDE 2.1.30 sources from the Open Group.
This commit is contained in:
264
cde/lib/DtSearch/objdate.c
Normal file
264
cde/lib/DtSearch/objdate.c
Normal file
@@ -0,0 +1,264 @@
|
||||
/*
|
||||
* COMPONENT_NAME: austext
|
||||
*
|
||||
* FUNCTIONS: is_objdatestr
|
||||
* is_objdatetm
|
||||
* objdate2fzkstr
|
||||
* objdate2tm
|
||||
* objdate_in_range
|
||||
* tm2objdate
|
||||
*
|
||||
* ORIGINS: 27
|
||||
*
|
||||
*
|
||||
* (C) COPYRIGHT International Business Machines Corp. 1994,1995
|
||||
* All Rights Reserved
|
||||
* Licensed Materials - Property of IBM
|
||||
* US Government Users Restricted Rights - Use, duplication or
|
||||
* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
|
||||
*/
|
||||
/*************************** OBJDATE.C *************************
|
||||
* $XConsortium: objdate.c /main/8 1996/11/21 19:51:44 drk $
|
||||
* November 1994.
|
||||
* Utilites for generic manipulation of austext objdates.
|
||||
* Most of these functions were originally in msgutil.c
|
||||
*
|
||||
* $Log$
|
||||
* Revision 2.5 1996/03/05 18:00:36 miker
|
||||
* Replaced hardcoded strings with refs to NULLDATESTR.
|
||||
*
|
||||
* Revision 2.4 1996/02/13 16:44:40 miker
|
||||
* Allow \n to terminate null date string in is_objdatestr.
|
||||
*
|
||||
* Revision 2.3 1995/10/25 16:38:10 miker
|
||||
* Added prolog.
|
||||
*
|
||||
* Revision 2.2 1995/10/02 20:37:30 miker
|
||||
* Cosmetic cleanup only.
|
||||
*
|
||||
* Revision 2.1 1995/09/22 21:25:35 miker
|
||||
* Freeze DtSearch 0.1, AusText 2.1.8
|
||||
*
|
||||
* Revision 1.3 1995/09/05 18:24:09 miker
|
||||
* Remove refs to usrblk so objdate can be used in offline programs.
|
||||
* Name changes for DtSearch.
|
||||
*/
|
||||
|
||||
#include "SearchP.h"
|
||||
#define X_INCLUDE_STRING_H
|
||||
#define XOS_USE_NO_LOCKING
|
||||
#include <X11/Xos_r.h>
|
||||
|
||||
#define PROGNAME "OBJDATE"
|
||||
|
||||
/************************************************/
|
||||
/* */
|
||||
/* is_objdatestr */
|
||||
/* */
|
||||
/************************************************/
|
||||
/* Converts OBJDATESTR formatted string as found in .fzk files
|
||||
* to DtSrObjdate long integer if string is valid.
|
||||
* Returns TRUE if passed string is correctly formatted
|
||||
* and conversion successful. Returns FALSE and
|
||||
* does not alter passed objdate if string is not valid.
|
||||
* String format is: "yy/mm/dd~hh:mm[\n]" (see OBJDATESTR in SearchP.h).
|
||||
* The slashes and tilde are mandatory, the final \n is optional.
|
||||
* Each field maps to an objdate bitfield; bitfields map
|
||||
* to struct tm fields (see fuzzy.h).
|
||||
* Can be used merely to test for valid string format by
|
||||
* passing NULL for objdate pointer.
|
||||
*/
|
||||
int is_objdatestr (char *string, DtSrObjdate *objdptr)
|
||||
{
|
||||
static char parsebuf[24];
|
||||
int i;
|
||||
char *token;
|
||||
DtSrObjdate myobjdate = 0L;
|
||||
_Xstrtokparams strtok_buf;
|
||||
|
||||
/* Test for "null" objdate (which is valid) */
|
||||
if (strncmp (string, NULLDATESTR, 9) == 0) {
|
||||
if (string[9] == 0 || string[9] == '\n') {
|
||||
if (objdptr)
|
||||
*objdptr = 0L;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
strncpy (parsebuf, string, sizeof (parsebuf));
|
||||
parsebuf[sizeof (parsebuf) - 1] = '\0';
|
||||
|
||||
if ((token = _XStrtok(parsebuf, "/", strtok_buf)) == NULL)
|
||||
return FALSE;
|
||||
i = atoi (token);
|
||||
if (i < 1 || i > 4095) /* yy */
|
||||
return FALSE;
|
||||
else
|
||||
myobjdate |= (i << 20);
|
||||
|
||||
if ((token = _XStrtok(NULL, "/", strtok_buf)) == NULL)
|
||||
return FALSE;
|
||||
i = atoi (token);
|
||||
if (i < 1 || i > 12) /* mm */
|
||||
return FALSE;
|
||||
else
|
||||
myobjdate |= (--i << 16);
|
||||
|
||||
if ((token = _XStrtok(NULL, "~", strtok_buf)) == NULL)
|
||||
return FALSE;
|
||||
i = atoi (token);
|
||||
if (i < 1 || i > 31) /* dd */
|
||||
return FALSE;
|
||||
else
|
||||
myobjdate |= (i << 11);
|
||||
|
||||
if ((token = _XStrtok(NULL, ":", strtok_buf)) == NULL)
|
||||
return FALSE;
|
||||
i = atoi (token);
|
||||
if (i < 0 || i > 23) /* hh */
|
||||
return FALSE;
|
||||
else
|
||||
myobjdate |= (i << 6);
|
||||
|
||||
if ((token = _XStrtok(NULL, "\n", strtok_buf)) == NULL)
|
||||
return FALSE;
|
||||
i = atoi (token);
|
||||
if (i < 0 || i > 59) /* mm */
|
||||
return FALSE;
|
||||
else
|
||||
myobjdate |= i;
|
||||
|
||||
if (objdptr)
|
||||
*objdptr = myobjdate;
|
||||
return TRUE;
|
||||
} /* is_objdatestr() */
|
||||
|
||||
|
||||
|
||||
/************************************************/
|
||||
/* */
|
||||
/* is_objdatetm */
|
||||
/* */
|
||||
/************************************************/
|
||||
/* Returns TRUE if passed structure is correctly formatted
|
||||
* for conversion to DtSrObjdate variable, else returns FALSE.
|
||||
*/
|
||||
int is_objdatetm (struct tm *objdatetm)
|
||||
{
|
||||
if (objdatetm->tm_year < 0)
|
||||
return FALSE;
|
||||
if (objdatetm->tm_year > 4095)
|
||||
return FALSE;
|
||||
if (objdatetm->tm_mon < 0)
|
||||
return FALSE;
|
||||
if (objdatetm->tm_mon > 11)
|
||||
return FALSE;
|
||||
if (objdatetm->tm_mday < 1)
|
||||
return FALSE;
|
||||
if (objdatetm->tm_mday > 31)
|
||||
return FALSE;
|
||||
if (objdatetm->tm_hour < 0)
|
||||
return FALSE;
|
||||
if (objdatetm->tm_hour > 23)
|
||||
return FALSE;
|
||||
if (objdatetm->tm_min < 0)
|
||||
return FALSE;
|
||||
if (objdatetm->tm_min > 59)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
} /* is_objdatetm() */
|
||||
|
||||
|
||||
/************************************************/
|
||||
/* */
|
||||
/* objdate2tm */
|
||||
/* */
|
||||
/************************************************/
|
||||
/* Converts DtSrObjdate formatted long int and returns
|
||||
* pointer to static, standard unix tm structure.
|
||||
* Bitfields map to struct tm fields (see fuzzy.h).
|
||||
* The output tm structure is suitable for mktime(),
|
||||
* but may only work for some formats of strftime().
|
||||
*/
|
||||
struct tm *objdate2tm (DtSrObjdate objdate)
|
||||
{
|
||||
static struct tm mytm;
|
||||
memset (&mytm, 0, sizeof (struct tm));
|
||||
mytm.tm_year = objdate >> 20;
|
||||
mytm.tm_mon = (objdate >> 16) & 0xf;
|
||||
mytm.tm_mday = (objdate >> 11) & 0x1f;
|
||||
mytm.tm_hour = (objdate >> 6) & 0x1f;
|
||||
mytm.tm_min = objdate & 0x3f;
|
||||
mytm.tm_isdst = -1;
|
||||
return &mytm;
|
||||
} /* objdate2tm() */
|
||||
|
||||
|
||||
/************************************************/
|
||||
/* */
|
||||
/* objdate2fzkstr */
|
||||
/* */
|
||||
/************************************************/
|
||||
/* Converts DtSrObjdate formatted long int and returns pointer
|
||||
* to static date string in .fzk format for debugging.
|
||||
*/
|
||||
char *objdate2fzkstr (DtSrObjdate objdate)
|
||||
{
|
||||
struct tm *tmptr;
|
||||
static char strbuf[36];
|
||||
if (objdate == 0L)
|
||||
return NULLDATESTR;
|
||||
tmptr = objdate2tm (objdate);
|
||||
sprintf (strbuf, OBJDATESTR,
|
||||
tmptr->tm_year, tmptr->tm_mon + 1,
|
||||
tmptr->tm_mday, tmptr->tm_hour, tmptr->tm_min);
|
||||
return strbuf;
|
||||
} /* objdate2fzkstr() */
|
||||
|
||||
|
||||
/************************************************/
|
||||
/* */
|
||||
/* tm2objdate */
|
||||
/* */
|
||||
/************************************************/
|
||||
/* Converts specific fields in a tm structure to
|
||||
* an DtSrObjdate formatted long int and returns it.
|
||||
* DtSrObjdate bitfields map to struct tm fields (see fuzzy.h).
|
||||
* Does not validate tm fields (use is_objdate() to confirm).
|
||||
*/
|
||||
DtSrObjdate tm2objdate (struct tm *tmptr)
|
||||
{
|
||||
return ((tmptr->tm_year << 20) |
|
||||
(tmptr->tm_mon << 16) |
|
||||
(tmptr->tm_mday << 11) |
|
||||
(tmptr->tm_hour << 6) |
|
||||
tmptr->tm_min);
|
||||
} /* tm2objdate() */
|
||||
|
||||
|
||||
/************************************************/
|
||||
/* */
|
||||
/* objdate_in_range */
|
||||
/* */
|
||||
/************************************************/
|
||||
/* Returns TRUE if passed record objdate (presumably read from
|
||||
* an austext record) is within the objdate ranges specified
|
||||
* in usrblk. Returns FALSE if record is in any way disqualified
|
||||
* from inclusion on a hitlist because of date.
|
||||
* Zero in any of the three dates is automatic "in range" qualification.
|
||||
*/
|
||||
int objdate_in_range (
|
||||
DtSrObjdate recdate,
|
||||
DtSrObjdate date1,
|
||||
DtSrObjdate date2)
|
||||
{
|
||||
if (recdate == 0L) /* Null dated record always qualifies */
|
||||
return TRUE;
|
||||
if (date1 != 0L && date1 > recdate)
|
||||
return FALSE;
|
||||
if (date2 != 0L && date2 < recdate)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
} /* objdate_in_range() */
|
||||
|
||||
/********************** OBJDATE.C *************************/
|
||||
Reference in New Issue
Block a user