** 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
+ /* 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
/**************************************************************\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
- char *s;\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
- *s++ = *CString++;\r
+ if( *CString == 0 )\r
+ {\r
+ break;\r
+ }\r
+ dst[i] = *CString++;\r
}\r
- *dst = (char ) i;\r
+ *dst = (char ) i-1;\r
return dst;\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