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:
andy
2006-03-21 21:57:00 +00:00
parent c8098b9eac
commit 6e973e07f4

View File

@@ -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)
{
char *a, *b;
int i, len;
int i, alen, blen;
if(argc < 2 || !naIsString(args[0]) || !naIsString(args[1]))
naRuntimeError(c, "bad argument to cmp");
a = naStr_data(args[0]);
alen = naStr_len(args[0]);
b = naStr_data(args[1]);
len = naStr_len(args[0]);
if(naStr_len(args[1]) < len)
len = naStr_len(args[1]);
for(i=0; i<len; i++) {
int diff = a - b;
if(diff < 0) return naNum(-1);
else if(diff > 0) return naNum(1);
blen = naStr_len(args[1]);
for(i=0; i<alen && i<blen; i++) {
int diff = a[i] - b[i];
if(diff) return naNum(diff < 0 ? -1 : 1);
}
return naNum(0);
return naNum(alen == blen ? 0 : (alen < blen ? -1 : 1));
}
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.
char* dosprintf(char* f, ...)
{
int l;
char* buf;
va_list va;
int len = 16;
int olen, len = 16;
while(1) {
buf = naAlloc(len);
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);
return buf;
}