/****************************************************************************** * Copyright (C) 1991,1992 by Wei Sun (william@cs.anu.edu.au) * All Rights Reserved * Modified by YLu, Jan 1993 * * File: * GB2PS.C * * SYNOPSIS: * gb2ps [-h] [-f] [-p] [-b page] [-e page_no] * input_file [output_file] * * DESCRIPTION: * GB2PS converts the HANZI GB code article into PostScript printable * files that can be printed on PostScript printers. * * OPTIONS: * -h Help, print the usage of GB2PS * -f allow page formating. * -p don't generate page number. * -b page_no begin generating PS file from page page_no. * -e page_no end generating PS file at page page_no. * * ENVIRONMENT VARIABLE: * GB2PSDIR: Chinese font directory. * * DISTRIBUTION: * This program and the font file are NOT in public domain. * All the files can be freely distributed for non-commercial purposes * only, and THERE IS NO WARRANTY FOR THIS PROGRAM. * * AUTHOR: * The author can be reached by E-mail: william@cs.anu.edu.au * or mail at: * * Wei Sun * Department of Computer Science * The Australian National University * Canberra, ACT 2601 * Australia *****************************************************************************/ #include #include #include #define QUWEI 94 #define CHAR_LIMIT 2 #define PATHSEP "/" #ifndef GB2PSDIR #define GB2PSDIR "/home/ftp/software/fonts" #endif #define SONGTI "cclibj.24" #define FANTI "cclibf.24" #define KEITI "cclibk.24" #define FANGSONGTI "cclibb.24" #define HEITI "cclibh.24" #define USERDEF "cclibu.24" extern int font_height, font_width; extern float linespace, charspace; #define _CSP (font_width+charspace) #define _ASP ((float)font_width/2+charspace) #define _CLP (maxFont_height+linespace) #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /*page margins*/ extern int _LM, _RM, _TM, _BM, _FI; struct Page { long offset; int _LM, _RM, _TM, _BM, _FI; int font_height, font_width; int chfont; int lineNo; }; extern struct Page page[]; struct CHfont { char name[20]; FILE *fp; int height, width; }; extern struct CHfont CHFONT[]; extern int CFP; extern char cfont_name[]; extern char filename[]; extern char stheader[], stfooter[]; extern int offset_CH; extern int size_of_CH; /* extern char line[500]; */ extern int charcount; extern int Analyse_flag; extern int page_begin_print, page_end_print; extern int endpage_flag; extern int format_flag; extern int pageno_flag; extern int pagecounter; extern int linecounter; extern float line_h[]; extern int setgray; extern FILE *in, *out; extern FILE *cfont; extern float H, V; extern int ASCshow(); extern int put_ASC(); extern int put_CH(); extern int putChar(); extern int putString(); extern int DefCHdict(); extern int AnalyseDoc(); extern int init(); extern int cleanup(); extern int readchar(); extern int get_bmp(); extern void usage(); /* gbmain */ int _LM, _RM, _TM, _BM, _FI; char stheader[100], stfooter[100]; int pageno_flag = TRUE; int endpage_flag = FALSE; int pagecounter = 1; int page_begin_print = 1, page_end_print = -1; float linespace = 3.0; float charspace = 0.07; struct CHfont CHFONT[6]; int CFP = 0; char cfont_name[100]; char filename[100]; int font_height, font_width; int offset_CH = 0; /* int size_of_CH = 150; /* 4+1+72*2+1 */ int size_of_CH = 72; /* 24*24/8 */ /* char line[500]; */ int charcount = 0; int format_flag = FALSE; int Analyse_flag = TRUE; FILE *in, *out; FILE *cfont; float H, V; main(argc, argv) int argc; char **argv; { int ch = 0, ch1, ch2; int i; *stheader = *stfooter = 0; i = init(argc, argv); init_page(); AnalyseDoc(); fprintf(stderr, "Page(s):"); ps_header(); begin_page(); while (((ch1 = readchar()) != EOF) && (pagecounter != page_end_print)) { if (!ch) ch2 = readchar(); else { ch2 = ch1; ch1 = ch; } ch = putChar(ch1, ch2); } if (pagecounter != page_end_print) end_page(); fprintf(out, "end\n"); ps_end(); cleanup(i); fprintf(stderr, "\n"); } /* gbinit */ char pathname[50]; int init(arg, arglist) int arg; char **arglist; { char **i; int k = 0; *cfont_name = 0; out = stdout; for (i = arglist + 1; i < arglist + arg; i++) switch (**i) { case '-': switch (*((*i) + 1)) { case 'f': format_flag = TRUE; break; case 'p': pageno_flag = FALSE; break; case 'b': sscanf(*(++i), "%d", &page_begin_print); if (page_begin_print < 1) page_begin_print = 1; break; case 'e': sscanf(*(++i), "%d", &page_end_print); if (page_end_print < 1) page_end_print = -1; else page_end_print += 1; break; case 'h': default: usage(); exit(0); break; } break; default: switch (k) { case 0: strcpy(filename, *i); if ((in = fopen(*i, "r")) == NULL) { fprintf(stderr, "Can't open input file -> %s\n", *i); exit(1); } k++; break; case 1: if ((out = fopen(*i, "w")) == NULL) { fprintf(stderr, "Can't open output file -> %s\n", *i); exit(1); } k++; break; } } if (k < 2) { if (k < 1) fprintf(stderr, "Input file name not supplied.\n"); else fprintf(stderr, "Output file name not supplied.\n"); fprintf(stderr, "Usage:\tgb2ps [-h] [-f] [-p] [-b page] [-e page] input_file [output_file]\n"); exit(1); } if (*pathname == 0) if (getenv("GB2PSDIR") != NULL) strcpy(pathname, getenv("GB2PSDIR")); else strcpy(pathname, GB2PSDIR); strcpy(cfont_name, pathname); strcat(cfont_name, PATHSEP); strcat(cfont_name, SONGTI); if ((cfont = fopen(cfont_name, "r")) != NULL) { CHFONT[0].fp = cfont; strcpy(CHFONT[0].name, "SONG 24"); CHFONT[0].height = 10; CHFONT[0].width = 10; } else { fprintf(stderr, "Cannot open font file -> %s\n", cfont_name); exit(1); } strcpy(cfont_name, pathname); strcat(cfont_name, PATHSEP); strcat(cfont_name, KEITI); if ((cfont = fopen(cfont_name, "r")) != NULL) { CHFONT[1].fp = cfont; strcpy(CHFONT[1].name, "KEI 24"); CHFONT[1].height = 10; CHFONT[1].width = 10; } else { fprintf(stderr, "Warning: cannot open font file -> %s, use %s instead.\n", KEITI, SONGTI); CHFONT[1] = CHFONT[0]; } strcpy(cfont_name, pathname); strcat(cfont_name, PATHSEP); strcat(cfont_name, FANGSONGTI); if ((cfont = fopen(cfont_name, "r")) != NULL) { CHFONT[2].fp = cfont; strcpy(CHFONT[2].name, "FANG SONG 24"); CHFONT[2].height = 10; CHFONT[2].width = 10; } else { fprintf(stderr, "Warning: cannot open font file -> %s, use %s instead.\n", FANGSONGTI, SONGTI); CHFONT[2] = CHFONT[0]; } strcpy(cfont_name, pathname); strcat(cfont_name, PATHSEP); strcat(cfont_name, HEITI); if ((cfont = fopen(cfont_name, "r")) != NULL) { CHFONT[3].fp = cfont; strcpy(CHFONT[3].name, "HEI 24"); CHFONT[3].height = 10; CHFONT[3].width = 10; } else { fprintf(stderr, "Warning: cannot open font file -> %s, use %s instead.\n", HEITI, SONGTI); CHFONT[3] = CHFONT[0]; } strcpy(cfont_name, pathname); strcat(cfont_name, PATHSEP); strcat(cfont_name, FANTI); if ((cfont = fopen(cfont_name, "r")) != NULL) { CHFONT[4].fp = cfont; strcpy(CHFONT[4].name, "FAN 24"); CHFONT[4].height = 10; CHFONT[4].width = 10; } else { fprintf(stderr, "Warning: cannot open font file -> %s, use %s instead.\n", FANTI, SONGTI); CHFONT[4] = CHFONT[0]; } strcpy(cfont_name, pathname); strcat(cfont_name, PATHSEP); strcat(cfont_name, USERDEF); if ((cfont = fopen(cfont_name, "r")) != NULL) { CHFONT[5].fp = cfont; strcpy(CHFONT[5].name, "USER 24"); CHFONT[5].height = 10; CHFONT[5].width = 10; } else { CHFONT[5] = CHFONT[0]; } return k; } cleanup(i) int i; { switch (i) { case 2: fclose(out); break; case 1: fclose(in); break; } cfont = CHFONT[0].fp; fclose(CHFONT[0].fp); if (cfont != CHFONT[1].fp) fclose(CHFONT[1].fp); if (cfont != CHFONT[2].fp) fclose(CHFONT[2].fp); if (cfont != CHFONT[3].fp) fclose(CHFONT[3].fp); if (cfont != CHFONT[4].fp) fclose(CHFONT[4].fp); if (cfont != CHFONT[5].fp) fclose(CHFONT[5].fp); } /* gbchar */ int CHcode[8836][6]; int ascflag = FALSE; int CH_mode = FALSE; int paraflag = TRUE; int newpage_flag = TRUE; int file_pointer_flag; struct Page page[400]; int linecounter = 0; float line_h[26400]; int maxFont_height = 0; /* will be set when read commands */ int commandcounter = 0; int rotate_flag = FALSE; int setgray = 0; ASCshow() { if (ascflag) { if (!Analyse_flag) fprintf(out, ") S\n"); ascflag = FALSE; } } newline() { charcount = 0; H = _LM; ASCshow(); if (maxFont_height < font_height) maxFont_height = font_height; if (Analyse_flag) { if (newpage_flag) { newpage_flag = FALSE; V = _TM - _CLP; } V -= _CLP; line_h[linecounter] = _CLP; linecounter++; maxFont_height = 0; } else { V -= line_h[linecounter]; linecounter++; } if (V < _BM) { if (endpage_flag) { end_page(); begin_page(); newpage_flag = TRUE; endpage_flag = FALSE; } else { endpage_flag = TRUE; /* printf("==Page %d lines:%d offset:%d V=%f\n", pagecounter,linecounter,ftell(in)-file_pointer_flag,V); */ if (Analyse_flag) { page[pagecounter + 1].offset = ftell(in) - file_pointer_flag; page[pagecounter + 1].chfont = CFP; page[pagecounter + 1].font_height = font_height; page[pagecounter + 1].font_width = font_width; page[pagecounter + 1]._LM = _LM; page[pagecounter + 1]._RM = _RM; page[pagecounter + 1]._TM = _TM; page[pagecounter + 1]._BM = _BM; page[pagecounter + 1]._FI = _FI; page[pagecounter + 1].lineNo = linecounter - 1; } } } } put_ASC(c) int c; { if (c == 26 || c == EOF || c == 0) return; charcount++; if (maxFont_height < font_height) maxFont_height = font_height; if (paraflag) { H = _LM; H += _FI; paraflag = FALSE; } if (endpage_flag) { end_page(); begin_page(); newpage_flag = TRUE; endpage_flag = FALSE; } if (Analyse_flag) { if ((c >= ' ') && (!ascflag)) ascflag = TRUE; } else { if (c >= ' ') { if (!ascflag) { ascflag = TRUE; fprintf(out, "%.0f %.0f M (", H + 0.5, V + 0.5); } if ((c <= 0x7f) && (c >= 0x20) && (c != '(') && (c != ')')) fprintf(out, "%c", c); else fprintf(out, "\\%03o", c); } else fprintf(out, " "); } H += _ASP; if (H > _RM) newline(); } put_CH(ch1, ch2) int ch1, ch2; { long addr; char st1[10]; char st2[200]; charcount += 2; ASCshow(); if (maxFont_height < font_height) maxFont_height = font_height; if (paraflag) { H = _LM; H += _FI; paraflag = FALSE; } if (endpage_flag) { end_page(); begin_page(); newpage_flag = TRUE; endpage_flag = FALSE; } if (Analyse_flag) { if ((pagecounter >= page_begin_print) && (pagecounter != page_end_print)) CHcode[(ch1 - 0xA1) * QUWEI + ch2 - 0xA1][CFP] += 1; } else if (ch1 != 0xa1 || ch2 != 0xa1) { addr = (ch1 - 0xA1) * QUWEI + ch2 - 0xA1; fprintf(out, "%.0f %.0f ", H + 0.5, V + 0.5); if (CHcode[addr][CFP] >= CHAR_LIMIT) /* QuWei code start from 1 */ fprintf(out, "C%1d%02d%02d\n", CFP, ch1 - 0xa0, ch2 - 0xa0); else { /***** fseek(cfont, (long) (offset_CH + addr * size_of_CH), 0); fgets(line, size_of_CH, cfont); sscanf(line, "%s %s", st1, st2); *****/ get_bmp(cfont, addr, st1, st2); fprintf(out, "H {<%s>} I G\n", st2); } } H += _CSP; if (H > _RM) newline(); } int putChar(ch1, ch2) int ch1, ch2; { int k, k1; file_pointer_flag = 1; switch (ch1) { case 13: case 26: break; /* for PC format file */ case '\n': paraflag = TRUE; newline(); break; case '\t': k1 = 8 - charcount % 8; for (k = 0; k <= k1; k++) put_ASC(' '); break; case 12: end_page(); break; case EOF: return EOF; default: if (ch1 >= 0xA1) { switch (ch2) { case 13: case 26: /* for PC format file */ case EOF: put_ASC(ch1); return EOF; case '\n': case 0: put_ASC(ch1); paraflag = TRUE; newline(); break; case 12: put_ASC(ch1); end_page(); break; default: if (ch2 < 0xA1) { put_ASC(ch1); file_pointer_flag = 0; put_ASC(ch2); } else { file_pointer_flag = 0; put_CH(ch1, ch2); } } return 0; } else put_ASC(ch1); } return ch2; } putString(st) char *st; { int i, ch, ch1, ch2, len; i = 0; ch = 0; len = strlen(st); while (i <= len) { ch1 = st[i++]; if (!ch) ch2 = st[i++]; else { ch2 = ch1; ch1 = ch; } ch = putChar(ch1, ch2); } } /*===========================================================================*/ DefCHdict() { long i, j, k = 0; char st1[10]; char st2[200]; for (i = 0; i < QUWEI * QUWEI; i++) for (j = 0; j < 6; j++) { if (CHcode[i][j] >= CHAR_LIMIT) k++; } fprintf(out, "/CHdict %d dict def\nCHdict begin\n", k + 400); for (i = 0; i < QUWEI * QUWEI; i++) for (j = 0; j < 6; j++) { if (CHcode[i][j] >= CHAR_LIMIT) { /***** fseek(CHFONT[j].fp, (long) (offset_CH + i * size_of_CH), 0); fgets(line, size_of_CH, CHFONT[j].fp); sscanf(line, "%s %s", st1, st2); *****/ get_bmp(CHFONT[j].fp, i, st1, st2); fprintf(out, "/C%1d%s {H {<%s>} I G} def \n", j, st1, st2); } } } /*AnalyseDoc: analyse the input document.*/ int AnalyseDoc() { int ch = 0, ch1, ch2, i, j; for (i = 0; i < QUWEI * QUWEI; i++) for (j = 0; j < 6; j++) CHcode[i][j] = 0;; begin_page(); while ((ch1 = readchar()) != EOF) { if (!ch) ch2 = readchar(); else { ch2 = ch1; ch1 = ch; } ch = putChar(ch1, ch2); } newline(); if (pagecounter >= page_begin_print) { CFP = page[page_begin_print].chfont; cfont = CHFONT[CFP].fp; _LM = page[page_begin_print]._LM; _RM = page[page_begin_print]._RM; _TM = page[page_begin_print]._TM; _BM = page[page_begin_print]._BM; _FI = page[page_begin_print]._FI; linecounter = page[page_begin_print].lineNo; font_height = page[page_begin_print].font_height; font_width = page[page_begin_print].font_width; fseek(in, page[page_begin_print].offset, 0); pagecounter = page_begin_print; } else { fprintf(stderr, "The file %s only has %d Page(s).\n", filename, pagecounter); exit(1); } Analyse_flag = FALSE; H = _LM; paraflag = TRUE; ascflag = FALSE; CH_mode = FALSE; } int readchar() { int c; int tmp; float tmp1 = 0.0; c = fgetc(in); while (c == '~') { tmp = fgetc(in); switch (tmp) { case '{': CH_mode = TRUE; break; case '}': CH_mode = FALSE; break; case '~': break; case '\n': break; default: ungetc(tmp, in); } if (tmp == '~') break; else c = fgetc(in); } if (CH_mode) if (((c & 0x7f) >= 0x21) && ((c & 0x7f) <= 0x7e)) return c | 0x80; else { CH_mode = FALSE; return c; } if (!format_flag) return c; if (c == '<') { ASCshow(); commandcounter = ftell(in); while ((c != '>') && (c != EOF)) { c = fgetc(in); if (c == '<') break; switch (c) { case '<': case EOF: break; case 'L': fscanf(in, "%d", &tmp); if (tmp > 0) linespace = tmp; break; case 'C': fscanf(in, "%f", &tmp1); if (tmp1 > 0) charspace = tmp1; break; case 'B': fscanf(in, "%f", &tmp1); V = -tmp1; break; case 'm': fscanf(in, "%f", &tmp1); if (tmp1 > 0) H = tmp1; fscanf(in, "%f", &tmp1); if (tmp1 > 0) V = tmp1; break; case 'M': switch (c = fgetc(in)) { case 'L': fscanf(in, "%d", &tmp); if (tmp > 0) _LM = tmp; if (H < tmp) H = (float) tmp; break; case 'R': fscanf(in, "%d", &tmp); if (tmp > 0) _RM = 572 - tmp; break; case 'T': fscanf(in, "%d", &tmp); if (tmp > 0) _TM = 832 - tmp; break; case 'B': fscanf(in, "%d", &tmp); if (tmp > 0) _BM = tmp; break; case 'I': fscanf(in, "%d", &tmp); _FI = tmp; break; } break; case 'F': switch (c = fgetc(in)) { case 'S': case 's': CFP = 0; cfont = CHFONT[CFP].fp; break; case 'K': case 'k': CFP = 1; cfont = CHFONT[CFP].fp; break; case 'F': case 'f': CFP = 2; cfont = CHFONT[CFP].fp; break; case 'H': case 'h': CFP = 3; cfont = CHFONT[CFP].fp; break; case 'G': case 'g': CFP = 4; cfont = CHFONT[CFP].fp; break; case 'U': case 'u': CFP = 5; cfont = CHFONT[CFP].fp; break; case 'Z': case 'z': fscanf(in, "%d", &tmp); if (tmp > 0) font_width = tmp; fscanf(in, "%d", &tmp); if (tmp > 0) font_height = tmp; if (!Analyse_flag) { fprintf(out, "/Courier findfont [%.2f 0 0 %.2f 0 0] makefont setfont\n", 0.837 * font_width, 1.5 * font_height); fprintf(out, "/H {moveto gsave currentpoint translate %d %d scale 24 24 true [24 0 0 -24 0 24]}def\n", font_width, font_height); } break; case 'R': case 'r': fscanf(in, "%d", &tmp); if (!Analyse_flag) { if (tmp == 0) { fprintf(out, "/Courier findfont [%.2f 0 0 %.2f 0 0] makefont setfont\n", 0.837 * font_width, 1.5 * font_height); fprintf(out, "/H {moveto gsave currentpoint translate %d %d scale 24 24 true [24 0 0 -24 0 24]}def\n", font_width, font_height); } else { fprintf(out, "/H {moveto gsave currentpoint translate %d %d scale 24 24 true [24 0 0 -24 0 24] %d rotate}def\n", font_width, font_height, tmp); } } break; case 'O': case 'o': tmp = font_width; font_width = font_height; font_height = tmp; rotate_flag = (!rotate_flag); if (rotate_flag == FALSE) { H -= font_height; if (!Analyse_flag) fprintf(out, "/H {moveto gsave currentpoint translate %d %d scale 24 24 true [24 0 0 -24 0 24]}def\n", font_width, font_height); } else { H += font_width; if (!Analyse_flag) fprintf(out, "/H {moveto gsave currentpoint translate %d %d scale 24 24 true [24 0 0 -24 0 24] 90 rotate}def\n", font_width, font_height); } break; } break; case 'G': fscanf(in, "%d", &tmp); if ((tmp >= 0) && (!Analyse_flag)) { setgray = tmp; fprintf(out, "%.2f setgray\n", (float) tmp / 100.0); } break; } } } if (c == '>') c = fgetc(in); return c; } /* gbpage */ init_page() { /* define margins, line space and character space*/ _LM = 72; _RM = 500; _TM = 760; _BM = 72; _FI = 0; V = _TM; H = _LM; charcount = 0; CFP = 0; cfont = CHFONT[0].fp; font_height = CHFONT[0].height; font_width = CHFONT[0].width; page[0].offset = 0; page[0].chfont = CFP; page[0].font_height = font_height; page[0].font_width = font_width; page[0]._LM = _LM; page[0]._RM = _RM; page[0]._TM = _TM; page[0]._BM = _BM; page[0]._FI = _FI; page[0].lineNo = 0; page[1] = page[0]; } begin_page() { if (!Analyse_flag) { if (pagecounter == page_end_print) return; fprintf(stderr, " [%d]", pagecounter); fflush(stderr); fprintf(out, "%%%%Page: %d %d\n", pagecounter, pagecounter); fprintf(out, "/Courier findfont [%.2f 0 0 %.2f 0 0] makefont setfont\n", 0.837 * font_width, 1.5 * font_height); fprintf(out, "/H {moveto gsave currentpoint translate %d %d scale 24 24 true [24 0 0 -24 0 24]}def\n", font_width, font_height); fprintf(out, "save\n"); if (setgray != 0) fprintf(out, "%.2f setgray\n", (float) setgray / 100.0); } if (*stheader) { if (!Analyse_flag) { fprintf(out, "/tempdict 100 dict\ntempdict begin\n"); fprintf(out, "/Courier findfont [%.2f 0 0 %.2f 0 0] makefont setfont\n", 8.37, 15.0); fprintf(out, "/H {moveto gsave currentpoint translate 10 10 scale 24 24 true [24 0 0 -24 0 24]}def\n"); fprintf(out, "end\n"); } V = _TM + 24; H = _LM; putString(stheader); ASCshow(); } V = _TM - line_h[linecounter]; charcount = 0; } end_page() { if (pagecounter) { ASCshow(); if (!Analyse_flag) { fprintf(out, "/Courier findfont [%.2f 0 0 %.2f 0 0] makefont setfont\n", 8.37, 15.0); fprintf(out, "/H {moveto gsave currentpoint translate 10 10 scale 24 24 true [24 0 0 -24 0 24]}def\n"); } if (*stfooter) { H = _LM; V = 48; putString(stfooter); ASCshow(); } if (!Analyse_flag) { if (pageno_flag) { fprintf(out, "%d %d M (%d) S\n", 300, _BM - 24, pagecounter); } fprintf(out, "endpage\n"); } } pagecounter++; } ps_header() { fprintf(out, "%%!PS-Adobe-1.0\n"); fprintf(out, "%%%%Creator: W. SUN, ANU\n"); fprintf(out, "%%%%Pages: (atend)\n"); fprintf(out, "%%%%EndComments\n"); fprintf(out, "%%%%BeginProlog\n"); fprintf(out, "/endpage {showpage restore} def\n"); fprintf(out, "/G /grestore load def\n"); fprintf(out, "/I /imagemask load def\n"); fprintf(out, "/M /moveto load def\n"); fprintf(out, "/S /show load def\n"); DefCHdict(); fprintf(out, "%%%%EndProlog\n"); } ps_end() { fprintf(out, "%%%%Trailer\n"); fprintf(out, "%%%%Pages: %d\n", pagecounter - 1); } int get_bmp(fnt_fp, word_indx, qu_wei, hex_array) FILE *fnt_fp; long word_indx; char *qu_wei, *hex_array; { int i, qu, wei; char hextmp[3]; unsigned char bmpbuf[200]; /* must be unsigned char ? */ /* get QuWei identifier string */ qu = (int) (word_indx / QUWEI) + 1; wei = (int) (word_indx % QUWEI) + 1; sprintf(qu_wei, "%02d%02d", qu, wei); /* get hexadecimal string representation of a character bitmap */ hex_array[0] = '\0'; /* making sure it starts as a null string */ fseek(fnt_fp, (long) (offset_CH + word_indx * size_of_CH), 0); (void) fread(bmpbuf, sizeof(unsigned char), (size_t) size_of_CH, fnt_fp); for (i = 0; i < size_of_CH; i++) { sprintf(hextmp, "%02x", bmpbuf[i]); strcat(hex_array, hextmp); } } void usage() { fprintf(stderr, "Usage:\tgb2ps [-h] [-f] [-p] [-b page] [-e page] input [output]\n\n"); fprintf(stderr, "\t-h\t help\n"); fprintf(stderr, "\t-f\t process text formatting commands <>\n"); fprintf(stderr, "\t-p\t do not generate page number\n"); fprintf(stderr, "\t-b page\t begin from page [default 1]\n"); fprintf(stderr, "\t-e page\t end at page [default last]\n\n"); fprintf(stderr, "Text formatting commands are embedded between '<' and '>'.\n\ Multiple commands inside <> are separated by space. The unit is point.\n\n"); fprintf(stderr,"\ (1) Font command 'F':\n\ FS FK FF FH FG FU -> Type face: Song, Kai, Fangsong, Hei, Fan, User.\n\ Fs Fk Ff Fh Fg Fu default Song.\n\ FZ xxx yyy -> Font size: scale of the font in X and Y directions.\n\ Fz xxx yyy default FZ 10 10\n\ FO or Fo -> Toggle: horizontal and vertical orientation.\n\n"); fprintf(stderr,"\ (2) Margin command 'M':\n\ ML nnn -> Left margin, default 72.\n\ MR nnn -> Right margin, default 72.\n\ MT nnn -> Top margin, default 72.\n\ MB nnn -> Bottom margin, default 72.\n\ MI [-]nnn -> First line indent, default 0.\n\n"); fprintf(stderr,"\ (3) Miscellaneous:\n\ << -> Print a single '<'.\n\ G nnn -> Set gray level, 0 <= nnn <= 100, default 0 (black).\n\ L nnn.nn -> Line spacing, default 3.0.\n\ C nnn.nn -> Character spacing, default 0.07.\n\ B [-]nn -> Adjust baseline up or down.\n\ m xxx yyy -> Move current position to (xxx, yyy).\n"); }