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

📄 slrline.c

📁 一个C格式的脚本处理函数库源代码,可让你的C程序具有执行C格式的脚本文件
💻 C
📖 第 1 页 / 共 2 页
字号:
		       len += dlen;	       /* ok since dlen comes out 0  */		       if (len > rli->edit_width) dlen = len - rli->edit_width;		       while (dlen--) *p++ = ' ';		       dlen = 0;		    }		  else		    {		       if (dlen == 3)			 {			    chb &= 0x7F;			    *p++ = '~';			 }		       *p++ = '^';		       if (chb == 127)  *p++ = '?';		       else *p++ = chb + '@';		    }	       }	     len += dlen;	  }	/* if (start_len > prompt_len) break; */	tw = rli->tab;	b = (unsigned char *) rli->buf;     }   rli->new_upd_len = (int) (p - rli->new_upd);   while (p < rli->new_upd + rli->edit_width) *p++ = ' ';   really_update (rli, want_cursor_pos);}void SLrline_redraw (SLang_RLine_Info_Type *rli){   unsigned char *p = rli->new_upd;   unsigned char *pmax = p + rli->edit_width;   while (p < pmax) *p++ = ' ';   rli->new_upd_len = rli->edit_width;   really_update (rli, 0);   RLupdate (rli);}static int rl_eof_insert (void){   if (This_RLI->len == 0)     {	SLang_Last_Key_Char = SLang_RL_EOF_Char;	/* rl_self_insert (); */	return rl_enter ();     }   return 0;}/* This is very naive.  It knows very little about nesting and nothing * about quoting. */static void blink_match (SLang_RLine_Info_Type *rli){   unsigned char bra, ket;   unsigned int delta_column;   unsigned char *p, *pmin;   int dq_level, sq_level;   int level;   pmin = rli->buf;   p = pmin + rli->point;   if (pmin == p)     return;   ket = SLang_Last_Key_Char;   switch (ket)     {      case ')':	bra = '(';	break;      case ']':	bra = '[';	break;      case '}':	bra = '{';	break;      default:	return;     }   level = 0;   sq_level = dq_level = 0;   delta_column = 0;   while (p > pmin)     {	char ch;	p--;	delta_column++;	ch = *p;	if (ch == ket)	  {	     if ((dq_level == 0) && (sq_level == 0))	       level++;	  }	else if (ch == bra)	  {	     if ((dq_level != 0) || (sq_level != 0))	       continue;	     level--;	     if (level == 0)	       {		  rli->point -= delta_column;		  RLupdate (rli);		  (*rli->input_pending)(10);		  rli->point += delta_column;		  RLupdate (rli);		  break;	       }	     if (level < 0)	       break;	  }	else if (ch == '"') dq_level = !dq_level;	else if (ch == '\'') sq_level = !sq_level;     }}int SLang_read_line (SLang_RLine_Info_Type *rli){   unsigned char *p, *pmax;   SLang_Key_Type *key;   SLang_Rline_Quit = 0;   This_RLI = rli;   p = rli->old_upd; pmax = p + rli->edit_width;   while (p < pmax) *p++ = ' ';   /* Sanity checking */   rli->len = strlen ((char *) rli->buf);   if (rli->len >= rli->buf_len)     {	rli->len = 0;	*rli->buf = 0;     }   if (rli->point > rli->len) rli->point = rli->len;   if (rli->point < 0) rli->point = 0;   rli->curs_pos = rli->start_column = 0;   rli->new_upd_len = rli->old_upd_len = 0;   This_RLI->last_fun = NULL;   if (rli->update_hook == NULL)     putc ('\r', stdout);   RLupdate (rli);   while (1)     {	key = SLang_do_key (RL_Keymap, (int (*)(void)) rli->getkey);	if ((key == NULL) || (key->f.f == NULL))	  rl_beep ();	else	  {	     if ((SLang_Last_Key_Char == SLang_RL_EOF_Char)		 && (*key->str == 2)		 && (This_RLI->len == 0))	       rl_eof_insert ();	     else if (key->type == SLKEY_F_INTRINSIC)	       {		  if ((key->f.f)())		    RLupdate (rli);		  if ((rli->flags & SL_RLINE_BLINK_MATCH)		      && (rli->input_pending != NULL))		    blink_match (rli);	       }	     if (SLang_Rline_Quit)	       {		  This_RLI->buf[This_RLI->len] = 0;		  if (SLang_Error == SL_USER_BREAK)		    {		       SLang_Error = 0;		       return -1;		    }		  return This_RLI->len;	       }	  }	if (key != NULL)	  This_RLI->last_fun = key->f.f;     }}static int rl_abort (void){   rl_delete_line ();   return rl_enter ();}/* TTY interface --- ANSI */static void ansi_goto_column (int n){   putc('\r', stdout);   if (n) fprintf(stdout, "\033[%dC", n);}static void rl_select_line (SLang_Read_Line_Type *p){   This_RLI->last = p;   strcpy ((char *) This_RLI->buf, (char *) p->buf);   This_RLI->point = This_RLI->len = strlen((char *) p->buf);}static int rl_next_line (void);static int rl_prev_line (void){   SLang_Read_Line_Type *prev;   if (((This_RLI->last_fun != (FVOID_STAR) rl_prev_line)	&& (This_RLI->last_fun != (FVOID_STAR) rl_next_line))       || (This_RLI->last == NULL))     {	prev = This_RLI->tail;     }   else prev = This_RLI->last->prev;   if (prev == NULL)     {	rl_beep ();	return 0;     }   rl_select_line (prev);   return 1;}static int rl_redraw (void){   SLrline_redraw (This_RLI);   return 1;}static int rl_next_line (void){   SLang_Read_Line_Type *next;   if (((This_RLI->last_fun != (FVOID_STAR) rl_prev_line)	&& (This_RLI->last_fun != (FVOID_STAR) rl_next_line))       || (This_RLI->last == NULL))      {	 rl_beep ();	 return 0;      }   next = This_RLI->last->next;   if (next == NULL)     {	This_RLI->len = This_RLI->point = 0;	*This_RLI->buf = 0;	This_RLI->last = NULL;     }   else rl_select_line (next);   return 1;}static SLKeymap_Function_Type SLReadLine_Functions[] ={   {"up", rl_prev_line},   {"down", rl_next_line},   {"bol", rl_bol},   {"eol", rl_eol},   {"right", rl_right},   {"left", rl_left},   {"self_insert", rl_self_insert},   {"bdel", rl_bdel},   {"del", rl_del},   {"deleol", rl_deleol},   {"enter", rl_enter},   {"trim", rl_trim},   {"quoted_insert", rl_quote_insert},   {(char *) NULL, NULL}};int SLang_init_readline (SLang_RLine_Info_Type *rli){   int ch;   char simple[2];   if (RL_Keymap == NULL)     {	simple[1] = 0;	if (NULL == (RL_Keymap = SLang_create_keymap ("ReadLine", NULL)))	  return -1;	RL_Keymap->functions = SLReadLine_Functions;	/* This breaks under some DEC ALPHA compilers (scary!) */#ifndef __DECC	for (ch = ' '; ch < 256; ch++)	  {	     simple[0] = (char) ch;	     SLkm_define_key (simple, (FVOID_STAR) rl_self_insert, RL_Keymap);	  }#else	ch = ' ';	while (1)	  {	     simple[0] = (char) ch;	     SLkm_define_key (simple, (FVOID_STAR) rl_self_insert, RL_Keymap);	     ch = ch + 1;	     if (ch == 256) break;	  }#endif				       /* NOT __DECC */	simple[0] = SLang_Abort_Char;	SLkm_define_key (simple, (FVOID_STAR) rl_abort, RL_Keymap);	simple[0] = SLang_RL_EOF_Char;	SLkm_define_key (simple, (FVOID_STAR) rl_eof_insert, RL_Keymap);#ifndef IBMPC_SYSTEM	SLkm_define_key  ("^[[A", (FVOID_STAR) rl_prev_line, RL_Keymap);	SLkm_define_key  ("^[[B", (FVOID_STAR) rl_next_line, RL_Keymap);	SLkm_define_key  ("^[[C", (FVOID_STAR) rl_right, RL_Keymap);	SLkm_define_key  ("^[[D", (FVOID_STAR) rl_left, RL_Keymap);	SLkm_define_key  ("^[OA", (FVOID_STAR) rl_prev_line, RL_Keymap);	SLkm_define_key  ("^[OB", (FVOID_STAR) rl_next_line, RL_Keymap);	SLkm_define_key  ("^[OC", (FVOID_STAR) rl_right, RL_Keymap);	SLkm_define_key  ("^[OD", (FVOID_STAR) rl_left, RL_Keymap);#else	SLkm_define_key  ("^@H", (FVOID_STAR) rl_prev_line, RL_Keymap);	SLkm_define_key  ("^@P", (FVOID_STAR) rl_next_line, RL_Keymap);	SLkm_define_key  ("^@M", (FVOID_STAR) rl_right, RL_Keymap);	SLkm_define_key  ("^@K", (FVOID_STAR) rl_left, RL_Keymap);	SLkm_define_key  ("^@S", (FVOID_STAR) rl_del, RL_Keymap);	SLkm_define_key  ("^@O", (FVOID_STAR) rl_eol, RL_Keymap);	SLkm_define_key  ("^@G", (FVOID_STAR) rl_bol, RL_Keymap);	SLkm_define_key  ("\xE0H", (FVOID_STAR) rl_prev_line, RL_Keymap);	SLkm_define_key  ("\xE0P", (FVOID_STAR) rl_next_line, RL_Keymap);	SLkm_define_key  ("\xE0M", (FVOID_STAR) rl_right, RL_Keymap);	SLkm_define_key  ("\xE0K", (FVOID_STAR) rl_left, RL_Keymap);	SLkm_define_key  ("\xE0S", (FVOID_STAR) rl_del, RL_Keymap);	SLkm_define_key  ("\xE0O", (FVOID_STAR) rl_eol, RL_Keymap);	SLkm_define_key  ("\xE0G", (FVOID_STAR) rl_bol, RL_Keymap);#endif	SLkm_define_key  ("^C", (FVOID_STAR) rl_abort, RL_Keymap);	SLkm_define_key  ("^E", (FVOID_STAR) rl_eol, RL_Keymap);	SLkm_define_key  ("^G", (FVOID_STAR) rl_abort, RL_Keymap);	SLkm_define_key  ("^I", (FVOID_STAR) rl_self_insert, RL_Keymap);	SLkm_define_key  ("^A", (FVOID_STAR) rl_bol, RL_Keymap);	SLkm_define_key  ("\r", (FVOID_STAR) rl_enter, RL_Keymap);	SLkm_define_key  ("\n", (FVOID_STAR) rl_enter, RL_Keymap);	SLkm_define_key  ("^K", (FVOID_STAR) rl_deleol, RL_Keymap);	SLkm_define_key  ("^L", (FVOID_STAR) rl_deleol, RL_Keymap);	SLkm_define_key  ("^V", (FVOID_STAR) rl_del, RL_Keymap);	SLkm_define_key  ("^D", (FVOID_STAR) rl_del, RL_Keymap);	SLkm_define_key  ("^F", (FVOID_STAR) rl_right, RL_Keymap);	SLkm_define_key  ("^B", (FVOID_STAR) rl_left, RL_Keymap);	SLkm_define_key  ("^?", (FVOID_STAR) rl_bdel, RL_Keymap);	SLkm_define_key  ("^H", (FVOID_STAR) rl_bdel, RL_Keymap);	SLkm_define_key  ("^P", (FVOID_STAR) rl_prev_line, RL_Keymap);	SLkm_define_key  ("^N", (FVOID_STAR) rl_next_line, RL_Keymap);	SLkm_define_key  ("^R", (FVOID_STAR) rl_redraw, RL_Keymap);	SLkm_define_key  ("`", (FVOID_STAR) rl_quote_insert, RL_Keymap);	SLkm_define_key  ("\033\\", (FVOID_STAR) rl_trim, RL_Keymap);	if (SLang_Error) return -1;     }   if (rli->prompt == NULL) rli->prompt = "";   if (rli->keymap == NULL) rli->keymap = RL_Keymap;   rli->old_upd = rli->upd_buf1;   rli->new_upd = rli->upd_buf2;   *rli->buf = 0;   rli->point = 0;   if (rli->flags & SL_RLINE_USE_ANSI)     {	if (rli->tt_goto_column == NULL) rli->tt_goto_column = ansi_goto_column;     }   if (Char_Widths[0] == 2) return 0;   for (ch = 0; ch < 32; ch++) Char_Widths[ch] = 2;   for (ch = 32; ch < 256; ch++) Char_Widths[ch] = 1;   Char_Widths[127] = 2;#ifndef IBMPC_SYSTEM   for (ch = 128; ch < 160; ch++) Char_Widths[ch] = 3;#endif   return 0;}SLang_Read_Line_Type *SLang_rline_save_line (SLang_RLine_Info_Type *rli){   SLang_Read_Line_Type *rl;   unsigned char *buf;   if ((rli == NULL) || (rli->buf == NULL))     return NULL;   if (NULL == (rl = (SLang_Read_Line_Type *) SLmalloc (sizeof (SLang_Read_Line_Type)))       || (NULL == (buf = (unsigned char *) SLmake_string ((char *)rli->buf))))     {	SLfree ((char *)rl);	return NULL;     }   rl->buf = buf;   rl->buf_len = strlen ((char *)buf);   rl->num = rl->misc = 0;   rl->next = rl->prev = NULL;   if (rli->tail != NULL)     {	rli->tail->next = rl;	rl->prev = rli->tail;     }   rli->tail = rl;   return rl;}

⌨️ 快捷键说明

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