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

📄 list.c

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 C
字号:
#include <stdio.h>
#include <curses.h>
#include <stdlib.h>
#include "tool.h"
#include "mytools.h"
#include "mult.h"
#include "db_struct_c.h"


#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define PAGEROW 58 
#define PAGECOL 78


struct {
	int X;
	int Y;
	int Width;
	int Height;
	char *Title;
	char **Item;
	char *Attr;
	int ItemNum;
} List;


typedef struct{
	int  pagehead ;
	int  pagefoot ;
	int  leftspc  ;
} print_struct;
print_struct print={
	2,2,0};

char * add_demical(muti_struct ddstru);
void ltrim(char * );


int CreateList(height, width, y, x, title)
int height;
int width;
int y;
int x;
char *title;
{
	List.Title = (char *)malloc(strlen(title) + 1);
	if (List.Title == NULL) return(-1);
	strcpy(List.Title, title);

	List.Item = 0;
	List.Attr = 0;
	List.ItemNum = 0;
	List.Y = y;
	List.X = x;
	List.Height = height;
	List.Width = width;

	return(0);
}

int AddListItem(char *item, char attr)
{
	void *tmp;

	tmp = realloc((void *)List.Attr, List.ItemNum + 1);
	if (tmp == NULL) return(-1);
	List.Attr = (char *)tmp;
	List.Attr[List.ItemNum] = attr;

	tmp = realloc((void *)List.Item, (List.ItemNum + 1) * sizeof(char *));
	if (tmp == NULL) return(-1);
	List.Item = (char **)tmp;

	List.Item[List.ItemNum] = (char *)malloc(strlen(item) + 1);
	if (List.Item[List.ItemNum] == NULL) return(-1);
	strcpy(List.Item[List.ItemNum], item);

	List.ItemNum++;
}

void ListPrompt(win, y, str, flag)
WINDOW *win;
int y;
char *str;
int flag;
{
	char prompt[81];

	sprintf(prompt, "%*s%s", (List.Width - 4 - strlen(str)) / 2, "", str);
	sprintf(prompt, "%-*s", List.Width - 4, prompt);
	h_winprompt(win, y, 2, prompt, 0, flag);
}

int DispList(int flag)
{
	WINDOW *TmpWin;
	char filename[128], *line;
	int page, begin, i, ch;

	line = (char *)malloc(List.Width - 3);
	if (line == NULL) return(-1);
	memset(line, ' ', List.Width - 4);
	line[List.Width - 4] = 0;
	sprintf(filename, "/tmp/.list.%d", getpid());
	scr_dump(filename);
	TmpWin = newwin(List.Height - (flag ? 0 : 3), List.Width, List.Y, List.X);
	wrefresh(TmpWin);
	ListPrompt(TmpWin, 1, List.Title, 0);
	if (flag) {
		Box2(TmpWin, List.Height, List.Width);
		ListPrompt(TmpWin, List.Height - 2, "上移: Home PgUp ↑ 下移:End PgDn 打印:CTRL_P:  返回: ESC", 0);
	}
	page = MIN(List.ItemNum, List.Height - 6);
	for (i = 0; i < page; i++)
		ListPrompt(TmpWin, 3 + i, List.Item[i], List.Attr[i]);
	wrefresh(TmpWin);
	begin = 0;
	while (1) {
		switch (ch = getkey(TmpWin)) {
		case CTRL_L:
			wrefresh(curscr);
			continue;
		case UP:
			if (begin == 0) {
				beep();
				continue;
			} else
				begin--;
			break;
		case DOWN:
			if (begin + List.Height - 7 >= List.ItemNum - 1) {
				beep();
				continue;
			} else
				begin++;
			break;
		case HOME:
			if (begin == 0) {
				beep();
				continue;
			} else
				begin = 0;
			break;
		case END:
			if (begin + List.Height - 7 >= List.ItemNum - 1) {
				beep();
				continue;
			} else
				begin = List.ItemNum - 1 - List.Height + 7;
			break;
		case PGUP:
			if (begin == 0) {
				beep();
				continue;
			} else
				begin = MAX(0, begin - List.Height + 7);
			break;
		case PGDN:
			if (begin + List.Height - 7 >= List.ItemNum - 1) {
				beep();
				continue;
			} else
				begin = begin + List.Height - 7;
			break;
		case CTRL_P:
			if(print_list(TmpWin,flag)==0) continue;
			break;
		case ESCAPE:
			break;
		default:
			beep();
			continue;
		}
		if (ch == ESCAPE) break;
		page = MIN(List.ItemNum - begin, List.Height - 6);
		for (i = 0; i < page; i++)
			ListPrompt(TmpWin, 3 + i, List.Item[begin + i], List.Attr[begin + i]);
		for (; i < List.Height - 6; i++)
			ListPrompt(TmpWin, 3 + i, line, 0);
		wrefresh(TmpWin);
	}
	delwin(TmpWin);
	scr_restore(filename);
	unlink(filename);
	free((void *)line);
	return(0);
}

int FreeList()
{
	int i;

	free((void *)List.Title);

	if (List.ItemNum) {
		for (i = 0; i < List.ItemNum; i++) free((void *)List.Item[i]);
		free((void *)List.Item);
	}
}

int print_list(win,flag)
WINDOW *win;
int flag;
{
	FILE * fp;
	int i,ret,listnum;
	int row=0;
	int page=1;
	int space_header,space_title;
	char sys_str[40],date_str[40],page_str[16],header_str[60];
	char report[40];
	char prompt[100];
	char dt[11],tm[20];
	char sys_cmd[100];
	S_sys_param sys;
	char	bank_name[21];

	void ltrim(),rtrim();

	sprintf(report,"%s/prt/report.%d",getenv("WORKDIR"),getpid());
/*
	select_sys_param(&sys);

	rtrim(sys.bank_id);
	rtrim(sys.host_id);
	get_bank_name(sys.bank_id, sys.host_id, bank_name);
*/



	if((fp=fopen(report,"w+"))==NULL){
		strcpy(prompt,"             打开报表文件错!任一键继续...\n");
		h_winprompt(win,List.Height-4, 10, prompt, 0, flag);
		wrefresh(win);
		getkey(win);
		return(-1);
	}
	/* compute the print.leftspc*/
	print.leftspc=(PAGECOL-strlen(List.Title))/2;
	/* print report header */
	sprintf(page_str,"第%d页",page);
	sprintf(header_str,"中国银行BTS系统统计分析--%s\n",audit_title);
	space_header=strlen(List.Title)-strlen(header_str)+2*print.leftspc;
	/* print print.pagehead*/
	for(i=0;i<print.pagehead ;i++) fprintf(fp,"\n");
	for(i=0;i<space_header/2;i++) fprintf(fp," ");
	fprintf(fp, "%s",header_str);
	for(i=0;i<strlen(List.Title)-strlen(page_str)+print.leftspc;i++)
		fprintf(fp," ");
	fprintf(fp,"%s",page_str);
	fprintf(fp,"\n");

	/* pritnt report title */
	getdatef(dt, "/");
	gettimef(tm, ":");
	sprintf(date_str,"%s  %s",dt,tm);
	sprintf(sys_str,"%s-%s   %s ",sys.bank_id,sys.host_id, bank_name);


	for(i=0;i<print.leftspc;i++) fprintf(fp," ");
	fprintf(fp,"%s",sys_str);
	space_title=strlen(List.Title)-strlen(sys_str)-strlen(date_str);
	for(i=0;i<space_title;i++) fprintf(fp," ");
	fprintf(fp,"%s\n",date_str);
	for(i=0;i<print.leftspc;i++) fprintf(fp," ");
	for(i=0;i<strlen(List.Title);i++) fprintf(fp,"-");
	fprintf(fp,"\n");
	/* print column  title */

	for(i=0;i<print.leftspc;i++) fprintf(fp," ");
	fprintf(fp, "%s\n",List.Title);
	for(i=0;i<print.leftspc;i++) fprintf(fp," ");
	for(i=0;i<strlen(List.Title);i++) fprintf(fp,"-");
	fprintf(fp,"\n");

	for (listnum = 0; listnum < List.ItemNum-2; listnum++) {
		row++;
		if(row>PAGEROW-print.pagehead-print.pagefoot){
			row=0;
			page++;
			/*print print.pagefoot and change the page in printer */
			for(i=0;i<print.pagefoot;i++) fprintf(fp,"\n");
			fprintf(fp,"\f");

			/* print next page header */
			sprintf(page_str,"第%d页",page);
			for(i=0;i<print.pagehead ;i++) fprintf(fp,"\n");
			for(i=0;i<space_header/2;i++) fprintf(fp," ");
			fprintf(fp, "%s",header_str);
			for(i=0;i<strlen(List.Title)-strlen(page_str)+print.leftspc;i++)
				fprintf(fp," ");
			fprintf(fp,"%s",page_str);
			fprintf(fp,"\n");
			/* print next title */
			for(i=0;i<print.leftspc;i++) fprintf(fp," ");
			fprintf(fp,"%s",sys_str);
			space_title=strlen(List.Title)-strlen(sys_str)-strlen(date_str);
			for(i=0;i<space_title;i++) fprintf(fp," ");
			fprintf(fp,"%s\n",date_str);
			for(i=0;i<print.leftspc;i++) fprintf(fp," ");
			for(i=0;i<strlen(List.Title);i++) fprintf(fp,"-");
			fprintf(fp,"\n");
			/* print next column header */
			for(i=0;i<print.leftspc;i++) fprintf(fp," ");
			fprintf(fp, "%s\n",List.Title);
			for(i=0;i<print.leftspc;i++) fprintf(fp," ");
			for(i=0;i<strlen(List.Title);i++) fprintf(fp,"-");
			fprintf(fp,"\n");
		}
		for(i=0;i<print.leftspc;i++) fprintf(fp," ");
		fprintf(fp,"%s\n",List.Item[listnum]);
	}
	for(i=0;i<print.leftspc;i++) fprintf(fp," ");
	for(i=0;i<strlen(List.Title);i++)
		fprintf(fp,"-");
	fprintf(fp,"\n");
	/* print page count title --the last row*/
	for(i=0;i<print.leftspc;i++) fprintf(fp," ");
	fprintf(fp,"%s\n",List.Item[listnum+1]);

	fclose(fp);
	if(ret=ddprint_file(report)){
		strcpy(prompt,"        打印出错,请检查打印机的配置!任一键继续...\n");
		h_winprompt(win,List.Height-4,10, prompt, 0, flag);
		wrefresh(win);
		getkey(win);
		return(-1);
	}
	strcpy(prompt,"                   打印成功!任一键继续...\n");
	h_winprompt(win,List.Height-4, 10, prompt, 0, flag);
	wrefresh(win);
	getkey(win);
	return(0);
}


void rtrim(char * str)
{
	int i;
	i=strlen(str)-1;
	while(str[i]==' ')i--;
	i++;
	str[i]='\0';
}



char * add_demical(muti_struct ddstru)
{
	int i=0;
	int j=19;
	int count=0;
	char str[20],result[20];
	char * ptr;

	memset(result,' ',19);
	result[19]='\0';
	if(ddstru.type==DDINT){
		sprintf(str,"%d",ddstru.ddnum.intnum);
		ptr=str;
		while(*ptr!='\0') ptr++;
		result[j--]=*ptr--;
		while(i<strlen(str)){
			count++;
			if(count>3){
				count=1;
				result[j]=',';
				j--;
			}
			result[j]=*ptr;
			ptr--;
			i++;
			j--;
		}
		ltrim(result);
		return(result);

	}
	else
		if(ddstru.type==DDDOUB){
			sprintf(str,"%.2f",ddstru.ddnum.doublenum);
			ptr=str;
			i=strlen(str);
			while(*ptr!='\0') ptr++;
			while(*ptr!='.'){
				result[j]=*ptr;
				ptr--;
				j--;
				i--;
			}
			result[j]=*ptr;
			ptr--;
			j--;
			i--;

			while(i>=0){
				count++;
				if(count>3){
					count=1;
					result[j]=',';
					j--;
				}
				result[j]=*ptr;
				ptr--;
				i--;
				j--;
			}

			ltrim(result);
			return(result);
		}
		else return(NULL);
}

void ltrim(char * str)
{
	char * ptr;
	ptr=str;
	while(*ptr==' ') ptr++;
	strcpy(str,ptr);
}

ddprint_file(char *fname)
{
	char  path[128];

	if( fname == (char *)NULL )
		return( -1 );

/******* lp_cmd ????????????????????? **/
	sprintf( path, "%s/bin/lp_cmd %s >/dev/null 2>/dev/null", getenv("WORKDIR"),fname );

	if( system( path ) )
		return( -1 );

	return( 0 );
}

⌨️ 快捷键说明

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