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

📄 myform.c

📁 sco unix 前台界面开发程序,采用UNIX中的词法分析器和语法分析器
💻 C
字号:
#include <curses.h>#include <form.h>#include <stdlib.h>#include <locale.h>#include "public.h"#include "myform.h"#include "newtype.h"#include "listbox.h"extern int FormFunc(char *, FORM_NODE *);WINDOW *FieldWin(FIELD *field)//当前域的主窗口{	return(form_win(field->form));}FORM_NODE *InitForm()//初始化表单{	int i;	FORM_NODE *pForm;	setlocale(LC_ALL,"");	pForm= (FORM_NODE *) malloc(sizeof(FORM_NODE));	pForm->fields = (FIELD **) calloc(MAX_FIELD, sizeof(FIELD *));	pForm->init	= (char **) calloc(MAX_FIELD, sizeof(char *));	pForm->term	= (char **) calloc(MAX_FIELD, sizeof(char *));	pForm->disp	= (char **) calloc(MAX_FIELD, sizeof(char *));	pForm->index = (int *) calloc(MAX_FIELD, sizeof(int));	for(i=0; i<MAX_FIELD; i++) {		pForm->init[i] = (char *) 0;		pForm->term[i] = (char *) 0;		pForm->disp[i] = (char *) 0;	}	return(pForm);}void FreeForm(FORM_NODE *pForm)//释放表单{	int i=0;	WINDOW *win = form_win(pForm->form);	werase(win);	wrefresh(win);	delwin(form_sub(pForm->form));	delwin(win);	unpost_form(pForm->form);	free_form(pForm->form);	del_panel(pForm->panel);	for(i = 0; i < MAX_FIELD; i++) {		if(pForm->fields[i]) free_field(pForm->fields[i]);		if(pForm->init[i]) free(pForm->init[i]);		if(pForm->term[i]) free(pForm->term[i]);		if(pForm->disp[i]) free(pForm->disp[i]);	}	if(pForm->index) free(pForm->index);	if(pForm->prompt) free(pForm->prompt);	if(pForm->name) free(pForm->name);	free(pForm);}WINDOW *FormWin(FORM_NODE *pForm)//返回表单窗口{	return(form_sub(pForm->form));}int CurrentIndex(FORM_NODE *pForm)//当前域索引号{	return(field_index(current_field(pForm->form)));}FIELD *CurrentField(FORM_NODE *pForm)//当前域{	return(pForm->fields[CurrentIndex(pForm)]);}char *CurrentTerm(FORM_NODE *pForm)//当前域终止函数名{	return(pForm->term[CurrentIndex(pForm)]);}char *CurrentInit(FORM_NODE *pForm)//当前域初始函数名{	return(pForm->init[CurrentIndex(pForm)]);}char *CurrentDisp(FORM_NODE *pForm)//当前域的显示文件名{	return(pForm->disp[CurrentIndex(pForm)]);}char *CurrentPrompt(FORM_NODE *pForm)//当前域提示{	return(field_userptr(CurrentField(pForm)));}void RunPrompt(FORM_NODE *pForm)//域提示{	char *str=CurrentPrompt(pForm);	WINDOW *win=form_sub(pForm->form);	if(str)		PrintMsg(win, str, 'N');	else		PrintMsg(win, pForm->prompt, 'N');	pos_form_cursor(pForm->form);//光标复位	wrefresh(win);}/*int RunDisp(FORM_NODE *pForm)//显示域对应信息{	FIELD *f = CurrentField(pForm);	char *x = Trim(field_buffer(f, 0));	char *fname=CurrentDisp(pForm);	char buf[160], disp[80], code[9];	WINDOW* w;   	int rows, cols, frow, fcol, nrow, nbuf;	FILE *fp;	if( fname == NULL) return;	if((fp = fopen(fname,"r")) == NULL) return;	memset(buf, 0 ,sizeof(buf));	while((fscanf(fp, "%[^\n]\n", buf) != EOF)) {		memset(code, 0, sizeof(code));		GetString(code, buf, 1, '|');		if(strcmp(Trim(code), x) == 0) {			memset(disp, 0, sizeof(disp));			GetString(disp, buf, 2, '|');   			w = form_sub(f->form);   			field_info(f, &rows, &cols, &frow, &fcol, &nrow, &nbuf);   			mvwaddstr(w, frow, fcol + cols + 2, disp);   			wrefresh(w);   			fclose(fp);   			return(0);   		}   	}   	w = FormWin(pForm);   	PrintMsg(w, "输入超出范围", 'E');   	fclose(fp);   	return(1);}*/char *GetVal(FIELD *f){	int end, len, i, j;	char *x = field_buffer(f, VALBUF);	FIELDTYPE *type = field_type(f);	if(type == TYPE_DATE) {		len = strlen(x);		end = len - 1;		for(i = 0, j = 1; i < len; i++) {			if( '0' <= x[i] && x[i] <= '9') continue;			for(j = i; j < end ; j++) x[j] = x[j+1];			x[end--] = ' ';			i--;			len--;		}	return(Trim(x));	}		if(type == TYPE_AMOUNT) {		len = strlen(x);		end = len - 1;		for(i = 0, j = 1; i < len; i++) {			if( ('0' <= x[i] && x[i] <= '9') || x[i] == '.') continue;			for(j = i; j < end ; j++) x[j] = x[j+1];			x[end--] = ' ';			i--;			len--;		}	return(Trim(x));	}		return(x);}int RunInit(FORM_NODE * pForm)//执行域初始函数{	FIELD  *f = CurrentField(pForm);	char *code = CurrentInit(pForm);	set_field_buffer(f, VALBUF, GetVal(f));	form_driver(pForm->form, REQ_VALIDATION);	RunPrompt(pForm);	return(FormFunc(code, pForm));}int RunTerm(FORM_NODE * pForm)//执行域终止函数{	char *code = CurrentTerm(pForm);	//FIELD *f = CurrentField(pForm);	//char *x = GetVal(f);	//for( ;*x != 0; x++)           // form_driver(pForm->form, *x);	//RunDisp(pForm);	return(FormFunc(code, pForm));}int RunList(FORM_NODE *pForm)//执行列表域函数{	FIELD *f = CurrentField(pForm);	LIST *n = (LIST *)field_arg(f);	WINDOW* w = form_sub(pForm->form);	LIST_NODE *p;	char *code;	int y, x, ret;   	int rows, cols, frow, fcol, nrow, nbuf;   	getbegyx(w, y, x);   	field_info(f, &rows, &cols, &frow, &fcol, &nrow, &nbuf);   	y += n->y;   	x += fcol;	if((p = InitList(y, x, n->len, n->name)) == NULL) {		 return(1);	}	else {		code = DriverList(p);		if(code){			 set_field_buffer(f, VALBUF, code);				 ret = 0;		}		else ret = 1;	}	FreeList(p);	update_panels();	doupdate();	return(ret);}int DriverForm(FORM_NODE *pForm)//表单驱动 0-接受 1-退出{	int ch, i;	char *x;	FORM *form = pForm->form;	WINDOW *win=form_win(form);	form_driver(form, REQ_OVL_MODE);	RunPrompt(pForm);	while(ch = wgetch(win)) {		switch(ch) {			case 0x1b://ESC				return(1);			case KEY_F(2):    			form_driver(form, REQ_VALIDATION);    			if(RunTerm(pForm) == OK)    				return(0);    			RunInit(pForm);				break;				case 0x0a://Enter			case KEY_DOWN:			    form_driver(form, REQ_VALIDATION);				if(RunTerm(pForm) == OK)				   form_driver(form, REQ_NEXT_FIELD);				RunInit(pForm);				break;			case KEY_UP:			    //form_driver(form, REQ_VALIDATION);				//if(RunTerm(pForm) == OK)					form_driver(form, REQ_PREV_FIELD);				RunInit(pForm);				break;			case 0x08://BackSpace				form_driver(form, REQ_DEL_PREV);				break;			case 0x7f://Del				form_driver(form, REQ_DEL_CHAR);				break;			case KEY_LEFT:				form_driver(form, REQ_LEFT_CHAR);				break;			case KEY_RIGHT:				form_driver(form, REQ_RIGHT_CHAR);				break;			case ' '://Space				if(field_type(current_field(form)) == TYPE_LIST) {					if(RunList(pForm) == OK ) 						form_driver(form, REQ_NEXT_FIELD);						RunInit(pForm);				}				break;			default:				form_driver(form, ch);				break;		}	}}void ClearForm(FORM_NODE *pForm){    int i;    FORM *form = pForm->form;    for(i = 0; i < field_count(form); i++) {        form_driver(form, REQ_CLR_FIELD);        form_driver(form, REQ_NEXT_FIELD);    }    form_driver(form, REQ_FIRST_FIELD);}int GetIndex(FORM_NODE *pForm, int indexno)//域的实际索引号{	int i;	for(i=0; i < MAX_FIELD; i++)		if(pForm->index[i] == indexno)			return(i);	return(-1);}char *ReadField(FORM_NODE *pForm, int i)//读入域中的值{	int no = GetIndex(pForm, i);	return(GetVal(pForm->fields[no]));}void WriteField(FORM_NODE *pForm, int i, char *buf)//写域值{	int no = GetIndex(pForm, i);	set_field_buffer(pForm->fields[no], VALBUF, buf);}void ClearField(FORM_NODE *pForm, int i){    char *x = ReadField(pForm, i);    memset(x, 0, strlen(x));    WriteField(pForm, i, x);}int CheckForm(FORM_NODE *p){	int i, flag = 0;    FORM *form = p->form;    WINDOW *win = FormWin(p);    for(i = 0; i < field_count(form); i++) {    	if(form_driver(form, REQ_VALIDATION) != E_OK) {    		PrintMsg(win, "输入数据不合法", 'E');    		return(1);    	}        form_driver(form, REQ_NEXT_FIELD);    }    return(0);}extern FILE *yyin;FORM_NODE *LoadForm(char *frmfile){    char msg[80];	if((yyin = fopen(frmfile, "r")) == NULL) {		sprintf(msg, "读文件[%s]失败!", frmfile);		PrintMsg(stdscr, msg, 'E');		deleteln();		refresh();		fclose(yyin);		return(NULL);	}	if(yyparse()){ //取得表单句柄HFORM;    	fclose(yyin);    	return(NULL);    }    else       fclose(yyin);	return(HFORM);}

⌨️ 快捷键说明

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