Melchior discovered that cmp() was just wrong, failing to actually
inspect the string pointers. It also failed to properly sort strings where one is a prefix of the other. It looks to me like I just never finished this, and it ended up in CVS because it just happened to compile...
This commit is contained in:
+10
-12
@@ -107,20 +107,18 @@ static naRef streq(naContext c, naRef me, int argc, naRef* args)
|
|||||||
static naRef f_cmp(naContext c, naRef me, int argc, naRef* args)
|
static naRef f_cmp(naContext c, naRef me, int argc, naRef* args)
|
||||||
{
|
{
|
||||||
char *a, *b;
|
char *a, *b;
|
||||||
int i, len;
|
int i, alen, blen;
|
||||||
if(argc < 2 || !naIsString(args[0]) || !naIsString(args[1]))
|
if(argc < 2 || !naIsString(args[0]) || !naIsString(args[1]))
|
||||||
naRuntimeError(c, "bad argument to cmp");
|
naRuntimeError(c, "bad argument to cmp");
|
||||||
a = naStr_data(args[0]);
|
a = naStr_data(args[0]);
|
||||||
|
alen = naStr_len(args[0]);
|
||||||
b = naStr_data(args[1]);
|
b = naStr_data(args[1]);
|
||||||
len = naStr_len(args[0]);
|
blen = naStr_len(args[1]);
|
||||||
if(naStr_len(args[1]) < len)
|
for(i=0; i<alen && i<blen; i++) {
|
||||||
len = naStr_len(args[1]);
|
int diff = a[i] - b[i];
|
||||||
for(i=0; i<len; i++) {
|
if(diff) return naNum(diff < 0 ? -1 : 1);
|
||||||
int diff = a - b;
|
|
||||||
if(diff < 0) return naNum(-1);
|
|
||||||
else if(diff > 0) return naNum(1);
|
|
||||||
}
|
}
|
||||||
return naNum(0);
|
return naNum(alen == blen ? 0 : (alen < blen ? -1 : 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
static naRef substr(naContext c, naRef me, int argc, naRef* args)
|
static naRef substr(naContext c, naRef me, int argc, naRef* args)
|
||||||
@@ -228,14 +226,14 @@ static naRef f_die(naContext c, naRef me, int argc, naRef* args)
|
|||||||
// until it fits. Returned buffer should be freed by the caller.
|
// until it fits. Returned buffer should be freed by the caller.
|
||||||
char* dosprintf(char* f, ...)
|
char* dosprintf(char* f, ...)
|
||||||
{
|
{
|
||||||
int l;
|
|
||||||
char* buf;
|
char* buf;
|
||||||
va_list va;
|
va_list va;
|
||||||
int len = 16;
|
int olen, len = 16;
|
||||||
while(1) {
|
while(1) {
|
||||||
buf = naAlloc(len);
|
buf = naAlloc(len);
|
||||||
va_start(va, f);
|
va_start(va, f);
|
||||||
if((l=vsnprintf(buf, len, f, va)) < len && l!=-1) {
|
olen = vsnprintf(buf, len, f, va);
|
||||||
|
if(olen >= 0 && olen < len) {
|
||||||
va_end(va);
|
va_end(va);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user