📄 tool.c
字号:
#include <curses.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include "mytools.h"
#include "errmesg.h"
#include "errmesg_macro.h"
#include "tool.h"
#include "db_struct_c.h"
#define SCR_NUM 200
double atof();
long atol();
extern int do_query, do_insert, do_update, do_delete, special, his_query;
extern S_tran_ls tran_ls;
extern char *mstr;
void prescan();
static char str_bak[200] = "";
static struct {
char *name;
char *index;
} index[] = { { "card_type"," data_id, card_id"},
{ NULL, NULL}};
/* IN_ITEM() */
static int prompt_flg = 1; /* 提示行开关 0:无提示行 1:有提示行 */
static unsigned in_item_ch = ENTER; /* 置为ENTER是为了当第一个字段为只显示时
能够返回ENTER以便继续作下一个字段 */
/*
* 字段值输入函数
*
*/
int in_item(pwin,name,row,col,value,len,fieldcheck,p_func,view,flag)
WINDOW *pwin; /* 显示窗口 */
char *name; /* 名称 */
int row, col; /* 坐标 */
char *value; /* 要编辑的字符串 */
int len; /* 字符串的长度 */
int ( *fieldcheck )(); /* 字段检查函数指针 */
int ( *p_func )(); /* 字段检查函数指针 */
int view; /* 0:正常 1:不处理 2:只显示
4:密文显示 8:非空(允许ESC退出) */
int flag; /* 是否回车确认 */
{
static int OverWrite = 1;
int y = row, x = col;
char *sp = value, *p;
int result = 0;
int k, full_flag;
char buffer[128];
int locate;
if ( view & SKIP )
return( in_item_ch );
value[len] = 0;
memset( value + strlen( value ), ' ', len - strlen( value ) );
if ( view & NOEDIT ) {
wmove( pwin, row, col );
if ( view & HIDE )
disp_pwd( pwin, value );
else
waddstr( pwin, value );
wrefresh( pwin );
/*
* 即使本字段无需输入,但仍需执行字段域值检查
*/
if ( fieldcheck ) {
if ( ( k = fieldcheck( value ) ) != SUCC ) {
wattroff( pwin, Item_Attr );
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
wattron( pwin, Item_Attr );
}
}
if ( p_func ) {
if ( ( k = p_func( value ) ) != SUCC ) {
wattroff( pwin, Item_Attr );
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
wattron( pwin, Item_Attr );
}
}
return( in_item_ch );
}
if ( prompt_flg == PROMPT_ON )
if ( OverWrite )
{
clear_wline(stdscr, LINES-1);
h_prompt( LINES-1, 69, "覆盖方式",0,1);
}
else
{
clear_wline(stdscr, LINES-1);
h_prompt( LINES-1, 69, "插入方式",0,1);
}
wattron( pwin, Item_Attr );
wmove( pwin, row, col );
if ( view & HIDE )
disp_pwd( pwin, value );
else waddstr( pwin, value );
full_flag = 0;
keypad ( pwin, FALSE );
do {
wmove( pwin, y, x );
wrefresh( pwin );
if ( full_flag == 0 )
in_item_ch = getkey(pwin);
else in_item_ch = ENTER;
switch ( in_item_ch ) {
case INS:
OverWrite ^= 1;
wattroff( pwin, Item_Attr );
if ( prompt_flg==PROMPT_ON )
if ( OverWrite )
{
clear_wline(stdscr, LINES-1);
h_prompt( LINES-1, 69, "覆盖方式",0,1);
}
else
{
clear_wline(stdscr, LINES-1);
h_prompt( LINES-1, 69, "插入方式",0,1);
}
wattron( pwin, Item_Attr );
break;
case LEFT:
if ( sp != value ) {
sp--;
x--;
}
break;
case RIGHT:
if ( * ( sp + 1 ) != 0 ) {
sp ++;
x ++;
} else
full_flag = 1;
break;
case HOME:
sp = value;
x = col;
break;
case END:
locate = len;
for ( sp = value+len-1; locate > 0 ; sp--, locate-- )
if ( *sp != ' ' ) break;
if ( locate < len ) {
x = col + locate;
sp = value + locate;
} else {
x = col + len - 1;
sp = value + len - 1;
}
break;
case UP:
result = in_item_ch;
break;
case DOWN: /* End edit of the field */
case CR:
case ENTER:
p = value + strlen(value) - 1;
if (strchr(value, ' ')) {
if (view & FULL) {
beep();
full_flag = 0;
break;
}
while ((p != value) && (*p == ' ')) p--;
if (*p == ' ') {
if (view & NOEMPTY) {
beep();
full_flag = 0;
break;
}
value[0] = 0;
}
}
if (value[0] && (view & DIGITAL)) {
while ((p != value) && isdigit(*p)) p--;
if (!isdigit(*p)) {
beep();
full_flag = 0;
break;
}
}
if ( fieldcheck )
if ( ( k = fieldcheck( value ) ) != SUCC ) {
wattroff( pwin, Item_Attr );
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
wattron( pwin, Item_Attr );
if (str_bak[0])
h_winprompt( pwin, 16, 2, str_bak, 0, 0 );
// Omitted for BOC set_blank( value, len );
sp = value;
y = row;
x = col;
mvwaddstr( pwin, y, x, sp );
full_flag = 0;
break;
}
if ( p_func )
if ( ( k = p_func( value ) ) != SUCC ) {
wattroff( pwin, Item_Attr );
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
wattron( pwin, Item_Attr );
if (str_bak[0]) h_winprompt( pwin, 16, 2, str_bak, 0, 0 );
// Omitted for BOC set_blank( value, len );
sp = value;
y = row;
x = col;
mvwaddstr( pwin, y, x, sp );
full_flag = 0;
break;
}
result=in_item_ch;
break;
case ESCAPE: /* Confirm and exit */
p = value + strlen(value) - 1;
if (strchr(value, ' ')) {
if (view & FULL) {
beep();
full_flag = 0;
break;
}
while ((p != value) && (*p == ' ')) p--;
if (*p == ' ') {
if (view & NOEMPTY) {
/*================== WuBin 2001-6-22 17:10 ======Start==============
beep();
full_flag = 0;
break;
===========================2001-6-22 17:10=======End==============*/
/* result=in_item_ch; 非空状态时,允许ESC退出 */
beep();
full_flag = 0;
break;
break;
}
value[0] = 0;
}
}
if (value[0] && (view & DIGITAL)) {
while ((p != value) && isdigit(*p)) p--;
if (!isdigit(*p)) {
beep();
full_flag = 0;
break;
}
}
if ( fieldcheck )
if ( ( k = fieldcheck( value ) ) != SUCC ) {
wattroff( pwin, Item_Attr );
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
wattron( pwin, Item_Attr );
if (str_bak[0]) h_winprompt( pwin, 16, 2, str_bak, 0, 0 );
// Omitted for BOC set_blank( value, len );
sp = value;
y = row;
x = col;
mvwaddstr( pwin, y, x, sp );
break;
}
if ( p_func )
if ( ( k = p_func( value ) ) != SUCC ) {
wattroff( pwin, Item_Attr );
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
wattron( pwin, Item_Attr );
if (str_bak[0]) h_winprompt( pwin, 16, 2, str_bak, 0, 0 );
// Omitted for BOC set_blank( value, len );
sp = value;
y = row;
x = col;
mvwaddstr( pwin, y, x, sp );
break;
}
result=in_item_ch;
break;
case CTRL_L: /* Redraw screen */
wrefresh( curscr );
break;
case CTRL_D: /* Clears to the end of the field */
memset( sp, ' ', strlen( sp ) );
value[len] = 0;
if ( view & HIDE )
disp_pwd( pwin, sp );
else waddstr( pwin, sp );
break;
case CTRL_W: /* Help screen */
FunKeyHelp(name);
break;
case CTRL_N:
/*
if (special && do_insert)
disp_posls(value);
*/
break;
case CTRL_U: /* Quit */
case CTRL_C: /* clear all fields */
result=in_item_ch;
break;
case CTRL_X: /* Deletes current character */
memcpy( sp, sp + 1, strlen( sp ) - 1 );
sp[strlen(sp)-1] = ' ';
if ( view & HIDE )
disp_pwd( pwin, sp );
else waddstr( pwin, sp );
break;
case BS: /* Delete previous character */
/* If is begin , del itself */
if ( sp != value ) {
sp --;
x --;
}
wmove( pwin, y, x );
memcpy( sp, sp + 1, strlen( sp ) - 1 );
sp[strlen(sp)-1] = ' ';
if ( view & HIDE )
disp_pwd( pwin, sp );
else waddstr( pwin, sp );
break;
default:
if ( iscntrl( in_item_ch ) ) break;
if ( * ( sp+1 ) != 0 ) {
if ( OverWrite == 0 )
move_mem( sp+1, sp, strlen( sp )-1 );
*sp = in_item_ch;
if ( view & HIDE )
disp_pwd( pwin, sp );
else waddstr( pwin, sp );
sp ++;
x ++;
} else {
*sp = in_item_ch;
if ( view & HIDE )
disp_pwd( pwin, sp );
else waddstr( pwin, sp );
if ( flag == NOENTER ) full_flag = 1;
}
break;
}
} while( result == 0 );
wmove( pwin, row, col);
wrefresh( pwin );
/* End - Modified by Liyao, 11/19/97 */
wattroff( pwin, Item_Attr );
str_bak[0] = 0;
return( result );
}
int get_confirm_str( str )
char *str;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -