Adds kill to the monitor
[akaros.git] / kern / src / string.c
index 4e3db1e..6142c52 100644 (file)
@@ -109,6 +109,19 @@ strchr(const char *s, char c)
        return 0;
 }
 
+// Return a pointer to the last occurrence of 'c' in 's',
+// or a null pointer if the string has no 'c'.
+char *
+strrchr(const char *s, char c)
+{
+       char *lastc = NULL;
+       for (; *s; s++)
+               if (*s == c){
+                       lastc = (char*)s;
+               }
+       return lastc;
+}
+
 void *
 memchr(void* mem, int chr, int len)
 {
@@ -139,7 +152,7 @@ memsetw(long* _v, long c, size_t n)
        start = _v;
        end = _v + n/sizeof(long);
        v = _v;
-       c = (char)c;
+       c = c & 0xff;
        c = c | c<<8;
        c = c | c<<16;
        #if NUM_ADDR_BITS == 64
@@ -353,9 +366,86 @@ strtol(const char *s, char **endptr, int base)
        return (neg ? -val : val);
 }
 
-int
-atoi(const char* s)
+unsigned long
+strtoul(const char *s, char **endptr, int base)
 {
+       int neg = 0;
+       unsigned long val = 0;
+
+       // gobble initial whitespace
+       while (*s == ' ' || *s == '\t')
+               s++;
+
+       // plus/minus sign
+       if (*s == '+')
+               s++;
+       else if (*s == '-')
+               s++, neg = 1;
+
+       // hex or octal base prefix
+       if ((base == 0 || base == 16) && (s[0] == '0' && s[1] == 'x'))
+               s += 2, base = 16;
+       else if (base == 0 && s[0] == '0')
+               s++, base = 8;
+       else if (base == 0)
+               base = 10;
+
+       // digits
+       while (1) {
+               int dig;
+
+               if (*s >= '0' && *s <= '9')
+                       dig = *s - '0';
+               else if (*s >= 'a' && *s <= 'z')
+                       dig = *s - 'a' + 10;
+               else if (*s >= 'A' && *s <= 'Z')
+                       dig = *s - 'A' + 10;
+               else
+                       break;
+               if (dig >= base)
+                       break;
+               s++, val = (val * base) + dig;
+               // we don't properly detect overflow!
+       }
+
+       if (endptr)
+               *endptr = (char *) s;
+       return (neg ? -val : val);
+}
+
+int atoi(const char *s)
+{
+       if (!s)
+               return 0;
+       if (s[0] == '0' && s[1] == 'x')
+               warn("atoi() used on a hex string!");
        // no overflow detection
        return (int)strtol(s,NULL,10);
 }
+
+int sigchecksum(void *address, int length)
+{
+       uint8_t *p, sum;
+
+       sum = 0;
+       for (p = address; length-- > 0; p++)
+               sum += *p;
+
+       return sum;
+}
+
+void *sigscan(uint8_t *address, int length, char *signature)
+{
+       uint8_t *e, *p;
+       int siglength;
+
+       e = address + length;
+       siglength = strlen(signature);
+       for (p = address; p + siglength < e; p += 16) {
+               if (memcmp(p, signature, siglength))
+                       continue;
+               return p;
+       }
+
+       return NULL;
+}