#include "linenoise/linenoise.h"
#include "newdb.h"
-void* xmalloc(size_t size)
+char* xstrdup(const char* s)
{
- void* ptr = malloc(size);
+ char* ptr = strdup(s);
if (ptr == NULL)
{
fprintf(stderr, "Out of memory!\n");
void packed_to_token(long packed, char token[6])
{
+ // Unpack and map back to ASCII.
for (int i = 0; i < 5; ++i)
{
char advent = (packed >> i * 6) & 63;
- token[i] = advent_to_ascii[advent];
+ token[4 - i] = advent_to_ascii[advent];
}
+
+ // Ensure the last character is \0.
token[5] = '\0';
+
+ // Replace trailing whitespace with \0.
+ for (int i = 4; i >= 0; --i)
+ {
+ if (token[i] == ' ' || token[i] == '\t')
+ token[i] = '\0';
+ else
+ break;
+ }
}
/* I/O routines (SPEAK, PSPEAK, RSPEAK, SETPRM, GETIN, YES) */
printf("\n");
// Create a copy of our string, so we can edit it.
- char* copy = (char*) xmalloc(strlen(msg) + 1);
- strncpy(copy, msg, strlen(msg) + 1);
+ char* copy = xstrdup(msg);
// Staging area for stringified parameters.
char parameters[5][100]; // FIXME: to be replaced with dynamic allocation
if (msg[i + 1] == 'd')
{
copy[i + 1] = 's';
- sprintf(parameters[pi], "%d", PARMS[pi]);
+ sprintf(parameters[pi], "%ld", PARMS[pi]);
}
// Unmodified string specifier.
// Render the final string.
char rendered[2000]; // FIXME: to be replaced with dynamic allocation
- sprintf(&rendered, copy, parameters[1], parameters[2], parameters[3], parameters[4]); // FIXME: to be replaced with vsprintf()
+ sprintf(rendered, copy, parameters[1], parameters[2], parameters[3], parameters[4]); // FIXME: to be replaced with vsprintf()
// Print the message.
printf("%s\n", rendered);
return word;
}
-void PUTTXT(token_t word, long *state, long casemake)
-/* Unpack the 30-bit value in word to obtain up to TOKLEN (currently
- * 5) integer-encoded chars, and store them in inline starting at
- * LNPOSN. If LNLENG>=LNPOSN, shift existing characters to the right
- * to make room. STATE will be zero when puttxt is called with the
- * first of a sequence of words, but is thereafter unchanged by the
- * caller, so PUTTXT can use it to maintain state across calls.
- * LNPOSN and LNLENG are incremented by the number of chars stored.
- * If CASEMAKE=1, all letters are made uppercase; if -1, lowercase; if 0,
- * as is. any other value for case is the same as 0 but also causes
- * trailing blanks to be included (in anticipation of subsequent
- * additional text). */
-{
- long alph1, alph2, byte, div, i, w;
-
- alph1=13*casemake+24;
- alph2=26*labs(casemake)+alph1;
- if (labs(casemake) > 1)
- alph1=alph2;
- /* alph1&2 define range of wrong-case chars, 11-36 or 37-62 or empty. */
- div=64L*64L*64L*64L;
- w=word;
- for (i=1; i<=TOKLEN; i++)
- {
- if (w <= 0 && *state == 0 && labs(casemake) <= 1)
- return;
- byte=w/div;
- w=(w-byte*div)*64;
- if (!(*state != 0 || byte != ascii_to_advent['%'])) {
- *state=ascii_to_advent['%'];
- continue;
- }
- SHFTXT(LNPOSN,1);
- *state=*state+byte;
- if (*state < alph2 && *state >= alph1)*state=*state-26*casemake;
- INLINE[LNPOSN]=*state;
- ++LNPOSN;
- *state=0;
- }
-}
-#define PUTTXT(WORD,STATE,CASE) fPUTTXT(WORD,&STATE,CASE)
-
-void SHFTXT(long from, long delta)
-/* Move INLINE(N) to INLINE(N+DELTA) for N=FROM,LNLENG. Delta can be
- * negative. LNLENG is updated; LNPOSN is not changed. */
-{
- long I, k, j;
-
- if (!(LNLENG < from || delta == 0)) {
- for (I=from; I<=LNLENG; I++) {
- k=I;
- if (delta > 0)
- k=from+LNLENG-I;
- j=k+delta;
- INLINE[j]=INLINE[k];
- }
- }
- LNLENG=LNLENG+delta;
-}
-
void TYPE0(void)
/* Type a blank line. This procedure is provided as a convenience for callers
* who otherwise have no use for MAPCOM. */
* and is not changed thereafter unless the routines on this page choose
* to do so. */
- if (!oldstyle && !isatty(1))
- fputs("> ", stdout);
do {
- if (oldstyle) {
+ if (!editline) {
+ if (prompt)
+ fputs("> ", stdout);
IGNORE(fgets(rawbuf,sizeof(rawbuf)-1,fp));
eof = (feof(fp));
} else {
fclose(logfp);
return false;
} else {
+ FILE *efp = NULL;
if (logfp && fp == stdin)
- IGNORE(fputs(rawbuf, logfp));
+ efp = logfp;
else if (!isatty(0))
- IGNORE(fputs(rawbuf, stdout));
+ efp = stdout;
+ if (efp != NULL)
+ {
+ if (prompt)
+ fputs("> ", efp);
+ IGNORE(fputs(rawbuf, efp));
+ }
strcpy(INLINE+1, rawbuf);
LNLENG=0;
for (i=1; i<=(long)sizeof(INLINE) && INLINE[i]!=0; i++) {
*t = (long) tv.tv_usec;
}
-long MOD(long n, long m)
-{
- return(n%m);
-}
+/* end */