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

📄 p.c

📁 UNIX 下
💻 C
字号:
#include "stdio.h"#include "stdlib.h"#include "string.h"//#include "curses.h"#define font_len 8#ifdef TRUE#else #define TRUE 1#endif#ifdef FALSE#else#define FALSE 0#endif#ifdef DEBUG #define DEBUF_OUTTEXT(a)#else#define DEBUG_OUTTEXT(a) printf("%s\n", a)#endif#define RET_OK 0#define RET_ERR 1#define COL_NUM 16#define COL_MAX_SIZE 128#define LINE_NUM 64#define ASSERT(arg, fp) {if(arg ==NULL){if(fp) fclose(fp); return RET_ERR;}}#define IN#define OUT#define FONT_MAX_NUM 10const char BADY[] ="<B>";const char END[]  ="<E>";const char HEAD_E[] ="</H>";const char BADY_E[] ="</B>";const char END_E[]  ="</E>";const char FONT[] ="<F?>";const char PARAM[] = "$?";char * FONT_BEGIN[FONT_MAX_NUM]={"\033e", "\033X", "\033U", "\033g",\				 "\033i"};char * FONT_END[FONT_MAX_NUM] ={"\033f", "\033Y", "\033R", "\033h",\                                "\033j"};char ERR_FILE_NO[]="文件不存在!file exist!";struct _DATA{	char * pCol[COL_NUM];	struct _DATA * pNext;}*g_pData, *g_pRoot;int g_iTotalNum = 0;int g_iCOLCounter = 0, g_iRAWCounter =0;char * g_pPrintBuf = NULL;char * g_pHeadBuf  = NULL;char * g_pEndBuf   = NULL;char * g_pBadyBuf[LINE_NUM];int g_iBadyCounter =0;/*g_iBadyCounter:数据实体个数*/int g_iLoopNUM =0;/*g_iLoopNUM:用循环方式打印时,定义循环次数*/int g_iPrintType =0;/*g_iPrintType:定义打印方式.==0终瑞打印, ==1主机打印*/char * g_pExecBuf = NULL;char g_sTMP[128];int readFormat(char *filename);int readData(char * filename);int help();int processFormat(int type);char * transFormat(char* inBuf);FILE * openTMP();void closeTMP(FILE* fp);FILE * openTMP(){	FILE * fp;	fp = fopen(g_sTMP, "w");	if(!fp) return NULL;	if(g_iPrintType == 0){//透明打印		fputs("\033[5i", fp);	}else{ //主机打印		printf("!!");	}	return fp;}void closeTMP(FILE *fp){	if(!fp) return ;	if(g_iPrintType ==0){			fputs("\033[4i", fp);	}else{	}	fclose(fp);}int main(int argc, char *argv[]){	char cBuf;	if(argc!=2 && argc!=3){		help();		return RET_ERR;	}	if(argc ==2){		if(strlen(argv[1])<4 ){			help();			return RET_ERR;		}		if(argv[1][1]=='f' || argv[1][1]=='F'){			g_iLoopNUM = 50000;			readFormat(&argv[1][3]);			processFormat(1);		}	}else if(argc ==3){		if(strlen(argv[1])<4 || strlen(argv[2])<4){			help();			return RET_ERR;		}		cBuf = argv[1][1];		switch(cBuf){			case 'f':			case 'F':				readFormat(&argv[1][3]);			break;			default:				printf("/F:FormatFile\n");				return RET_ERR;			break;		}			cBuf = argv[2][1];		switch(cBuf){			case 'D':			case 'd':				strcpy(g_sTMP, &argv[2][3]);				strcat(g_sTMP, ".p");				readData(&argv[2][3]);				processFormat(0);			break;			case 'n':			case 'N':				g_iLoopNUM = atoi(&argv[2][3]);				processFormat(1);				break;			default:				printf("循环次数或读取数据文件! /N:number | /D:DataFile\n");				printf("大家好!\n");				break;		}	}	/*	if(!initscr()){		return RET_ERR;	}	printw("Hello World!\n");	refresh();	sleep(1);	endwin();	*/	return RET_OK;}int readData(char * filename){	FILE * fp;	char cBuf;	char szBuf[COL_MAX_SIZE];	int  iCounter =0;	if(filename == NULL) return RET_ERR;		if(!(fp=fopen(filename, "r"))){		printf("%s:%s\n", ERR_FILE_NO, filename);		return RET_ERR;	}	g_pRoot = g_pData = (struct _DATA*)malloc(sizeof(struct _DATA));	if(g_pData ==NULL) return RET_ERR;	else g_pData->pNext = NULL;	//*****begin read date file	while(!feof(fp)){		if(fread(&cBuf, 1, 1, fp) != 1) break;				if(iCounter < COL_MAX_SIZE - 1){			szBuf[iCounter++] = cBuf;			szBuf[iCounter] = '\0';		}		//szBuf[iCounter] = '\0';		if(cBuf =='|'){			szBuf[iCounter-1] = '\0';			iCounter =0;			if(strlen(szBuf) == 0){			//	continue;			}			g_pData->pCol[g_iCOLCounter] =(char*)malloc(strlen(szBuf));			ASSERT(g_pData->pCol[g_iCOLCounter], fp);			strncpy(g_pData->pCol[g_iCOLCounter], szBuf, strlen(szBuf));			g_pData->pCol[g_iCOLCounter][strlen(szBuf)] ='\0';			printf("COL[%d]=%s\n", g_iCOLCounter, g_pData->pCol[g_iCOLCounter]);			memset(szBuf, 0, sizeof(szBuf));			g_iCOLCounter ++;		}						if(cBuf =='\n' || cBuf =='\r' ){			iCounter = 0;			g_pData->pNext = (struct _DATA*)malloc(sizeof(struct _DATA));			ASSERT(g_pData->pNext, fp);			g_pData = g_pData->pNext;			g_pData->pNext = NULL;						g_iRAWCounter ++;				memset(g_pData->pCol,  0, COL_NUM);			g_iCOLCounter =0;		}	}	g_iTotalNum = g_iRAWCounter;	g_iRAWCounter = 0;	g_pData = g_pRoot;	//*****end 	if(fp) fclose(fp);	return RET_OK;}int readFormat(char *filename){	FILE * fp, *fp1;	//char cBuf;	long idx1, idx2;	if(filename == NULL) RET_ERR;	if(!(fp=fopen(filename, "r"))) return RET_ERR;		fseek(fp , 0, SEEK_SET);	while(!feof(fp)){		if(fgetc(fp) =='<'){			idx1 = ftell(fp)+3;			switch(fgetc(fp)){				case 'H':					while(TRUE){						if(fgetc(fp) == '<' &&						   fgetc(fp) == '/' && 						   fgetc(fp) =='H' && 						   fgetc(fp) == '>'){							idx2 = ftell(fp);							g_pHeadBuf = (char*)malloc(idx2 -idx1);							ASSERT(g_pHeadBuf, fp);							fseek(fp, -(idx2-idx1), SEEK_CUR);							fread(g_pHeadBuf, 1, idx2-idx1-4, fp);							g_pHeadBuf[idx2 - idx1 -3] = '\0';							break;						}					}				break;				case 'B':					while(TRUE){						if(fgetc(fp) == '<' &&						   fgetc(fp) == '/' && 						   fgetc(fp) =='B' && 						   fgetc(fp) == '>'){							idx2 = ftell(fp);							g_pBadyBuf[g_iBadyCounter] = (char*)malloc(idx2 -idx1);							ASSERT(g_pBadyBuf[g_iBadyCounter], fp);							fseek(fp, -(idx2-idx1), SEEK_CUR);							fread(g_pBadyBuf[g_iBadyCounter], 1, idx2-idx1-4, fp);							g_pBadyBuf[g_iBadyCounter][idx2 - idx1 -3] = '\0';							g_iBadyCounter ++;							break;						}					}				break;				case 'E':					while(TRUE){						if(fgetc(fp) == '<' &&						   fgetc(fp) == '/' && 						   fgetc(fp) =='E' && 						   fgetc(fp) == '>'){							idx2 = ftell(fp);							g_pEndBuf = (char*)malloc(idx2 -idx1);							ASSERT(g_pEndBuf, fp);							fseek(fp, -(idx2-idx1), SEEK_CUR);							fread(g_pEndBuf, 1, idx2-idx1-4, fp);							g_pEndBuf[idx2 - idx1 - 2] = '\0';							break;						}					}				break;						}		}	}	if(fp) fclose(fp);	return RET_OK;}int processFormat(int type){	int i;	FILE * tmp_p =NULL;	char printBuf[56];	switch(type){		case 0://使用数据文件输入, 打印直至文件结束		for(i =0; i< g_iTotalNum && g_pData->pNext; i++){			tmp_p = openTMP();			if(!tmp_p) return RET_ERR;/*			if(g_pHeadBuf){			}			for(i=0; g_pBadyBuf[i] && i< LINE_NUM; i++){ 			}*/			if(g_pEndBuf){				g_pExecBuf = transFormat(g_pEndBuf);				ASSERT(g_pExecBuf, tmp_p);				fputs(g_pExecBuf, tmp_p);				if(g_pExecBuf) 				{					free(g_pExecBuf);					g_pExecBuf = NULL;				}				fputs("\n", tmp_p);			}			closeTMP(tmp_p);			memset(printBuf, 0, sizeof(printBuf));			if(g_iPrintType == 0){				printf("Content=%s,按回车打印......", g_pData->pCol[1]);				getchar();				sprintf(printBuf, "cat %s ", g_sTMP);				system(printBuf);				printf("输出完成.\n\n");			}else{				system("lp tmp.p");			}			g_pData = g_pData->pNext;		}		break;		case 1://不使用数据文件输入, 指定打印次数			tmp_p = openTMP();			if(!tmp_p) return RET_ERR;			if(g_pHeadBuf){			}else			if(g_pBadyBuf[0]){			}else			if(g_pEndBuf){				g_pExecBuf = transFormat(g_pEndBuf);				ASSERT(g_pExecBuf, tmp_p);				fputs(g_pExecBuf, tmp_p);			//	fputs("\r\n", tmp_p);			}else{				printf("请定义固定打印格式及内容:\r\n在<E></E>数据段中!\r\n");			}			closeTMP(tmp_p);			for(i = 0; i< g_iLoopNUM; i++){			if(g_iPrintType ==0){				printf("按回车键打印......");				getchar();				system("cat tmp.p");				printf("打印完成.\n");			}else{			}		}				break;	}	return RET_OK;}char * transFormat(IN char* inBuf){	int inp=0, outp=0, font=0, tinp=0, datIdx=0;	char fontBuf[font_len];	char * tmpPoint=NULL;	//当格式数或数	if(inBuf == NULL || g_pData->pNext == NULL)		 return NULL;		g_pExecBuf = (char*)malloc(strlen(inBuf)*2+COL_MAX_SIZE*COL_NUM);	if(g_pExecBuf == (char*)NULL) return NULL;	memset(g_pExecBuf, 0, strlen(inBuf)*2 +COL_MAX_SIZE*COL_NUM);	if(g_iPrintType == 0){//终端打印		while(inp < strlen(inBuf)){			if(inBuf[inp]=='/' && inBuf[inp+1]=='/'){				//读注释,不进行处理.				tinp = inp ;				while(inBuf[++tinp] != '\n'){}				inp = tinp +1;				continue;			}						if(inBuf[inp]=='<'){				if(inBuf[inp+1]=='F'){					font = 0;					tinp = inp+2;					while(tinp++ < inp+font_len){			 			if(inBuf[tinp] == '>'){							memset(fontBuf, 0, font_len);							strncpy(fontBuf, &inBuf[inp+2], tinp-inp-2);							font = atoi(fontBuf);							break;						}					}					if(font >0 && font <FONT_MAX_NUM){//有字体控制语句						sprintf(&g_pExecBuf[outp], FONT_BEGIN[font -1]);						outp += strlen(FONT_BEGIN[font -1]);						inp += tinp-inp +1;						continue;					}				}											if(inBuf[inp+1]=='/'){				//font 引用上次字体变量font,恢复字体					tinp = inp +2;				//下面代吗需要优化					while(tinp++ < inp +font_len){						if(inBuf[tinp] == '>'){							font = atoi(&inBuf[inp+3]);							break;						}					}					if(font >0 && font < FONT_MAX_NUM){						sprintf(&g_pExecBuf[outp], FONT_END[font-1]);						outp += strlen(FONT_END[font-1]);						inp += tinp -inp +1;						continue;					}								}				if(inBuf[inp+1] =='$' && g_pData){//如果数据文件存在,从中检索据段				font = 0;				tinp = inp+2;				while(++tinp < inp +font_len){					if(inBuf[tinp] =='>' ){						memset(fontBuf, 0, font_len);							//这里存储数据段索引临时缓冲							strncpy(fontBuf, &inBuf[inp+2], tinp-inp-2);							font = atoi(fontBuf);//font现在用作存储数据索引							break;						}						}					if(font < COL_NUM && font >0 && g_pData->pCol[font-1]){						//sprintf(&g_pExecBuf[outp], g_pData->pCol[font-1], strlen(g_pData->pCol[font-1]));						strncpy(&g_pExecBuf[outp], g_pData->pCol[font-1], strlen(g_pData->pCol[font-1]));							outp +=strlen(g_pData->pCol[font-1]);						inp+=tinp -inp +1;						continue;					}				}				}		g_pExecBuf[outp++] = inBuf[inp++];			}	}else if(g_iPrintType ==1){//主机打印	}		return g_pExecBuf;}int releaseData(){	g_pData = g_pRoot;	do{	}while(g_pData->pNext);	return RET_OK;}int help(){	printf("NOTE:\n");	printf("       program /f:format-file [/d:data-file|n:number]\n\n");	printf("字体:\n");	printf("<F?>text<F?>  F?定义打印字体.\n\n");	printf("数据引用:\n");	printf("<$?>          $?表示数据引用列.\n\n");	printf("例子:\n");	printf("<H>title(<$9>)</H>\n");	printf("<B>姓名:<$1>,年龄:<$2>,工龄:<$3>,工资:$1024.00</B>\n");	printf("<E>END</E>\n");	return RET_OK;}

⌨️ 快捷键说明

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