summaryrefslogtreecommitdiff
path: root/fonts/psfonts/tools/vptovf.ch
diff options
context:
space:
mode:
Diffstat (limited to 'fonts/psfonts/tools/vptovf.ch')
-rw-r--r--fonts/psfonts/tools/vptovf.ch325
1 files changed, 325 insertions, 0 deletions
diff --git a/fonts/psfonts/tools/vptovf.ch b/fonts/psfonts/tools/vptovf.ch
new file mode 100644
index 0000000000..3a6853865f
--- /dev/null
+++ b/fonts/psfonts/tools/vptovf.ch
@@ -0,0 +1,325 @@
+% vptovf.ch for C compilation with web2c.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [0] WEAVE: print changes only.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+\pageno=\contentspagenumber \advance\pageno by 1
+@y
+\pageno=\contentspagenumber \advance\pageno by 1
+\let\maybe=\iffalse
+\def\title{VP$\,$\lowercase{to}$\,$VF changes for C}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1] Change banner string.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d banner=='This is VPtoVF, Version 1.4' {printed when the program starts}
+@y
+@d banner=='This is VPtoVF, Version 1.4' {more is printed later}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [2] Remove filenames from program statement, and print the banner later.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p program VPtoVF(@!vpl_file,@!vf_file,@!tfm_file,@!output);
+@y
+@p program VPtoVF;
+@z
+
+@x
+ begin print_ln(banner);@/
+@y
+ begin
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% increase max. ligtable size:
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!max_lig_steps=5000;
+ {maximum length of ligature program, must be at most $32767-257=32510$}
+@!max_kerns=500; {the maximum number of distinct kern values}
+@!hash_size=5003; {preferably a prime number, a bit larger than the number
+ of character pairs in lig/kern steps}
+@y
+@!max_lig_steps=32000;
+ {maximum length of ligature program, must be at most $32767-257=32510$}
+@!max_kerns=15000; {the maximum number of distinct kern values}
+@!hash_size=15077; {preferably a prime number, a bit larger than the number
+ of character pairs in lig/kern steps}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6] Open VPL file.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+reset(vpl_file);
+@y
+if (argc < 4) or (argc > n_options + 4)
+then begin
+ print_ln ('Usage: vptovf [-verbose] <vpl file> <vfm file> <tfm file>.');
+ uexit (1);
+end;
+@<Initialize the option variables@>;
+@<Parse arguments@>;
+argv (optind, vpl_name);
+reset (vpl_file, vpl_name);
+if verbose then begin
+ print (banner);
+ print_ln (banner);
+end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [21] Declare filename variables.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!tfm_file:packed file of 0..255;
+@y
+@!tfm_file:packed file of 0..255;
+@!vf_name,@!tfm_name,@!vpl_name:packed array[1..PATH_MAX] of char;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [22] Open output files.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ On some systems you may have to do something special to write a
+packed file of bytes. For example, the following code didn't work
+when it was first tried at Stanford, because packed files have to be
+opened with a special switch setting on the \PASCAL\ that was used.
+@^system dependencies@>
+
+@<Set init...@>=
+rewrite(vf_file); rewrite(tfm_file);
+@y
+@ On some systems you may have to do something special to write a
+packed file of bytes.
+@^system dependencies@>
+
+@<Set init...@>=
+argv(optind + 1, vf_name);
+rewrite(vf_file, vf_name);
+argv(optind + 2, tfm_name);
+rewrite(tfm_file, tfm_name);
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [89] `index' is not a good choice for an identifier on Unix systems.
+% Neither is `class', on AIX.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+|k|th element of its list.
+
+@<Glob...@>=
+@!index:array[pointer] of byte;
+@y
+|k|th element of its list.
+
+@d index == index_var
+@d class == class_var
+
+@<Glob...@>=
+@!index:array[pointer] of byte;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [118] No output unless verbose.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Print |c| in octal notation@>;
+@y
+if verbose then @<Print |c| in octal notation@>;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [144] Output of real numbers.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @d round_message(#)==if delta>0 then print_ln('I had to round some ',
+@.I had to round...@>
+ #,'s by ',(((delta+1) div 2)/@'4000000):1:7,' units.')
+@y
+@ @d round_message(#)==if delta>0 then begin print('I had to round some ',
+@.I had to round...@>
+ #,'s by '); print_real((((delta+1) div 2)/@'4000000),1,7);
+ print_ln(' units.'); end
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [152] Fix up the mutually recursive procedures a la pltotf.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p function f(@!h,@!x,@!y:indx):indx; forward;@t\2@>
+ {compute $f$ for arguments known to be in |hash[h]|}
+@y
+@p
+ifdef('notdef')
+function f(@!h,@!x,@!y:indx):indx; begin end;@t\2@>
+ {compute $f$ for arguments known to be in |hash[h]|}
+endif('notdef')
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [153] Finish fixing up f.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p function f;
+@y
+@p function f(@!h,@!x,@!y:indx):indx;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [156] Change TFM-byte output to fix ranges.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d out(#)==write(tfm_file,#)
+@y
+@d out(#)==putbyte(#,tfm_file)
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [165] Fix output of reals.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure out_scaled(x:fix_word); {outputs a scaled |fix_word|}
+var @!n:byte; {the first byte after the sign}
+@!m:0..65535; {the two least significant bytes}
+begin if abs(x/design_units)>=16.0 then
+ begin print_ln('The relative dimension ',x/@'4000000:1:3,
+ ' is too large.');
+@.The relative dimension...@>
+ print(' (Must be less than 16*designsize');
+ if design_units<>unity then print(' =',design_units/@'200000:1:3,
+ ' designunits');
+@y
+@p procedure out_scaled(x:fix_word); {outputs a scaled |fix_word|}
+var @!n:byte; {the first byte after the sign}
+@!m:0..65535; {the two least significant bytes}
+begin if fabs(x/design_units)>=16.0 then
+ begin print('The relative dimension ');
+ print_real(x/@'4000000,1,3);
+ print_ln(' is too large.');
+@.The relative dimension...@>
+ print(' (Must be less than 16*designsize');
+ if design_units<>unity then begin print(' =');
+ print_real(design_units/@'200000,1,3);
+ print(' designunits');
+ end;
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [141] char_remainder[c] is unsigned, and label_table[sort_ptr].rr
+% might be -1, and if -1 is coerced to being unsigned, it will be bigger
+% than anything else.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ while label_table[sort_ptr].rr>char_remainder[c] do
+@y
+ while label_table[sort_ptr].rr>toint(char_remainder[c]) do
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [175] Change VF-byte output to fix ranges.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d vout(#)==write(vf_file,#)
+@y
+@d vout(#)==putbyte(#,vf_file)
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [181] Be quiet unless verbose.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+read_input; print_ln('.');@/
+@y
+read_input;
+if verbose then print_ln('.');
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [182] System-dependent changes.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@* System-dependent changes.
+This section should be replaced, if necessary, by changes to the program
+that are necessary to make \.{VPtoVF} work at a particular installation.
+It is usually best to design your change file so that all changes to
+previous sections preserve the section numbering; then everybody's version
+will be consistent with the printed program. More extensive changes,
+which introduce new sections, can be inserted here; then only the index
+itself will get a new section number.
+@^system dependencies@>
+@y
+@* System-dependent changes. We want to parse a Unix-style command line.
+
+@<Parse arguments@> =
+begin
+ @<Define the option table@>;
+ repeat
+ getopt_return_val := getopt_long_only (argc, gargv, '', long_options,
+ address_of_int (option_index));
+ if getopt_return_val <> -1
+ then begin
+ if getopt_return_val = "?"
+ then uexit (1); {|getopt| has already given an error message.}
+ {We don't have any non-flag options.}
+ end;
+ until getopt_return_val = -1;
+
+ {Now |optind| is the index of first non-option on the command line.}
+end
+
+
+@ The array of information we pass in. The type |getopt_struct| is
+defined in C, to avoid type clashes. We also need to know the return
+value from getopt, and the index of the current option.
+
+@<Local var...@> =
+@!long_options: array[0..n_options] of getopt_struct;
+@!getopt_return_val: integer;
+@!option_index: c_int_type;
+
+
+@ Here are the options we allow.
+
+@<Define the option...@> =
+long_options[0].name := 'verbose';
+long_options[0].has_arg := 0;
+long_options[0].flag := address_of_int (verbose);
+long_options[0].val := 1;
+
+
+@ The global variable |verbose| determines whether or not we print
+progress information.
+
+@<Glob...@> =
+@!verbose: c_int_type;
+
+@ It starts off |false|.
+
+@<Initialize the option...@> =
+verbose := false;
+
+
+@ An element with all zeros always ends the list.
+
+@<Define the option...@> =
+long_options[1].name := 0;
+long_options[1].has_arg := 0;
+long_options[1].flag := 0;
+long_options[1].val := 0;
+
+
+@ Pascal compilers won't count the number of elements in an array
+constant for us. This doesn't include the zero-element at the end,
+because this array starts at index zero.
+
+@<Constants...@> =
+n_options = 1;
+@z