Diff for /freem/src/symtab_bltin.c between versions 1.1 and 1.8

version 1.1, 2025/01/19 02:04:04 version 1.8, 2025/04/04 12:46:13
Line 1 Line 1
 /*  /*
  *                            *   *   $Id$
  *                           * *  
  *                          *   *  
  *                     ***************  
  *                      * *       * *  
  *                       *  MUMPS  *  
  *                      * *       * *  
  *                     ***************  
  *                          *   *  
  *                           * *  
  *                            *  
  *  
  *   symtab.c  
  *      FreeM local system table and user-defined special variable table    *      FreeM local system table and user-defined special variable table 
  *   *
  *     *  
  *   Author: Serena Willis <jpw@coherent-logic.com>   *   Author: Serena Willis <snw@coherent-logic.com>
  *    Copyright (C) 1998 MUG Deutschland   *    Copyright (C) 1998 MUG Deutschland
  *    Copyright (C) 2020 Coherent Logic Development LLC   *    Copyright (C) 2020, 2025 Coherent Logic Development LLC
  *   *
  *   *
  *   This file is part of FreeM.   *   This file is part of FreeM.
Line 35 Line 23
  *   You should have received a copy of the GNU Affero Public License   *   You should have received a copy of the GNU Affero Public License
  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.   *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
  *   *
    *   $Log$
    *   Revision 1.8  2025/04/04 12:46:13  snw
    *   Patch Solaris 8 crash and bump version to 0.63.1-rc1
    *
    *   Revision 1.7  2025/03/26 15:17:12  snw
    *   Fall back to global-backed SSVNs when memory-backed globals fail in attempt to fix Tru64
    *
    *   Revision 1.6  2025/03/24 04:13:11  snw
    *   Replace action macro dat with fra_dat to avoid symbol conflict on OS/2
    *
    *   Revision 1.5  2025/03/24 02:01:41  snw
    *   Work around some OS/2 incompatibilities in symbol table code
    *
    *   Revision 1.4  2025/03/09 19:50:47  snw
    *   Second phase of REUSE compliance and header reformat
    *
    *
    * SPDX-FileCopyrightText:  (C) 2025 Coherent Logic Development LLC
    * SPDX-License-Identifier: AGPL-3.0-or-later
  **/   **/
   
 #include <stdlib.h>  #include <stdlib.h>
Line 54 Line 61
 symbol-table calls */  symbol-table calls */
 /* #define DEBUG_SYM  */  /* #define DEBUG_SYM  */
   
   short st_use_shm = FALSE;
 short restoring_consts = FALSE;  short restoring_consts = FALSE;
 int semid_symtab;  int semid_symtab;
   
 #if !defined(__OpenBSD__) && !defined(__APPLE__)  #if !defined(__OpenBSD__) && !defined(__APPLE__) && !defined(__OS2__)
 union semun {  union semun {
     int              val;    /* Value for SETVAL */      int              val;    /* Value for SETVAL */
     struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */      struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
Line 94  long str2long(char *string) Line 102  long str2long(char *string)
     return value;      return value;
 }  }
   
 void symtab_init ()  void symtab_init (void)
 {  {
     register int i;      register int i;
     union semun arg;      union semun arg;
Line 113  void symtab_init () Line 121  void symtab_init ()
         shm_config->hdr->PSIZE = DEFPSIZE;          shm_config->hdr->PSIZE = DEFPSIZE;
         shm_config->hdr->argptr = mbpartition;          shm_config->hdr->argptr = mbpartition;
                   
        
         fprintf (stderr, "symtab_init:  initializing memory-backed globals\r\n");                  fprintf (stderr, "symtab_init:  initializing memory-backed globals\r\n");        
   
         semid_symtab = semget (symtab_sk, 1, 0666 | IPC_CREAT);          semid_symtab = semget (symtab_sk, 1, 0666 | IPC_CREAT);
Line 124  void symtab_init () Line 133  void symtab_init ()
             fprintf (stderr, "symtab_init:  symbol table semaphore created with semid %d\r\n", semid_symtab);              fprintf (stderr, "symtab_init:  symbol table semaphore created with semid %d\r\n", semid_symtab);
         }          }
   
   #if defined(__sun__)
           fprintf (stderr, "symtab_init:  falling back to global-backed structured system variables\r\n");
           shm_config->hdr->use_mb_globals = FALSE;
           return;
   #endif
   
   
         arg.val = 1;          arg.val = 1;
         if (semctl (semid_symtab, 0, SETVAL, arg) == -1) {          if (semctl (semid_symtab, 0, SETVAL, arg) == -1) {
             fprintf (stderr, "symtab_init:  failed to initialize symbol table semaphore\r\n");              fprintf (stderr, "symtab_init:  failed to initialize symbol table semaphore\r\n");
Line 136  void symtab_init () Line 152  void symtab_init ()
         fprintf (stderr, "symtab_init:  allocating partition for memory-backed globals\r\n");          fprintf (stderr, "symtab_init:  allocating partition for memory-backed globals\r\n");
                   
         mbpartition = (char *) shm_alloc ((size_t) PSIZE + 2);          mbpartition = (char *) shm_alloc ((size_t) PSIZE + 2);
         NULLPTRCHK(mbpartition,"symtab_init");          if (mbpartition != NULL) {
               shm_config->hdr->use_mb_globals = TRUE;
           }
           else {
               fprintf (stderr, "symtab_init:  falling back to global-backed structured system variables\r\n");
               shm_config->hdr->use_mb_globals = FALSE;
           }
   
         shm_config->hdr->partition = mbpartition;          shm_config->hdr->partition = mbpartition;
                   
Line 156  void symtab_init () Line 178  void symtab_init ()
                   
         mbpartition = shm_config->hdr->partition;          mbpartition = shm_config->hdr->partition;
   
           symtab_release_sem ();
     }      }
         
 }  }
Line 206  void symtab_shm (short action, char *key Line 229  void symtab_shm (short action, char *key
     unsigned long stptrs[128];      unsigned long stptrs[128];
     register int i;      register int i;
     char *old_partition = partition;      char *old_partition = partition;
   
       if (shm_config->hdr->use_mb_globals == FALSE) {
           symtab_bltin (action, key, data);
           return;
       }
     partition = mbpartition;      partition = mbpartition;
   
     writing_mb = TRUE;      writing_mb = TRUE;
Line 948  old0:    /* entry from getinc */ Line 976  old0:    /* entry from getinc */
             /* end of set_sym section */              /* end of set_sym section */
   
                           
             case dat:              case fra_dat:
   
   
                 /* note: we assume EOL<DELIM<ASCII */                  /* note: we assume EOL<DELIM<ASCII */
Line 2475  unsubscr: Line 2503  unsubscr:
   
   
 /******************************************************************************/  /******************************************************************************/
 short int collate (s, t)  
     char *s;  
     char *t;  
     /* if 't' follows 's' in MUMPS collating sequence a 1 is returned      /* if 't' follows 's' in MUMPS collating sequence a 1 is returned
      * otherwise 0       * otherwise 0
      */       */
   
   short int collate (char *s, char *t)
 {  {
     short dif;      short dif;
   
Line 2552  short int numeric (char *str) Line 2579  short int numeric (char *str)
 }                                       /* end of numeric() */  }                                       /* end of numeric() */
   
 /******************************************************************************/  /******************************************************************************/
 short int comp (s, t)  
     char *s;  
     char *t;                      
     /* s and t are strings representing */      /* s and t are strings representing */
     /* MUMPS numbers. comp returns t>s  */      /* MUMPS numbers. comp returns t>s  */
   
   short int comp (char *s, char *t)
 {  {
   
     register int s1 = s[0], t1 = t[0], point = '.';      register int s1 = s[0], t1 = t[0], point = '.';
Line 2621  short int comp (s, t) Line 2647  short int comp (s, t)
   
 }                                       /* end of comp() */  }                                       /* end of comp() */
 /******************************************************************************/  /******************************************************************************/
 void intstr (str, integ)                        /* converts integer to string */  void intstr (char *str, short integ)                    /* converts integer to string */
     char *str;  
     short integ;  
 {  {
   
     if (integ < 0) {      if (integ < 0) {
Line 2662  void intstr (str, integ)   /* converts i Line 2686  void intstr (str, integ)   /* converts i
 }                                       /* end of intstr() */  }                                       /* end of intstr() */
   
 /******************************************************************************/  /******************************************************************************/
 void lintstr (str, integ)                       /* converts long integer to string */  void lintstr (char *str, long integ)                    /* converts long integer to string */
     char *str;  
     long integ;  
 {  {
     char result[11];                    /* 32 bit = 10 digits+sign */      char result[11];                    /* 32 bit = 10 digits+sign */
     register int i = 0;      register int i = 0;
Line 2700  void lintstr (str, integ)   /* converts Line 2722  void lintstr (str, integ)   /* converts
  * alphabet for each character a pointer to the first variable beginning   * alphabet for each character a pointer to the first variable beginning
  * with that letter is maintained. (0 indicates there's no such var.)   * with that letter is maintained. (0 indicates there's no such var.)
  */   */
 void udfsvn (action, key, data)         /* symbol table functions */  
     short action;                       /* set_sym      get_sym   */  void udfsvn (short action, char *key, char *data)               /* symbol table functions */
     char *key;                  /* lvn as ASCII-string */  
     char *data;  
 {  {
   
 long keyl;                      /* length of key                  */  long keyl;                      /* length of key                  */
Line 2910  old: Line 2930  old:
   
   
 /******************************************************************************/  /******************************************************************************/
 long getpmore ()  long getpmore (void)
 {                                       /* try to get more 'partition' space. returns size increment */  {                                       /* try to get more 'partition' space. returns size increment */
           
     long siz;      long siz;
Line 2932  long getpmore () Line 2952  long getpmore ()
 }                                       /* end getpmore */  }                                       /* end getpmore */
   
 /******************************************************************************/  /******************************************************************************/
 long getumore ()  long getumore (void)
 {                                       /* try to get more udfsvntab space. returns size increment */  {                                       /* try to get more udfsvntab space. returns size increment */
     long siz, dif;      long siz, dif;
   
Line 2958  long getumore () Line 2978  long getumore ()
 }                                       /* end getumore */  }                                       /* end getumore */
   
 /******************************************************************************/  /******************************************************************************/
 long getrmore ()  long getrmore (void)
 {                                       /* try to get more routine space. returns size increment */  {                                       /* try to get more routine space. returns size increment */
     long siz, dif;      long siz, dif;
     short i;      short i;
Line 2990  long getrmore () Line 3010  long getrmore ()
 }                                       /* end getrmore */  }                                       /* end getrmore */
   
 /******************************************************************************/  /******************************************************************************/
 short int getnewmore ()  short int getnewmore (void)
 {                                       /* enlarge new_buffers */  {                                       /* enlarge new_buffers */
     char *newbuf;      char *newbuf;
     int i;      int i;

Removed from v.1.1  
changed lines
  Added in v.1.8


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