102 lines
2.2 KiB
Diff
102 lines
2.2 KiB
Diff
|
This adds several standard C functions to lib.c:
|
||
|
strncmp, toupper, isdigit, isxdigit
|
||
|
|
||
|
simple_strtoul is a limited implementation of strtoul, taken from Linux.
|
||
|
|
||
|
They will be needed for command line parsing.
|
||
|
|
||
|
Index: memtest86+-1.70/lib.c
|
||
|
===================================================================
|
||
|
--- memtest86+-1.70.orig/lib.c
|
||
|
+++ memtest86+-1.70/lib.c
|
||
|
@@ -69,6 +69,21 @@ int memcmp(const void *s1, const void *s
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+int strncmp(const char *s1, const char *s2, ulong n)
|
||
|
+{
|
||
|
+ signed char res = 0;
|
||
|
+ while (n) {
|
||
|
+ res = *s1 - *s2;
|
||
|
+ if (res != 0)
|
||
|
+ return res;
|
||
|
+ if (*s1 == '\0')
|
||
|
+ return 0;
|
||
|
+ ++s1, ++s2;
|
||
|
+ --n;
|
||
|
+ }
|
||
|
+ return res;
|
||
|
+}
|
||
|
+
|
||
|
void *memmove(void *dest, const void *src, ulong n)
|
||
|
{
|
||
|
long i;
|
||
|
@@ -87,6 +102,53 @@ void *memmove(void *dest, const void *sr
|
||
|
}
|
||
|
return dest;
|
||
|
}
|
||
|
+
|
||
|
+char toupper(char c)
|
||
|
+{
|
||
|
+ if (c >= 'a' && c <= 'z')
|
||
|
+ return c + 'A' -'a';
|
||
|
+ else
|
||
|
+ return c;
|
||
|
+}
|
||
|
+
|
||
|
+int isdigit(char c)
|
||
|
+{
|
||
|
+ return c >= '0' && c <= '9';
|
||
|
+}
|
||
|
+
|
||
|
+int isxdigit(char c)
|
||
|
+{
|
||
|
+ return isdigit(c) || (toupper(c) >= 'A' && toupper(c) <= 'F');
|
||
|
+}
|
||
|
+
|
||
|
+unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)
|
||
|
+{
|
||
|
+ unsigned long result = 0, value;
|
||
|
+
|
||
|
+ if (!base) {
|
||
|
+ base = 10;
|
||
|
+ if (*cp == '0') {
|
||
|
+ base = 8;
|
||
|
+ cp++;
|
||
|
+ if (toupper(*cp) == 'X' && isxdigit(cp[1])) {
|
||
|
+ cp++;
|
||
|
+ base = 16;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ } else if (base == 16) {
|
||
|
+ if (cp[0] == '0' && toupper(cp[1]) == 'X')
|
||
|
+ cp += 2;
|
||
|
+ }
|
||
|
+ while (isxdigit(*cp) &&
|
||
|
+ (value = isdigit(*cp) ? *cp-'0' : toupper(*cp)-'A'+10) < base) {
|
||
|
+ result = result*base + value;
|
||
|
+ cp++;
|
||
|
+ }
|
||
|
+ if (endp)
|
||
|
+ *endp = (char *)cp;
|
||
|
+ return result;
|
||
|
+}
|
||
|
+
|
||
|
/*
|
||
|
* Scroll the error message area of the screen as needed
|
||
|
* Starts at line LINE_SCROLL and ends at line 23
|
||
|
Index: memtest86+-1.70/test.h
|
||
|
===================================================================
|
||
|
--- memtest86+-1.70.orig/test.h
|
||
|
+++ memtest86+-1.70/test.h
|
||
|
@@ -95,6 +95,7 @@ typedef unsigned long ulong;
|
||
|
#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
|
||
|
int memcmp(const void *s1, const void *s2, ulong count);
|
||
|
void *memmove(void *dest, const void *src, ulong n);
|
||
|
+int strncmp(const char *s1, const char *s2, ulong n);
|
||
|
int query_linuxbios(void);
|
||
|
int query_pcbios(void);
|
||
|
int insertaddress(ulong);
|
||
|
|
||
|
--
|