|
|
1.1 root 1: /* prim2time.c - presentation element to time string */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/psap/RCS/prim2time.c,v 7.0 89/11/23 22:13:17 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/psap/RCS/prim2time.c,v 7.0 89/11/23 22:13:17 mrose Rel $
9: *
10: *
11: * $Log: prim2time.c,v $
12: * Revision 7.0 89/11/23 22:13:17 mrose
13: * Release 6.0
14: *
15: */
16:
17: /*
18: * NOTICE
19: *
20: * Acquisition, use, and distribution of this module and related
21: * materials are subject to the restrictions of a license agreement.
22: * Consult the Preface in the User's Manual for the full terms of
23: * this agreement.
24: *
25: */
26:
27:
28: /* LINTLIBRARY */
29:
30: #include <ctype.h>
31: #include <stdio.h>
32: #include "psap.h"
33:
34: /* DATA */
35:
36: #define YEAR(y) ((y) >= 100 ? (y) : (y) + 1900)
37:
38: long get_usec ();
39:
40: /* */
41:
42: UTC prim2time (pe, generalized)
43: register PE pe;
44: int generalized;
45: {
46: int len;
47: register char *cp;
48: register UTC u;
49: UTC (*aux) ();
50:
51: aux = generalized ? str2gent : str2utct;
52: switch (pe -> pe_form) {
53: case PE_FORM_PRIM:
54: if (pe -> pe_prim == NULLPED)
55: return pe_seterr (pe, PE_ERR_PRIM, NULLUTC);
56: u = (*aux) ((char *) pe -> pe_prim, (int) pe -> pe_len);
57: break;
58:
59: case PE_FORM_CONS:
60: if ((cp = prim2str (pe, &len)) == NULLCP)
61: return NULLUTC;
62: u = len ? (*aux) (cp, len) : NULLUTC;
63: free (cp);
64: break;
65: }
66:
67: return (u ? u : pe_seterr (pe, generalized ? PE_ERR_GENT : PE_ERR_UTCT,
68: NULLUTC));
69: }
70:
71: /* */
72:
73: UTC str2utct (cp, len)
74: register char *cp;
75: register int len;
76: {
77: int year,
78: hours,
79: mins;
80: register int zone;
81: static UTCtime ut;
82: register UTC u = &ut;
83:
84: bzero ((char *) u, sizeof *u);
85:
86: if (sscanf (cp, "%2d%2d%2d%2d%2d", &year, &u -> ut_mon,
87: &u -> ut_mday, &u -> ut_hour, &u -> ut_min) != 5)
88: return NULLUTC;
89: cp += 10, len -= 10;
90: u -> ut_year = YEAR (year);
91:
92: if (len > 0 && isdigit (*cp)) {
93: if (sscanf (cp, "%2d", &u -> ut_sec) != 1)
94: return NULLUTC;
95: u -> ut_flags |= UT_SEC;
96: cp += 2, len -= 2;
97: }
98:
99: if (len > 0) {
100: switch (*cp) {
101: case 'Z':
102: cp++, len--;
103: break;
104:
105: case '+':
106: case '-':
107: if (sscanf (cp + 1, "%2d%2d", &hours, &mins) != 2)
108: return NULLUTC;
109: zone = hours * 60 + mins;
110: u -> ut_zone = *cp == '+' ? zone : -zone;
111: cp += 5, len -= 5;
112: break;
113:
114: default:
115: return NULLUTC;
116: }
117: u -> ut_flags |= UT_ZONE;
118: }
119: if (len != 0)
120: return NULLUTC;
121:
122: return u;
123: }
124:
125: /* */
126:
127: UTC str2gent (cp, len)
128: char *cp;
129: int len;
130: {
131: int hours,
132: mins;
133: long usec;
134: register int zone;
135: static UTCtime ut;
136: register UTC u = &ut;
137:
138: bzero ((char *) u, sizeof *u);
139:
140: if (sscanf (cp, "%4d%2d%2d%2d", &u -> ut_year, &u -> ut_mon,
141: &u -> ut_mday, &u -> ut_hour) != 4)
142: return NULLUTC;
143: cp += 10, len -= 10;
144:
145: if (len > 0)
146: switch (*cp) {
147: case '.':
148: case ',':
149: cp++, len--;
150: if ((usec = get_usec (&cp, &len)) < 0)
151: return NULLUTC;
152: u -> ut_min = (usec * 60) / 1000000;
153: usec -= (u -> ut_min * 1000000) / 60;
154: u -> ut_sec = (usec * 60) / 1000000;
155: usec -= (u -> ut_sec * 1000000) / 60;
156: u -> ut_usec = usec;
157: u -> ut_flags |= UT_SEC | UT_USEC;
158: goto get_zone;
159:
160: default:
161: if (isdigit (*cp)) {
162: if (sscanf (cp, "%2d", &u -> ut_min) != 1)
163: return NULLUTC;
164: cp += 2, len -= 2;
165: }
166: break;
167: }
168:
169: if (len > 0)
170: switch (*cp) {
171: case '.':
172: case ',':
173: cp++, len--;
174: if ((usec = get_usec (&cp, &len)) < 0)
175: return NULLUTC;
176: u -> ut_sec = (usec * 60) / 1000000;
177: usec -= (u -> ut_sec * 1000000) / 60;
178: u -> ut_usec = usec;
179: u -> ut_flags |= UT_SEC | UT_USEC;
180: goto get_zone;
181:
182: default:
183: if (isdigit (*cp)) {
184: if (sscanf (cp, "%2d", &u -> ut_sec) != 1)
185: return NULLUTC;
186: u -> ut_flags |= UT_SEC;
187: cp += 2, len -= 2;
188: }
189: break;
190: }
191:
192: if (len > 0)
193: switch (*cp) {
194: case '.':
195: case ',':
196: cp++, len--;
197: if ((usec = get_usec (&cp, &len)) < 0)
198: return NULLUTC;
199: u -> ut_usec = usec;
200: u -> ut_flags |= UT_USEC;
201: goto get_zone;
202:
203: default:
204: break;
205: }
206:
207: get_zone: ;
208: if (len > 0) {
209: switch (*cp) {
210: case 'Z':
211: cp++, len--;
212: break;
213:
214: case '+':
215: case '-':
216: if (sscanf (cp + 1, "%2d%2d", &hours, &mins) != 2)
217: return NULLUTC;
218: zone = hours * 60 + mins;
219: u -> ut_zone = *cp == '+' ? zone : -zone;
220: cp += 5, len -= 5;
221: break;
222:
223: default:
224: return NULLUTC;
225: }
226: u -> ut_flags |= UT_ZONE;
227: }
228: if (len != 0)
229: return NULLUTC;
230:
231: return u;
232: }
233:
234: /* */
235:
236: /* not perfect, but what is? */
237:
238: static long get_usec (cp, len)
239: char **cp;
240: int *len;
241: {
242: register int j;
243: register long i;
244: register char *dp;
245:
246: i = 0L;
247: for (dp = *cp, j = 0; isdigit (*dp); dp++, j++)
248: if (j < 6)
249: i = i * 10L + (long) (*dp - '0');
250:
251: *cp = dp, *len -= j;
252:
253: while (j++ < 6)
254: i *= 10L;
255:
256: return i;
257: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.