⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regression.c

📁 一个C语言写的快速贝叶斯垃圾邮件过滤工具
💻 C
📖 第 1 页 / 共 3 页
字号:
/************************************************************************* * Regression test */#include "triodef.h"#if defined(TRIO_COMPILER_ANCIENT)# include <varargs.h>#else# include <stdarg.h>#endif#include <math.h>#include <limits.h>#include <float.h>#include <errno.h>#include "trio.h"#include "triop.h"#if defined(TRIO_EMBED_NAN)# define TRIO_PUBLIC_NAN static# define TRIO_FUNC_NINF# define TRIO_FUNC_PINF# define TRIO_FUNC_NAN# define TRIO_FUNC_ISINF# define TRIO_FUNC_ISNAN# if TRIO_FEATURE_FLOAT#  define TRIO_FUNC_NZERO# endif#endif#include "trionan.h"#if defined(TRIO_EMBED_STRING)# define TRIO_PUBLIC_STRING static# define TRIO_FUNC_EQUAL_CASE#endif#include "triostr.h"#undef printf#if TRIO_FEATURE_WIDECHAR# include <wchar.h>#endif#define QUOTE(x) #x#define DOUBLE_EQUAL(x,y) (((x)>(y)-DBL_EPSILON) && ((x)<(y)+DBL_EPSILON))#define FLOAT_EQUAL(x,y) (((x)>(y)-FLT_EPSILON) && ((x)<(y)+FLT_EPSILON))static TRIO_CONST char rcsid[] = "@(#)$Id: regression.c,v 1.54 2005/12/25 11:06:57 breese Exp $";#if defined(TRIO_EMBED_NAN)# include "trionan.c"#endif#if defined(TRIO_EMBED_STRING)# include "triostr.c"#endif/************************************************************************* * */static voidDumpTRIO_ARGS2((buffer, rc),	   char *buffer,	   int rc){  if (rc < 0)    {      printf("Err = %d (%s), Pos = %d\n",	     TRIO_ERROR_CODE(rc),	     TRIO_ERROR_NAME(rc),	     TRIO_ERROR_POSITION(rc));    }  else if (buffer)    printf("buffer[% 3d] = \"%s\"\n", rc, buffer);}/************************************************************************* * */static voidReport0TRIO_ARGS2((file, line),          TRIO_CONST char *file,          int line){  printf("Verification failed in %s:%d.\n", file, line);}/************************************************************************* * */static voidReportTRIO_ARGS4((file, line, expected, got),	   TRIO_CONST char *file,	   int line,	   TRIO_CONST char *expected,	   TRIO_CONST char *got){  Report0(file, line);  printf("  Expected \"%s\"\n", expected);  printf("  Got      \"%s\"\n", got);}/************************************************************************* * */intVerifyTRIO_VARGS5((file, line, result, fmt, va_alist),	    TRIO_CONST char *file,	    int line,	    TRIO_CONST char *result,	    TRIO_CONST char *fmt,	    TRIO_VA_DECL){  int rc;  va_list args;  char buffer[4096];  TRIO_VA_START(args, fmt);  rc = trio_vsnprintf(buffer, sizeof(buffer), fmt, args);  if (rc < 0)    Dump(buffer, rc);  TRIO_VA_END(args);  if (!trio_equal_case(result, buffer))    {      Report(file, line, result, buffer);      return 1;    }  return 0;}/************************************************************************* * */intVerifyReturnValues(TRIO_NOARGS){  int nerrors = 0;  int rc;  int count;  char *expected;  char buffer[4096];  char result[4096];  rc = trio_sprintf(buffer, "%s%n", "0123456789", &count);  trio_sprintf(result, "%d %d %s", rc, count, buffer);  expected = "10 10 0123456789";  if (!trio_equal_case(result, expected))    {      nerrors++;      Report(__FILE__, __LINE__, expected, result);    }    rc = trio_snprintf(buffer, sizeof(buffer), "%s%n", "0123456789", &count);  trio_sprintf(result, "%d %d %s", rc, count, buffer);  expected = "10 10 0123456789";  if (!trio_equal_case(result, expected))    {      nerrors++;      Report(__FILE__, __LINE__, expected, result);    }    rc = trio_snprintf(buffer, 4, "%s%n", "0123456789", &count);  trio_sprintf(result, "%d %d %s", rc, count, buffer);  expected = "10 3 012";  if (!trio_equal_case(result, expected))    {      nerrors++;      Report(__FILE__, __LINE__, expected, result);    }  /* The output buffer contains the empty string */  rc = trio_snprintf(buffer, 1, "%s%n", "0123456789", &count);  trio_sprintf(result, "%d %d %s", rc, count, buffer);  expected = "10 0 ";  if (!trio_equal_case(result, expected))    {      nerrors++;      Report(__FILE__, __LINE__, expected, result);    }  /* The output buffer should be left untouched when max size is 0 */  trio_sprintf(buffer, "DO NOT TOUCH");  rc = trio_snprintf(buffer, 0, "%s%n", "0123456789", &count);  trio_sprintf(result, "%d %d %s", rc, count, buffer);  expected = "10 0 DO NOT TOUCH";  if (!trio_equal_case(result, expected))    {      nerrors++;      Report(__FILE__, __LINE__, expected, result);    }    return nerrors;}/************************************************************************* * */#define TEST_STRING "0123456789"intVerifyAllocate(TRIO_NOARGS){  int nerrors = 0;#if TRIO_FEATURE_DYNAMICSTRING  int rc;  char *string;  int count;  int test_size = sizeof(TEST_STRING) - 1;  /* Allocate a string with the result */  rc = trio_asprintf(&string, "%s%n", TEST_STRING, &count);  if (rc < 0)    {      nerrors++;      Dump(string, rc);    }  else if (count != test_size)    {      nerrors++;      printf("Validation failed in %s:%d\n", __FILE__, __LINE__);      printf("  Expected %%n = %d\n", test_size);      printf("  Got      %%n = %d\n", count);    }  else if (!trio_equal_case(string, TEST_STRING))    {      nerrors++;      Report(__FILE__, __LINE__, TEST_STRING, string);    }  if (string)    free(string);#endif    return nerrors;}/************************************************************************* * */intVerifyFormatting(TRIO_NOARGS){  int nerrors = 0;  char buffer[256];  /* Normal text */  nerrors += Verify(__FILE__, __LINE__, "Hello world",		   "Hello world");  /* String */  nerrors += Verify(__FILE__, __LINE__, "Hello world",		   "%s", "Hello world");  /* Pointer */  if (sizeof(void *) == 4)    {      nerrors += Verify(__FILE__, __LINE__, "Pointer 0x01234567",			"Pointer %p", 0x1234567);    }  else if (sizeof(void *) == 8)    {      nerrors += Verify(__FILE__, __LINE__, "Pointer 0x0123456789012345",			"Pointer %p", 0x123456789012345);    }  /* Nil pointer */  nerrors += Verify(__FILE__, __LINE__, "Pointer (nil)",		   "Pointer %p", NULL);  /* Integer */  nerrors += Verify(__FILE__, __LINE__, "Number 42",		   "Number %d", 42);  nerrors += Verify(__FILE__, __LINE__, "Number -42",		   "Number %d", -42);  nerrors += Verify(__FILE__, __LINE__, "Number 42",		   "Number %ld", 42L);  nerrors += Verify(__FILE__, __LINE__, "Number -42",		   "Number %ld", -42L);  /* Integer width */  nerrors += Verify(__FILE__, __LINE__, "  1234",		    "%6d", 1234);  nerrors += Verify(__FILE__, __LINE__, "  1234",		    "%*d", 6, 1234);  /* Integer width overrun */  nerrors += Verify(__FILE__, __LINE__, "123456",		    "%4d", 123456);  /* Integer precision */  nerrors += Verify(__FILE__, __LINE__, "0012",		    "%.4d", 12);  nerrors += Verify(__FILE__, __LINE__, "0012",		    "%.*d", 4, 12);  nerrors += Verify(__FILE__, __LINE__, "  0012",		    "%6.*d", 4, 12);  nerrors += Verify(__FILE__, __LINE__, "  0012",		    "%*.*d", 6, 4, 12);  nerrors += Verify(__FILE__, __LINE__, "  0012",		    "%*.*.*d", 6, 4, 2, 12);  nerrors += Verify(__FILE__, __LINE__, "  0012",		    "%*.*.*i", 6, 4, 10, 12);  /* Integer sign, zero-padding, and width */  nerrors += Verify(__FILE__, __LINE__, "+01234",		    "%+06d", 1234);  nerrors += Verify(__FILE__, __LINE__, " 01234",		    "% 06d", 1234);  nerrors += Verify(__FILE__, __LINE__, "+01234",		    "% +06d", 1234);  /* Integer adjust, zero-padding, and width */  nerrors += Verify(__FILE__, __LINE__, "12      ",		    "%-08d", 12);  /* Integer zero-padding, width, and precision */  nerrors += Verify(__FILE__, __LINE__, "  000012",		    "%08.6d", 12);  /* Integer base */  nerrors += Verify(__FILE__, __LINE__, "42",		   "%u", 42);  nerrors += Verify(__FILE__, __LINE__, "-1",		   "%d", -1);  nerrors += Verify(__FILE__, __LINE__, "52",		   "%o", 42);  nerrors += Verify(__FILE__, __LINE__, "052",		   "%#o", 42);  nerrors += Verify(__FILE__, __LINE__, "0",		   "%#o", 0);  nerrors += Verify(__FILE__, __LINE__, "2a",		    "%x", 42);  nerrors += Verify(__FILE__, __LINE__, "2A",		    "%X", 42);  nerrors += Verify(__FILE__, __LINE__, "0x2a",		   "%#x", 42);  nerrors += Verify(__FILE__, __LINE__, "0X2A",		   "%#X", 42);  nerrors += Verify(__FILE__, __LINE__, "0x00c ",		   "%-#6.3x", 12);  nerrors += Verify(__FILE__, __LINE__, "",		   "%.d", 0);  nerrors += Verify(__FILE__, __LINE__, "",		   "%#.d", 0);  nerrors += Verify(__FILE__, __LINE__, "42",		   "%.d", 42);  nerrors += Verify(__FILE__, __LINE__, "",		   "%.o", 0);  nerrors += Verify(__FILE__, __LINE__, "    0000",		   "%8.4o", 0);  nerrors += Verify(__FILE__, __LINE__, "       0",		   "%8o", 0);  nerrors += Verify(__FILE__, __LINE__, "00000000",		   "%08o", 0);  nerrors += Verify(__FILE__, __LINE__, "0",		   "%#.o", 0);  nerrors += Verify(__FILE__, __LINE__, "52",		   "%.o", 42);  nerrors += Verify(__FILE__, __LINE__, "",		   "%.x", 0);  nerrors += Verify(__FILE__, __LINE__, "",		   "%#.x", 0);  nerrors += Verify(__FILE__, __LINE__, "2a",		   "%.x", 42);  sprintf(buffer, "%u", UINT_MAX);  nerrors += Verify(__FILE__, __LINE__, buffer,		   "%u", -1);  sprintf(buffer, "%x", UINT_MAX);  nerrors += Verify(__FILE__, __LINE__, buffer,		    "%x", -1);#if TRIO_FEATURE_FLOAT  /* Double */  nerrors += Verify(__FILE__, __LINE__, "3141.000000",		    "%f", 3141.0);  nerrors += Verify(__FILE__, __LINE__, "3141.500000",		    "%f", 3141.5);  nerrors += Verify(__FILE__, __LINE__, "3.141000e+03",		    "%e", 3141.0);  nerrors += Verify(__FILE__, __LINE__, "     -2.3420e-02",		    "%16.4e", -2.342E-02);  nerrors += Verify(__FILE__, __LINE__, "     -2.3420e-22",		    "%16.4e", -2.342E-22);  nerrors += Verify(__FILE__, __LINE__, "      2.3420e-02",		    "% 16.4e", 2.342E-02);  nerrors += Verify(__FILE__, __LINE__, " 2.3420e-02",		    "% 1.4e", 2.342E-02);  nerrors += Verify(__FILE__, __LINE__, "3.141000E-44",		    "%E", 3.141e-44);  nerrors += Verify(__FILE__, __LINE__, "0",		    "%g", 0.0);  nerrors += Verify(__FILE__, __LINE__, "-0",		    "%g", trio_nzero());  nerrors += Verify(__FILE__, __LINE__, "3141.5",		    "%g", 3141.5);  nerrors += Verify(__FILE__, __LINE__, "3.1415E-06",		    "%G", 3.1415e-6);  nerrors += Verify(__FILE__, __LINE__, "+3141.000000",		    "%+f", 3141.0);  nerrors += Verify(__FILE__, __LINE__, "-3141.000000",		    "%+f", -3141.0);  nerrors += Verify(__FILE__, __LINE__, "0.333333",		    "%f", 1.0/3.0);  nerrors += Verify(__FILE__, __LINE__, "0.666667",		    "%f", 2.0/3.0);  /* Beyond accuracy */  nerrors += Verify(__FILE__, __LINE__, "0.000000",		    "%f", 1.234567890123456789e-20);# if defined(TRIO_BREESE)  nerrors += Verify(__FILE__, __LINE__, "1.3999999999999999111821580299875",		    "%.32g", 1.4);  nerrors += Verify(__FILE__, __LINE__, "1.39999999999999991118215802998748",		    "%.32f", 1.4);  nerrors += Verify(__FILE__, __LINE__, "1.3999999999999999111821580300",		    "%.28f", 1.4);  nerrors += Verify(__FILE__, __LINE__, "1.399999999999999911182158",		    "%.24f", 1.4);  nerrors += Verify(__FILE__, __LINE__, "1.39999999999999991",		    "%.17f", 1.4);  nerrors += Verify(__FILE__, __LINE__, "1.40000000000000",		    "%.14f", 1.4);  nerrors += Verify(__FILE__, __LINE__, "39413.800000000002910383045673370361",		    "%.30f", 39413.80);# endif  /* 2^-1 + 2^-15 */  nerrors += Verify(__FILE__, __LINE__, "0.500030517578125",		    "%.*g", DBL_DIG + 10, 0.500030517578125);  /* Double decimal point */  nerrors += Verify(__FILE__, __LINE__, "3141",		    "%.0f", 3141.0);  nerrors += Verify(__FILE__, __LINE__, "3142",		    "%.0f", 3141.5);  nerrors += Verify(__FILE__, __LINE__, "3141",		    "%.f", 3141.0);  nerrors += Verify(__FILE__, __LINE__, "12",		    "%.f", 12.34);  nerrors += Verify(__FILE__, __LINE__, "3141.000",		    "%.3f", 3141.0);  nerrors += Verify(__FILE__, __LINE__, "3141.000000",		    "%#f", 3141.0);  nerrors += Verify(__FILE__, __LINE__, "0.0000",		    "%#.4f", 0.0);  nerrors += Verify(__FILE__, __LINE__, "0.000",		    "%#.4g", 0.0);  nerrors += Verify(__FILE__, __LINE__, "0.001000",		    "%#.4g", 1e-3);  nerrors += Verify(__FILE__, __LINE__, "3141.0000",		    "%#.4f", 3141.0);  nerrors += Verify(__FILE__, __LINE__, "3141.",		    "%#.0f", 3141.0);  nerrors += Verify(__FILE__, __LINE__, "3141.",		    "%#.f", 3141.0);  nerrors += Verify(__FILE__, __LINE__, "11.0000",		    "%#.4f", 11.0);  nerrors += Verify(__FILE__, __LINE__, "100.00",		    "%.2f", 99.9999);  nerrors += Verify(__FILE__, __LINE__, "3e+03",		    "%.e", 3141.0);  nerrors += Verify(__FILE__, __LINE__, "3.e+03",		    "%#.e", 3141.0);  nerrors += Verify(__FILE__, __LINE__, "1.23457e+06",		    "%g", 1234567.0);  nerrors += Verify(__FILE__, __LINE__, "1e+02",		    "%.2g", 99.9999);  nerrors += Verify(__FILE__, __LINE__, "1.0e+02",		    "%#.2g", 99.9999);  nerrors += Verify(__FILE__, __LINE__, "0.123",		    "%0g", 0.123);  nerrors += Verify(__FILE__, __LINE__, "1.00e+00",		    "%.2e", 0.9999);  nerrors += Verify(__FILE__, __LINE__, "1",		    "%.2g", 0.9999);  nerrors += Verify(__FILE__, __LINE__, "2",		    "%.0g", 1.5);  nerrors += Verify(__FILE__, __LINE__, "2",		    "%.g", 1.5);  nerrors += Verify(__FILE__, __LINE__, "0.01",		    "%.2g", 0.01);  nerrors += Verify(__FILE__, __LINE__, "0.010",		    "%#.2g", 0.01);  nerrors += Verify(__FILE__, __LINE__, "1e-04",		    "%5.g", 0.999999e-4);  /* Double width and precision */  nerrors += Verify(__FILE__, __LINE__, "      1e-05",		    "%11.5g", 1e-5);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -