]> git.sur5r.net Git - cc65/commitdiff
Added further optimizations and unit tests.
authorIrgendwerA8 <c.krueger.b@web.de>
Sun, 5 Mar 2017 01:09:12 +0000 (02:09 +0100)
committerIrgendwerA8 <c.krueger.b@web.de>
Sun, 5 Mar 2017 01:09:12 +0000 (02:09 +0100)
26 files changed:
libsrc/common/memmove.s
libsrc/common/strcat.s
libsrc/common/strchr.s
libsrc/common/strcspn.s
libsrc/common/strlen.s
libsrc/common/strncat.s
libsrc/common/strspn.s
libsrc/runtime/axlong.s
test/val/atoi-test.c [deleted file]
test/val/lib_common_atoi.c [new file with mode: 0644]
test/val/lib_common_memmove.c [new file with mode: 0644]
test/val/lib_common_strcat.c [new file with mode: 0644]
test/val/lib_common_strchr.c [new file with mode: 0644]
test/val/lib_common_strcspn.c [new file with mode: 0644]
test/val/lib_common_strncat.c [new file with mode: 0644]
test/val/lib_common_strol.c [new file with mode: 0644]
test/val/lib_common_strrchr.c [new file with mode: 0644]
test/val/lib_common_strspn.c [new file with mode: 0644]
test/val/lib_common_strtoul.c [new file with mode: 0644]
test/val/strtol-test.c [deleted file]
test/val/strtoul-test.c [deleted file]
test/val/unittest.h [new file with mode: 0644]
testcode/lib/strcat-test.c [deleted file]
testcode/lib/strchr-test.c [deleted file]
testcode/lib/strrchr-test.c [deleted file]
testcode/lib/unittest.h [deleted file]

index 9c33124f19e2b1d1d3b33fe13f94d4fc2faff2fa..666447cd8cbea36992847ba02a93dbea615c2b67 100644 (file)
@@ -1,6 +1,6 @@
 ;
 ; 2003-08-20, Ullrich von Bassewitz
-; 2009-09-13, Christian Krueger -- performance increase (about 20%)
+; 2009-09-13, Christian Krueger -- performance increase (about 20%), 2013-07-25 improved unrolling
 ; 2015-10-23, Greg King
 ;
 ; void* __fastcall__ memmove (void* dest, const void* src, size_t size);
@@ -61,13 +61,10 @@ PageSizeCopy:                   ; assert Y = 0
         dec     ptr1+1          ; adjust base...
         dec     ptr2+1
         dey                     ; in entry case: 0 -> FF
-        lda     (ptr1),y        ; need to copy this 'intro byte'
-        sta     (ptr2),y        ; to 'land' later on Y=0! (as a result of the '.repeat'-block!)
-        dey                     ; FF ->FE
 @copyBytes:
-        .repeat 2               ; Unroll this a bit to make it faster...
-        lda     (ptr1),y
-        sta     (ptr2),y
+        .repeat 3               ; unroll this a bit to make it faster...
+        lda     (ptr1),y        ; important: unrolling three times gives a nice
+        sta     (ptr2),y        ; 255/3 = 85 loop which ends at 0
         dey
         .endrepeat
 @copyEntry:                     ; in entry case: 0 -> FF
index 9be65386f843bab40820282c4f8b7f13135ff6db..74fef0759a47aacfc2cfda59ef2376c86a6731e2 100644 (file)
@@ -1,6 +1,6 @@
 ;
 ; Ullrich von Bassewitz, 31.05.1998
-; Christian Krueger: 2013-Jul-24, minor optimization
+; Christian Krueger: 2013-Jul-24, minor optimizations
 ;
 ; char* strcat (char* dest, const char* src);
 ;
@@ -15,8 +15,12 @@ _strcat:
         jsr popax       ; Get dest
         sta tmp3        ; Remember for function return
         tay
+.if (.cpu .bitand ::CPU_ISET_65SC02)
+        stz ptr2
+.else
         lda #0
         sta ptr2        ; access from page start, y contains low byte
+.endif        
         stx ptr2+1
 
 findEndOfDest:
index 0bd55d0e148321d5f1241823b7268589e472b2b2..48bb8822b2596426a355426c4eebc4663e4ca51e 100644 (file)
@@ -14,8 +14,12 @@ _strchr:
         jsr popax       ; get s
         tay             ; low byte of pointer to y
         stx ptr1+1
+.if (.cpu .bitand ::CPU_ISET_65SC02)
+        stz ptr1
+.else
         lda #0
-        sta ptr1        ; ptr access page wise
+        sta ptr1        ; access from page start, y contains low byte
+.endif        
 
 Loop:   lda (ptr1),y    ; Get next char
         beq EOS         ; Jump on end of string
index 8fd567ae4417ce8f3b4dd887662e6036bf001dc2..3f7b42ed1f9bac7148bca7fd4457021b8d024be1 100644 (file)
@@ -1,54 +1,54 @@
 ;
 ; Ullrich von Bassewitz, 11.06.1998
+; Christian Krueger: 05-Aug-2013, optimization
 ;
 ; size_t strcspn (const char* s1, const char* s2);
 ;
 
         .export         _strcspn
-        .import         popax
-        .importzp       ptr1, ptr2, tmp1, tmp2, tmp3
+        .import         popax, _strlen
+        .importzp       ptr1, ptr2, tmp1, tmp2
 
 _strcspn:
-        sta     ptr2            ; Save s2
-        stx     ptr2+1
-        jsr     popax           ; Get s1
-        sta     ptr1
-        stx     ptr1+1
-        ldx     #0              ; low counter byte
-        stx     tmp1            ; high counter byte
-        ldy     #$00
-
-L1:     lda     (ptr1),y        ; get next char from s1
-        beq     L6              ; jump if done
-        sta     tmp2            ; save char
+        jsr _strlen         ; get length in a/x and transfer s2 to ptr1
+                            ; Note: It does not make sense to
+                            ; have more than 255 test chars, so
+                            ; we don't support a high byte here! (ptr1+1 is
+                            ; also unchanged in strlen then (important!))
+                            ; -> the original implementation also
+                            ; ignored this case
+
+        sta tmp1            ; tmp1 = strlen of test chars
+        jsr popax           ; get and save s1
+        sta ptr2            ; to ptr2
+        stx ptr2+1
+        ldx #0              ; low counter byte
+        stx tmp2            ; high counter byte
+
+loadChar:
+        ldy #0
+        lda (ptr2),y        ; get next char from s1
+        beq leave           ; handly byte of s1
+advance:
+        inc ptr2            ; advance string position to test
+        bne check
+        inc ptr2+1
+        dey                 ; correct next iny (faster/shorter than bne...)
+
+checkNext:
         iny
-        bne     L2
-        inc     ptr1+1
-L2:     sty     tmp3            ; save index into s1
-
-        ldy     #0              ; get index into s2
-L3:     lda     (ptr2),y        ;
-        beq     L4              ; jump if done
-        cmp     tmp2
-        beq     L6
-        iny
-        bne     L3
-
-; The character was not found in s2. Increment the counter and start over
-
-L4:     ldy     tmp3            ; reload index
-        inx
-        bne     L1
-        inc     tmp1
-        bne     L1
+check:  cpy tmp1            ; compare with length of test character string
+        beq endOfTestChars
+        cmp (ptr1),y        ; found matching char?
+        bne checkNext           
 
-; The character was found, or we reached the end of s1. Return count of
-; characters
-
-L6:     txa                     ; get low counter byte
-        ldx     tmp1            ; get high counter byte
+leave:  txa                 ; restore position of finding
+        ldx tmp2            ; and return
         rts
 
-
-
+endOfTestChars:
+        inx
+        bne loadChar
+        inc tmp2
+        bne loadChar        ; like bra...        
 
index b583eea50c4b1876538af312e90a23a65a99d4fa..1a51edb1174b1ff084d9fe5792e2406b17d8897e 100644 (file)
@@ -1,6 +1,10 @@
 ;
 ; Ullrich von Bassewitz, 31.05.1998
 ;
+; Note: strspn & strcspn call internally this function and rely on
+; the usage of only ptr1 here! Keep in mind when appling changes
+; and check the other implementations too!
+;
 ; int strlen (const char* s);
 ;
 
@@ -23,4 +27,3 @@ L1:     lda     (ptr1),y
 
 L9:     tya                     ; get low byte of counter, hi's all set
         rts
-
index b7bb04b2ad6fd83d56a0c8ceecc2b2a34a5b3538..42717853f4de8153ab44740c580ab3c9a58ba70f 100644 (file)
@@ -1,5 +1,6 @@
 ;
 ; Ullrich von Bassewitz, 31.05.1998
+; Christian Krueger: 12-Aug-2013, minor optimizations
 ;
 ; char* strncat (char* dest, const char* src, size_t n);
 ;
         .importzp       ptr1, ptr2, ptr3, tmp1, tmp2
 
 _strncat:
-        eor     #$FF            ; one's complement to count upwards
-        sta     tmp1
-        txa
-        eor     #$FF
-        sta     tmp2
-        jsr     popax           ; get src
-        sta     ptr1
-        stx     ptr1+1
-        jsr     popax           ; get dest
-        sta     ptr2
-        stx     ptr2+1
-        sta     ptr3            ; remember for function return
-        stx     ptr3+1
-        ldy     #0
+    eor #$FF        ; one's complement to count upwards
+    sta tmp1
+    txa
+    eor #$FF
+    sta tmp2
+    
+    jsr popax       ; get src
+    sta ptr1
+    stx ptr1+1
 
-; find end of dest
+    jsr popax       ; get dest
+    sta ptr3        ; remember for function return
+    stx ptr3+1          
+    stx ptr2+1
+    tay             ; low byte as offset in Y
+.if (.cpu .bitand ::CPU_ISET_65SC02)
+    stz ptr2
+.else
+    ldx #0
+    stx ptr2        ; destination on page boundary
+.endif
 
-L1:     lda     (ptr2),y
-        beq     L2
-        iny
-        bne     L1
-        inc     ptr2+1
-        bne     L1
+; find end of dest
 
-; end found, get offset in y into pointer
+L1: lda (ptr2),y
+    beq L2
+    iny
+    bne L1
+    inc ptr2+1
+    bne L1
 
-L2:     tya
-        clc
-        adc     ptr2
-        sta     ptr2
-        bcc     L3
-        inc     ptr2+1
+; end found, apply offset to dest ptr and reset y
+L2: sty ptr2
 
 ; copy src. We've put the ones complement of the count into the counter, so
 ; we'll increment the counter on top of the loop
 
-L3:     ldy     #0
-        ldx     tmp1            ; low counter byte
+L3: ldy #0
+    ldx tmp1        ; low counter byte
 
-L4:     inx
-        bne     L5
-        inc     tmp2
-        beq     L6              ; jump if done
-L5:     lda     (ptr1),y
-        sta     (ptr2),y
-        beq     L7
-        iny
-        bne     L4
-        inc     ptr1+1
-        inc     ptr2+1
-        bne     L4
+L4: inx
+    bne L5
+    inc tmp2
+    beq L6          ; jump if done
+L5: lda (ptr1),y
+    sta (ptr2),y
+    beq L7
+    iny
+    bne L4
+    inc ptr1+1
+    inc ptr2+1
+    bne L4
 
 ; done, set the trailing zero and return pointer to dest
 
-L6:     lda     #0
-        sta     (ptr2),y
-L7:     lda     ptr3
-        ldx     ptr3+1
-        rts
+L6: lda #0
+    sta (ptr2),y
+L7: lda ptr3
+    ldx ptr3+1
+    rts
 
 
index f8b8fff2ac4da37dc8de787e9a31508f0b838162..3316f0dab5796d1b6e8bee49f4d2ef9879755052 100644 (file)
@@ -1,56 +1,54 @@
 ;
 ; Ullrich von Bassewitz, 11.06.1998
+; Christian Krueger: 08-Aug-2013, optimization
 ;
 ; size_t strspn (const char* s1, const char* s2);
 ;
 
         .export         _strspn
-        .import         popax
-        .importzp       ptr1, ptr2, tmp1, tmp2, tmp3
+        .import         popax, _strlen
+        .importzp       ptr1, ptr2, tmp1, tmp2
 
 _strspn:
-        sta     ptr2            ; Save s2
-        stx     ptr2+1
-        jsr     popax           ; get s1
-        sta     ptr1
-        stx     ptr1+1
-        ldx     #0              ; low counter byte
-        stx     tmp1            ; high counter byte
-        ldy     #$00
-
-L1:     lda     (ptr1),y        ; get next char from s1
-        beq     L6              ; jump if done
-        sta     tmp2            ; save char
-        iny
-        bne     L2
-        inc     ptr1+1
-L2:     sty     tmp3            ; save index into s1
-
-        ldy     #0              ; get index into s2
-L3:     lda     (ptr2),y        ;
-        beq     L6              ; jump if done
-        cmp     tmp2
-        beq     L4
+        jsr _strlen         ; get length in a/x and transfer s2 to ptr1
+                            ; Note: It does not make sense to
+                            ; have more than 255 test chars, so
+                            ; we don't support a high byte here! (ptr1+1 is
+                            ; also unchanged in strlen then (important!))
+                            ; -> the original implementation also
+                            ; ignored this case
+
+        sta tmp1            ; tmp1 = strlen of test chars
+        jsr popax           ; get and save s1
+        sta ptr2            ; to ptr2
+        stx ptr2+1
+        ldx #0              ; low counter byte
+        stx tmp2            ; high counter byte
+
+loadChar:
+        ldy #0
+        lda (ptr2),y        ; get next char from s1
+        beq leave           ; handly byte of s1
+advance:
+        inc ptr2            ; advance string position to test
+        bne check
+        inc ptr2+1
+        dey                 ; correct next iny (faster/shorter than bne...)
+
+checkNext:
         iny
-        bne     L3
+check:  cpy tmp1            ; compare with length of test character string
+        beq leave
+        cmp (ptr1),y        ; found matching char?
+        bne checkNext           
 
-; The character was found in s2. Increment the counter and start over
-
-L4:     ldy     tmp3            ; reload index
+foundTestChar:
         inx
-        bne     L1
-        inc     tmp1
-        bne     L1
-
-; The character was not found, or we reached the end of s1. Return count of
-; characters
+        bne loadChar
+        inc tmp2
+        bne loadChar        ; like bra...  
 
-L6:     txa                     ; get low counter byte
-        ldx     tmp1            ; get high counter byte
+leave:  txa                 ; restore position of finding
+        ldx tmp2            ; and return
         rts
-
-
-
-
-
-
+   
\ No newline at end of file
index 6d97b5025bf885895e734e8f5a1ca9168056d18b..02d0a825c01323f8729c607d08d87b4f24fb05e7 100644 (file)
@@ -1,5 +1,6 @@
 ;
 ; Ullrich von Bassewitz, 25.10.2000
+; Christian Krueger, 02-Mar-2017, some bytes saved
 ;
 ; CC65 runtime: Convert int in ax into a long
 ;
 
 ; Convert AX from int to long in EAX
 
+axlong: ldy     #$ff
+        cpx     #$80            ; Positive?
+        bcs     store           ; No, apply $FF
+
 axulong:
         ldy     #0
-        sty     sreg
-        sty     sreg+1
-        rts
-
-axlong: cpx     #$80            ; Positive?
-        bcc     axulong         ; Yes, handle like unsigned type
-        ldy     #$ff
-        sty     sreg
+store:  sty     sreg
         sty     sreg+1
         rts
 
-
-
diff --git a/test/val/atoi-test.c b/test/val/atoi-test.c
deleted file mode 100644 (file)
index 5f5fa65..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-  !!DESCRIPTION!! A small test for atoi. Assumes twos complement
-  !!ORIGIN!!
-  !!LICENCE!!
-  !!AUTHOR!!
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <errno.h>
-
-static unsigned int Failures = 0;
-
-static void CheckAtoi (const char* Str, int Val)
-{
-    int Res = atoi (Str);
-    if (Res != Val) {
-        printf ("atoi error in \"%s\":\n"
-                "  result = %d, should be %d\n", Str, Res, Val);
-        ++Failures;
-    }
-}
-
-int main (void)
-{
-    CheckAtoi ("\t +0A", 0);
-    CheckAtoi ("\t -0.123", 0);
-    CheckAtoi ("  -32  ", -32);
-    CheckAtoi (" +32  ", 32);
-    CheckAtoi ("0377", 377);
-    CheckAtoi (" 0377 ", 377);
-    CheckAtoi (" +0377 ", 377);
-    CheckAtoi (" -0377 ", -377);
-    CheckAtoi ("0x7FFF", 0);
-    CheckAtoi (" +0x7FFF", 0);
-    CheckAtoi (" -0x7FFF", 0);
-    printf ("Failures: %u\n", Failures);
-
-    return Failures;
-}
diff --git a/test/val/lib_common_atoi.c b/test/val/lib_common_atoi.c
new file mode 100644 (file)
index 0000000..5f5fa65
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+  !!DESCRIPTION!! A small test for atoi. Assumes twos complement
+  !!ORIGIN!!
+  !!LICENCE!!
+  !!AUTHOR!!
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <errno.h>
+
+static unsigned int Failures = 0;
+
+static void CheckAtoi (const char* Str, int Val)
+{
+    int Res = atoi (Str);
+    if (Res != Val) {
+        printf ("atoi error in \"%s\":\n"
+                "  result = %d, should be %d\n", Str, Res, Val);
+        ++Failures;
+    }
+}
+
+int main (void)
+{
+    CheckAtoi ("\t +0A", 0);
+    CheckAtoi ("\t -0.123", 0);
+    CheckAtoi ("  -32  ", -32);
+    CheckAtoi (" +32  ", 32);
+    CheckAtoi ("0377", 377);
+    CheckAtoi (" 0377 ", 377);
+    CheckAtoi (" +0377 ", 377);
+    CheckAtoi (" -0377 ", -377);
+    CheckAtoi ("0x7FFF", 0);
+    CheckAtoi (" +0x7FFF", 0);
+    CheckAtoi (" -0x7FFF", 0);
+    printf ("Failures: %u\n", Failures);
+
+    return Failures;
+}
diff --git a/test/val/lib_common_memmove.c b/test/val/lib_common_memmove.c
new file mode 100644 (file)
index 0000000..dd58015
--- /dev/null
@@ -0,0 +1,61 @@
+#include <string.h>
+#include "unittest.h"
+
+#define BufferSize 384               // test correct page passing (>256, multiple of 128 here)
+
+static char Buffer[BufferSize+3];    // +1 to move up (and down)
+
+
+
+TEST
+{
+    unsigned i, v;
+    char*    p;
+    
+    for (i=0; i < BufferSize; ++i)
+      Buffer[i+1] = (i%128);
+
+    Buffer[0] = 255;                  // to check if start position is untouched
+    Buffer[BufferSize+2] = 255;       // to check if end position is untouched
+
+    // copy upwards
+    p = memmove(Buffer+2, Buffer+1, BufferSize);
+
+    // check buffer consistency before target
+    ASSERT_AreEqual(255, (unsigned)Buffer[0], "%u", "Unexpected value before range!");
+
+    // check buffer consistency at starting point
+    ASSERT_AreEqual(0, (unsigned)Buffer[1], "%u", "Unexpected value at range start!");
+
+    // check buffer consistency after range
+    ASSERT_AreEqual(255, (unsigned)Buffer[BufferSize+2], "%u", "Unexpected value after range!");
+
+    // check buffer values
+    for (i=0; i < BufferSize; ++i)
+    {
+        ASSERT_AreEqual(i%128, (unsigned)Buffer[i+2], "%u", "Unexpected value in buffer at position %u!" COMMA i+2);
+    }
+
+    v = Buffer[BufferSize+1];   // rember value of first untouched end-byte 
+
+    // copy downwards
+    p = memmove(Buffer+1, Buffer+2, BufferSize);
+
+    // check buffer consistency before target
+    ASSERT_AreEqual(255, (unsigned)Buffer[0], "%u", "Unexpected value before range!");
+
+    // check buffer consistency at end point
+    ASSERT_AreEqual(v, (unsigned)Buffer[BufferSize+1], "%u", "Unexpected value at range end!");
+
+    // check buffer consistency after range
+    ASSERT_AreEqual(255, (unsigned)Buffer[BufferSize+2], "%u", "Unexpected value after range!");
+
+    // check buffer values
+    for (i=0; i < BufferSize; ++i)
+    {
+        ASSERT_AreEqual(i%128, (unsigned)Buffer[i+1], "%u", "Unexpected value in buffer at position %u!" COMMA i+1);
+    }
+}
+ENDTEST
+
+
diff --git a/test/val/lib_common_strcat.c b/test/val/lib_common_strcat.c
new file mode 100644 (file)
index 0000000..1872053
--- /dev/null
@@ -0,0 +1,54 @@
+#include <string.h>
+#include "unittest.h"
+
+#define SourceStringSize 257                            // test correct page passing (>256)
+
+static char SourceString[SourceStringSize+1];           // +1 room for terminating null
+static char DestinationString[2*SourceStringSize+1];    // will contain two times the source buffer
+
+
+TEST
+{
+    unsigned i,j;
+    char*    p;
+    
+    for (i=0; i < SourceStringSize; ++i)
+      SourceString[i] = (i%128)+1;
+
+    SourceString[i] = 0;
+
+    ASSERT_AreEqual(SourceStringSize, strlen(SourceString), "%u", "Source string initialization or 'strlen()' problem!");
+
+    /* Ensure empty destination string */
+    DestinationString[0] = 0;
+
+    ASSERT_AreEqual(0, strlen(DestinationString), "%u", "Destination string initialization or 'strlen()' problem!");
+    
+    /* Test concatenation to empty buffer */
+
+    strcat(DestinationString, SourceString);
+    
+    ASSERT_AreEqual(SourceStringSize, strlen(DestinationString), "%u", "Unexpected string length while string concatenation to empty buffer!");
+    
+    /* Test concatenation to non empty buffer */
+
+    p = strcat(DestinationString, SourceString);
+
+    ASSERT_AreEqual(2*SourceStringSize, strlen(DestinationString), "%u", "Unexpected string length while string concatenation to non-empty buffer!");
+
+    /* Test return value */
+
+    ASSERT_IsTrue(p == DestinationString,"Invalid return value!");
+
+    /* Test contents */
+
+    for(j=0; j <2; ++j)
+        for(i=0; i < SourceStringSize; ++i)
+        {
+            unsigned position = j*SourceStringSize+i;
+            unsigned current = DestinationString[position];
+            unsigned expected = (i%128)+1;
+            ASSERT_AreEqual(expected, current, "%u", "Unexpected destination buffer contents at position %u!\n" COMMA position);
+        }
+}
+ENDTEST
diff --git a/test/val/lib_common_strchr.c b/test/val/lib_common_strchr.c
new file mode 100644 (file)
index 0000000..a48d287
--- /dev/null
@@ -0,0 +1,42 @@
+#include <string.h>
+#include "unittest.h"
+
+                                                        
+/* Test string. Must NOT have duplicate characters! */
+static char S[] = "Helo wrd!\n";
+
+static char Found[256];
+
+
+
+TEST
+{
+    unsigned Len;
+    unsigned I;
+    char*    P;
+
+    /* Get the length of the string */
+    Len = strlen (S);
+
+    /* Search for all characters in the string, including the terminator */
+    for (I = 0; I < Len+1; ++I)
+    {
+        /* Search for this char */
+        P = strchr (S, S[I]);
+
+        /* Check if we found it */
+        ASSERT_IsFalse(P == 0 || (P - S) != I, "For code 0x%02X, offset %u!\nP = %04X offset = %04X\n" COMMA S[I] COMMA I COMMA P COMMA P-S);
+        /* Mark the char as checked */
+        Found[S[I]] = 1;
+    }
+
+    /* Search for all other characters and make sure they aren't found */
+    for (I = 0; I < 256; ++I)
+    {
+        if (Found[I] == 0)
+        {
+            ASSERT_IsFalse(strchr (S, (char)I), "Failed for code 0x%02X\n" COMMA I);
+        }
+    }
+}
+ENDTEST
diff --git a/test/val/lib_common_strcspn.c b/test/val/lib_common_strcspn.c
new file mode 100644 (file)
index 0000000..10935a7
--- /dev/null
@@ -0,0 +1,26 @@
+#include <string.h>
+#include "unittest.h"
+
+#define EstimatedStringSize 384                         // test correct page passing (>256)
+
+static char EstimatedString[EstimatedStringSize+1];     // +1 room for terminating null
+static char* EmptyTestChars="";                         // strlen equivalent...
+static char* TestChars="1234567890";                    // we like to find numbers
+
+TEST
+{
+    unsigned i;
+    
+    for (i=0; i < EstimatedStringSize; ++i)
+      EstimatedString[i] = (i%26)+'A';                 // put ABCD... into the string to be estimated
+
+    ASSERT_AreEqual(strlen(EstimatedString), strcspn(EstimatedString, TestChars), "%u", "Unxpected position returned for non-participant case!");
+
+    EstimatedString[EstimatedStringSize/2] = TestChars[strlen(TestChars-1)];
+    ASSERT_AreEqual(EstimatedStringSize/2, strcspn(EstimatedString, TestChars), "%u", "Unxpected position returned for participant case!");
+
+    ASSERT_AreEqual(strlen(EstimatedString), strcspn(EstimatedString, EmptyTestChars), "%u", "Unxpected position returned for empty test case!");
+}
+ENDTEST
+
+
diff --git a/test/val/lib_common_strncat.c b/test/val/lib_common_strncat.c
new file mode 100644 (file)
index 0000000..dd6df91
--- /dev/null
@@ -0,0 +1,54 @@
+#include <string.h>
+#include "unittest.h"
+
+#define SourceStringSize 384                            // test correct page passing (>256, multiple of 128 here)
+
+static char SourceString[SourceStringSize+1];           // +1 room for terminating null
+static char DestinationString[2*SourceStringSize+1];    // will contain two times the source buffer
+
+
+TEST
+{
+    unsigned i;
+    char*    p;
+    
+    for (i=0; i < SourceStringSize; ++i)
+      SourceString[i] = (i%128)+1;
+
+    SourceString[i] = 0;
+
+    ASSERT_AreEqual(SourceStringSize, strlen(SourceString), "%u", "Source string initialization or 'strlen()' problem!");
+
+    /* Ensure empty destination string */
+    DestinationString[0] = 0;
+
+    ASSERT_AreEqual(0, strlen(DestinationString), "%u", "Destination string initialization or 'strlen()' problem!");
+    
+    /* Test "unlimted" concatenation to empty buffer */
+
+    strncat(DestinationString, SourceString, 1024);
+    
+    ASSERT_AreEqual(SourceStringSize, strlen(DestinationString), "%u", "Unexpected string length while string concatenation to empty buffer!");
+    
+    /* Test limited concatenation to non empty buffer */
+
+    p = strncat(DestinationString, SourceString, 128);
+
+    ASSERT_AreEqual(SourceStringSize+128, strlen(DestinationString), "%u", "Unexpected string length while string concatenation to non-empty buffer!");
+
+    /* Test return value */
+
+    ASSERT_IsTrue(p == DestinationString, "Invalid return value!");
+
+    /* Test contents */
+
+    for(i=0; i < strlen(DestinationString); ++i)
+    {
+        unsigned current = DestinationString[i];
+        unsigned expected = (i%128)+1;
+        ASSERT_AreEqual(expected, current, "%u", "Unexpected destination buffer contents at position %u!\n" COMMA i);
+    }
+}
+ENDTEST
+
+
diff --git a/test/val/lib_common_strol.c b/test/val/lib_common_strol.c
new file mode 100644 (file)
index 0000000..76daef7
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+  !!DESCRIPTION!! A small test for atoi/strtol. Assumes twos complement
+  !!ORIGIN!!
+  !!LICENCE!!
+  !!AUTHOR!!
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <errno.h>
+
+#define ERROR   0
+#define OK      1
+
+static unsigned int Failures = 0;
+
+static void IncStr (char* Buf)
+/* Increment a number represented as a string by one. The string MUST not
+ * start with a '9', we cannot handle overflow in this case.
+ */
+{
+    int Len = strlen (Buf);
+
+    while (--Len >= 0) {
+        switch (Buf[Len]) {
+            case '9':
+                Buf[Len] = '0';
+                break;
+
+            default:
+                ++(Buf[Len]);
+                return;
+        }
+    }
+}
+
+static void CheckStrToL (const char* Str, int Base, long Val, unsigned char Ok)
+{
+    char* EndPtr;
+    long Res = strtol (Str, &EndPtr, Base);
+    if (Ok) {
+        if (Res != Val) {
+            printf ("strtol error in \"%s\":\n"
+                    "  result = %ld, should be %ld, chars = %d\n",
+                    Str, Res, Val, EndPtr - Str);
+            ++Failures;
+        }
+    } else {
+        if (errno != ERANGE) {
+            printf ("strtol error in \"%s\":\n"
+                    "  should not convert, but errno = %d\n",
+                    Str, errno);
+            ++Failures;
+        }
+        if (Res != Val) {
+            printf ("strtol error in \"%s\":\n"
+                    "  result = %ld, should be %ld, chars = %d\n",
+                    Str, Res, Val, EndPtr - Str);
+            ++Failures;
+        }
+    }
+}
+
+int main (void)
+{
+    char Buf[80];
+
+    /* Prefixed allowed if base = 0 */
+    CheckStrToL ("\t 0x10G ", 0, 16L, OK);
+    CheckStrToL ("\t 0X10G ", 0, 16L, OK);
+    CheckStrToL (" \t0377\t", 0, 255L, OK);
+    CheckStrToL (" 377", 0, 377L, OK);
+
+    CheckStrToL ("\t -0x10G ", 0, -16L, OK);
+    CheckStrToL ("\t -0X10G ", 0, -16L, OK);
+    CheckStrToL (" \t-0377\t", 0, -255L, OK);
+    CheckStrToL (" -377", 0, -377L, OK);
+
+    /* No prefixes if base = 10 */
+    CheckStrToL ("\t 1234 ", 10, 1234L, OK);
+    CheckStrToL ("\t -1234 ", 10, -1234L, OK);
+    CheckStrToL ("\t -0x10G ", 10, 0L, OK);
+    CheckStrToL ("\t -0X10G ", 10, 0L, OK);
+    CheckStrToL (" \t-0377\t", 10, -377L, OK);
+    CheckStrToL (" 0377", 10, 377L, OK);
+
+    /* 0x prefix is allowed if base = 16 */
+    CheckStrToL ("\t 0x1234 ", 16, 0x1234L, OK);
+    CheckStrToL ("\t -0x1234 ", 16, -0x1234L, OK);
+    CheckStrToL ("\t -010G ", 16, -16L, OK);
+    CheckStrToL ("\t 10G ", 16, 16L, OK);
+
+    /* Check LONG_MIN and LONG_MAX */
+    sprintf (Buf, "%ld", LONG_MIN);
+    CheckStrToL (Buf, 0, LONG_MIN, OK);
+    sprintf (Buf, "%ld", LONG_MAX);
+    CheckStrToL (Buf, 0, LONG_MAX, OK);
+
+    /* Check value one smaller */
+    sprintf (Buf+1, "%ld", LONG_MIN);
+    Buf[1] = '0';       /* Overwrite '-' */
+    IncStr (Buf+1);
+    if (Buf[1] == '0') {
+        Buf[1] = '-';
+        Buf[0] = ' ';
+    } else {
+        Buf[0] = '-';
+    }
+    CheckStrToL (Buf, 0, LONG_MIN, ERROR);
+
+    /* Check value one larger */
+    sprintf (Buf+1, "%ld", LONG_MAX);
+    Buf[0] = '0';
+    IncStr (Buf);
+    if (Buf[0] == '0') {
+        Buf[0] = ' ';
+    }
+    CheckStrToL (Buf, 0, LONG_MAX, ERROR);
+
+    /* Check numbers that are much too large or small */
+    CheckStrToL ("-999999999999999999999999999999999999999999999999999999999", 0, LONG_MIN, ERROR);
+    CheckStrToL ("+999999999999999999999999999999999999999999999999999999999", 0, LONG_MAX, ERROR);
+    CheckStrToL (" 999999999999999999999999999999999999999999999999999999999", 0, LONG_MAX, ERROR);
+
+    /* Check a few other bases */
+    CheckStrToL ("aBcD", 36, 481261L, OK);
+    CheckStrToL ("zyaB", 35, 0L, ERROR);
+    CheckStrToL ("zyaB", 36, 1677395L, ERROR);
+
+    printf ("Failures: %u\n", Failures);
+
+    return Failures;
+}
diff --git a/test/val/lib_common_strrchr.c b/test/val/lib_common_strrchr.c
new file mode 100644 (file)
index 0000000..a72c44d
--- /dev/null
@@ -0,0 +1,38 @@
+#include <string.h>
+#include "unittest.h"
+                                                    
+static char TestString[] = "01234567890123456789";  // two times the same string
+static char Found[256];
+
+TEST
+{
+    unsigned len;
+    unsigned i;
+    char*    p;
+
+    len = strlen(TestString)/2; // test only one half of the string, to find last appearance
+
+    /* Search for all characters in the string, including the terminator */
+    for (i = 0; i < len; ++i)
+    {
+        /* Search for this char */
+        p = strrchr (TestString, TestString[i]);
+        ASSERT_AreEqual(i+len, p-TestString, "%u", "Unexpected location of character '%c' found!" COMMA TestString[i]);
+
+        /* Mark the char as checked */
+        Found[TestString[i]] = 1;
+    }
+
+    /* Search for all other characters and make sure they aren't found */
+    for (i = 0; i < 256; ++i)
+    {
+        if (!Found[i])
+        {
+            p = strrchr (TestString, i);
+            ASSERT_IsFalse(p, "Unexpected location of character '%c' found!" COMMA TestString[i]);
+        }
+    }
+}
+ENDTEST
+
+
diff --git a/test/val/lib_common_strspn.c b/test/val/lib_common_strspn.c
new file mode 100644 (file)
index 0000000..96a0064
--- /dev/null
@@ -0,0 +1,24 @@
+#include <string.h>
+#include "unittest.h"
+
+#define EstimatedStringSize 384                         // test correct page passing (>256)
+
+static char EstimatedString[EstimatedStringSize+1];     // +1 room for terminating null
+static char* EmptyTestChars="";                         // empty test case...
+static char* TestChars="1234567890";                    // we like to find numbers
+
+TEST
+{
+    unsigned i;
+    
+    for (i=0; i < EstimatedStringSize; ++i)
+      EstimatedString[i] = (i%10)+'0';                 // put 0123... into the string to be estimated
+
+    ASSERT_AreEqual(strlen(EstimatedString), strspn(EstimatedString, TestChars), "%u", "Unxpected position returned for all participant case!");
+
+    EstimatedString[EstimatedStringSize/2] = 'X';
+    ASSERT_AreEqual(EstimatedStringSize/2, strspn(EstimatedString, TestChars), "%u", "Unxpected position returned for breaking case!");
+
+    ASSERT_AreEqual(0, strspn(EstimatedString, EmptyTestChars), "%u", "Unxpected position returned for empty test case!");
+}
+ENDTEST
diff --git a/test/val/lib_common_strtoul.c b/test/val/lib_common_strtoul.c
new file mode 100644 (file)
index 0000000..803fd45
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+  !!DESCRIPTION!! A small test for strtuol. Assumes twos complement
+  !!ORIGIN!!
+  !!LICENCE!!
+  !!AUTHOR!!
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <errno.h>
+
+#define ERROR   0
+#define OK      1
+
+static unsigned int Failures = 0;
+
+static void IncStr (char* Buf)
+/* Increment a number represented as a string by one. The string MUST not
+ * start with a '9', we cannot handle overflow in this case.
+ */
+{
+    int Len = strlen (Buf);
+
+    while (--Len >= 0) {
+        switch (Buf[Len]) {
+            case '9':
+                Buf[Len] = '0';
+                break;
+
+            default:
+                ++(Buf[Len]);
+                return;
+        }
+    }
+}
+
+static void CheckStrToUL (const char* Str, int Base, unsigned long Val, unsigned char Ok)
+{
+    char* EndPtr;
+    unsigned long Res = strtoul (Str, &EndPtr, Base);
+    if (Ok) {
+        if (Res != Val) {
+            printf ("strtol error in \"%s\":\n"
+                    "  result = %lu, should be %lu, chars = %d\n",
+                    Str, Res, Val, EndPtr - Str);
+            ++Failures;
+        }
+    } else {
+        if (errno != ERANGE) {
+            printf ("strtol error in \"%s\":\n"
+                    "  should not convert, but errno = %d\n",
+                    Str, errno);
+            ++Failures;
+        }
+        if (Res != Val) {
+            printf ("strtol error in \"%s\":\n"
+                    "  result = %lu, should be %lu, chars = %d\n",
+                    Str, Res, Val, EndPtr - Str);
+            ++Failures;
+        }
+    }
+}
+
+int main (void)
+{
+    char Buf[80];
+
+    /* Prefixed allowed if base = 0 */
+    CheckStrToUL ("\t 0x10G ", 0, 16UL, OK);
+    CheckStrToUL ("\t 0X10G ", 0, 16UL, OK);
+    CheckStrToUL (" \t0377\t", 0, 255UL, OK);
+    CheckStrToUL (" 377", 0, 377UL, OK);
+
+    CheckStrToUL ("\t -0x10G ", 0, (unsigned long) -16L, OK);
+    CheckStrToUL ("\t -0X10G ", 0, (unsigned long) -16L, OK);
+    CheckStrToUL (" \t-0377\t", 0, (unsigned long) -255L, OK);
+    CheckStrToUL (" -377", 0, (unsigned long) -377L, OK);
+
+    /* No prefixes if base = 10 */
+    CheckStrToUL ("\t 1234 ", 10, 1234UL, OK);
+    CheckStrToUL ("\t -1234 ", 10, (unsigned long) -1234L, OK);
+    CheckStrToUL ("\t -0x10G ", 10, 0UL, OK);
+    CheckStrToUL ("\t -0X10G ", 10, 0UL, OK);
+    CheckStrToUL (" \t-0377\t", 10, (unsigned long) -377L, OK);
+    CheckStrToUL (" 0377", 10, 377UL, OK);
+
+    /* 0x prefix is allowed if base = 16 */
+    CheckStrToUL ("\t 0x1234 ", 16, 0x1234UL, OK);
+    CheckStrToUL ("\t -0x1234 ", 16, (unsigned long) -0x1234L, OK);
+    CheckStrToUL ("\t -010G ", 16, (unsigned long) -16L, OK);
+    CheckStrToUL ("\t 10G ", 16, 16UL, OK);
+
+    /* Check ULONG_MAX */
+    sprintf (Buf, "%lu", ULONG_MAX);
+    CheckStrToUL (Buf, 0, ULONG_MAX, OK);
+
+    /* Check value one larger */
+    sprintf (Buf+1, "%lu", ULONG_MAX);
+    Buf[0] = '0';
+    IncStr (Buf);
+    if (Buf[0] == '0') {
+        Buf[0] = ' ';
+    }
+    CheckStrToUL (Buf, 0, ULONG_MAX, ERROR);
+
+    /* Check numbers that are much too large or small */
+    CheckStrToUL ("-999999999999999999999999999999999999999999999999999999999", 0, ULONG_MAX, ERROR);
+    CheckStrToUL ("+999999999999999999999999999999999999999999999999999999999", 0, ULONG_MAX, ERROR);
+    CheckStrToUL (" 999999999999999999999999999999999999999999999999999999999", 0, ULONG_MAX, ERROR);
+
+    /* Check a few other bases */
+    CheckStrToUL ("aBcD", 36, 481261UL, OK);
+    CheckStrToUL ("zyaB", 35, 0UL, ERROR);
+    CheckStrToUL ("zyaB", 36, 1677395UL, ERROR);
+
+    printf ("Failures: %u\n", Failures);
+
+    return Failures;
+}
diff --git a/test/val/strtol-test.c b/test/val/strtol-test.c
deleted file mode 100644 (file)
index 76daef7..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
-  !!DESCRIPTION!! A small test for atoi/strtol. Assumes twos complement
-  !!ORIGIN!!
-  !!LICENCE!!
-  !!AUTHOR!!
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <errno.h>
-
-#define ERROR   0
-#define OK      1
-
-static unsigned int Failures = 0;
-
-static void IncStr (char* Buf)
-/* Increment a number represented as a string by one. The string MUST not
- * start with a '9', we cannot handle overflow in this case.
- */
-{
-    int Len = strlen (Buf);
-
-    while (--Len >= 0) {
-        switch (Buf[Len]) {
-            case '9':
-                Buf[Len] = '0';
-                break;
-
-            default:
-                ++(Buf[Len]);
-                return;
-        }
-    }
-}
-
-static void CheckStrToL (const char* Str, int Base, long Val, unsigned char Ok)
-{
-    char* EndPtr;
-    long Res = strtol (Str, &EndPtr, Base);
-    if (Ok) {
-        if (Res != Val) {
-            printf ("strtol error in \"%s\":\n"
-                    "  result = %ld, should be %ld, chars = %d\n",
-                    Str, Res, Val, EndPtr - Str);
-            ++Failures;
-        }
-    } else {
-        if (errno != ERANGE) {
-            printf ("strtol error in \"%s\":\n"
-                    "  should not convert, but errno = %d\n",
-                    Str, errno);
-            ++Failures;
-        }
-        if (Res != Val) {
-            printf ("strtol error in \"%s\":\n"
-                    "  result = %ld, should be %ld, chars = %d\n",
-                    Str, Res, Val, EndPtr - Str);
-            ++Failures;
-        }
-    }
-}
-
-int main (void)
-{
-    char Buf[80];
-
-    /* Prefixed allowed if base = 0 */
-    CheckStrToL ("\t 0x10G ", 0, 16L, OK);
-    CheckStrToL ("\t 0X10G ", 0, 16L, OK);
-    CheckStrToL (" \t0377\t", 0, 255L, OK);
-    CheckStrToL (" 377", 0, 377L, OK);
-
-    CheckStrToL ("\t -0x10G ", 0, -16L, OK);
-    CheckStrToL ("\t -0X10G ", 0, -16L, OK);
-    CheckStrToL (" \t-0377\t", 0, -255L, OK);
-    CheckStrToL (" -377", 0, -377L, OK);
-
-    /* No prefixes if base = 10 */
-    CheckStrToL ("\t 1234 ", 10, 1234L, OK);
-    CheckStrToL ("\t -1234 ", 10, -1234L, OK);
-    CheckStrToL ("\t -0x10G ", 10, 0L, OK);
-    CheckStrToL ("\t -0X10G ", 10, 0L, OK);
-    CheckStrToL (" \t-0377\t", 10, -377L, OK);
-    CheckStrToL (" 0377", 10, 377L, OK);
-
-    /* 0x prefix is allowed if base = 16 */
-    CheckStrToL ("\t 0x1234 ", 16, 0x1234L, OK);
-    CheckStrToL ("\t -0x1234 ", 16, -0x1234L, OK);
-    CheckStrToL ("\t -010G ", 16, -16L, OK);
-    CheckStrToL ("\t 10G ", 16, 16L, OK);
-
-    /* Check LONG_MIN and LONG_MAX */
-    sprintf (Buf, "%ld", LONG_MIN);
-    CheckStrToL (Buf, 0, LONG_MIN, OK);
-    sprintf (Buf, "%ld", LONG_MAX);
-    CheckStrToL (Buf, 0, LONG_MAX, OK);
-
-    /* Check value one smaller */
-    sprintf (Buf+1, "%ld", LONG_MIN);
-    Buf[1] = '0';       /* Overwrite '-' */
-    IncStr (Buf+1);
-    if (Buf[1] == '0') {
-        Buf[1] = '-';
-        Buf[0] = ' ';
-    } else {
-        Buf[0] = '-';
-    }
-    CheckStrToL (Buf, 0, LONG_MIN, ERROR);
-
-    /* Check value one larger */
-    sprintf (Buf+1, "%ld", LONG_MAX);
-    Buf[0] = '0';
-    IncStr (Buf);
-    if (Buf[0] == '0') {
-        Buf[0] = ' ';
-    }
-    CheckStrToL (Buf, 0, LONG_MAX, ERROR);
-
-    /* Check numbers that are much too large or small */
-    CheckStrToL ("-999999999999999999999999999999999999999999999999999999999", 0, LONG_MIN, ERROR);
-    CheckStrToL ("+999999999999999999999999999999999999999999999999999999999", 0, LONG_MAX, ERROR);
-    CheckStrToL (" 999999999999999999999999999999999999999999999999999999999", 0, LONG_MAX, ERROR);
-
-    /* Check a few other bases */
-    CheckStrToL ("aBcD", 36, 481261L, OK);
-    CheckStrToL ("zyaB", 35, 0L, ERROR);
-    CheckStrToL ("zyaB", 36, 1677395L, ERROR);
-
-    printf ("Failures: %u\n", Failures);
-
-    return Failures;
-}
diff --git a/test/val/strtoul-test.c b/test/val/strtoul-test.c
deleted file mode 100644 (file)
index 803fd45..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
-  !!DESCRIPTION!! A small test for strtuol. Assumes twos complement
-  !!ORIGIN!!
-  !!LICENCE!!
-  !!AUTHOR!!
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <errno.h>
-
-#define ERROR   0
-#define OK      1
-
-static unsigned int Failures = 0;
-
-static void IncStr (char* Buf)
-/* Increment a number represented as a string by one. The string MUST not
- * start with a '9', we cannot handle overflow in this case.
- */
-{
-    int Len = strlen (Buf);
-
-    while (--Len >= 0) {
-        switch (Buf[Len]) {
-            case '9':
-                Buf[Len] = '0';
-                break;
-
-            default:
-                ++(Buf[Len]);
-                return;
-        }
-    }
-}
-
-static void CheckStrToUL (const char* Str, int Base, unsigned long Val, unsigned char Ok)
-{
-    char* EndPtr;
-    unsigned long Res = strtoul (Str, &EndPtr, Base);
-    if (Ok) {
-        if (Res != Val) {
-            printf ("strtol error in \"%s\":\n"
-                    "  result = %lu, should be %lu, chars = %d\n",
-                    Str, Res, Val, EndPtr - Str);
-            ++Failures;
-        }
-    } else {
-        if (errno != ERANGE) {
-            printf ("strtol error in \"%s\":\n"
-                    "  should not convert, but errno = %d\n",
-                    Str, errno);
-            ++Failures;
-        }
-        if (Res != Val) {
-            printf ("strtol error in \"%s\":\n"
-                    "  result = %lu, should be %lu, chars = %d\n",
-                    Str, Res, Val, EndPtr - Str);
-            ++Failures;
-        }
-    }
-}
-
-int main (void)
-{
-    char Buf[80];
-
-    /* Prefixed allowed if base = 0 */
-    CheckStrToUL ("\t 0x10G ", 0, 16UL, OK);
-    CheckStrToUL ("\t 0X10G ", 0, 16UL, OK);
-    CheckStrToUL (" \t0377\t", 0, 255UL, OK);
-    CheckStrToUL (" 377", 0, 377UL, OK);
-
-    CheckStrToUL ("\t -0x10G ", 0, (unsigned long) -16L, OK);
-    CheckStrToUL ("\t -0X10G ", 0, (unsigned long) -16L, OK);
-    CheckStrToUL (" \t-0377\t", 0, (unsigned long) -255L, OK);
-    CheckStrToUL (" -377", 0, (unsigned long) -377L, OK);
-
-    /* No prefixes if base = 10 */
-    CheckStrToUL ("\t 1234 ", 10, 1234UL, OK);
-    CheckStrToUL ("\t -1234 ", 10, (unsigned long) -1234L, OK);
-    CheckStrToUL ("\t -0x10G ", 10, 0UL, OK);
-    CheckStrToUL ("\t -0X10G ", 10, 0UL, OK);
-    CheckStrToUL (" \t-0377\t", 10, (unsigned long) -377L, OK);
-    CheckStrToUL (" 0377", 10, 377UL, OK);
-
-    /* 0x prefix is allowed if base = 16 */
-    CheckStrToUL ("\t 0x1234 ", 16, 0x1234UL, OK);
-    CheckStrToUL ("\t -0x1234 ", 16, (unsigned long) -0x1234L, OK);
-    CheckStrToUL ("\t -010G ", 16, (unsigned long) -16L, OK);
-    CheckStrToUL ("\t 10G ", 16, 16UL, OK);
-
-    /* Check ULONG_MAX */
-    sprintf (Buf, "%lu", ULONG_MAX);
-    CheckStrToUL (Buf, 0, ULONG_MAX, OK);
-
-    /* Check value one larger */
-    sprintf (Buf+1, "%lu", ULONG_MAX);
-    Buf[0] = '0';
-    IncStr (Buf);
-    if (Buf[0] == '0') {
-        Buf[0] = ' ';
-    }
-    CheckStrToUL (Buf, 0, ULONG_MAX, ERROR);
-
-    /* Check numbers that are much too large or small */
-    CheckStrToUL ("-999999999999999999999999999999999999999999999999999999999", 0, ULONG_MAX, ERROR);
-    CheckStrToUL ("+999999999999999999999999999999999999999999999999999999999", 0, ULONG_MAX, ERROR);
-    CheckStrToUL (" 999999999999999999999999999999999999999999999999999999999", 0, ULONG_MAX, ERROR);
-
-    /* Check a few other bases */
-    CheckStrToUL ("aBcD", 36, 481261UL, OK);
-    CheckStrToUL ("zyaB", 35, 0UL, ERROR);
-    CheckStrToUL ("zyaB", 36, 1677395UL, ERROR);
-
-    printf ("Failures: %u\n", Failures);
-
-    return Failures;
-}
diff --git a/test/val/unittest.h b/test/val/unittest.h
new file mode 100644 (file)
index 0000000..bd355bb
--- /dev/null
@@ -0,0 +1,89 @@
+/*****************************************************************************/
+/*                                                                           */
+/*                               unittest.h                                  */
+/*                                                                           */
+/*                        Unit test helper macros                            */
+/*                                                                           */
+/*                                                                           */
+/*                                                                           */
+/* (C) 2017 Christian Krueger                                                */
+/*                                                                           */
+/* This software is provided 'as-is', without any expressed or implied       */
+/* warranty.  In no event will the authors be held liable for any damages    */
+/* arising from the use of this software.                                    */
+/*                                                                           */
+/* Permission is granted to anyone to use this software for any purpose,     */
+/* including commercial applications, and to alter it and redistribute it    */
+/* freely, subject to the following restrictions:                            */
+/*                                                                           */
+/* 1. The origin of this software must not be misrepresented; you must not   */
+/*    claim that you wrote the original software. If you use this software   */
+/*    in a product, an acknowledgment in the product documentation would be  */
+/*    appreciated but is not required.                                       */
+/* 2. Altered source versions must be plainly marked as such, and must not   */
+/*    be misrepresented as being the original software.                      */
+/* 3. This notice may not be removed or altered from any source              */
+/*    distribution.                                                          */
+/*                                                                           */
+/*****************************************************************************/
+
+#ifndef _UNITTEST_H
+#define _UNITTEST_H
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifndef COMMA
+#define COMMA ,
+#endif
+
+#define TEST    int main(void) \
+                {\
+                    printf("%s: ",__FILE__);
+
+#define ENDTEST     printf("Passed\n"); \
+                    return EXIT_SUCCESS; \
+                }
+
+#define ASSERT_IsTrue(a,b)                  if (!(a)) \
+                                            {\
+                                                printf("Fail at line %d:\n",__LINE__);\
+                                                printf(b);\
+                                                printf("\n");\
+                                                printf("Expected status should be true but wasn't!\n");\
+                                                exit(EXIT_FAILURE);\
+                                            }
+
+#define ASSERT_IsFalse(a,b)                 if ((a)) \
+                                            {\
+                                                printf("Fail at line %d:\n",__LINE__);\
+                                                printf(b);\
+                                                printf("\n");\
+                                                printf("Expected status should be false but wasn't!\n");\
+                                                exit(EXIT_FAILURE);\
+                                            }
+
+#define ASSERT_AreEqual(a,b,c,d)            if ((a) != (b)) \
+                                            {\
+                                                printf("Fail at line %d:\n",__LINE__);\
+                                                printf(d);\
+                                                printf("\n");\
+                                                printf("Expected value: "c", but is "c"!\n", (a), (b));\
+                                                exit(EXIT_FAILURE);\
+                                            }
+
+#define ASSERT_AreNotEqual(a,b,c,d)         if ((a) == (b)) \
+                                            {\
+                                                printf("Fail at line %d:\n",__LINE__);\
+                                                printf(d);\
+                                                printf("\n");\
+                                                printf("Expected value not: "c", but is "c"!\n", (a), (b));\
+                                                exit(EXIT_FAILURE);\
+                                            }
+
+/* End of unittest.h */
+#endif
+
+
+
+
diff --git a/testcode/lib/strcat-test.c b/testcode/lib/strcat-test.c
deleted file mode 100644 (file)
index 58119e2..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#include <string.h>
-#include "unittest.h"
-
-#define SourceStringSize 257                            // test correct page passing (>256)
-
-static char SourceString[SourceStringSize+1];           // +1 room for terminating null
-static char DestinationString[2*SourceStringSize+1];    // will contain two times the source buffer
-
-
-TEST
-{
-    unsigned i,j;
-    char*    p;
-    
-    for (i=0; i < SourceStringSize; ++i)
-      SourceString[i] = (i%128)+1;
-
-    SourceString[i] = 0;
-
-    ASSERT_AreEqual(SourceStringSize, strlen(SourceString), "%u", "Source string initialization or 'strlen()' problem!");
-
-    /* Ensure empty destination string */
-    DestinationString[0] = 0;
-
-    ASSERT_AreEqual(0, strlen(DestinationString), "%u", "Destination string initialization or 'strlen()' problem!");
-    
-    /* Test concatenation to empty buffer */
-
-    strcat(DestinationString, SourceString);
-    
-    ASSERT_AreEqual(SourceStringSize, strlen(DestinationString), "%u", "Unexpected string length while string concatenation to empty buffer!");
-    
-    /* Test concatenation to non empty buffer */
-
-    p = strcat(DestinationString, SourceString);
-
-    ASSERT_AreEqual(2*SourceStringSize, strlen(DestinationString), "%u", "Unexpected string length while string concatenation to non-empty buffer!");
-
-    /* Test return value */
-
-    ASSERT_IsTrue(p == DestinationString,"Invalid return value!");
-
-    /* Test contents */
-
-    for(j=0; j <2; ++j)
-        for(i=0; i < SourceStringSize; ++i)
-        {
-            unsigned position = j*SourceStringSize+i;
-            unsigned current = DestinationString[position];
-            unsigned expected = (i%128)+1;
-            ASSERT_AreEqual(expected, current, "%u", "Unexpected destination buffer contents at position %u!\n" COMMA position);
-        }
-}
-ENDTEST
-
-
diff --git a/testcode/lib/strchr-test.c b/testcode/lib/strchr-test.c
deleted file mode 100644 (file)
index 7aba1de..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-                                                        
-/* Test string. Must NOT have duplicate characters! */
-static char S[] = "Helo wrd!\n";
-
-static char Found[256];
-
-
-
-int main (void)
-{
-    unsigned Len;
-    unsigned I;
-    char*    P;
-
-    /* Print a header */
-    printf ("strchr(): ");
-
-    /* Get the length of the string */
-    Len = strlen (S);
-
-    /* Search for all characters in the string, including the terminator */
-    for (I = 0; I < Len+1; ++I) {
-
-        /* Search for this char */
-        P = strchr (S, S[I]);
-
-        /* Check if we found it */
-        if (P == 0 || (P - S) != I) {
-            printf ("Failed for code 0x%02X, offset %u!\n", S[I], I);
-            printf ("P = %04X offset = %04X\n", P, P-S);
-            exit (EXIT_FAILURE);
-        }
-
-        /* Mark the char as checked */
-        Found[S[I]] = 1;
-    }
-
-    /* Search for all other characters and make sure they aren't found */
-    for (I = 0; I < 256; ++I) {
-        if (Found[I] == 0) {
-            if (strchr (S, (char)I) != 0) {
-                printf ("Failed for code 0x%02X\n", I);
-                exit (EXIT_FAILURE);
-            }
-        }
-    }
-
-    /* Test passed */
-    printf ("Passed\n");
-    return EXIT_SUCCESS;
-}
-
-
-
diff --git a/testcode/lib/strrchr-test.c b/testcode/lib/strrchr-test.c
deleted file mode 100644 (file)
index a72c44d..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#include <string.h>
-#include "unittest.h"
-                                                    
-static char TestString[] = "01234567890123456789";  // two times the same string
-static char Found[256];
-
-TEST
-{
-    unsigned len;
-    unsigned i;
-    char*    p;
-
-    len = strlen(TestString)/2; // test only one half of the string, to find last appearance
-
-    /* Search for all characters in the string, including the terminator */
-    for (i = 0; i < len; ++i)
-    {
-        /* Search for this char */
-        p = strrchr (TestString, TestString[i]);
-        ASSERT_AreEqual(i+len, p-TestString, "%u", "Unexpected location of character '%c' found!" COMMA TestString[i]);
-
-        /* Mark the char as checked */
-        Found[TestString[i]] = 1;
-    }
-
-    /* Search for all other characters and make sure they aren't found */
-    for (i = 0; i < 256; ++i)
-    {
-        if (!Found[i])
-        {
-            p = strrchr (TestString, i);
-            ASSERT_IsFalse(p, "Unexpected location of character '%c' found!" COMMA TestString[i]);
-        }
-    }
-}
-ENDTEST
-
-
diff --git a/testcode/lib/unittest.h b/testcode/lib/unittest.h
deleted file mode 100644 (file)
index bd355bb..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/*****************************************************************************/
-/*                                                                           */
-/*                               unittest.h                                  */
-/*                                                                           */
-/*                        Unit test helper macros                            */
-/*                                                                           */
-/*                                                                           */
-/*                                                                           */
-/* (C) 2017 Christian Krueger                                                */
-/*                                                                           */
-/* This software is provided 'as-is', without any expressed or implied       */
-/* warranty.  In no event will the authors be held liable for any damages    */
-/* arising from the use of this software.                                    */
-/*                                                                           */
-/* Permission is granted to anyone to use this software for any purpose,     */
-/* including commercial applications, and to alter it and redistribute it    */
-/* freely, subject to the following restrictions:                            */
-/*                                                                           */
-/* 1. The origin of this software must not be misrepresented; you must not   */
-/*    claim that you wrote the original software. If you use this software   */
-/*    in a product, an acknowledgment in the product documentation would be  */
-/*    appreciated but is not required.                                       */
-/* 2. Altered source versions must be plainly marked as such, and must not   */
-/*    be misrepresented as being the original software.                      */
-/* 3. This notice may not be removed or altered from any source              */
-/*    distribution.                                                          */
-/*                                                                           */
-/*****************************************************************************/
-
-#ifndef _UNITTEST_H
-#define _UNITTEST_H
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#ifndef COMMA
-#define COMMA ,
-#endif
-
-#define TEST    int main(void) \
-                {\
-                    printf("%s: ",__FILE__);
-
-#define ENDTEST     printf("Passed\n"); \
-                    return EXIT_SUCCESS; \
-                }
-
-#define ASSERT_IsTrue(a,b)                  if (!(a)) \
-                                            {\
-                                                printf("Fail at line %d:\n",__LINE__);\
-                                                printf(b);\
-                                                printf("\n");\
-                                                printf("Expected status should be true but wasn't!\n");\
-                                                exit(EXIT_FAILURE);\
-                                            }
-
-#define ASSERT_IsFalse(a,b)                 if ((a)) \
-                                            {\
-                                                printf("Fail at line %d:\n",__LINE__);\
-                                                printf(b);\
-                                                printf("\n");\
-                                                printf("Expected status should be false but wasn't!\n");\
-                                                exit(EXIT_FAILURE);\
-                                            }
-
-#define ASSERT_AreEqual(a,b,c,d)            if ((a) != (b)) \
-                                            {\
-                                                printf("Fail at line %d:\n",__LINE__);\
-                                                printf(d);\
-                                                printf("\n");\
-                                                printf("Expected value: "c", but is "c"!\n", (a), (b));\
-                                                exit(EXIT_FAILURE);\
-                                            }
-
-#define ASSERT_AreNotEqual(a,b,c,d)         if ((a) == (b)) \
-                                            {\
-                                                printf("Fail at line %d:\n",__LINE__);\
-                                                printf(d);\
-                                                printf("\n");\
-                                                printf("Expected value not: "c", but is "c"!\n", (a), (b));\
-                                                exit(EXIT_FAILURE);\
-                                            }
-
-/* End of unittest.h */
-#endif
-
-
-
-