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>