📄 list.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 + -