?? p.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 + -