--- freem/src/global_bltin.c 2025/04/11 16:52:05 1.19 +++ freem/src/global_bltin.c 2025/04/17 14:34:27 1.23 @@ -1,5 +1,5 @@ /* - * $Id: global_bltin.c,v 1.19 2025/04/11 16:52:05 snw Exp $ + * $Id: global_bltin.c,v 1.23 2025/04/17 14:34:27 snw Exp $ * freem database engine * * @@ -24,6 +24,18 @@ * along with FreeM. If not, see . * * $Log: global_bltin.c,v $ + * Revision 1.23 2025/04/17 14:34:27 snw + * Further logging improvements + * + * 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 + * * Revision 1.19 2025/04/11 16:52:05 snw * Fix indentation in global handler * @@ -88,6 +100,7 @@ #include "mpsdef.h" #include "journal.h" #include "global_bltin.h" +#include "log.h" global_handle *global_handles_head; unsigned long gbl_cache_misses = 0; @@ -105,45 +118,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 @@ -309,7 +283,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); } @@ -334,7 +308,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); } @@ -467,13 +441,11 @@ short gbl_open(global_handle *g, short a switch (result) { case GBL_HDR_BADMAGIC: - fprintf (stderr, "gbl_open: bad magic value in %s [FATAL]\n", g->global_name); - exit (1); + logprintf (FM_LOG_FATAL, "gbl_open: bad magic value in %s", g->global_name); break; case GBL_HDR_BADVERSION: - fprintf (stderr, "gbl_open: global version is %d in %s (must be %d) [FATAL]\n", g->header.format_version, g->global_name, GBL_FORMAT_VERSION); - exit (1); + logprintf (FM_LOG_FATAL, "gbl_open: global version is %d in %s (must be %d)", g->header.format_version, g->global_name, GBL_FORMAT_VERSION); break; } @@ -499,9 +471,8 @@ int gbl_read_block(global_handle *g, uns g->use_count++; - fstat (g->fd, &gstat); if (!g->locked) gbl_lock (g, 1); - + fstat (g->fd, &gstat); if ((g->last_block == blocknum) && (g->have_cached_block) && @@ -509,7 +480,6 @@ int gbl_read_block(global_handle *g, uns (gstat.st_mtime < g->last_read_time)) { /* the global has not been modified since the last read; grab from memory */ g->memory_reads++; - g->last_read_time = time (0L); memcpy (block, g->last_block_accessed, g->header.block_size); } else { @@ -520,14 +490,14 @@ int gbl_read_block(global_handle *g, uns /* update cache */ memcpy (g->last_block_accessed, block, g->header.block_size); g->have_cached_block = TRUE; - g->last_read_time = time (0L); - g->cached_block_num = blocknum; - + g->cached_block_num = blocknum; g->last_block = blocknum; - g->use_count++; g->read_ops++; } + g->last_read_time = time (0L); + g->use_count++; + if (g->locked) gbl_unlock (g); return TRUE; @@ -550,7 +520,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++; @@ -748,83 +718,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++; } } + } } @@ -887,22 +836,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); @@ -967,10 +900,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; } @@ -1043,8 +974,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) { @@ -1127,19 +1057,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); @@ -1158,16 +1078,16 @@ reopen: if (action == get_sym) { - tfast0: +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: gbl_read_block (g, blknbr, block); @@ -1175,7 +1095,6 @@ reopen: 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]); @@ -1184,9 +1103,7 @@ reopen: 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 */ @@ -1194,13 +1111,11 @@ reopen: 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; @@ -1208,21 +1123,17 @@ reopen: 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 */ @@ -2604,36 +2515,12 @@ s10: } case killone: - { if (found == 2) goto killo; /* entry found use normal kill routine */ goto quit; } - case merge_sym: - - printf("MERGE NOT IMPLEMENTED FOR GLOBALS\n"); - -#ifdef DEBUG_GBL - - int loop; - - printf ("DEBUG MERGE: "); - printf ("[key] is ["); - - for (loop = 0; key[loop] != EOL; loop++) printf ("%c", (key[loop] == DELIM) ? '!' : key[loop]); - - printf ("]\r\n"); - printf ("[data] is ["); - - for(loop = 0; data[loop] != EOL; loop++) printf ("%c", (data[loop] == DELIM) ? '!' : data[loop]); - - printf("]\r\n"); - -#endif - return; - default: merr_raise (INVREF); /* accidental call with wrong action code (v22-stuff) */ @@ -3721,27 +3608,13 @@ void close_all_globals (void) gbl_close_all (); return; -} /* end close_all_globals() */ +} /* close_all_globals() */ static void panic (void) { - printf ("write failed\r\n"); - - printf ("\033[s\033[25H\033[5;7mwrite needs more disk space immediately\007"); - sleep (1); - printf ("\033[m\007\033[2K\033[u"); - - /* restore screen 'cause system messed up screen */ - -#ifdef NOWRITEM - - write_m ("\033[4~\201"); - -#endif /* NOWRITEM */ - + logprintf (FM_LOG_ERROR, "global_bltin: could not write to full disk"); return; - -} /* end panic() */ +} /* panic() */ void gbl_dump_stat(void)