Add support for WATCOMC
[pforth] / csrc / pf_text.c
index 9530546..6d36e2c 100644 (file)
@@ -135,11 +135,16 @@ void pfReportThrow( ThrowCode code )
 ** Copy a Forth String to a 'C' string.\r
 */\r
 \r
 ** Copy a Forth String to a 'C' string.\r
 */\r
 \r
-char *ForthStringToC( char *dst, const char *FString )\r
+char *ForthStringToC( char *dst, const char *FString, cell_t dstSize )\r
 {\r
        cell_t Len;\r
 \r
        Len = (cell_t) *FString;\r
 {\r
        cell_t Len;\r
 \r
        Len = (cell_t) *FString;\r
+       /* Make sure the text + NUL can fit. */\r
+       if( Len >= dstSize )\r
+       {\r
+               Len = dstSize - 1;\r
+       }\r
        pfCopyMemory( dst, FString+1, Len );\r
        dst[Len] = '\0';\r
 \r
        pfCopyMemory( dst, FString+1, Len );\r
        dst[Len] = '\0';\r
 \r
@@ -149,17 +154,20 @@ char *ForthStringToC( char *dst, const char *FString )
 /**************************************************************\r
 ** Copy a NUL terminated string to a Forth counted string.\r
 */\r
 /**************************************************************\r
 ** Copy a NUL terminated string to a Forth counted string.\r
 */\r
-char *CStringToForth( char *dst, const char *CString )\r
+char *CStringToForth( char *dst, const char *CString, cell_t dstSize )\r
 {\r
 {\r
-       char *s;\r
        cell_t i;\r
 \r
        cell_t i;\r
 \r
-       s = dst+1;\r
-       for( i=0; *CString; i++ )\r
+       /* Make sure the SIZE+text can fit. */\r
+       for( i=1; i<dstSize; i++ )\r
        {\r
        {\r
-               *s++ = *CString++;\r
+               if( *CString == 0 )\r
+               {\r
+                       break;\r
+               }\r
+               dst[i] = *CString++;\r
        }\r
        }\r
-       *dst = (char ) i;\r
+       *dst = (char ) i-1;\r
        return dst;\r
 }\r
 \r
        return dst;\r
 }\r
 \r
@@ -335,3 +343,65 @@ void TypeName( const char *Name )
 }\r
 \r
 \r
 }\r
 \r
 \r
+\r
+#ifdef PF_UNIT_TEST\r
+/* Unit test for string conversion routines. */\r
+#define ASSERT_PAD_IS( index, value, msg ) \\r
+       if( pad[index] != ((char)(value)) ) \\r
+       { \\r
+               ERR(( "ERROR text test failed: " msg "\n")); \\r
+               numErrors += 1; \\r
+       } \\r
+\r
+cell_t pfUnitTestText( void )\r
+{\r
+       cell_t numErrors = 0;\r
+       char pad[16];\r
+       char fpad[8];\r
+\r
+       /* test CStringToForth */\r
+       pfSetMemory(pad,0xA5,sizeof(pad));\r
+       CStringToForth( pad, "frog", 6 );\r
+       ASSERT_PAD_IS( 0, 4, "CS len 6" );\r
+       ASSERT_PAD_IS( 4, 'g', "CS end 6" );\r
+       ASSERT_PAD_IS( 5, 0xA5, "CS past 6" );\r
+       \r
+       pfSetMemory(pad,0xA5,sizeof(pad));\r
+       CStringToForth( pad, "frog", 5 );\r
+       ASSERT_PAD_IS( 0, 4, "CS len 5" );\r
+       ASSERT_PAD_IS( 4, 'g', "CS end 5" );\r
+       ASSERT_PAD_IS( 5, 0xA5, "CS past 5" );\r
+       \r
+       pfSetMemory(pad,0xA5,sizeof(pad));\r
+       CStringxxxxxToForth( pad, "frog", 4 );\r
+       ASSERT_PAD_IS( 0, 3, "CS len 4" );\r
+       ASSERT_PAD_IS( 3, 'o', "CS end 4" );\r
+       ASSERT_PAD_IS( 4, 0xA5, "CS past 4" );\r
+       \r
+       /* Make a Forth string for testing ForthStringToC. */\r
+       CStringToForth( fpad, "frog", sizeof(fpad) );\r
+       \r
+       pfSetMemory(pad,0xA5,sizeof(pad));\r
+       ForthStringToC( pad, fpad, 6 );\r
+       ASSERT_PAD_IS( 0, 'f', "FS len 6" );\r
+       ASSERT_PAD_IS( 3, 'g', "FS end 6" );\r
+       ASSERT_PAD_IS( 4, 0, "FS nul 6" );\r
+       ASSERT_PAD_IS( 5, 0xA5, "FS past 6" );\r
+       \r
+       pfSetMemory(pad,0xA5,sizeof(pad));\r
+       ForthStringToC( pad, fpad, 5 );\r
+       ASSERT_PAD_IS( 0, 'f', "FS len 5" );\r
+       ASSERT_PAD_IS( 3, 'g', "FS end 5" );\r
+       ASSERT_PAD_IS( 4, 0, "FS nul 5" );\r
+       ASSERT_PAD_IS( 5, 0xA5, "FS past 5" );\r
+       \r
+       pfSetMemory(pad,0xA5,sizeof(pad));\r
+       ForthStringToC( pad, fpad, 4 );\r
+       ASSERT_PAD_IS( 0, 'f', "FS len 4" );\r
+       ASSERT_PAD_IS( 2, 'o', "FS end 4" );\r
+       ASSERT_PAD_IS( 3, 0, "FS nul 4" );\r
+       ASSERT_PAD_IS( 4, 0xA5, "FS past 4" );\r
+       \r
+       return numErrors;\r
+}\r
+#endif\r