home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / SQDEV200.ZIP / SRC / STRISTR.C < prev    next >
C/C++ Source or Header  |  1994-05-23  |  3KB  |  89 lines

  1. /***************************************************************************
  2.  *                                                                         *
  3.  *  Squish Developers Kit Source, Version 2.00                             *
  4.  *  Copyright 1989-1994 by SCI Communications.  All rights reserved.       *
  5.  *                                                                         *
  6.  *  USE OF THIS FILE IS SUBJECT TO THE RESTRICTIONS CONTAINED IN THE       *
  7.  *  SQUISH DEVELOPERS KIT LICENSING AGREEMENT IN SQDEV.PRN.  IF YOU DO NOT *
  8.  *  FIND THE TEXT OF THIS AGREEMENT IN THE AFOREMENTIONED FILE, OR IF YOU  *
  9.  *  DO NOT HAVE THIS FILE, YOU SHOULD IMMEDIATELY CONTACT THE AUTHOR AT    *
  10.  *  ONE OF THE ADDRESSES LISTED BELOW.  IN NO EVENT SHOULD YOU PROCEED TO  *
  11.  *  USE THIS FILE WITHOUT HAVING ACCEPTED THE TERMS OF THE SQUISH          *
  12.  *  DEVELOPERS KIT LICENSING AGREEMENT, OR SUCH OTHER AGREEMENT AS YOU ARE *
  13.  *  ABLE TO REACH WITH THE AUTHOR.                                         *
  14.  *                                                                         *
  15.  *  You can contact the author at one of the address listed below:         *
  16.  *                                                                         *
  17.  *  Scott Dudley       FidoNet     1:249/106                               *
  18.  *  777 Downing St.    Internet    sjd@f106.n249.z1.fidonet.org            *
  19.  *  Kingston, Ont.     CompuServe  >INTERNET:sjd@f106.n249.z1.fidonet.org  *
  20.  *  Canada  K7M 5N3    BBS         1-613-634-3058, V.32bis                 *
  21.  *                                                                         *
  22.  ***************************************************************************/
  23.  
  24. /*# name=Case-insensitive search-for-str-inside-another routine
  25. */
  26.  
  27. #include <stdio.h>
  28. #include <string.h>
  29. #include <ctype.h>
  30. #include "prog.h"
  31.  
  32. /* Code to handle chinese characters */
  33.  
  34. #define ISLEFT(c) ((c) > (byte)0x80 && (c) < (byte)0xff)
  35. #define ISRIGHT(c) (((c) >= (byte)0x40 && (c) <= (byte)0x7e) || \
  36.                     ((c) >= (byte)0xa1 && (c) <= (byte)0xfe))
  37.  
  38. word _fast ischin(byte *buf)
  39. {
  40.   return (ISLEFT(buf[0]) && ISRIGHT(buf[1]));
  41. }
  42.  
  43. char * _fast stristr(char *string,char *search)
  44. {
  45.   /* "register" keyword used to fix the brain-dead MSC (opti)mizer */
  46.  
  47.   word last_found=0;
  48.   word strlen_search=strlen(search);
  49.   byte l1, l2;
  50.   word i;
  51.  
  52.   if (string)
  53.   {
  54.     while (*string)
  55.     {
  56.       /**** start chinese modifications *****/
  57.       l1=(byte)(ischin(string) ? 2 : 1);
  58.       l2=(byte)(ischin(search+last_found) ? 2 : 1);
  59.  
  60.       if (l1==l2)
  61.         i=(l1==1) ? memicmp(string, search+last_found, l1) : 1;
  62.       else i=1;
  63.       
  64.       if (!i)
  65.         last_found += l1;
  66.       /**** end chinese modifications *****/
  67.       /* old code: if ((tolower(*string))==(tolower(search[last_found])))
  68.                      last_found++;
  69.       */
  70.       else
  71.       {
  72.         if (last_found != 0)
  73.         {
  74.           string -= last_found-1;
  75.           last_found=0;
  76.           continue;
  77.         }
  78.       }
  79.  
  80.       string += l1;
  81.  
  82.       if (last_found==strlen_search) return(string-last_found);
  83.     }
  84.   }
  85.  
  86.   return(NULL);
  87. }
  88.  
  89.