--- freem/src/global_bltin.c 2025/04/11 18:24:32 1.20 +++ freem/src/global_bltin.c 2025/04/13 04:22:43 1.22 @@ -1,5 +1,5 @@ /* - * $Id: global_bltin.c,v 1.20 2025/04/11 18:24:32 snw Exp $ + * $Id: global_bltin.c,v 1.22 2025/04/13 04:22:43 snw Exp $ * freem database engine * * @@ -24,6 +24,12 @@ * along with FreeM. If not, see . * * $Log: global_bltin.c,v $ + * Revision 1.22 2025/04/13 04:22:43 snw + * Fix snprintf calls + * + * Revision 1.21 2025/04/11 20:55:49 snw + * Disable -Wunused-result where possible + * * Revision 1.20 2025/04/11 18:24:32 snw * Fix bug in memory cache * @@ -108,45 +114,6 @@ short g_numeric (char *str); void close_all_globals(void); static void panic (void); -#define ROOT 0L - -/* end of line symbol in global module is 30, which is a code not */ -/* otherwise used in subscripts */ -#define g_EOL 30 - -#define EOL1 EOL - -/* numerics (('.'<<1)&037)==28 ; (('-'<<1)&037)==26; */ -#define POINT 28 -#define MINUS 26 - -/* ALPHA and OMEGA are dummy subscripts in $order processing */ -/* ALPHA sorts before all other subscripts */ -/* OMEGA sorts after all other subscripts */ -/* e.g. ("abc") -> "abc",OMEGA ; ("abc","") -> "abc",ALPHA */ -#define OMEGA 29 -#define ALPHA 31 - -/* length of blocks. status bytes defined as offset to blocklength */ -/* BLOCKLEN 1024 is defined in mpsdef0 include file */ -#define DATALIM (BLOCKLEN-11) -#define LLPTR (BLOCKLEN-10) -#define NRBLK LLPTR -#define COLLA (BLOCKLEN- 7) -#define RLPTR (BLOCKLEN- 6) -#define FREE RLPTR -#define BTYP (BLOCKLEN- 3) -#define OFFS (BLOCKLEN- 2) - -/* length of blockpointers in bytes */ -#define PLEN 3 - -#define EMPTY 0 -#define FBLK 1 -#define POINTER 2 -#define BOTTOM 6 -#define DATA 8 - #if !defined(__OpenBSD__) && !defined(_AIX) && !defined(__osf__) && !defined(MSDOS) && !defined(__vax__) && !defined(__OS2__) long time (); #endif @@ -312,7 +279,7 @@ int gbl_write_initial_header(global_hand lseek (g->fd, 0, SEEK_SET); if (write (g->fd, &hdr, sizeof (global_header)) == -1) { - snprintf (msg, sizeof (msg), "error %d writing global header for %s", errno, g->global_name); + snprintf (msg, sizeof (msg) - 1, "error %d writing global header for %s", errno, g->global_name); m_fatal (msg); } @@ -337,7 +304,7 @@ int gbl_write_header(global_handle *g, g lseek (g->fd, 0, SEEK_SET); if (write (g->fd, hdr, sizeof (global_header)) == -1) { - snprintf (msg, sizeof (msg), "error %d writing global header for %s", errno, g->global_name); + snprintf (msg, sizeof (msg) - 1, "error %d writing global header for %s", errno, g->global_name); m_fatal (msg); } @@ -551,7 +518,7 @@ int gbl_write_block(global_handle *g, un errno = 0; lseek (g->fd, hdr_offset + (blocknum * g->header.block_size), SEEK_SET); - write (g->fd, block, BLOCKLEN); + write (g->fd, block, g->header.block_size); errsav = errno; g->last_block = blocknum; g->use_count++; @@ -749,83 +716,62 @@ void global_bltin (short action, char *k register long int k; register long int ch; - j = 0; - + j = 0; hdr_offset = sizeof (global_header); /* process optional limitations */ if (glvnflag.all && key[0] >= '%' && key[0] <= 'z') { if ((i = glvnflag.one[0])) { /* number of significant chars */ - j = 0; while ((k = key[j]) != DELIM && k != EOL) { - if (j >= i) { - while ((k = key[++j]) != DELIM && k != EOL); - stcpy (&key[i], &key[j]); - break; } - j++; - } } if (glvnflag.one[1]) { /* upper/lower sensitivity */ - j = 0; - while ((k = key[j]) != DELIM && k != EOL) { - if (k >= 'a' && k <= 'z') key[j] = k - 32; - j++; - } } if ((i = glvnflag.one[2])) { - if (stlen (key) > i) { merr_raise (M75); return; } /* key length limit */ - } if ((i = glvnflag.one[3])) { /* subscript length limit */ - + j = 0; - while ((k = key[j++]) != DELIM && k != EOL); - + if (k == DELIM) { - k = 0; for (;;) { - k = key[j++]; - if (k == DELIM || k == EOL) { - if (k > i) { merr_raise (M75); return; } - k = 0; } - if (k == EOL) break; k++; } } + } } @@ -888,22 +834,6 @@ void global_bltin (short action, char *k } } - if (v22ptr) { - - procv22 (key); - - if (key[0] != '^') { - char losav[256]; - - stcpy (losav, l_o_val); - symtab (action, key, data); - stcpy (g_o_val, l_o_val); - stcpy (l_o_val, losav); - - return; - } - } - g = gbl_handle (key); i = gbl_path (key, filnam); @@ -968,10 +898,8 @@ void global_bltin (short action, char *k compactkey[k++] = ch << 1; } - else if (ch < SP || ch >= DEL) { - - /*no CTRLs */ - + else if (ch < SP || ch >= DEL) { + /* no CTRLs */ merr_raise (SBSCR); return; } @@ -1044,8 +972,7 @@ void global_bltin (short action, char *k reopen: - gbl_open (g, action); - if (g->fd == -1) { + if (!gbl_open (g, action)) { /* file not found */ if (action != set_sym) { @@ -1128,19 +1055,9 @@ reopen: block[BTYP] = DATA; /* type */ block[OFFS] = i / 256; block[OFFS + 1] = i % 256; - - for (;;) { - - errno = 0; - write (g->fd, block, BLOCKLEN); - - if (errno == 0) break; - - lseek (g->fd, hdr_offset + ((ROOT + 1L) * BLOCKLEN), SEEK_SET); - panic (); - - } + gbl_write_block (g, ROOT + 1, block); + gbl_close (g); gbl_unlock (g); gbl_open (g, action); @@ -1162,21 +1079,20 @@ reopen: tfast0: gbl_lock (g, 3); - if (g->fast_path > 0) goto tfast1; /* try again last block */ + if (g->fast_path > 0) { + goto tfast1; /* try again last block */ + } blknbr = g->last_block = ROOT; /* start with ROOT block */ for (;;) { - - -tfast1: + tfast1: gbl_read_block (g, blknbr, block); /* temporarily disabled tfast2: */ if ((typ = block[BTYP]) == DATA) { /* scan data block: here we test for equality only */ - offset = UNSIGN (block[OFFS]) * 256 + UNSIGN (block[OFFS + 1]); j = UNSIGN (block[0]); @@ -1185,9 +1101,7 @@ tfast1: stcpy0 (key1, &block[2], j); /* get first key */ ch = keyl; /* ch is a register! */ - - while (i < offset) { - + while (i < offset) { j = UNSIGN (block[i++]); /* length of key - offset */ k = UNSIGN (block[i++]); /* offset into previous entry */ @@ -1195,13 +1109,11 @@ tfast1: while (k < j) key1[k++] = block[i++]; /* get key */ - if (j != ch) { /* keys have different length */ - + if (j != ch) { /* keys have different length */ i += UNSIGN (block[i]); i++; - continue; - + continue; } j = ch; @@ -1209,21 +1121,17 @@ tfast1: do { j--; } while (compactkey[j] == key1[j]); /* compare keys */ - - - if (j < 0) { - + + if (j < 0) { k = UNSIGN (block[i++]); stcpy0 (data, &block[i], k); /* get value */ data[k] = EOL1; /* append EOL */ - goto quit; - + goto quit; } i += UNSIGN (block[i]); - i++; /* skip data */ - + i++; /* skip data */ } /* fast access failed. try normal path */