1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00
cde/cde/lib/DtSearch/objdate.c
Pascal Stumpf a1cbcd24db Low-hanging fruit: Fix most warnings in lib/DtSearch.
Most of these are related to missing includes and prototypes as well as
parens/braces.  A few are also potential 64bit issues.
2012-08-12 14:20:58 -06:00

287 lines
8.1 KiB
C

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these librararies and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/*
* 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"
#include <stdlib.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 *************************/