home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / strings / str_test.c < prev    next >
C/C++ Source or Header  |  2000-08-31  |  9KB  |  271 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17.  
  18. /* Test of all stringfunktions that is coded in assembler */
  19.  
  20. #include <global.h>
  21. #include <stdarg.h>
  22. #include "m_string.h"
  23.  
  24. #define F_LEN    8
  25. #define F_CHAR    'A'
  26. #define F_FILL    'B'
  27. #define T_LEN    15
  28. #define T_CHAR    'D'
  29. #define T_FILL    'E'
  30. #define F_PREFILL '0'
  31. #define T_PREFILL '1'
  32.  
  33. static char from_buff[100],to_buff[100];
  34. static my_string from,to;
  35. static int errors,tests;
  36. static int test_strarg(char *name,...);
  37. static void init_strings (void);    /* Init from and to */
  38. void test_arg (my_string message,long func_value,long value);
  39. int compare_buff (my_string message,my_string b1,my_string b2,int length,
  40.           pchar fill, pchar prefill);
  41.  
  42. int my_test(int a)
  43. {
  44.   return a ? 1 : 0;
  45. }
  46.  
  47. int main(void)
  48. {
  49.   static char v1[]="Monty",v2[]="on",v3[]="Montys",v4[]="ty",v5[]="gr",
  50.               v6[]="hohohoo",v7[]="hohoo",v8[]="hohooo",v9[]="t",
  51.           cont[]="qwet";
  52.   errors=tests=0;
  53.   init_strings();
  54.  
  55.   test_arg("bcmp(from,to,5)",(long) my_test(bcmp(from,to,5)),1L);
  56.   test_arg("bcmp(from,from,5)",(long) bcmp(from,from,5),0L);
  57.  
  58.   test_arg("bcmp(from,to,0)",(long) bcmp(from,to,0),0L);
  59.   test_arg("strend(from)",(long) strend(from),(long) from+F_LEN);
  60.   test_arg("strchr(v1,'M')",(long) strchr(v1,'M'),(long) v1);
  61.   test_arg("strchr(v1,'y')",(long) strchr(v1,'y'),(long) v1+4);
  62.   test_arg("strchr(v1,'x')",(long) strchr(v1,'x'),0L);
  63.   test_arg("strcont(v1,cont)",(long) strcont(v1,cont),(long) v1+3);
  64.   test_arg("strcont(v1,v2)",(long) strcont(v1,v2),(long) v1+1);
  65.   test_arg("strcont(v1,v5)",(long) strcont(v1,v5),0L);
  66.   test_arg("is_prefix(v3,v1)",(long) is_prefix(v3,v1),1L);
  67.   test_arg("is_prefix(v1,v3)",(long) is_prefix(v1,v3),0L);
  68.   test_arg("is_prefix(v3,v4)",(long) is_prefix(v3,v4),0L);
  69.   test_arg("strstr(v1,v1)",(long) strstr(v1,v1),(long) v1);
  70.   test_arg("strstr(v1,v2)",(long) strstr(v1,v2),(long) v1+1);
  71.   test_arg("strstr(v1,v4)",(long) strstr(v1,v4),(long) v1+3);
  72.   test_arg("strstr(v6,v7)",(long) strstr(v6,v7),(long) v6+2);
  73.   test_arg("strstr(v1,v9)",(long) strstr(v1,v9),(long) v1+3);
  74.   test_arg("strstr(v1,v3)",(long) strstr(v1,v3),0L);
  75.   test_arg("strstr(v1,v5)",(long) strstr(v1,v5),0L);
  76.   test_arg("strstr(v6,v8)",(long) strstr(v6,v8),0L);
  77.  
  78.   test_arg("strinstr(v1,v4)",(long) strinstr(v1,v4),4L);
  79.   test_arg("strinstr(v1,v5)",(long) strinstr(v1,v5),0L);
  80.   test_arg("strlen(from)",(long) strlen(from),(long) F_LEN);
  81.   test_arg("strlen(\"\")",(long) strlen(""),0L);
  82. #ifdef HAVE_STRNLEN
  83.   test_arg("strnlen(from,3)",(long) strnlen(from,3),3L);
  84.   test_arg("strnlen(from,0)",(long) strnlen(from,0),0L);
  85.   test_arg("strnlen(from,1000)",(long) strnlen(from,1000),(long) F_LEN);
  86. #endif
  87.  
  88.   test_strarg("bfill(to,4,' ')",(bfill(to,4,' '),0L),INT_MAX32,4,' ',0,0);
  89.   test_strarg("bfill(from,0,' ')",(bfill(from,0,' '),0L),INT_MAX32,0,0);
  90.   test_strarg("bzero(to,3)",(bzero(to,3),0L),INT_MAX32,3,0,0,0);
  91.   test_strarg("bzero(to,0)",(bzero(to,0),0L),INT_MAX32,0,0);
  92.   test_strarg("bmove(to,from,4)",(bmove(to,from,4),0L),INT_MAX32,4,F_CHAR,
  93.           0,0);
  94.   test_strarg("bmove(to,from,0)",(bmove(to,from,0),0L),INT_MAX32,0,0);
  95.   test_strarg("bmove_upp(to+6,from+6,3)",(bmove_upp(to+6,from+6,3),0L),INT_MAX32,
  96.            3,T_CHAR,3,F_CHAR,0,0);
  97.   test_strarg("bmove_upp(to,from,0)",(bmove_upp(to,from,0),0L),INT_MAX32,0,0);
  98.   test_strarg("strappend(to,3,' ')",(strappend(to,3,' '),0L),INT_MAX32,
  99.           3,T_CHAR,1,0,T_LEN-4,T_CHAR,1,0,0,0);
  100.   test_strarg("strappend(to,T_LEN+5,' ')",(strappend(to,T_LEN+5,' '),0L),INT_MAX32,
  101.            T_LEN,T_CHAR,5,' ',1,0,0,0);
  102.   test_strarg("strcat(to,from)",strcat(to,from),to,T_LEN,T_CHAR,
  103.           F_LEN,F_CHAR,1,0,0,0);
  104.   test_strarg("strcat(to,\"\")",strcat(to,""),INT_MAX32,0,0);
  105.   test_strarg("strfill(to,4,' ')",strfill(to,4,' '),to+4,4,' ',1,0,0,0);
  106.   test_strarg("strfill(from,0,' ')",strfill(from,0,' '),from,0,1,0,0);
  107.   test_strarg("strmake(to,from,4)",strmake(to,from,4),to+4,4,F_CHAR,
  108.           1,0,0,0);
  109.   test_strarg("strmake(to,from,0)",strmake(to,from,0),to+0,1,0,0,0);
  110.   test_strarg("strmov(to,from)",strmov(to,from),to+F_LEN,F_LEN,F_CHAR,0,0);
  111.   test_strarg("strmov(to,\"\")",strmov(to,""),to,1,0,0,0);
  112.   test_strarg("strnmov(to,from,2)",strnmov(to,from,2),to+2,2,F_CHAR,0,0);
  113.   test_strarg("strnmov(to,from,F_LEN+5)",strnmov(to,from,F_LEN+5),to+F_LEN,
  114.            F_LEN,F_CHAR,1,0,0,0);
  115.   test_strarg("strnmov(to,\"\",2)",strnmov(to,"",2),to,1,0,0,0);
  116.   test_strarg("strxmov(to,from,\"!!\",NullS)",strxmov(to,from,"!!",NullS),to+F_LEN+2,F_LEN,F_CHAR,2,'!',0,0,0);
  117.   test_strarg("strxmov(to,NullS)",strxmov(to,NullS),to,1,0,0,0);
  118.   test_strarg("strxmov(to,from,from,from,from,from,'!!',from,NullS)",strxmov(to,from,from,from,from,from,"!!",from,NullS),to+F_LEN*6+2,F_LEN,F_CHAR,F_LEN,F_CHAR,F_LEN,F_CHAR,F_LEN,F_CHAR,F_LEN,F_CHAR,2,'!',F_LEN,F_CHAR,1,0,0,0);
  119.   test_strarg("bchange(to,2,from,4,6)",(bchange(to,2,from,4,6),0L),INT_MAX32,
  120.           4,F_CHAR,2,T_CHAR,0,0);
  121.  
  122.   printf("tests: %d  errors: %d\n",tests,errors);
  123.   if (errors)
  124.     fputs("--- Some functions doesn't work!! Fix them\n",stderr);
  125.   return(errors > 0);
  126.  
  127.   fputs("Fatal error\n",stderr);
  128.   return(2);
  129. } /* main */
  130.  
  131.  
  132.     /* Init strings */
  133.  
  134. void init_strings(void)
  135. {
  136.   reg1 int i;
  137.   reg2 char *pos;
  138.  
  139.   from=from_buff+3; to=to_buff+3;
  140.  
  141.   pos=from_buff; *pos++= F_FILL; *pos++=F_FILL; *pos++=F_PREFILL;
  142.   for (i=0 ; i < F_LEN ; i++)
  143.     *pos++=F_CHAR;
  144.   *pos++=0;
  145.   for (i=0; i<50 ; i++)
  146.     *pos++= F_FILL;
  147.  
  148.   pos=to_buff; *pos++= T_FILL; *pos++=T_FILL; *pos++=T_PREFILL;
  149.   for (i=0 ; i < T_LEN ; i++)
  150.     *pos++=T_CHAR;
  151.   *pos++=0;
  152.   for (i=0; i<50 ; i++)
  153.     *pos++= T_FILL;
  154. } /* init_strings */
  155.  
  156.  
  157.     /* Test that function return rigth value */
  158.  
  159. void test_arg(my_string message, long int func_value, long int value)
  160. {
  161.   tests++;
  162.   printf("testing '%s'\n",message);
  163.   if (func_value != value)
  164.   {
  165.     printf("func: '%s' = %ld   Should be: %ld\n",message,func_value,value);
  166.     errors++;
  167.   }
  168. } /* test_arg */
  169.  
  170.     /* Test function return value and from and to arrays */
  171.  
  172. static int test_strarg(char *message,...)
  173. {
  174.   long func_value,value;
  175.   int error,length;
  176.   char chr,cmp_buff[100],*pos,*pos2;
  177.   va_list pvar;
  178.  
  179.   tests++;
  180.   va_start(pvar,message);
  181.   func_value=va_arg(pvar,long);
  182.   value=va_arg(pvar,long);
  183.  
  184.   printf("testing '%s'\n",message);
  185.   if (func_value != value && value != INT_MAX32)
  186.   {
  187.     printf("func: '%s' = %ld   Should be: %ld\n",message,func_value,value);
  188.     errors++;
  189.   }
  190.   pos= cmp_buff;
  191.   while ((length = va_arg(pvar, int)) != 0)
  192.   {
  193.     chr= (char) (va_arg(pvar, int));
  194.     while (length--)
  195.       *pos++=chr;
  196.   }
  197.   pos2=to+ (int)(pos-cmp_buff);
  198.   while (pos <= cmp_buff+T_LEN)
  199.     *pos++= *pos2++;
  200.   if (compare_buff(message,to,cmp_buff,(int) (pos-cmp_buff),T_FILL,T_PREFILL))
  201.   {
  202.     init_strings();
  203.     va_end(pvar);
  204.     return 1;
  205.   }
  206.  
  207.   pos= cmp_buff;
  208.   while ((length = va_arg(pvar, int)) != 0)
  209.   {
  210.     chr= (char) (va_arg(pvar, int));
  211.     while (length--)
  212.       *pos++=chr;
  213.   }
  214.   pos2=from+ (int)(pos-cmp_buff);
  215.   while (pos <= cmp_buff+F_LEN)
  216.     *pos++= *pos2++;
  217.   error=compare_buff(message,from,cmp_buff,(int) (pos-cmp_buff),F_FILL,F_PREFILL);
  218.   init_strings();
  219.   va_end(pvar);
  220.   return (error != 0);
  221. } /* test_strarg */
  222.  
  223.  
  224.     /* test if function made right value */
  225.  
  226. int compare_buff(my_string message, my_string b1, my_string b2, int length,
  227.          pchar fill, pchar prefill)
  228. {
  229.   int i,error=0;
  230.  
  231.   if (bcmp(b1,b2,length))
  232.   {
  233.     errors++;
  234.     printf("func: '%s'   Buffers differ\nIs:        ",message);
  235.     for (i=0 ; i<length ; i++)
  236.       printf("%3d ",b1[i]);
  237.     printf("\nShould be: ");
  238.     for (i=0 ; i<length ; i++)
  239.       printf("%3d ",b2[i]);
  240.     puts("");
  241.   }
  242.   else if (b1[-1] != prefill || b1[-2] != fill || b1[-3] != fill)
  243.   {
  244.     printf("func: '%s'   Chars before buffer is changed\n",message);
  245.     errors++;
  246.     error=1;
  247.   }
  248.   else if (b1[length] != fill || b1[length+1] != fill)
  249.   {
  250.     printf("func: '%s'   Chars after buffer is changed\n",message);
  251.     errors++;
  252.     error=1;
  253.   }
  254.   return error;
  255. } /* compare_buff */
  256.  
  257.     /* These are here to be loaded and examined */
  258.  
  259. void dummy_functions(void)
  260. {
  261.   VOID(memchr(from,'a',5));
  262.   VOID(memcmp(from,to,5));
  263.   VOID(memcpy(from,to,5));
  264.   VOID(memset(from,' ',5));
  265.   VOID(strcmp(from,to));
  266.   VOID(strcpy(from,to));
  267.   VOID(strstr(from,to));
  268.   VOID(strrchr(from,'a'));
  269.   return;
  270. }
  271.