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

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