Applied changes from CVS version 1.15 of official version of TinyScheme.

Changed to always use snprintf (Patch due to Ramiro bsd1628).
This commit is contained in:
Kevin Cozens
2009-08-07 16:25:31 -04:00
parent 28e7c3f612
commit 9541fe0387
2 changed files with 55 additions and 61 deletions

View File

@ -117,7 +117,9 @@ char gc_verbose; /* if gc_verbose is not zero, print gc status */
char no_memory; /* Whether mem. alloc. has failed */
#define LINESIZE 1024
char strbuff[LINESIZE];
char linebuff[LINESIZE];
#define STRBUFFSIZE 256
char strbuff[STRBUFFSIZE];
FILE *tmpfp;
int tok;

View File

@ -38,6 +38,7 @@
#if USE_MATH
# include <math.h>
#endif
#include <limits.h>
#include <float.h>
#include <ctype.h>
@ -131,7 +132,7 @@ static int utf8_stricmp(const char *s1, const char *s2)
#endif
#ifndef prompt
# define prompt "> "
# define prompt "ts> "
#endif
#ifndef InitFile
@ -1133,7 +1134,7 @@ INTERFACE pointer gensym(scheme *sc) {
char name[40];
for(; sc->gensym_cnt<LONG_MAX; sc->gensym_cnt++) {
sprintf(name,"gensym-%ld",sc->gensym_cnt);
snprintf(name,40,"gensym-%ld",sc->gensym_cnt);
/* first check oblist */
x = oblist_find_by_name(sc, name);
@ -1218,21 +1219,21 @@ static pointer mk_atom(scheme *sc, char *q) {
/* make constant */
static pointer mk_sharp_const(scheme *sc, char *name) {
long x;
char tmp[256];
char tmp[STRBUFFSIZE];
if (!strcmp(name, "t"))
return (sc->T);
else if (!strcmp(name, "f"))
return (sc->F);
else if (*name == 'o') {/* #o (octal) */
sprintf(tmp, "0%s", name+1);
snprintf(tmp, STRBUFFSIZE, "0%s", name+1);
sscanf(tmp, "%lo", &x);
return (mk_integer(sc, x));
} else if (*name == 'd') { /* #d (decimal) */
sscanf(name+1, "%ld", &x);
return (mk_integer(sc, x));
} else if (*name == 'x') { /* #x (hex) */
sprintf(tmp, "0x%s", name+1);
snprintf(tmp, STRBUFFSIZE, "0x%s", name+1);
sscanf(tmp, "%lx", &x);
return (mk_integer(sc, x));
} else if (*name == 'b') { /* #b (binary) */
@ -1250,7 +1251,7 @@ static pointer mk_sharp_const(scheme *sc, char *name) {
c='\t';
} else if(name[1]=='x' && name[2]!=0) {
int c1=0;
if(sscanf(name+2,"%x",&c1)==1 && c1<256) {
if(sscanf(name+2,"%x",&c1)==1 && c1 < UCHAR_MAX) {
c=c1;
} else {
return sc->NIL;
@ -1387,7 +1388,7 @@ static void gc(scheme *sc, pointer a, pointer b) {
if (sc->gc_verbose) {
char msg[80];
sprintf(msg,"done: %ld cells were recovered.\n", sc->fcells);
snprintf(msg,80,"done: %ld cells were recovered.\n", sc->fcells);
putstr(sc,msg);
}
}
@ -1559,7 +1560,7 @@ static void port_close(scheme *sc, pointer p, int flag) {
static gunichar basic_inchar(port *pt) {
int len;
if(pt->kind&port_file) {
if(pt->kind & port_file) {
unsigned char utf8[7];
int c;
int i;
@ -1607,8 +1608,8 @@ static gunichar basic_inchar(port *pt) {
}
}
} else {
if(*pt->rep.string.curr==0
|| pt->rep.string.curr==pt->rep.string.past_the_end) {
if(*pt->rep.string.curr == 0 ||
pt->rep.string.curr == pt->rep.string.past_the_end) {
return EOF;
} else {
gunichar c;
@ -1640,17 +1641,17 @@ static gunichar inchar(scheme *sc) {
gunichar c;
port *pt;
again:
pt=sc->inport->_object._port;
pt = sc->inport->_object._port;
if(pt->kind&port_file)
{
if (sc->bc_flag)
c = sc->backchar[--sc->bc_flag];
else
c=basic_inchar(pt);
c = basic_inchar(pt);
}
else
c=basic_inchar(pt);
if(c==EOF && sc->inport==sc->loadport && sc->file_i!=0) {
c = basic_inchar(pt);
if(c == EOF && sc->inport == sc->loadport && sc->file_i != 0) {
file_pop(sc);
if(sc->nesting!=0) {
return EOF;
@ -1764,16 +1765,6 @@ static char *readstr_upto(scheme *sc, char *delim) {
gunichar c_prev = 0;
int len = 0;
#if 0
while (!is_one_of(delim, (*p++ = inchar(sc))))
;
if(p==sc->strbuff+2 && p[-2]=='\\') {
*p=0;
} else {
backchar(sc,p[-1]);
*--p = '\0';
}
#else
do {
c_prev = c;
c = inchar(sc);
@ -1781,14 +1772,13 @@ static char *readstr_upto(scheme *sc, char *delim) {
p += len;
} while (c && !is_one_of(delim, c));
if(p==sc->strbuff+2 && c_prev=='\\')
if(p == sc->strbuff+2 && c_prev == '\\')
*p = '\0';
else
{
backchar(sc,c); /* put back the delimiter */
p[-len] = '\0';
}
#endif
return sc->strbuff;
}
@ -1802,7 +1792,7 @@ static pointer readstrexp(scheme *sc) {
for (;;) {
c=inchar(sc);
if(c==EOF || p-sc->strbuff>sizeof(sc->strbuff)-1) {
if(c == EOF || p-sc->strbuff > sizeof(sc->strbuff)-1) {
return sc->F;
}
switch(state) {
@ -2066,14 +2056,13 @@ static void atom2str(scheme *sc, pointer l, int f, char **pp, int *plen) {
p = "#<EOF>";
} else if (is_port(l)) {
p = sc->strbuff;
strcpy(p, "#<PORT>");
snprintf(p, STRBUFFSIZE, "#<PORT>");
} else if (is_number(l)) {
p = sc->strbuff;
if(num_is_integer(l)) {
sprintf(p, "%ld", ivalue_unchecked(l));
snprintf(p, STRBUFFSIZE, "%ld", ivalue_unchecked(l));
} else {
g_ascii_formatd (p, sizeof (sc->strbuff), "%.10g",
rvalue_unchecked(l));
snprintf(p, STRBUFFSIZE, "%.10g", rvalue_unchecked(l));
}
} else if (is_string(l)) {
if (!f) {
@ -2094,33 +2083,36 @@ static void atom2str(scheme *sc, pointer l, int f, char **pp, int *plen) {
} else {
switch(c) {
case ' ':
sprintf(p,"#\\space"); break;
snprintf(p,STRBUFFSIZE,"#\\space"); break;
case '\n':
sprintf(p,"#\\newline"); break;
snprintf(p,STRBUFFSIZE,"#\\newline"); break;
case '\r':
sprintf(p,"#\\return"); break;
snprintf(p,STRBUFFSIZE,"#\\return"); break;
case '\t':
sprintf(p,"#\\tab"); break;
snprintf(p,STRBUFFSIZE,"#\\tab"); break;
default:
#if USE_ASCII_NAMES
if(c==127) {
strcpy(p,"#\\del"); break;
snprintf(p,STRBUFFSIZE,"#\\del");
break;
} else if(c<32) {
strcpy(p,"#\\"); strcat(p,charnames[c]); break;
snprintf(p,STRBUFFSIZE,"#\\%s", charnames[c]);
break;
}
#else
if(c<32) {
sprintf(p,"#\\x%x",c); break;
snprintf(p,STRBUFFSIZE,"#\\x%x",c); break;
}
#endif
sprintf(p,"#\\%c",c); break;
snprintf(p,STRBUFFSIZE,"#\\x%c",c); break;
}
}
} else if (is_symbol(l)) {
p = symname(l);
} else if (is_proc(l)) {
p = sc->strbuff;
sprintf(p, "#<%s PROCEDURE %ld>", procname(l),procnum(l));
snprintf(p,STRBUFFSIZE,"#<%s PROCEDURE %ld>",
procname(l),procnum(l));
} else if (is_macro(l)) {
p = "#<MACRO>";
} else if (is_closure(l)) {
@ -2129,7 +2121,7 @@ static void atom2str(scheme *sc, pointer l, int f, char **pp, int *plen) {
p = "#<PROMISE>";
} else if (is_foreign(l)) {
p = sc->strbuff;
sprintf(p, "#<FOREIGN PROCEDURE %ld>", procnum(l));
snprintf(p,STRBUFFSIZE,"#<FOREIGN PROCEDURE %ld>", procnum(l));
} else if (is_continuation(l)) {
p = "#<CONTINUATION>";
} else {
@ -2932,7 +2924,7 @@ static pointer opexe_0(scheme *sc, enum scheme_opcodes op) {
s_goto(sc,OP_BEGIN);
}
default:
sprintf(sc->strbuff, "%d: illegal operator", sc->op);
snprintf(sc->strbuff,STRBUFFSIZE,"%d: illegal operator", sc->op);
Error_0(sc,sc->strbuff);
}
return sc->T;
@ -3142,7 +3134,7 @@ static pointer opexe_1(scheme *sc, enum scheme_opcodes op) {
s_goto(sc,OP_APPLY);
default:
sprintf(sc->strbuff, "%d: illegal operator", sc->op);
snprintf(sc->strbuff,STRBUFFSIZE,"%d: illegal operator", sc->op);
Error_0(sc,sc->strbuff);
}
return sc->T;
@ -3607,7 +3599,7 @@ static pointer opexe_2(scheme *sc, enum scheme_opcodes op) {
}
default:
sprintf(sc->strbuff, "%d: illegal operator", sc->op);
snprintf(sc->strbuff,STRBUFFSIZE,"%d: illegal operator", sc->op);
Error_0(sc,sc->strbuff);
}
return sc->T;
@ -3761,7 +3753,7 @@ static pointer opexe_3(scheme *sc, enum scheme_opcodes op) {
case OP_EQV: /* eqv? */
s_retbool(eqv(car(sc->args), cadr(sc->args)));
default:
sprintf(sc->strbuff, "%d: illegal operator", sc->op);
snprintf(sc->strbuff,STRBUFFSIZE,"%d: illegal operator", sc->op);
Error_0(sc,sc->strbuff);
}
return sc->T;
@ -4308,7 +4300,7 @@ static pointer opexe_5(scheme *sc, enum scheme_opcodes op) {
}
default:
sprintf(sc->strbuff, "%d: illegal operator", sc->op);
snprintf(sc->strbuff,STRBUFFSIZE,"%d: illegal operator", sc->op);
Error_0(sc,sc->strbuff);
}
@ -4363,7 +4355,7 @@ static pointer opexe_6(scheme *sc, enum scheme_opcodes op) {
case OP_MACROP: /* macro? */
s_retbool(is_macro(car(sc->args)));
default:
sprintf(sc->strbuff, "%d: illegal operator", sc->op);
snprintf(sc->strbuff,STRBUFFSIZE,"%d: illegal operator", sc->op);
Error_0(sc,sc->strbuff);
}
return sc->T; /* NOTREACHED */
@ -4450,24 +4442,24 @@ static void Eval_Cycle(scheme *sc, enum scheme_opcodes op) {
for (;;) {
op_code_info *pcd=dispatch_table+sc->op;
if (pcd->name!=0) { /* if built-in function, check arguments */
char msg[512];
char msg[STRBUFFSIZE];
int ok=1;
int n=list_length(sc,sc->args);
/* Check number of arguments */
if(n<pcd->min_arity) {
ok=0;
sprintf(msg,"%s: needs%s %d argument(s)",
pcd->name,
pcd->min_arity==pcd->max_arity?"":" at least",
pcd->min_arity);
snprintf(msg, STRBUFFSIZE, "%s: needs%s %d argument(s)",
pcd->name,
pcd->min_arity==pcd->max_arity?"":" at least",
pcd->min_arity);
}
if(ok && n>pcd->max_arity) {
ok=0;
sprintf(msg,"%s: needs%s %d argument(s)",
pcd->name,
pcd->min_arity==pcd->max_arity?"":" at most",
pcd->max_arity);
snprintf(msg, STRBUFFSIZE, "%s: needs%s %d argument(s)",
pcd->name,
pcd->min_arity==pcd->max_arity?"":" at most",
pcd->max_arity);
}
if(ok) {
if(pcd->arg_tests_encoding!=0) {
@ -4496,10 +4488,10 @@ static void Eval_Cycle(scheme *sc, enum scheme_opcodes op) {
} while(i<n);
if(i<n) {
ok=0;
sprintf(msg,"%s: argument %d must be: %s",
pcd->name,
i+1,
tests[j].kind);
snprintf(msg, STRBUFFSIZE, "%s: argument %d must be: %s",
pcd->name,
i+1,
tests[j].kind);
}
}
}