|
|
1.1 root 1: #include "../h/rt.h"
2: #include "../h/keyword.h"
3: #ifdef SYSTIME
4: #include <sys/time.h>
5: #else SYSTIME
6: #include <time.h>
7: #endif SYSTIME
8: #include <sys/types.h>
9: #include <sys/times.h>
10:
11: static char *day[] = {
12: "Sunday", "Monday", "Tuesday", "Wednesday",
13: "Thursday", "Friday", "Saturday"
14: };
15:
16: static char *month[] = {
17: "January", "February", "March", "April", "May", "June",
18: "July", "August", "September", "October", "November", "December"
19: };
20:
21: /*
22: * keywd - process keyword.
23: */
24:
25: keywd(nargs, arg1)
26: int nargs;
27: struct descrip arg1;
28: {
29: register int hour, i;
30: register char *merid;
31: char sbuf[MAXSTRING];
32: struct tm *tbuf, *localtime();
33: struct tms tp;
34: long time(), clock, runtim;
35: char *alcstr();
36:
37: SetBound;
38:
39: /*
40: * This is just plug and chug code. For whatever keyword is desired,
41: * the appropriate value is dug out of the system and made into
42: * a suitable Icon value.
43: *
44: * A few special cases are worth noting:
45: * &fail - calls fail();
46: * &pos, &random, &trace - trapped variables are made for possible
47: * subsequent assignments.
48: */
49: switch (INTVAL(arg1)) {
50: case K_ASCII:
51: arg1.type = D_CSET;
52: BLKLOC(arg1) = (union block *) &k_ascii;
53: break;
54: case K_CLOCK:
55: sneed(8);
56: time(&clock);
57: tbuf = localtime(&clock);
58: sprintf(sbuf,"%02d:%02d:%02d",tbuf->tm_hour,tbuf->tm_min,tbuf->tm_sec);
59: STRLEN(arg1) = 8;
60: STRLOC(arg1) = alcstr(sbuf,8);
61: break;
62: case K_CSET:
63: arg1.type = D_CSET;
64: BLKLOC(arg1) = (union block *) &k_cset;
65: break;
66: case K_DATE:
67: sneed(10);
68: time(&clock);
69: tbuf = localtime(&clock);
70: sprintf(sbuf, "%04d/%02d/%02d",
71: (tbuf->tm_year)+1900,tbuf->tm_mon+1,tbuf->tm_mday);
72: STRLEN(arg1) = 10;
73: STRLOC(arg1) = alcstr(sbuf,10);
74: break;
75: case K_DATELINE:
76: time(&clock);
77: tbuf = localtime(&clock);
78: if ((hour = tbuf->tm_hour) >= 12) {
79: merid = "pm";
80: if (hour > 12)
81: hour -= 12;
82: }
83: else {
84: merid = "am";
85: if (hour < 1)
86: hour += 12;
87: }
88: sprintf(sbuf, "%s, %s %d, %d %d:%02d %s",
89: day[tbuf->tm_wday], month[tbuf->tm_mon], tbuf->tm_mday,
90: 1900 + tbuf->tm_year, hour, tbuf->tm_min, merid);
91: sneed(i = strlen(sbuf));
92: STRLEN(arg1) = i;
93: STRLOC(arg1) = alcstr(sbuf, i);
94: break;
95: case K_ERROUT:
96: arg1.type = D_FILE;
97: BLKLOC(arg1) = (union block *) &k_errout;
98: break;
99: case K_FAIL:
100: fail();
101: break;
102: case K_HOST:
103: iconhost(sbuf);
104: sneed(i = strlen(sbuf));
105: STRLEN(arg1) = i;
106: STRLOC(arg1) = alcstr(sbuf, i);
107: break;
108: case K_INPUT:
109: arg1.type = D_FILE;
110: BLKLOC(arg1) = (union block *) &k_input;
111: break;
112: case K_LCASE:
113: arg1.type = D_CSET;
114: BLKLOC(arg1) = (union block *) &k_lcase;
115: break;
116: case K_LEVEL:
117: arg1.type = D_INTEGER;
118: INTVAL(arg1) = k_level;
119: break;
120: case K_MAIN:
121: arg1 = k_main;
122: break;
123: case K_NULL:
124: arg1 = nulldesc;
125: break;
126: case K_OUTPUT:
127: arg1.type = D_FILE;
128: BLKLOC(arg1) = (union block *) &k_output;
129: break;
130: case K_POS:
131: arg1.type = D_TVPOS;
132: INTVAL(arg1) = k_pos;
133: break;
134: case K_RANDOM:
135: arg1.type = D_TVRAND;
136: BLKLOC(arg1) = (union block *) &k_random;
137: break;
138: case K_SOURCE:
139: arg1 = BLKLOC(current)->estack.activator;
140: break;
141: case K_SUBJECT:
142: arg1.type = D_VAR;
143: BLKLOC(arg1) = (union block *) &k_subject;
144: break;
145: case K_TIME:
146: times(&tp);
147: runtim =
148: 1000 * ((tp.tms_utime - starttime) / (double)HZ);
149: mkint(runtim, &arg1);
150: break;
151: case K_TRACE:
152: arg1.type = D_TVTRACE;
153: INTVAL(arg1) = k_trace;
154: break;
155: case K_UCASE:
156: arg1.type = D_CSET;
157: BLKLOC(arg1) = (union block *) &k_ucase;
158: break;
159: case K_VERSION:
160: sneed(i = strlen(VERSION));
161: STRLEN(arg1) = i;
162: STRLOC(arg1) = VERSION;
163: break;
164: case K_OPTIONS:
165: sneed(i = strlen(OPTIONS));
166: STRLEN(arg1) = i;
167: STRLOC(arg1) = OPTIONS;
168: break;
169: default:
170: syserr("keyword: unknown keyword type.");
171: }
172: ClearBound;
173: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.