Browse Source

scan_uint and scan_ushort will now abort if the result does not fit in

uint or ushort as opposed to ulong.
master
Felix von Leitner 19 years ago
parent
commit
271d97d5c9
  1. 30
      scan/scan_uint.c
  2. 30
      scan/scan_ushort.c

30
scan/scan_uint.c

@ -1,8 +1,30 @@
#include "scan.h"
/* this is cut and paste from scan_ulong instead of calling scan_ulong
* because this way scan_uint can abort scanning when the number would
* not fit into an unsigned int (as opposed to not fitting in an
* unsigned long) */
unsigned int scan_uint(const char* src,unsigned int* dest) {
unsigned long l;
register int len=scan_ulong(src,&l);
*dest=l;
return len;
if (sizeof(unsigned int) == sizeof(unsigned long)) {
/* a good optimizing compiler should remove the else clause when not
* needed */
return scan_ulong(src,(unsigned long*)dest);
} else {
register const char *tmp=src;
register unsigned int l=0;
register unsigned char c;
while ((c=*tmp-'0')<10) {
unsigned int n;
/* division is very slow on most architectures */
n=l<<3; if ((n>>3)!=l) break;
if (n+(l<<1) < n) break;
n+=l<<1;
if (n+c < n) break;
l=n+c;
++tmp;
}
*dest=l;
return tmp-src;
}
}

30
scan/scan_ushort.c

@ -1,8 +1,30 @@
#include "scan.h"
/* this is cut and paste from scan_ulong instead of calling scan_ulong
* because this way scan_ushort can abort scanning when the number would
* not fit into an unsigned short (as opposed to not fitting in an
* unsigned long) */
unsigned int scan_ushort(const char* src,unsigned short* dest) {
unsigned long l;
register int len=scan_ulong(src,&l);
*dest=l;
return len;
if (sizeof(unsigned short) == sizeof(unsigned int)) {
/* a good optimizing compiler should remove the else clause when not
* needed */
return scan_uint(src,(unsigned int*)dest);
} else {
register const char *tmp=src;
register unsigned short int l=0;
register unsigned char c;
while ((c=*tmp-'0')<10) {
unsigned short int n;
/* division is very slow on most architectures */
n=l<<3; if ((n>>3)!=l) break;
if (n+(l<<1) < n) break;
n+=l<<1;
if (n+c < n) break;
l=n+c;
++tmp;
}
*dest=l;
return tmp-src;
}
}

Loading…
Cancel
Save