📄 newtype.c
字号:
#include <stdio.h>#include <ctype.h>#include <stdarg.h>#include <stdlib.h> #include <form.h>#include <string.h>#include "screen.h"#include "myform.h"#include "protime.h"#include "public.h"#include "newtype.h"//创建金额类型 static char *make_amount(va_list *ap){ AMOUNT *n = (AMOUNT *)malloc(sizeof(AMOUNT)); if(n) { n->prec = va_arg(*ap, int); n->vmin = va_arg(*ap, double); n->vmax = va_arg(*ap, double); } return (char *)n;}static char *copy_amount(char *arg){ AMOUNT *n = (AMOUNT *)malloc(sizeof(AMOUNT)); if(n) *n = *((AMOUNT *)arg); return (char *)n;}static void free_amount(char *arg){ free(arg);} static int ccheck_amount(int c, char *arg){ return (isdigit(c) || c =='.');}static int fcheck_amount(FIELD *f, char *arg){ int rows, cols, frow, fcol, nrow, nbuf; WINDOW *w; AMOUNT *n = (AMOUNT *)arg; double vmin = n->vmin; double vmax = n->vmax; char *x = GetVal(f); char buf[30]; if(atof(Trim(x)) < n->vmin || atof(Trim(x)) > n->vmax) return(FALSE); PrintAmt(buf, atof(x), n->prec); set_field_buffer(f, 0, buf); return TRUE;} FIELDTYPE *TYPE_AMOUNT;void creat_amount(){ TYPE_AMOUNT = new_fieldtype(fcheck_amount, ccheck_amount); set_fieldtype_arg(TYPE_AMOUNT, make_amount, copy_amount, free_amount);}void cancel_amount(){ free_fieldtype(TYPE_AMOUNT);}//创建正文类型数据static int fcheck_text(FIELD *f, char *arg){ //char *x = field_buffer(f, VALBUF); //set_field_buffer(f, VALBUF, field_buffer(f, DSPBUF)); //return(!IsBlank(x)); return(TRUE);}static int ccheck_text(int c, char *arg){ return(c > 32 ? TRUE : FALSE);} FIELDTYPE* TYPE_TEXT;void creat_text(){ TYPE_TEXT = new_fieldtype(fcheck_text, ccheck_text);}void cancel_text(){ free_fieldtype(TYPE_TEXT);}//创建中文正文类型数据static int fcheck_ctext(FIELD *f, char *arg){ //char *x = field_buffer(f, VALBUF); //set_field_buffer(f, VALBUF, field_buffer(f, DSPBUF)); //return(!IsBlank(x)); return(TRUE);}static int ccheck_ctext(int c, char *arg){ return(c > 0x80 ? TRUE : FALSE);} FIELDTYPE* TYPE_CTEXT;void creat_ctext(){ TYPE_TEXT = new_fieldtype(fcheck_ctext, ccheck_ctext);}void cancel_ctext(){ free_fieldtype(TYPE_CTEXT);}//创建英文正文类型数据static int fcheck_etext(FIELD *f, char *arg){ //char *x = field_buffer(f, VALBUF); //set_field_buffer(f, VALBUF, field_buffer(f, DSPBUF)); //return(!IsBlank(x)); return(TRUE);}static int ccheck_etext(int c, char *arg){ return(c < 0x80 ? TRUE : FALSE);} FIELDTYPE* TYPE_ETEXT;void creat_etext(){ TYPE_TEXT = new_fieldtype(fcheck_etext, ccheck_etext);}void cancel_etext(){ free_fieldtype(TYPE_ETEXT);}//创建数字类型数据static int fcheck_digit(FIELD *f, char *arg){ //char *x = field_buffer(f, VALBUF); //set_field_buffer(f, VALBUF, field_buffer(f, DSPBUF)); //return(!IsBlank(x)); return(TRUE);}static int ccheck_digit(int c, char *arg){ return (isdigit(c));} FIELDTYPE* TYPE_DIGIT;void creat_digit(){ TYPE_TEXT = new_fieldtype(fcheck_digit, ccheck_digit);}void cancel_digit(){ free_fieldtype(TYPE_DIGIT);}//创建日期类型static int ccheck_date(int c, char *arg){ return isdigit(c);}static int fcheck_date(FIELD *f, char *arg){ char *x = GetVal(f); char buf[11]; int d = atoi(Trim(x)); int rows, cols, frow, fcol, nrow, nbuf; WINDOW *w; if(!IsDate(d)) return(FALSE); memset(buf, 0, sizeof(buf)); sprintf(buf, "%04d/%02d/%02d", GetYmd(d, 'Y'), GetYmd(d, 'M'), GetYmd(d, 'D')); set_field_buffer(f, VALBUF, buf); return(TRUE);} FIELDTYPE *TYPE_DATE;void creat_date(){ TYPE_DATE = new_fieldtype(fcheck_date, ccheck_date);}void cancel_date(){ free_fieldtype(TYPE_DATE);}//创建列表类型static char *make_list(va_list *ap){ LIST *n = (LIST *)malloc(sizeof(LIST)); if(n) { n->y = va_arg(*ap, int); n->len = va_arg(*ap, int); strcpy(n->name, va_arg(*ap, char *)); } return (char *)n;}static char *copy_list(char *arg){ LIST *n = (LIST *)malloc(sizeof(LIST)); if(n) *n = *((LIST *)arg); return (char *)n;}static void free_list(char *arg){ free(arg);} static int ccheck_list(int c, char *arg){ return(c > 32 ? TRUE : FALSE);}static int fcheck_list(FIELD *f, char *arg){ FILE *fp; LIST *n = (LIST *)arg; char *x = Trim(field_buffer(f, 0)); char buf[160], disp[80], code[9]; WINDOW* w; int rows, cols, frow, fcol, nrow, nbuf; if( n->name == NULL) return(FALSE); if((fp = fopen(n->name,"r")) == NULL) return(FALSE); w = form_sub(f->form); 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, '|'); field_info(f, &rows, &cols, &frow, &fcol, &nrow, &nbuf); mvwaddstr(w, frow, fcol + cols + 1, disp); wrefresh(w); fclose(fp); return(TRUE); } } fclose(fp); return(FALSE);}FIELDTYPE* TYPE_LIST;void creat_list(){ TYPE_LIST = new_fieldtype(fcheck_list, ccheck_list); set_fieldtype_arg(TYPE_LIST, make_list, copy_list, free_list);}void cancel_list(){ free_fieldtype(TYPE_LIST);}void CreateType(){ creat_amount(); creat_text(); creat_ctext(); creat_etext(); creat_digit(); creat_date(); creat_list();}void CancelType(){ cancel_amount(); cancel_text(); cancel_ctext(); cancel_etext(); cancel_digit(); cancel_date(); cancel_list();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -