Annotation of freem/src/cmd_read.c, revision 1.4

1.1       snw         1: /*
1.4     ! snw         2:  *   $Id: cmd_read.c,v 1.3 2025/03/09 19:14:24 snw Exp $
1.1       snw         3:  *    Implementation of the READ command
                      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) 2023, 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: cmd_read.c,v $
        !            27:  *   Revision 1.3  2025/03/09 19:14:24  snw
        !            28:  *   First 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 <string.h>
                     36: #include <stdlib.h>
                     37: #include "mpsdef.h"
                     38: #include "mcommand.h"
                     39: #if !defined(MSDOS)
                     40: # include "io_socket.h"
                     41: #endif
                     42: 
                     43: MRESULT cmd_read(MACTION *ra)
                     44: {
                     45:     register int i;
                     46:     register char ch;
                     47:     char vn[255];
                     48:     char an[255];
                     49:     
                     50:     if (io != HOME && devopen[io] != 'r' && devopen[io] != '+' && io < FIRSTSCK) {
                     51:         return NOREAD;
                     52:     }
                     53: 
                     54: read_command:
                     55: 
                     56:     switch (*codptr)
                     57:     {
                     58:         case '!':
1.4     ! snw        59:             if (frm_crlf[io]) {
1.1       snw        60:                 write_m ("\012\201");
                     61:             }
                     62:             else {
                     63:                 write_m ("\012\015\201");
                     64:             }
                     65:                     
                     66:             if (*++codptr == '!' || *codptr == '#' || *codptr == '?') goto read_command;
                     67: 
                     68:             goto cont_read;
                     69: 
                     70:         case '#':
                     71:             write_m ("\015\014\201");
                     72: 
                     73:             if (*++codptr == '!' || *codptr == '#' || *codptr == '?') goto read_command;
                     74:                     
                     75:             goto cont_read;
                     76:                 
                     77:         case '?':
                     78:             codptr++;
                     79:                     
                     80:             expr (STRING);
                     81:                     
                     82:             if (merr ()) return merr ();
                     83:                     
                     84:             write_t ((short) intexpr (argptr));
                     85:                     
                     86:             goto cont_read;
                     87:                 
                     88:         case '/':
                     89:             codptr++;
                     90:                     
                     91:             expr (NAME);
                     92:             if (merr ()) return merr ();
                     93: 
                     94:             write_f (varnam);
                     95:                     
                     96:             codptr++;
                     97:                     
                     98:             goto cont_read;
                     99:                 
                    100:         case '"':
                    101:             i = 0;
                    102:                     
                    103:             for (;;) {
                    104:                         
                    105:                 while ((ch = *++codptr) > '"') argptr[i++] = ch;
                    106:                         
                    107:                 /* EOL < "any ASCII character" */
                    108:                 if (ch == '"' && (ch = *++codptr) != '"') {
                    109:                     argptr[i] = EOL;
                    110:                     write_m (argptr);
                    111: 
                    112:                     goto cont_read;
                    113:                 }
                    114: 
                    115:                 if ((argptr[i++] = ch) == EOL) {
                    116:                     return QUOTER;
                    117:                 }
                    118:             }
                    119:     }
                    120: 
                    121:     i = InFieldLen;     /* no length limit */
                    122:     InFieldLen = 255;       /* Not necessarily tied to STRLEN */
                    123: 
                    124:     if (*codptr == '*') {
                    125:         codptr++;
                    126:         i = 0;
                    127:     }           /* single char read */
                    128:             
                    129:     if (*codptr == '$') {
                    130:         return INVREF;
                    131:     }
                    132: 
                    133:     expr (NAME);
                    134:             
                    135:     if (merr ()) return merr ();
                    136:             
                    137:     stcpy (vn, varnam);
                    138:     codptr++;           /* lvn */
                    139: 
                    140:     if (i != 0 && *codptr == '#') {           /* length limit */
                    141:         codptr++;
                    142:             
                    143:         expr (STRING);
                    144:             
                    145:         if ((i = intexpr (argptr)) <= 0) return ARGER;
                    146:         if (merr ()) return merr ();
                    147:     }
                    148: 
                    149:     frm_timeout = (-1L);
                    150:     timeoutms = 0;      /* no timeout */
                    151: 
                    152:     if (*codptr == ':')
                    153:     {           /* timeout */
                    154:         int i, ch;
                    155: 
                    156:         codptr++;
                    157: 
                    158:         expr (STRING);
                    159:         numlit (argptr);
                    160:                 
                    161:         if (merr ()) return merr ();
                    162:                 
                    163:         frm_timeout = 0;
                    164:         timeoutms = 0;
                    165:                 
                    166:         if (argptr[0] != '-') {
                    167:                     
                    168:             i = 0;
                    169: 
                    170:             for (;;) { /* get integer and fractional part */ 
                    171:                         
                    172:                 if ((ch = argptr[i++]) == EOL) break;
                    173: 
                    174:                 if (ch == '.') {
                    175:                         
                    176:                     timeoutms = (argptr[i++] - '0') * 100;
                    177:                         
                    178:                     if ((ch = argptr[i++]) != EOL) {                        
                    179:                         timeoutms += (ch - '0') * 10;
                    180:                         
                    181:                         if ((ch = argptr[i]) != EOL) {
                    182:                             timeoutms += (ch - '0');
                    183:                         }
                    184: 
                    185:                     }
                    186:                     break;
                    187:                 }
                    188:                 frm_timeout = frm_timeout * 10 + ch - '0';
                    189:             }
                    190:         }
                    191:     } /* if (*codptr == ':') */
                    192: 
                    193: #if 0
                    194:     set_io (UNIX);
                    195:     printf ("READ: io = %d timeout = %d timeoutms = %d count = %d\n", io, frm_timeout, timeoutms, i);
                    196:     set_io (MUMPS);
                    197: #endif            
                    198: 
                    199:     if (io < FIRSTSCK) {
                    200:         /* $IO is not a socket device */
                    201:         read_m (argptr, frm_timeout, timeoutms, i);
                    202:     }
                    203:     else {
                    204:         /* $IO _is_ a socket device */
                    205:         msck_read (io, argptr, frm_timeout, timeoutms, i);
                    206:     }
                    207: 
                    208:     if (vn[0] != '^') {
                    209:         stcpy (an, argptr);
                    210:         symtab (set_sym, vn, an);
                    211:     }
                    212:     else {
                    213:         stcpy (an, argptr);
                    214:         if (vn[1] == '$') {
                    215:             ssvn (set_sym, vn, an);
                    216:         }
                    217:         else {
                    218:             global (set_sym, vn, an);
                    219:         }
                    220:     }
                    221: 
                    222:     if (merr () != OK) {
                    223:         stcpy (varerr, vn);
                    224:         return merr ();
                    225:     }
                    226: 
                    227: cont_read:
                    228: 
                    229:     *ra = RA_CONTINUE;
                    230:     return OK;
                    231: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>