Annotation of freem/src/ssvn.c, revision 1.4
1.1 snw 1: /*
1.4 ! snw 2: * $Id: ssvn.c,v 1.3 2025/03/09 19:50:47 snw Exp $
1.1 snw 3: * structured system variable support
4: *
5: *
1.2 snw 6: * Author: Serena Willis <snw@coherent-logic.com>
1.1 snw 7: * Copyright (C) 1998 MUG Deutschland
1.3 snw 8: * Copyright (C) 2020, 2025 Coherent Logic Development LLC
1.1 snw 9: *
10: *
11: * This file is part of FreeM.
12: *
13: * FreeM is free software: you can redistribute it and/or modify
14: * it under the terms of the GNU Affero Public License as published by
15: * the Free Software Foundation, either version 3 of the License, or
16: * (at your option) any later version.
17: *
18: * FreeM is distributed in the hope that it will be useful,
19: * but WITHOUT ANY WARRANTY; without even the implied warranty of
20: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21: * GNU Affero Public License for more details.
22: *
23: * You should have received a copy of the GNU Affero Public License
24: * along with FreeM. If not, see <https://www.gnu.org/licenses/>.
25: *
1.4 ! snw 26: * $Log: ssvn.c,v $
! 27: * Revision 1.3 2025/03/09 19:50:47 snw
! 28: * Second phase of REUSE compliance and header reformat
! 29: *
1.3 snw 30: *
31: * SPDX-FileCopyrightText: (C) 2025 Coherent Logic Development LLC
32: * SPDX-License-Identifier: AGPL-3.0-or-later
1.1 snw 33: **/
34:
35: #include <stdio.h>
36: #include <stdlib.h>
37: #include <string.h>
38: #include <sys/types.h>
39: #if !defined(__OpenBSD__) && !defined(__FreeBSD__)
40: # include <sys/timeb.h>
41: #endif
42: #include "mpsdef.h"
43: #include "freem.h"
44: #include "mref.h"
45: #include "mdebug.h"
46:
47: #ifdef USE_SYS_TIME_H
48: # include <sys/time.h>
49: #endif
50:
51: typedef struct ssvn_lut {
52: const char *input_name;
53: const char *canonical_name;
54: } ssvn_lut;
55:
56: ssvn_lut ssv_tab[] = {
57: {"^$C", "^$CHARACTER"},
58: {"^$CHARACTER", "^$CHARACTER"},
59: {"^$D", "^$DEVICE"},
60: {"^$DEVICE", "^$DEVICE"},
61: {"^$DI", "^$DISPLAY"},
62: {"^$DISPLAY", "^$DISPLAY"},
63: {"^$E", "^$EVENT"},
64: {"^$EVENT", "^$EVENT"},
65: {"^$G", "^$GLOBAL"},
66: {"^$GLOBAL", "^$GLOBAL"},
67: {"^$J", "^$JOB"},
68: {"^$JOB", "^$JOB"},
69: {"^$LI","^$LIBRARY"},
70: {"^$LIBRARY","^$LIBRARY"},
71: {"^$L", "^$LOCK"},
72: {"^$LOCK", "^$LOCK"},
73: {"^$O", "^$OBJECT"},
74: {"^$OBJECT", "^$OBJECT"},
75: {"^$R", "^$ROUTINE"},
76: {"^$ROUTINE", "^$ROUTINE"},
77: {"^$S", "^$SYSTEM"},
78: {"^$SYSTEM", "^$SYSTEM"},
79: {"^$W", "^$WINDOW"},
80: {"^$WINDOW", "^$WINDOW"},
81: {"^$ZF", "^$ZFILE"},
82: {"^$ZFILE", "^$ZFILE"},
83: {"^$ZFR", "^$ZFREEM"},
84: {"^$ZFREEM", "^$ZFREEM"},
85: {"^$ZD", "^$ZDIRECTORY"},
86: {"^$ZDIRECTORY", "^$ZDIRECTORY"},
87: {"^$ZO", "^$ZOS"},
88: {"^$ZOS", "^$ZOS"},
89: {"^$ZP", "^$ZPROCESS"},
90: {"^$ZPROCESS", "^$ZPROCESS"},
91: {"^$ZR", "^$ZRPI"},
92: {"^$ZRPI", "^$ZRPI"},
93: {NULL, NULL}
94: };
95:
96:
97: void ssvn (short action, char *key, char *data);
98: void ssvn_normalize_key (char *key);
99:
100: /* structured system variable management */
101: /* set_sym get_sym */
102: /* kill_sym $data */
103: /* kill_all $fra_order */
104: /* killexcl $fra_query */
105: /* new_sym */
106: /* new_all getinc */
107: /* newexcl */
108: /* killone m_alias */
109: /* merge_sym zdata */
110: void ssvn (short action, char *key, char *data)
111: {
112: int i, j;
113: char ch;
114: char ptmp[256];
1.4 ! snw 115: char sbuf[256];
1.1 snw 116:
1.4 ! snw 117: snprintf (sbuf, sizeof (sbuf), " C CHARACTER D DEVICE DI DISPLAY E EVENT G GLOBAL J JOB LI LIBRARY L LOCK O OBJECT P R ROUTINE S SYSTEM W WINDOW \201");
! 118:
! 119:
1.1 snw 120: if ((rtn_dialect () == D_M77) ||
121: (rtn_dialect () == D_M84) ||
122: (rtn_dialect () == D_M90)) {
123: merr_raise (NOSTAND);
124: return;
125: }
126:
127: i = 1;
128: j = 2;
129:
130: while ((ch = key[j]) != EOL) {
131:
132: if (ch >= 'a' && ch <= 'z') ch -= 32;
133: if (ch == DELIM) break;
134:
135: ptmp[i++] = ch;
136: j++;
137:
138: }
139:
140: ptmp[0] = SP;
141: ptmp[i++] = SP;
142: ptmp[i] = EOL;
143:
144: ssvn_normalize_key (key);
145:
146: if (dbg_enable_watch && (action == set_sym)) dbg_fire_watch (key);
147:
148: if (merr () > OK) return;
149:
150:
151: if ((ptmp[1] != 'Z') && (ptmp[1] != 'Y')) {
152:
1.4 ! snw 153: if (find (sbuf, ptmp) == FALSE) {
1.1 snw 154: merr_raise (M60);
155: return;
156: }
157:
158: switch (ptmp[1]) {
159:
160: case 'C': /* ^$CHARACTER ssvn */
161: ssvn_character (action, key, data);
162: break;
163:
164: case 'D': /* ^$DEVICE and ^$DISPLAY ssvns */
165: switch(ptmp[2]) {
166:
167: case 'E': /* ^$DEVICE */
168: ssvn_device (action, key, data);
169: break;
170:
171: case 'I': /* ^$DISPLAY */
172: ssvn_display (action, key, data);
173: break;
174:
175: default:
176: merr_raise (INVREF);
177: break;
178: }
179:
180: break;
181:
182: case 'E': /* ^$EVENT ssvn */
183: ssvn_event (action, key, data);
184: break;
185:
186: case 'G': /* ^$GLOBAL ssvn */
187: ssvn_global (action, key, data);
188: break;
189:
190: case 'J': /* ^$JOB ssvn */
191: ssvn_job (action, key, data);
192: break;
193:
194: case 'L': /* ^$LIBRARY/^$LOCK ssvns */
195: if (ptmp[2] == 'I') {
196: ssvn_library (action, key, data);
197: }
198: else {
199: ssvn_lock (action, key, data);
200: }
201: break;
202:
203: case 'O':
204: ssvn_object (action, key, data);
205: break;
206:
207: case 'R': /* ^$ROUTINE ssvn */
208: ssvn_routine (action, key, data);
209: break;
210:
211: case 'S': /* ^$SYSTEM ssvn */
212: ssvn_system (action, key, data);
213: break;
214:
215: case 'W': /* ^$WINDOW ssvn */
216: ssvn_window (action, key, data);
217: break;
218:
219: default:
220: merr_raise (INVREF);
221: break;
222: }
223: }
224: else { /* implementation-specific ssvns */
225: ssvn_z (action, key, data);
226: return;
227: }
228:
229: return;
230: }
231:
232: /* convert SSVN names to canonical form (all caps, full-length name) */
233: void ssvn_normalize_key (char *key)
234: {
235: freem_ref_t *ref;
236: char *new_key;
237: ssvn_lut *p;
238: register int i;
239:
240:
241: ref = malloc (sizeof (freem_ref_t));
242: NULLPTRCHK(ref,"ssvn_normalize_key");
243:
244: mref_init (ref, MREF_RT_SSVN, "");
245: internal_to_mref (ref, key);
246:
247: for (i = 0; i < strlen (ref->name); i++) {
248: if (ref->name[i] >= 'a' && ref->name[i] <= 'z') ref->name[i] -= 32;
249: }
250:
251:
252: for (p = ssv_tab; p->input_name != NULL; ++p) {
253:
254: if (strcmp (ref->name, p->input_name) == 0) {
255:
256: strcpy (ref->name, p->canonical_name);
257:
258: new_key = mref_to_internal (ref);
259: stcpy (key, new_key);
260:
261: free (ref);
262: free (new_key);
263:
264: merr_clear ();
265: return;
266:
267: }
268:
269: }
270:
271: merr_raise (M60);
272:
273: free (ref);
274:
275: return;
276:
277: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>