Add the trex ethermedium.
[akaros.git] / kern / src / string.c
index 33cddad..427c4d5 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)
 {
@@ -259,9 +272,17 @@ memcpy(void* dst, const void* src, size_t _n)
        return dst;
 }
 
+#ifdef CONFIG_X86
+void bcopy(const void *src, void *dst, size_t len);
+#endif
+
 void *
 memmove(void *COUNT(_n) dst, const void *COUNT(_n) src, size_t _n)
 {
+#ifdef CONFIG_X86
+       bcopy(src, dst, _n);
+       return dst;
+#else
        const char *BND(src,src+_n) s;
        char *BND(dst,dst+_n) d;
        size_t n = _n;
@@ -278,6 +299,7 @@ memmove(void *COUNT(_n) dst, const void *COUNT(_n) src, size_t _n)
                        *d++ = *s++;
 
        return dst;
+#endif
 }
 
 int
@@ -409,3 +431,30 @@ int atoi(const char *s)
        // 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;
+}