?? print.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 10#define TMP_FILE "tmp.p"const 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;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 (TMP_FILE, "w"); if (!fp) return NULL; if (g_iPrintType == 0) {//透明打印 fputs ("\033[5i", fp); } else { //主機打印 printf ("!!"); } return fp;}voidcloseTMP (FILE * fp){ if (!fp) return; if (g_iPrintType == 0) { fputs ("\033[4i", fp); } else { } fclose (fp);}intmain (int argc, char *argv[]){ char cBuf; if (argc != 2 && argc != 3) { help (); return RET_ERR; } if (argc == 2) { help (); return RET_ERR; } 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': 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;}intreadData (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[COL_MAX_SIZE - 1] = '\0'; if (cBuf == '|' || cBuf == '\n') { szBuf[iCounter - 1] = '\0'; iCounter = 0; 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)); memset (szBuf, 0, sizeof (szBuf)); g_iCOLCounter++; } if (cBuf == '\n') { //printf("run %d|%s|%s\n", g_iRAWCounter, g_pData->pCol[0], g_pData->pCol[1]); 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, sizeof (char) * COL_NUM); g_iCOLCounter = 0; } } g_iTotalNum = g_iRAWCounter; g_iRAWCounter = 0; g_pData = g_pRoot; //*****end if (fp) fclose (fp); return RET_OK;}intreadFormat (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;}intprocessFormat (int type){ int i; FILE *tmp_p = NULL; switch (type) { case 0: //使用數據文件輸入, 打印直至文件結束 for (i = 0; i < g_iTotalNum && g_pData; 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); fputs ("", tmp_p); } closeTMP (tmp_p); if (g_iPrintType == 0) { printf ("按回車打印......"); getchar (); system ("cat tmp.p"); printf ("打印完成.\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 ("", 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) return NULL; if (g_pExecBuf != NULL) { free (g_pExecBuf); g_pExecBuf = NULL; } g_pExecBuf = (char *) malloc (strlen (inBuf) * 2 + COL_MAX_SIZE * COL_NUM); if (g_pExecBuf == (char *) NULL) return NULL; 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] == '>') { 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])); 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;}intreleaseData (){ g_pData = g_pRoot; do { } while (g_pData->pNext); return RET_OK;}inthelp (){ printf ("NOTE:\n"); printf (" program /f:format-file [/d|/n:date-file|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</B>\n"); printf ("<E>finish</E>\n"); return RET_OK;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -