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

📄 slsearch.c

📁 一个C格式的脚本处理函数库源代码,可让你的C程序具有执行C格式的脚本文件
💻 C
字号:
/* Copyright (c) 1992, 1999, 2001, 2002, 2003 John E. Davis * This file is part of the S-Lang library. * * You may distribute under the terms of either the GNU General Public * License or the Perl Artistic License. */#include "slinclud.h"#include "slang.h"#include "_slang.h"#ifdef upcase# undef upcase#endif#define upcase(ch) (cs ? ch : UPPER_CASE(ch))static unsigned char *search_forward (register unsigned char *beg,				      unsigned char *end,				      unsigned char *key,				      register int key_len, int cs, int *ind){   register unsigned char char1;   unsigned char *pos;   int j, str_len;   register unsigned char ch;   register int db;   str_len = (int) (end - beg);   if (str_len < key_len) return (NULL);      if (key_len == 0)     return NULL;   char1 = key[key_len - 1];   beg += (key_len - 1);   while(1)     {	if (cs) while (beg < end)	  {	     ch = *beg;	     db = ind[(unsigned char) ch];	     if ((db < key_len) && (ch == char1)) break;	     beg += db; /* ind[(unsigned char) ch]; */	  }	else while (beg < end)	  {	     ch = *beg;	     db = ind[(unsigned char) ch];	     if ((db < key_len) &&		 (UPPER_CASE(ch) == char1)) break;	     beg += db; /* ind[(unsigned char) ch]; */	  }	if (beg >= end) return(NULL);	pos = beg - (key_len - 1);	for (j = 0; j < key_len; j++)	  {	     ch = upcase(pos[j]);	     if (ch != (unsigned char) key[j]) break;	  }	if (j == key_len) return(pos);	beg += 1;     }}static unsigned char *search_backward (unsigned char *beg,unsigned char *end,				       unsigned char *key, int key_len,				       int cs, int *ind){   unsigned char ch, char1;   int j, str_len, ofs;    str_len = (int) (end - beg);    if (str_len < key_len) return (NULL);      if (key_len == 0)     return NULL;	   /*  end -= (key_len - 1); */   end -= key_len;    char1 = key[0];    while(1)      {	 while ((beg <= end) && (ch = *end, ch = upcase(ch), ch != char1))	   {	      ofs = ind[(unsigned char) ch];#ifdef __MSDOS__	      /* This is needed for msdos segment wrapping problems */	      if (beg + ofs > end) return(NULL);#endif	      end -= ofs;	   }	 if (beg > end) return(NULL);	 for (j = 1; j < key_len; j++)	   {	      ch = upcase(end[j]);	      if (ch != key[j]) break;	   }	 if (j == key_len) return(end);	 end--;      }}unsigned char *SLsearch (unsigned char *pmin, unsigned char *pmax,			 SLsearch_Type *st){   if (st->dir > 0) return search_forward (pmin, pmax, st->key,					   st->key_len, st->cs, st->ind);   else return search_backward (pmin, pmax, st->key,				st->key_len, st->cs, st->ind);}static int Case_Tables_Ok;int SLsearch_init (char *str, int dir, int cs, SLsearch_Type *st){   int i, maxi;   register int max = strlen(str);   unsigned char *w, *work = st->key;   register int *indp, *indpm;   int *ind = st->ind;   if (max >= (int) sizeof (st->key))     {	SLang_doerror ("Search string too long.");	return -1;     }   st->dir = dir; st->cs = cs;   if (!Case_Tables_Ok) SLang_init_case_tables ();   if (dir > 0)     {	w = work;     }   else     {	maxi = max - 1;	str = str + maxi;	w = work + maxi;     }   /* for (i = 0; i < 256; i++) ind[i] = max; */   indp = ind; indpm = ind + 256;   while (indp < indpm)     {	*indp++ = max;	*indp++ = max;	*indp++ = max;	*indp++ = max;     }   i = 0;   if (cs) while (i < max)     {	i++;	maxi = max - i;	*w = *str;	ind[(unsigned char) *str] = maxi;	str += dir; w += dir;     }   else while (i < max)     {	i++;	maxi = max - i;	*w = UPPER_CASE(*str);	ind[(unsigned char) *w] = maxi;	ind[(unsigned char) LOWER_CASE(*str)] = maxi;	str += dir; w += dir;     }   work[max] = 0;   st->key_len = max;   return max;}/* 8bit clean upper and lowercase macros */unsigned char _SLChg_LCase_Lut[256];unsigned char _SLChg_UCase_Lut[256];void SLang_define_case (int *u, int *l){   unsigned char up = (unsigned char) *u, dn = (unsigned char) *l;   _SLChg_LCase_Lut[up] = dn;   _SLChg_LCase_Lut[dn] = dn;   _SLChg_UCase_Lut[dn] = up;   _SLChg_UCase_Lut[up] = up;}void SLang_init_case_tables (void){   int i, j;   if (Case_Tables_Ok) return;   for (i = 0; i < 256; i++)     {	_SLChg_UCase_Lut[i] = i;	_SLChg_LCase_Lut[i] = i;     }   for (i = 'A'; i <= 'Z'; i++)     {	j = i + 32;	_SLChg_UCase_Lut[j] = i;	_SLChg_LCase_Lut[i] = j;     }#ifdef PC_SYSTEM   /* Initialize for DOS code page 437. */   _SLChg_UCase_Lut[135] = 128; _SLChg_LCase_Lut[128] = 135;   _SLChg_UCase_Lut[132] = 142; _SLChg_LCase_Lut[142] = 132;   _SLChg_UCase_Lut[134] = 143; _SLChg_LCase_Lut[143] = 134;   _SLChg_UCase_Lut[130] = 144; _SLChg_LCase_Lut[144] = 130;   _SLChg_UCase_Lut[145] = 146; _SLChg_LCase_Lut[146] = 145;   _SLChg_UCase_Lut[148] = 153; _SLChg_LCase_Lut[153] = 148;   _SLChg_UCase_Lut[129] = 154; _SLChg_LCase_Lut[154] = 129;   _SLChg_UCase_Lut[164] = 165; _SLChg_LCase_Lut[165] = 164;#else   /* ISO Latin */   for (i = 192; i <= 221; i++)     {	j = i + 32;	_SLChg_UCase_Lut[j] = i;	_SLChg_LCase_Lut[i] = j;     }   _SLChg_UCase_Lut[215] = 215; _SLChg_LCase_Lut[215] = 215;   _SLChg_UCase_Lut[223] = 223; _SLChg_LCase_Lut[223] = 223;   _SLChg_UCase_Lut[247] = 247; _SLChg_LCase_Lut[247] = 247;   _SLChg_UCase_Lut[255] = 255; _SLChg_LCase_Lut[255] = 255;#endif   Case_Tables_Ok = 1;}

⌨️ 快捷键说明

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