diff options
Diffstat (limited to 'fonts/utilities/ps2mf/chr2ps.c')
-rw-r--r-- | fonts/utilities/ps2mf/chr2ps.c | 350 |
1 files changed, 350 insertions, 0 deletions
diff --git a/fonts/utilities/ps2mf/chr2ps.c b/fonts/utilities/ps2mf/chr2ps.c new file mode 100644 index 0000000000..0e78ea1c25 --- /dev/null +++ b/fonts/utilities/ps2mf/chr2ps.c @@ -0,0 +1,350 @@ +/* CHR2PS.C */ + +#define VERSION "1.0 (beta)" + +#include <stdio.h> +#include <string.h> +#ifndef AIX +#include <stdlib.h> +#endif +#include "defines.h" +#include "myopen.h" +#include "chr2ps.h" + +void give_usage () +{ + fprintf (stderr, "Usage: chr2ps [<somechr[.chr]|-]"); + fprintf (stderr, " [<someps>[.ps]]\n"); + exit (UNSUCCESSFUL); +} + +#ifdef __STDC__ +void preamble (int argc, char ** argv) +#else +void preamble (argc, argv) +int argc; +char ** argv; +#endif +{ + if (argc == 1) give_usage (); + if (argc == 3) + { + if (strequ (argv [1], "-")) chr_file = stdin; + else chr_file = my_open (argv [1], ".chr", "rb"); + ps_file = my_open (argv [2], ".ps", "w"); + } + else + { + chr_file = my_open (argv [1], ".chr", "rb"); + ps_file = my_open (argv [1], ".ps", "w"); + } +} + +void postamble () +{ + fclose (chr_file); + fclose (ps_file); + fprintf (stderr, "Conversion done\n"); + exit (SUCCESSFUL); +} + +#ifdef __STDC__ +unsigned char ReadChar (void) +#else +unsigned char ReadChar () +#endif +{ + char Inc; + + if (! HaveSavedChar) + { + fread (&Inc, 1, 1, chr_file); + /* translate CR, LF or CR/LF to '\n' */ + if (Inc == '\r') /* CR = 0x0D */ + { + fread (&Inc, 1, 1, chr_file); + if (Inc != '\n') /* LF = 0x0A */ + { + HaveSavedChar = TRUE; + SavedChar = Inc; + } + Inc = '\n'; + } + } + else + { + Inc = SavedChar; + HaveSavedChar = FALSE; + } + return (Inc); +} + +#ifdef __STDC__ +void ReadLine (void) +#else +void ReadLine () +#endif +{ +/* read another line (binary mode!) + do not include the \r and \n characters + */ +/* assume a line is terminated by CR, LF or CR/LF */ + + char_pos = in_buff; + * in_buff = NULLCHAR; + in_size = 0; + while (! feof (chr_file)) + { + inchar = ReadChar (); + if (inchar != '\n') + { + in_buff [in_size] = inchar; + in_size++; + } + else + { + break; + } + } + in_buff [in_size] = NULLCHAR; +} + +#ifdef __STDC__ +unsigned char DeCrypt (unsigned char cipher) +#else +unsigned char DeCrypt(cipher) +unsigned char cipher; +#endif +{ + unsigned char plain; + + plain = (cipher ^ (cr >> 8)); + cr = (cipher + cr) * cc1 + cc2; + return plain; +} + +#ifdef __STDC__ +void DecryptCharString (unsigned char * CS, int count) +#else +void DecryptCharString (CS, count) +unsigned char * CS; +int count; +#endif +{ + int i; + unsigned char byte; + long value; + int out_size; + + cr = CR; cc1 = CC1; cc2 = CC2; + out_size = 0; + fputs("{ ", ps_file); + for (i = 0; i < lenIV; i++) byte = DeCrypt (CS [i]); + for (i = lenIV ; i < count ; ) + { + byte = DeCrypt (CS [i ++]); + if (byte == 11) + { + fprintf (ps_file, " %s", commands [byte] . command); + break; + } + else if (byte == 12) + { + byte = DeCrypt (CS [i ++]); + if (byte > MAX_ESCAPE) + { + out_size = out_size + 17; + if (out_size > out_break) + { + out_size = 0; + fprintf (ps_file, "\n "); + } + fprintf (ps_file, " not_defined_e%d", byte); + } + else + { + out_size = out_size + + strlen (escapes [byte] . command); + if (out_size > out_break) + { + out_size = 0; + fprintf (ps_file, "\n "); + } + fprintf (ps_file, " %s", + escapes [byte] . command); + } + continue; + } + else if (byte < 32) + { + out_size = out_size + + strlen (commands [byte] . command); + if (out_size > out_break) + { + out_size = 0; + fprintf (ps_file, "\n "); + } + fprintf (ps_file, " %s", commands [byte] . command); + } + if (byte >= 32) + { + if (byte <= 246) + { + out_size = out_size + 4; + if (out_size > out_break) + { + out_size = 0; + fprintf (ps_file, "\n "); + } + fprintf (ps_file, " %d", byte - 139); + } + else if ((byte >= 247) && (byte <= 250)) + { + out_size = out_size + 7; + if (out_size > out_break) + { + out_size = 0; + fprintf (ps_file, "\n "); + } + fprintf (ps_file, " %d", (byte - 247) * 256 + + DeCrypt (CS [i ++]) + 108); + } + else if ((byte >= 251) && (byte <= 254)) + { + out_size = out_size + 7; + if (out_size > out_break) + { + out_size = 0; + fprintf (ps_file, "\n "); + } + fprintf (ps_file, " %d", -(byte - 251) * 256 + - DeCrypt(CS[i++]) - 108); + } + else if (byte == 255) + { + out_size = out_size + 9; + if (out_size > out_break) + { + out_size = 0; + fprintf (ps_file, "\n "); + } + value = DeCrypt (CS [i ++]); + value <<= 8; + value += DeCrypt (CS [i ++]); + value <<= 8; + value += DeCrypt (CS [i ++]); + value <<= 8; + value += DeCrypt (CS [i ++]); + fprintf (ps_file, " %d", value); + } + } + } + fprintf (ps_file, " } "); +} + +#ifdef __STDC__ +void main (int argc, char ** argv) +#else +void main(argc, argv) +int argc; +char ** argv; +#endif +{ + int lusteller; + char ch; + + fprintf (stderr, "This is chr2ps, version: %s\n", VERSION); + preamble (argc, argv); + HaveSavedChar = FALSE; in_size = 0; + fprintf (stderr, " Conversion of charstring to postscript \n"); + fprintf (stderr, " Copying inputfile until /Subrs entry \n"); + for (;;) + { + ReadLine (); + fprintf (ps_file, "%s\n", in_buff); + if (strnequ ((char *) in_buff, "/lenIV", 6)) + { + lenIV = atoi ((char *) in_buff + 7); + } + if (strstr ((char *) in_buff, "/Subrs") != NULL) break; + } + tp = 0; in_size = 0; inchar= ' '; + fprintf (stderr, " Decrypting charstring data now (This may take a while...)\n"); + for (lusteller = 0;; lusteller ++) + { + if (! (lusteller % 20)) fprintf (stderr, "."); + if (feof (chr_file)) break; + prevchar = inchar; + inchar = ReadChar (); + in_size ++; + if (in_size > TEMPSIZE) fputc (temp_buff [tp], ps_file); + temp_buff [tp] = inchar; + if (tp == (TEMPSIZE - 1)) tp = 0; + else tp++; + if ((inchar != '-') && (inchar != 'R')) continue; + if (prevchar != ' ') continue; + if (inchar == '-') testchar = '|'; + else testchar = 'D'; + inchar = ReadChar (); + if (inchar != testchar) + { + in_size++; + if (in_size > TEMPSIZE) fputc (temp_buff [tp], ps_file); + temp_buff[tp] = inchar; + if (tp == (TEMPSIZE - 1)) tp = 0; + else tp++; + continue; + } + inchar = ReadChar (); + testchar = ' '; + if (inchar != testchar) + { + in_size++; + if (in_size > TEMPSIZE) fputc (temp_buff [tp], ps_file); + temp_buff [tp] = inchar; + if (tp == (TEMPSIZE - 1)) tp = 0; + else tp++; + continue; + } + if (in_size > 20) restcount = 20; + else + { + restcount = in_size; + tp = 0; + } + for (i = 0 ; i < restcount ; i++) + { + in_buff [i] = temp_buff [tp]; + if (tp == (TEMPSIZE - 1)) tp = 0; + else tp++; + } + in_buff [restcount] = NULLCHAR; + count_pos = & in_buff [restcount - 2]; + do count_pos --; + while (* count_pos != ' '); + count_pos ++; + count = atoi ((char *) count_pos); + * count_pos = NULLCHAR; + fprintf (ps_file, "%s", in_buff); + in_size = 0; tp = 0; + fread (CharString, 1, count, chr_file); + CharString [count] = NULLCHAR; + DecryptCharString (CharString, count); + } + fprintf (stderr, "\n"); + if (in_size > 20) restcount = 20; + else + { + restcount = in_size; + tp = 0; + } + for (i = 0 ; i < restcount ; i ++) + { + in_buff [i] = temp_buff [tp]; + if (tp == (TEMPSIZE - 1)) tp = 0; + else tp++; + } + in_buff [restcount] = NULLCHAR; + fprintf (ps_file, "%s", in_buff); + postamble (); +} |