diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/rtflatex/rtflatex.c |
Initial commit
Diffstat (limited to 'support/rtflatex/rtflatex.c')
-rw-r--r-- | support/rtflatex/rtflatex.c | 4699 |
1 files changed, 4699 insertions, 0 deletions
diff --git a/support/rtflatex/rtflatex.c b/support/rtflatex/rtflatex.c new file mode 100644 index 0000000000..a7f7385bfe --- /dev/null +++ b/support/rtflatex/rtflatex.c @@ -0,0 +1,4699 @@ +/* Output from p2c 1.21alpha2-dt-Jul.95, the Pascal-to-C translator */ +/* From input file "rtflatex.pas" */ + + +#include "p2crtf.h" +#include "p2c_mods.h" +#include "p2clib_m.c" + + +/* version 2.15 */ + + +#define lmx 511 +#define olmx 1023 +#define maxlevel 72 +#define maxkeyln 64 +#define bfslen 24 +#define numsizes 16 +#define maxfonts 128 +#define maxstyles 12 +#define max_skip_strings 8 +#define maxRTFstyles 64 +#define RTFstyle_length 128 + + +typedef Char string24[bfslen + 1]; + +typedef Char string2[3]; + +typedef Char string5[6]; + +typedef Char string128[129]; + +typedef Char string255[256]; + +typedef Char exline_type[olmx]; +typedef Char string_RTFstyle[RTFstyle_length + 1]; + + +Static FILE *inputfile, *outputfile, *figurefile, *logfile, *skipfile; +Static short catcode[256], digit[256], majusc[256], letter[256]; +Static string24 acc_transl[256], ftech_transl[256]; +Static Char prev_line[lmx], inpline[lmx]; +Static exline_type exline; +Static short tex_verbose, verbose, icharz, numl, kout, kinp, prev_kinp, + bracelvl; +Static short lvlcode[maxlevel + 1], tab_nb_cellx[maxlevel + 1], + tab_nb_ands[maxlevel + 1], tab_cellx[maxlevel + 1]; +Static Char kar, hexaone, hexatwo; +Static string255 next_rtf; +Static boolean removed_ok, write_log, do_it_again, no_space_conv, use_sl, + latex209, latex_header, base_flag, envir_closed_ok, + last_percent, simplify_ok, no_RTFrtf, par_to_begin; +Static short num_styles, input_line_number, numfonts, num_word_fonts, stdsize, + stdkz; +Static string24 close_kar[maxlevel + 1], form_code[maxlevel + 1], + bfslcode[maxlevel + 1], sizecode[maxlevel + 1], + currsize[maxlevel + 1], currbfsl[maxlevel + 1], + spacingcode[maxlevel + 1], active_RTFf[maxlevel + 1]; +Static short center_flag[maxlevel + 1], flushright_flag[maxlevel + 1], + math_mode[maxlevel + 1]; +Static boolean underl_flag[maxlevel + 1], auto_close[maxlevel + 1]; +Static string24 sizekey[numsizes]; +Static short sizeval[3][numsizes]; +Static short sizemags[3][numsizes]; +Static string24 newfonts[maxfonts], word_fonts[maxfonts], + equiv_fonts[maxfonts], font_names[maxfonts]; +Static short word_font_num[maxfonts]; +Static string255 inkeyw; +Static short num_diff_sizes, keyw, cat, ikar, numval, numsign, num_hexa, + num_skip_strings, decl_font_num, num_latex_options, num_indent, + i, j, k, l, m, n; +Static string24 works, worksa, worksb, latex_style, end_math_code; +Static string24 latex_options[maxstyles + 1]; +Static string24 environ_type[11]; +Static string255 skip_strings[max_skip_strings]; +Static short leftskip, rightskip, leftcurskip, rightcurskip, save_skip, + space_after, displ_skip; +Static string_RTFstyle RTFstyles[maxRTFstyles]; +Static short ref_styles[256]; + +Static boolean clbrdrr, clbrdrl, clbrdrt, clbrdrb; + +/* indications to build file names of figure bitmaps */ +Static string128 figure_name, figure_path, figure_type; +Static string24 pict_name; +Static long rtfpicw, rtfpich, pict_char_number, pict_byte_number; +Static short pict_last_hexa, pict_number; +Static boolean pict_left_hexa; +Static Char last_kar; +Static Char inputfile_NAME[_FNSIZE]; +Static Char outputfile_NAME[_FNSIZE]; +Static Char figurefile_NAME[_FNSIZE]; +Static Char logfile_NAME[_FNSIZE]; +Static Char skipfile_NAME[_FNSIZE]; + + +/*---------------------------------------------------------------------------*/ +/* resets all integers to 0, all strings to '', for safety */ + +Static Void clean_all() +{ + short z; + + for (z = 1; z <= lmx; z++) + prev_line[k-1] = ' '; + for (z = 1; z <= lmx; z++) + inpline[k-1] = ' '; + for (z = 1; z <= olmx; z++) + exline[k-1] = ' '; + + tex_verbose = 0; + verbose = 0; + icharz = 0; + numl = 0; + kout = 0; + kinp = 0; + prev_kinp = 0; + bracelvl = 0; + + for (z = 0; z <= maxlevel; z++) { + lvlcode[z] = 0; + tab_nb_cellx[z] = 0; + tab_nb_ands[z] = 0; + tab_cellx[z] = 0; + } + kar = ' '; + hexaone = ' '; + hexatwo = ' '; + + *next_rtf = '\0'; + removed_ok = false; + write_log = false; + do_it_again = false; + no_space_conv = false; + use_sl = false; + latex209 = false; + latex_header = false; + base_flag = false; + envir_closed_ok = false; + last_percent = false; + simplify_ok = false; + no_RTFrtf = false; + par_to_begin = false; + + num_styles = 0; + input_line_number = 0; + numfonts = 0; + num_word_fonts = 0; + stdsize = 0; + stdkz = 0; + + for (z = 0; z <= maxlevel; z++) { + *close_kar[z] = '\0'; + *form_code[z] = '\0'; + *bfslcode[z] = '\0'; + *sizecode[z] = '\0'; + *currsize[z] = '\0'; + *currbfsl[z] = '\0'; + *spacingcode[z] = '\0'; + *active_RTFf[z] = '\0'; + center_flag[z] = 0; + flushright_flag[z] = 0; + math_mode[z] = 0; + underl_flag[z] = false; + auto_close[z] = false; + } + /* sizekey : array[1..numsizes] of string24; */ + /* sizeval : array[1..3,1..numsizes] of integer; */ + /* sizemags : array[1..3,1..numsizes] of integer; */ + for (z = 0; z <= maxfonts - 1; z++) { + *newfonts[z] = '\0'; + *word_fonts[z] = '\0'; + *equiv_fonts[z] = '\0'; + *font_names[z] = '\0'; + word_font_num[z] = 0; + } + *inkeyw = '\0'; + num_diff_sizes = 0; + keyw = 0; + cat = 0; + ikar = 0; + numval = 0; + numsign = 0; + num_hexa = 0; + num_skip_strings = 0; + decl_font_num = 0; + num_latex_options = 0; + num_indent = 0; + i = 0; + j = 0; + k = 0; + l = 0; + m = 0; + n = 0; + *works = '\0'; + *worksa = '\0'; + *worksb = '\0'; + *latex_style = '\0'; + *end_math_code = '\0'; + + for (z = 0; z <= maxstyles; z++) + *latex_options[z] = '\0'; + for (z = 0; z <= 10; z++) + *environ_type[z] = '\0'; + for (z = 0; z <= max_skip_strings - 1; z++) + *skip_strings[z] = '\0'; + leftskip = 0; + rightskip = 0; + leftcurskip = 0; + rightcurskip = 0; + save_skip = 0; + space_after = 0; + displ_skip = 0; + + for (z = 0; z <= maxRTFstyles - 1; z++) + *RTFstyles[z] = '\0'; + for (z = 0; z <= 255; z++) + ref_styles[z] = 0; + + clbrdrr = false; + clbrdrl = false; + clbrdrt = false; + clbrdrb = false; + + /* indications to build file names of figure bitmaps */ + *figure_name = '\0'; + *figure_path = '\0'; + *figure_type = '\0'; + *pict_name = '\0'; + rtfpicw = 0; + rtfpich = 0; + pict_char_number = 0; + pict_byte_number = 0; + pict_last_hexa = 0; + pict_number = 0; + pict_left_hexa = false; + last_kar = ' '; +} + + +/*---------------------------------------------------------------------------*/ + +Static Void title() +{ + printf(" MICROSOFT RTF(Word[Perfect]) to LaTeX conversion\n"); + printf(" Daniel Taupin, CNRS, 20th September 1996\n"); + printf(" Universite de Paris-Sud, Orsay, France\n"); + printf(" Version 2.15\n"); + printf(" E-mail: taupin@lps.u-psud.fr\n"); +} + + +/*---------------------------------------------------------------------------*/ +/* converts a hexa character into a number from 0 to 15 */ + +Static short hx_to_i(kar) +Char kar; +{ + short ikar = kar; + short okar; + + if (ikar < '0') { + okar = 0; + return okar; + } + if (ikar <= '9') { + okar = ikar - '0'; + return okar; + } + if (ikar <= 'Z') { + okar = ikar + 10 - 'A'; + return okar; + } + if (ikar <= 'z') + okar = ikar + 10 - 'a'; + else + okar = 0; + /*END IF ikar */ + return okar; +} + + +/*---------------------------------------------------------------------------*/ +/* converts a string of two hexa character into a number from 0 to 255 */ + +Static short hs_to_i(input_stg) +Char *input_stg; +{ + return (hx_to_i(input_stg[0]) * 16 + hx_to_i(input_stg[1])); +} + + +/*---------------------------------------------------------------------------*/ +/* truncate at bfslen a string */ + +Static Char *truncate24(Result, a) +Char *Result; +Char *a; +{ + sprintf(Result, "%.*s", bfslen, a); + return Result; +/* p2c: rtflatex.h, line 173: + * Note: Possible faulty string assignment [145] */ +/* p2c: rtflatex.h, line 173: + * Note: string[24] := string[255] => unpredictable crashes */ +} + + +/* version 2.15 */ + +/*---------------------------------------------------------------------------*/ +/* finds the '.' initiating the postfix of the given file name */ + +Static short pos_postfix(xx) +Char *xx; +{ + short Result = 0; + short i, FORLIM; + + FORLIM = strlen(xx); + for (i = 1; i <= FORLIM; i++) { /*END DO*/ + if (xx[i-1] == '.') + Result = i; + else if (xx[i-1] == ']') + Result = 0; + else if (xx[i-1] == '/') + Result = 0; + else if (xx[i-1] == '\\') + Result = 0; + else if (xx[i-1] == ':') + Result = 0; + } + /*END IF*/ + return Result; +} + + +/*---------------------------------------------------------------------------*/ +/* the signed variant of str(n,stg) */ + +Static Void sign_str(num, out_sign_str) +short num; +Char *out_sign_str; +{ + string255 sign_work; + Char STR2[256]; + + sprintf(sign_work, "%d", num); + /* if (num<0) then out_sign_str:='-'+sign_work */ + if (num < 0) { + sprintf(STR2, "-%s", sign_work); + truncate24(out_sign_str, STR2); + } else { + truncate24(out_sign_str, sign_work); + /*END IF*/ + } +} + + +/*---------------------------------------------------------------------------*/ +/* prints/displays a message */ + +Static Void print_msg(verbose_level, msg) +short verbose_level; +Char *msg; +{ + if (verbose >= verbose_level) + fputs(msg, stdout); + if (write_log) + fputs(msg, logfile); +} + + +/*---------------------------------------------------------------------------*/ +/* prints/displays a message with RETURN */ + +Static Void println_msg(verbose_level, msg) +short verbose_level; +Char *msg; +{ + if (verbose >= verbose_level) + puts(msg); + if (write_log) + fprintf(logfile, "%s\n", msg); +} + + +/* ======================================================================= */ +/* used at initialization to store one size name (Latex) and its magnitudes */ + +Static Void sizeone(i, s, j, k, l, mag10, mag11, mag12) +short i; +Char *s; +short j, k, l, mag10, mag11, mag12; +{ + truncate24(sizekey[i-1], s); + sizeval[0][i-1] = j; + sizemags[0][i-1] = mag10; + sizeval[1][i-1] = k; + sizemags[1][i-1] = mag11; + sizeval[2][i-1] = l; + sizemags[2][i-1] = mag12; +} + + +/* ======================================================================= */ +/* initialization of LaTeX font heights <==> size keywords */ + +Static Void sizeinit() +{ + short k; + + sizeone(1, "HUGE", 720, 720, 840, 2986, 2986, 3583); + sizeone(2, "Huge", 600, 600, 720, 2488, 2488, 2986); + sizeone(3, "huge", 500, 500, 600, 2074, 2074, 2488); + sizeone(4, "LARGE", 440, 440, 500, 1728, 1728, 2074); + sizeone(5, "Large", 360, 360, 440, 1440, 1440, 1728); + sizeone(6, "large", 280, 280, 360, 1200, 1200, 1440); + sizeone(7, "normalsize", 240, 272, 290, 1000, 1095, 1200); + sizeone(8, "small", 220, 240, 272, 900, 1000, 1095); + sizeone(9, "footnotesize", 190, 220, 240, 800, 900, 1000); + sizeone(10, "scriptsize", 160, 190, 190, 700, 800, 800); + sizeone(11, "tiny", 120, 140, 140, 500, 600, 600); + for (k = 12; k <= 16; k++) + sizeone(k, "tiny", 0, 0, 0, 500, 600, 600); + num_diff_sizes = 11; + + for (k = 0; k <= 10; k++) + strcpy(environ_type[k], "\\RTFerror"); + + strcpy(environ_type[0], "document"); + strcpy(environ_type[1], "center"); + strcpy(environ_type[2], "flushright"); + +} + + +/* ======================================================================= */ + +Static Void mac_init() +{ + short k; + + /* install the conversions of RTF accents (coded \'xx in hexa) */ + /* build a list of conversion of accented letters */ + + for (k = 0; k <= 255; k++) + *acc_transl[k] = '\0'; + + strcpy(acc_transl[hs_to_i("80")], "\"A"); + strcpy(acc_transl[hs_to_i("81")], "\\AA{}"); + strcpy(acc_transl[hs_to_i("82")], "\\c{C}"); + strcpy(acc_transl[hs_to_i("83")], "\\'E"); + strcpy(acc_transl[hs_to_i("84")], "\\~N"); + strcpy(acc_transl[hs_to_i("85")], "\\\"O"); + strcpy(acc_transl[hs_to_i("86")], "\\\"U"); + strcpy(acc_transl[hs_to_i("87")], "\\'a"); + strcpy(acc_transl[hs_to_i("88")], "\\`a"); + strcpy(acc_transl[hs_to_i("89")], "\\^a"); + strcpy(acc_transl[hs_to_i("8a")], "\\\"a"); + strcpy(acc_transl[hs_to_i("8b")], "\\~a"); + strcpy(acc_transl[hs_to_i("8c")], "\\aa{}"); + strcpy(acc_transl[hs_to_i("8d")], "\\c{c}"); + strcpy(acc_transl[hs_to_i("8e")], "\\'e"); + strcpy(acc_transl[hs_to_i("8f")], "\\`e"); + strcpy(acc_transl[hs_to_i("90")], "\\^e"); + strcpy(acc_transl[hs_to_i("91")], "\\\"e"); + strcpy(acc_transl[hs_to_i("93")], "\\'{\\i}"); + strcpy(acc_transl[hs_to_i("93")], "\\`{\\i}"); + strcpy(acc_transl[hs_to_i("94")], "\\^{\\i}"); + strcpy(acc_transl[hs_to_i("95")], "\\\"{\\i}"); + strcpy(acc_transl[hs_to_i("96")], "\\~n"); + strcpy(acc_transl[hs_to_i("97")], "\\'o"); + strcpy(acc_transl[hs_to_i("98")], "\\`o"); + strcpy(acc_transl[hs_to_i("99")], "\\^o"); + strcpy(acc_transl[hs_to_i("9a")], "\\\"o"); + strcpy(acc_transl[hs_to_i("9b")], "\\~o"); + strcpy(acc_transl[hs_to_i("9c")], "\\'u"); + strcpy(acc_transl[hs_to_i("9d")], "\\`u"); + strcpy(acc_transl[hs_to_i("9e")], "\\^u"); + strcpy(acc_transl[hs_to_i("9f")], "\\\"u"); + strcpy(acc_transl[hs_to_i("a0")], "\\dag{}"); + strcpy(acc_transl[hs_to_i("a1")], "\\degree{}"); + strcpy(acc_transl[hs_to_i("a3")], "\\pound{}"); + strcpy(acc_transl[hs_to_i("a4")], "\\S{}"); + strcpy(acc_transl[hs_to_i("a7")], "\\ss{}"); + strcpy(acc_transl[hs_to_i("ae")], "\\AE{}"); + strcpy(acc_transl[hs_to_i("af")], "\\O{}"); + strcpy(acc_transl[hs_to_i("b0")], "$\\infty "); + strcpy(acc_transl[hs_to_i("b1")], "$\\pm "); + strcpy(acc_transl[hs_to_i("b2")], "$\\leq "); + strcpy(acc_transl[hs_to_i("b3")], "$\\geq "); + strcpy(acc_transl[hs_to_i("b5")], "$\\mu "); + strcpy(acc_transl[hs_to_i("b6")], "$\\partial "); + strcpy(acc_transl[hs_to_i("b7")], "$\\Sigma "); + strcpy(acc_transl[hs_to_i("b8")], "$\\Pi "); + strcpy(acc_transl[hs_to_i("b9")], "$\\pi "); + strcpy(acc_transl[hs_to_i("bd")], "${1\\over2}"); + strcpy(acc_transl[hs_to_i("bf")], "\\o{}"); + strcpy(acc_transl[hs_to_i("c6")], "$\\Delta "); + strcpy(acc_transl[hs_to_i("c9")], "..."); + strcpy(acc_transl[hs_to_i("cb")], "\\`A"); + strcpy(acc_transl[hs_to_i("cc")], "\\~A"); + strcpy(acc_transl[hs_to_i("cd")], "\\~O"); + strcpy(acc_transl[hs_to_i("ce")], "\\OE{}"); + strcpy(acc_transl[hs_to_i("cf")], "\\oe{}"); + strcpy(acc_transl[hs_to_i("d0")], "--{}"); + strcpy(acc_transl[hs_to_i("d1")], "---{}"); + strcpy(acc_transl[hs_to_i("d2")], "``"); + strcpy(acc_transl[hs_to_i("d3")], "''"); + strcpy(acc_transl[hs_to_i("d4")], "`{}"); + strcpy(acc_transl[hs_to_i("d5")], "'{}"); + strcpy(acc_transl[hs_to_i("d6")], "$\\div "); + strcpy(acc_transl[hs_to_i("d8")], "\\\"y"); + strcpy(acc_transl[hs_to_i("e1")], "$\\cdot "); + strcpy(acc_transl[hs_to_i("e4")], "\\\"a"); + strcpy(acc_transl[hs_to_i("e5")], "\\^A"); + strcpy(acc_transl[hs_to_i("e6")], "\\^E"); + strcpy(acc_transl[hs_to_i("e7")], "\\'A"); + strcpy(acc_transl[hs_to_i("e8")], "\\\"E"); + strcpy(acc_transl[hs_to_i("e9")], "\\`E"); + strcpy(acc_transl[hs_to_i("ea")], "\\'I"); + strcpy(acc_transl[hs_to_i("eb")], "\\^I"); + strcpy(acc_transl[hs_to_i("ec")], "\\\"I"); + strcpy(acc_transl[hs_to_i("ed")], "\\`I"); + strcpy(acc_transl[hs_to_i("ee")], "\\'O"); + strcpy(acc_transl[hs_to_i("ef")], "\\^O"); + strcpy(acc_transl[hs_to_i("f1")], "\\`O"); + strcpy(acc_transl[hs_to_i("f2")], "\\'U"); + strcpy(acc_transl[hs_to_i("f3")], "\\^U"); + strcpy(acc_transl[hs_to_i("f4")], "\\`U"); + strcpy(acc_transl[hs_to_i("f6")], "\\\"o"); + strcpy(acc_transl[hs_to_i("fb")], "\\degree{}"); + strcpy(acc_transl[hs_to_i("fc")], "\\\"u"); + +} + + +/* ======================================================================= */ + +Static Void ansi_init() +{ + short k; + + /* install the conversions of RTF accents (coded \'xx in hexa) */ + /* build a list of conversion of accented letters */ + + for (k = 0; k <= 255; k++) + *acc_transl[k] = '\0'; + + strcpy(acc_transl[hs_to_i("a1")], "!`"); + strcpy(acc_transl[hs_to_i("a3")], "\\pound{}"); + strcpy(acc_transl[hs_to_i("a7")], "\\S{}"); + strcpy(acc_transl[hs_to_i("a8")], "\\\"{ }"); + strcpy(acc_transl[hs_to_i("a9")], "\\copyright{}"); + strcpy(acc_transl[hs_to_i("ab")], "<<"); + strcpy(acc_transl[hs_to_i("b0")], "\\degree{}"); + strcpy(acc_transl[hs_to_i("b1")], "$\\pm "); + strcpy(acc_transl[hs_to_i("b4")], "\\'{ }"); + strcpy(acc_transl[hs_to_i("b5")], "$\\mu "); + strcpy(acc_transl[hs_to_i("b7")], "$\\cdot "); + strcpy(acc_transl[hs_to_i("b8")], "\\c{ }"); + strcpy(acc_transl[hs_to_i("bb")], ">>"); + strcpy(acc_transl[hs_to_i("bc")], "${1\\over4}"); + strcpy(acc_transl[hs_to_i("bd")], "${1\\over2}"); + strcpy(acc_transl[hs_to_i("be")], "${3\\over4}"); + strcpy(acc_transl[hs_to_i("bf")], "?`"); + + strcpy(acc_transl[hs_to_i("c0")], "\\`A"); + strcpy(acc_transl[hs_to_i("c1")], "\\'A"); + strcpy(acc_transl[hs_to_i("c2")], "\\^A"); + strcpy(acc_transl[hs_to_i("c3")], "\\~A"); + strcpy(acc_transl[hs_to_i("c4")], "\\\"A"); + strcpy(acc_transl[hs_to_i("c5")], "\\AA{}"); + strcpy(acc_transl[hs_to_i("c6")], "\\AE{}"); + strcpy(acc_transl[hs_to_i("c7")], "\\c{C}"); + strcpy(acc_transl[hs_to_i("c8")], "\\`E"); + strcpy(acc_transl[hs_to_i("c9")], "\\'E"); + strcpy(acc_transl[hs_to_i("ca")], "\\^E"); + strcpy(acc_transl[hs_to_i("cb")], "\\\"E"); + strcpy(acc_transl[hs_to_i("cc")], "\\`I"); + strcpy(acc_transl[hs_to_i("cd")], "\\'I"); + strcpy(acc_transl[hs_to_i("ce")], "\\^I"); + strcpy(acc_transl[hs_to_i("cf")], "\\\"I"); + + strcpy(acc_transl[hs_to_i("d1")], "\\~N"); + strcpy(acc_transl[hs_to_i("d2")], "\\`O"); + strcpy(acc_transl[hs_to_i("d3")], "\\'O"); + strcpy(acc_transl[hs_to_i("d4")], "\\^O"); + strcpy(acc_transl[hs_to_i("d5")], "\\~O"); + strcpy(acc_transl[hs_to_i("d6")], "\\\"O"); + strcpy(acc_transl[hs_to_i("d8")], "\\O"); + strcpy(acc_transl[hs_to_i("d9")], "\\`U"); + strcpy(acc_transl[hs_to_i("da")], "\\'U"); + strcpy(acc_transl[hs_to_i("db")], "\\^U"); + strcpy(acc_transl[hs_to_i("dc")], "\\\"U"); + strcpy(acc_transl[hs_to_i("dd")], "\\'Y"); + strcpy(acc_transl[hs_to_i("df")], "\\ss{}"); + + + strcpy(acc_transl[hs_to_i("e0")], "\\`a"); + strcpy(acc_transl[hs_to_i("e1")], "\\'a"); + strcpy(acc_transl[hs_to_i("e2")], "\\^a"); + strcpy(acc_transl[hs_to_i("e3")], "\\~a"); + strcpy(acc_transl[hs_to_i("e4")], "\\\"a"); + strcpy(acc_transl[hs_to_i("e5")], "\\aa{}"); + strcpy(acc_transl[hs_to_i("e6")], "\\ae{}"); + strcpy(acc_transl[hs_to_i("e7")], "\\c{c}"); + strcpy(acc_transl[hs_to_i("e8")], "\\`e"); + strcpy(acc_transl[hs_to_i("e9")], "\\'e"); + strcpy(acc_transl[hs_to_i("ea")], "\\^e"); + strcpy(acc_transl[hs_to_i("eb")], "\\\"e"); + strcpy(acc_transl[hs_to_i("ec")], "\\`i"); + strcpy(acc_transl[hs_to_i("ed")], "\\'i"); + strcpy(acc_transl[hs_to_i("ee")], "\\^i"); + strcpy(acc_transl[hs_to_i("ef")], "\\\"i"); + + strcpy(acc_transl[hs_to_i("f1")], "\\~n"); + strcpy(acc_transl[hs_to_i("f2")], "\\`o"); + strcpy(acc_transl[hs_to_i("f3")], "\\'o"); + strcpy(acc_transl[hs_to_i("f4")], "\\^o"); + strcpy(acc_transl[hs_to_i("f5")], "\\~o"); + strcpy(acc_transl[hs_to_i("f6")], "\\\"o"); + strcpy(acc_transl[hs_to_i("f8")], "\\o"); + strcpy(acc_transl[hs_to_i("f9")], "\\`u"); + strcpy(acc_transl[hs_to_i("fa")], "\\'u"); + strcpy(acc_transl[hs_to_i("fb")], "\\^u"); + strcpy(acc_transl[hs_to_i("fc")], "\\\"u"); + strcpy(acc_transl[hs_to_i("fd")], "\\'y"); + strcpy(acc_transl[hs_to_i("ff")], "\\\"y"); + + + +} + + +/* ======================================================================= */ + +Static Void charinit() +{ + short K; + + for (K = 0; K <= 255; K++) + catcode[K] = 12; + for (K = 'A'; K <= 'Z'; K++) + catcode[K] = 11; + for (K = 'a'; K <= 'z'; K++) + catcode[K] = 11; + for (K = '0'; K <= '9'; K++) + catcode[K] = 16; + K = ' '; + catcode[K] = 10; + K = '{'; + catcode[K] = 1; + K = '}'; + catcode[K] = 2; + K = '('; + catcode[K] = 3; + K = ')'; + catcode[K] = 4; + K = '\\'; + catcode[K] = 0; + + icharz = '0'; + + /* build an empty list of conversion of accented letters */ + + for (K = 0; K <= 255; K++) + *acc_transl[K] = '\0'; + + /* Now install the conversions of "ftech" characters into math codes +... or letters*/ + + for (K = 0; K <= 255; K++) + *ftech_transl[K] = '\0'; + strcpy(ftech_transl['a'], "\\alpha "); + strcpy(ftech_transl['A'], "\\Alpha "); + strcpy(ftech_transl['b'], "\\beta "); + strcpy(ftech_transl['B'], "\\Beta "); + strcpy(ftech_transl['c'], "\\chi "); + strcpy(ftech_transl['C'], "\\Chi "); + strcpy(ftech_transl['d'], "\\delta "); + strcpy(ftech_transl['D'], "\\Delta "); + strcpy(ftech_transl['e'], "\\varepsilon "); + strcpy(ftech_transl['E'], "\\Epsilon "); + strcpy(ftech_transl['f'], "\\phi "); + strcpy(ftech_transl['F'], "\\Phi "); + strcpy(ftech_transl['g'], "\\gamma "); + strcpy(ftech_transl['G'], "\\Gamma "); + strcpy(ftech_transl['h'], "\\eta "); + strcpy(ftech_transl['H'], "\\Eta "); + strcpy(ftech_transl['i'], "\\iota "); + strcpy(ftech_transl['I'], "\\Iota "); + strcpy(ftech_transl['j'], "\\varphi "); + strcpy(ftech_transl['J'], "\\vartheta "); + strcpy(ftech_transl['k'], "\\kappa "); + strcpy(ftech_transl['K'], "\\Kappa "); + strcpy(ftech_transl['l'], "\\lambda "); + strcpy(ftech_transl['L'], "\\Lambda "); + strcpy(ftech_transl['m'], "\\mu "); + strcpy(ftech_transl['M'], "\\Mu "); + strcpy(ftech_transl['n'], "\\nu "); + strcpy(ftech_transl['N'], "\\Nu"); + strcpy(ftech_transl['o'], "o"); + strcpy(ftech_transl['O'], "\\Omicron "); + strcpy(ftech_transl['p'], "\\pi "); + strcpy(ftech_transl['P'], "\\Pi "); + strcpy(ftech_transl['q'], "\\theta "); + strcpy(ftech_transl['Q'], "\\Theta "); + strcpy(ftech_transl['r'], "\\rho "); + strcpy(ftech_transl['R'], "\\Rho "); + strcpy(ftech_transl['s'], "\\sigma "); + strcpy(ftech_transl['S'], "\\Sigma "); + strcpy(ftech_transl['t'], "\\tau "); + strcpy(ftech_transl['T'], "\\Tau "); + strcpy(ftech_transl['u'], "\\upsilon "); + strcpy(ftech_transl['U'], "\\varUpsilon "); + strcpy(ftech_transl['v'], "\\varpi "); + strcpy(ftech_transl['V'], "\\varsigma "); + strcpy(ftech_transl['w'], "\\omega "); + strcpy(ftech_transl['W'], "\\Omega "); + strcpy(ftech_transl['x'], "\\xi "); + strcpy(ftech_transl['X'], "\\Xi "); + strcpy(ftech_transl['y'], "\\psi "); + strcpy(ftech_transl['Y'], "\\Psi "); + strcpy(ftech_transl['z'], "\\zeta "); + strcpy(ftech_transl['Z'], "\\Zeta "); + + strcpy(ftech_transl['@'], "\\cong "); + strcpy(ftech_transl['~'], "\\sim "); + strcpy(ftech_transl['"'], "\\forall "); + strcpy(ftech_transl['$'], "\\exists "); + + strcpy(ftech_transl[hs_to_i("27")], "\\ni "); + strcpy(ftech_transl[hs_to_i("5e")], "\\bot "); + strcpy(ftech_transl[hs_to_i("a0")], "\\dag "); + strcpy(ftech_transl[hs_to_i("a1")], "\\Upsilon "); + strcpy(ftech_transl[hs_to_i("a2")], "'"); + strcpy(ftech_transl[hs_to_i("a3")], "\\leq "); + strcpy(ftech_transl[hs_to_i("a4")], "/"); + strcpy(ftech_transl[hs_to_i("a5")], "\\infty "); + strcpy(ftech_transl[hs_to_i("a6")], "\\cap "); + strcpy(ftech_transl[hs_to_i("a7")], "\\clubsuit "); + strcpy(ftech_transl[hs_to_i("a9")], "\\heartsuit "); + strcpy(ftech_transl[hs_to_i("aa")], "\\spadesuit "); + strcpy(ftech_transl[hs_to_i("ab")], "\\leftrightarrow "); + strcpy(ftech_transl[hs_to_i("ac")], "\\leftarrow "); + strcpy(ftech_transl[hs_to_i("ad")], "\\uparrow "); + strcpy(ftech_transl[hs_to_i("ae")], "\\rightarrow "); + strcpy(ftech_transl[hs_to_i("af")], "\\downarrow "); + strcpy(ftech_transl[hs_to_i("b0")], "^{\\circ}"); + strcpy(ftech_transl[hs_to_i("b1")], "\\pm "); + strcpy(ftech_transl[hs_to_i("b2")], "''"); + strcpy(ftech_transl[hs_to_i("b3")], "\\geq "); + strcpy(ftech_transl[hs_to_i("b4")], "\\times "); + strcpy(ftech_transl[hs_to_i("b5")], "\\propto "); + strcpy(ftech_transl[hs_to_i("b6")], "\\partial "); + strcpy(ftech_transl[hs_to_i("b7")], "\\bullet "); + strcpy(ftech_transl[hs_to_i("b8")], "\\div "); + strcpy(ftech_transl[hs_to_i("b9")], "\\neq "); + strcpy(ftech_transl[hs_to_i("ba")], "\\equiv "); + strcpy(ftech_transl[hs_to_i("bb")], "\\approx "); + strcpy(ftech_transl[hs_to_i("bc")], "\\ldots "); + strcpy(ftech_transl[hs_to_i("bd")], "\\mid "); + strcpy(ftech_transl[hs_to_i("c0")], "\\aleph "); + strcpy(ftech_transl[hs_to_i("c1")], "\\Im "); + strcpy(ftech_transl[hs_to_i("c2")], "\\Re "); + strcpy(ftech_transl[hs_to_i("c3")], "\\wp "); + strcpy(ftech_transl[hs_to_i("c4")], "\\otimes "); + strcpy(ftech_transl[hs_to_i("c5")], "\\oplus "); + strcpy(ftech_transl[hs_to_i("c6")], "\\oslash "); + strcpy(ftech_transl[hs_to_i("c7")], "\\cap "); + strcpy(ftech_transl[hs_to_i("c8")], "\\cup "); + strcpy(ftech_transl[hs_to_i("c9")], "\\supset "); + strcpy(ftech_transl[hs_to_i("ca")], "\\supseteq "); + strcpy(ftech_transl[hs_to_i("cb")], "\\not\\subset "); + strcpy(ftech_transl[hs_to_i("cc")], "\\subset "); + strcpy(ftech_transl[hs_to_i("cd")], "\\subseteq "); + strcpy(ftech_transl[hs_to_i("ce")], "\\in "); + strcpy(ftech_transl[hs_to_i("cf")], "\\not\\in "); + strcpy(ftech_transl[hs_to_i("d0")], "\\angle "); + strcpy(ftech_transl[hs_to_i("d1")], "\\nabla "); + strcpy(ftech_transl[hs_to_i("d2")], "\\registered "); + strcpy(ftech_transl[hs_to_i("d3")], "\\copyright "); + strcpy(ftech_transl[hs_to_i("d4")], "\\trademark "); + strcpy(ftech_transl[hs_to_i("d5")], "\\prod "); + strcpy(ftech_transl[hs_to_i("d7")], "\\cdot "); + strcpy(ftech_transl[hs_to_i("d8")], "\\neg "); + strcpy(ftech_transl[hs_to_i("d9")], "\\wedge "); + strcpy(ftech_transl[hs_to_i("da")], "\\vee "); + strcpy(ftech_transl[hs_to_i("db")], "\\Leftrightarrow "); + strcpy(ftech_transl[hs_to_i("dc")], "\\Leftarrow "); + strcpy(ftech_transl[hs_to_i("dd")], "\\Uparrow "); + strcpy(ftech_transl[hs_to_i("de")], "\\Rightarrow "); + strcpy(ftech_transl[hs_to_i("df")], "\\Downarrow "); + strcpy(ftech_transl[hs_to_i("e0")], "\\diamondsuit "); + strcpy(ftech_transl[hs_to_i("e1")], "\\langle "); + strcpy(ftech_transl[hs_to_i("e2")], "\\registered "); + strcpy(ftech_transl[hs_to_i("e3")], "\\copyright "); + strcpy(ftech_transl[hs_to_i("e4")], "\\trademark "); + strcpy(ftech_transl[hs_to_i("e5")], "\\sum "); + strcpy(ftech_transl[hs_to_i("e9")], "\\lceil "); + strcpy(ftech_transl[hs_to_i("ea")], "\\mid "); + strcpy(ftech_transl[hs_to_i("eb")], "\\lfloor "); + strcpy(ftech_transl[hs_to_i("f1")], "\\rangle "); + strcpy(ftech_transl[hs_to_i("f2")], "\\int "); + + strcpy(end_math_code, "$"); +} + + +/* ======================================================================= */ +/* this procedure returns a set of 4 chars, the size preamble of a non std font */ +Static Char *sizealpha(Result, i) +Char *Result; +short i; +{ + short h; + + h = i / 2; + if (h <= 5) + return strcpy(Result, "\\fiv"); + else if (h <= 6) + return strcpy(Result, "\\six"); + else if (h <= 7) + return strcpy(Result, "\\sev"); + else if (h <= 8) + return strcpy(Result, "\\egt"); + else if (h <= 9) + return strcpy(Result, "\\nin"); + else if (h <= 10) + return strcpy(Result, "\\ten"); + else if (h <= 11) + return strcpy(Result, "\\elv"); + else if (h <= 13) + return strcpy(Result, "\\twl"); + else if (h <= 15) + return strcpy(Result, "\\frt"); + else if (h <= 18) + return strcpy(Result, "\\svtn"); + else if (h <= 23) + return strcpy(Result, "\\twty"); + else if (h <= 28) + return strcpy(Result, "\\twfv"); + else { + return strcpy(Result, "\\thtw"); + /*END IF*/ + + } +} + + +/* ======================================================================= */ +/* write "help" information */ + +Static Void write_help() +{ + printf("Usage: RTFLATEX [options] <input-file> [options] <output-file>\n"); + printf("Options:\n"); + printf(" -b : set explicit \\baselineskip at par ends\n"); + printf(" -d<nnn> : debug level: 1=default, 0=quiet, >1=verbose\n"); + printf(" -f<templ> : file template to put figures (need a * )\n"); + printf(" -l<style> : latex style (default is \"report\")\n"); + printf(" -m : put debugging marks in output TeX\n"); + printf(" -o<option> : latex style option (cumulative)\n"); + printf(" -p<value> : std font size (10, 11, 12)\n"); + printf(" -r<file> : LOG output file (default is none)\n"); + printf(" -s : use slanted instead of italic\n"); + printf(" -t : omit LaTeX \\documentstyle etc.\n"); + printf(" -v : convert text and fonts, not spacings\n"); + printf(" -x : inhibit output simplification\n"); + printf(" -z<file> : file containing list of ignored keywords\n"); + printf(" -209 : assume ancient Latex209\n"); + _Escape(0); +} + + +/*---------------------------------------------------------------------------*/ +/* this procedure open files and set the -xxxx options */ + +Static Void open_files() +{ + string128 skipname, outputname, inputname, logname, optstr; + short testio, cat, ikar; + short kparm = 0; + short L, pospt; + Char first_char; + boolean success; + string24 inskipk; + short kkk, number_params; + Char STR1[256], STR3[256], STR4[256]; + short FORLIM1; + Char *TEMP; + Char STR5[40]; + Char STR6[68]; + + strcpy(figure_path, "rtf*.bit"); + *figure_type = '\0'; + stdsize = 12; + stdkz = 3; /* standard LaTeX size : 10, 11, 12 pt */ + *inputname = '\0'; + *outputname = '\0'; + strcpy(skipname, P_argv[0]); + num_skip_strings = 1; + for (L = 0; L <= max_skip_strings - 1; L++) + *skip_strings[L] = '\0'; + + pospt = pos_postfix(skipname); + if (pospt > 0) { + if (!strcmp(strsub(STR1, skipname, pospt, strlen(skipname)), ".EXE")) + sprintf(skipname, "%.*sSKW", pospt, strcpy(STR3, skipname)); + else if (!strcmp(strsub(STR3, skipname, pospt, strlen(skipname)), ".exe")) + sprintf(skipname, "%.*sskw", pospt, strcpy(STR4, skipname)); + } else + strcat(skipname, ".skw"); + /*END IF*/ + number_params = P_argc - 1; + + for (kkk = 1; kkk <= number_params; kkk++) { /*END WHILE*/ + kparm = kkk; + strcpy(optstr, P_argv[kparm]); + first_char = optstr[0]; + if (first_char == '-') { + printf("%cOption :>%s<\n", first_char, optstr); + if (optstr[1] == 'p') { + stdsize = 0; + FORLIM1 = strlen(optstr); + for (L = 2; L <= FORLIM1 - 1; L++) { + ikar = optstr[L]; + cat = catcode[ikar]; + if (cat != 16) { + printf("Illegal character in -p option: %s\n", optstr); + _Escape(0); + } + stdsize = stdsize * 10 + ikar - icharz; + } + printf("Standard size found: %dpt\n", stdsize); + if (stdsize < 11) + stdkz = 1; + else if (stdsize == 11) + stdkz = 2; + else + stdkz = 3; + } else if (optstr[1] == '2') { + /*END IF*/ + latex209 = true; + } else if (optstr[1] == 'v') + no_space_conv = true; + else if (optstr[1] == 's') + use_sl = true; + else if (optstr[1] == 't') + latex_header = false; + else if (optstr[1] == 'x') + simplify_ok = false; + else if (optstr[1] == 'b') + base_flag = true; + else if (optstr[1] == 'z') + strcpy(skipname, optstr + 2); + else if (optstr[1] == 'l') { + truncate24(latex_style, optstr); + if (*latex_style == '\0') + strcpy(latex_style, "report"); + } else if (optstr[1] == 'o') { + if (num_latex_options >= maxstyles) + printf("Too many style options, %s ignored !\n", optstr); + else { + num_latex_options++; + truncate24(latex_options[num_latex_options], + strsub(STR4, optstr, 3, bfslen)); + } + } else if (optstr[1] == 'f') { + /*END IF num_latex_options*/ + strcpy(figure_path, optstr + 2); + printf("-f:%s\n", figure_path); + } else if (optstr[1] == 'r') { + strcpy(logname, optstr + 2); + write_log = true; + } else if (optstr[1] == 'm') + tex_verbose = 1; /* insert marks in TeX output */ + else if (optstr[1] == 'd') { + verbose = 0; + FORLIM1 = strlen(optstr); + for (L = 2; L <= FORLIM1 - 1; L++) { + ikar = optstr[L]; + cat = catcode[ikar]; + if (cat != 16) { + printf("Illegal character in -d option: %s\n", optstr); + _Escape(0); + } + verbose = verbose * 10 + ikar - icharz; + /*END IF*/ + if (verbose > 0) + printf("Verbose=%d\n", verbose); + } + } else + printf("Unsupported option, ignored: %s\n", optstr); + } else if (*inputname == '\0') { + /*END IF*/ + strcpy(inputname, optstr); + } else if (*outputname == '\0') + strcpy(outputname, optstr); + else if (*optstr != '\0') { + printf("Too many non option args : %s\n", optstr); + printf("This one ignored !\n"); + } + } + + /*END IF*/ + pospt = strpos2(figure_path, "*", 1); + if (pospt == 0) { + printf("NO * in -f<path> option\n"); + _Escape(0); + } + strcpy(figure_type, figure_path + pospt); + sprintf(figure_path, "%.*s", pospt - 1, strcpy(STR3, figure_path)); + + if (*inputname == '\0') /* stops if help written */ + write_help(); + + if (pos_postfix(inputname) == 0) + strcat(inputname, ".rtf"); + + strcpy(inputfile_NAME, inputname); + if (inputfile != NULL) + inputfile = freopen(inputfile_NAME, "r", inputfile); + else + inputfile = fopen(inputfile_NAME, "r"); + _SETIO(inputfile != NULL, FileNotFound); + testio = P_ioresult; + success = (testio == 0); + if (!success) { + _SETIO(printf("Unable to open input file %s ; code=%d\n", + inputname, testio) >= 0, FileWriteError); + _Escape(0); + } + + if (*outputname == '\0') { + pospt = pos_postfix(inputname); + sprintf(outputname, "%.*stex", pospt, inputname); + _SETIO(printf("Output name taken from input: %s\n", outputname) >= 0, + FileWriteError); + } + + if (!strcmp(outputname, inputname)) { + _SETIO(printf("Input and output files have same names, abort!\n") >= 0, + FileWriteError); + _SETIO(printf(" Input: %s\n", inputname) >= 0, FileWriteError); + _SETIO(printf(" Output: %s\n", inputname) >= 0, FileWriteError); + if (inputfile != NULL) + fclose(inputfile); + inputfile = NULL; + _Escape(0); + } + + strcpy(outputfile_NAME, outputname); + if (outputfile != NULL) + outputfile = freopen(outputfile_NAME, "w", outputfile); + else + outputfile = fopen(outputfile_NAME, "w"); + _SETIO(outputfile != NULL, FileNotFound); + testio = P_ioresult; + success = (testio == 0); + + if (!success) { + _SETIO(printf("ioresult (output)=%d\n", testio) >= 0, FileWriteError); + _SETIO(printf("Unable to open output file %s ; code=%d\n", + outputname, testio) >= 0, FileWriteError); + if (inputfile != NULL) + fclose(inputfile); + inputfile = NULL; + _Escape(0); + } + + /* opening skip file to eliminate useless output \RTFxxx keywords */ + if (*skipname == '\0') { + pospt = pos_postfix(inputname); + sprintf(skipname, "%.*sskw", pospt, inputname); + _SETIO(printf("keyword skip file name taken from input: %s\n", skipname) >= 0, + FileWriteError); + } + + if (!strcmp(skipname, inputname)) { + _SETIO(printf("Input and skip files have same names, abort!\n") >= 0, + FileWriteError); + _SETIO(printf(" Input: %s\n", inputname) >= 0, FileWriteError); + _SETIO(printf(" skip: %s\n", inputname) >= 0, FileWriteError); + if (inputfile != NULL) + fclose(inputfile); + inputfile = NULL; + _Escape(0); + } + + strcpy(skipfile_NAME, skipname); + if (skipfile != NULL) + skipfile = freopen(skipfile_NAME, "r", skipfile); + else + skipfile = fopen(skipfile_NAME, "r"); + _SETIO(skipfile != NULL, FileNotFound); + testio = P_ioresult; + success = (testio == 0); + + if (!success) { + _SETIO(printf("ioresult (keyword skip file)=%d\n", testio) >= 0, + FileWriteError); + _SETIO(printf("Unable to open keyword skip file %s ; code=%d\n", + skipname, testio) >= 0, FileWriteError); + if (inputfile != NULL) + fclose(inputfile); + inputfile = NULL; + _Escape(0); + } + + + if (write_log) { /*END IF write_log*/ + if (*logname == '\0') { /*END IF logname*/ + pospt = pos_postfix(inputname); + sprintf(logname, "%.*slog", pospt, inputname); + _SETIO(printf("Log name taken from input : %s\n", logname) >= 0, + FileWriteError); + } + + if (!strcmp(logname, inputname) || !strcmp(logname, outputname)) + { /*END IF logname*/ + _SETIO(printf("Log and input or output files have same names, abort!\n") >= + 0, FileWriteError); + _SETIO(printf(" Log: %s\n", logname) >= 0, FileWriteError); + if (inputfile != NULL) + fclose(inputfile); + inputfile = NULL; + _Escape(0); + } + + strcpy(logfile_NAME, logname); + if (logfile != NULL) + logfile = freopen(logfile_NAME, "w", logfile); + else + logfile = fopen(logfile_NAME, "w"); + _SETIO(logfile != NULL, FileNotFound); + testio = P_ioresult; + write_log = (testio == 0); + + if (!write_log) { /*END IF not success*/ + _SETIO(printf("ioresult (Log)=%d\n", testio) >= 0, FileWriteError); + _SETIO(printf("Unable to open log file %s ; code=%d\n", logname, testio) >= + 0, FileWriteError); + if (inputfile != NULL) + fclose(inputfile); + inputfile = NULL; + _Escape(0); + } + _SETIO(printf("%s, ", logname) >= 0, FileWriteError); + } + _SETIO(printf("%s, %s and %s successfully opened.\n", + inputname, skipname, outputname) >= 0, FileWriteError); + + while (!P_eof(skipfile)) { /*END DO*/ + _SETIO(fgets(inskipk, bfslen + 1, skipfile) != NULL, EndOfFile); + TEMP = strchr(inskipk, '\n'); + if (TEMP != NULL) + *TEMP = 0; + sprintf(STR5, "Cancelling \"%s\"", inskipk); + println_msg(2, STR5); + if (*inskipk == '\0') { /*END IF*/ + /*END IF*/ + continue; + } + if (strlen(inskipk) + strlen(skip_strings[num_skip_strings-1]) < 255) + sprintf(skip_strings[num_skip_strings-1] + + strlen(skip_strings[num_skip_strings-1]), "%s ", inskipk); + else if (num_skip_strings < max_skip_strings) { + num_skip_strings++; + sprintf(skip_strings[num_skip_strings-1] + + strlen(skip_strings[num_skip_strings-1]), "%s ", inskipk); + } else { + sprintf(STR6, "Too many keywords to ignore, %s not recorded!", inskipk); + println_msg(1, STR6); + } + } +} + + +/*---------------------------------------------------------------------------*/ +/* clean the output line */ + +Static Void cleanout() +{ + for (i = 1; i <= olmx; i++) + exline[i-1] = ' '; + kout = 0; +} + + +/*---------------------------------------------------------------------------*/ +/* prints/displays the current stored output line */ + +Static Void print_line(verbose_level) +short verbose_level; +{ + short i, FORLIM; + Char STR1[256]; + + FORLIM = kout; + for (i = 0; i <= FORLIM - 1; i++) { + sprintf(STR1, "%c", exline[i]); + print_msg(verbose_level, STR1); + } + println_msg(verbose_level, "<<<"); +} + + +/*---------------------------------------------------------------------------*/ +/* makes the pos function in an array of type exline_type */ + +Static short array_pos(oldstring, testline, array_long) +Char *oldstring; +Char *testline; +short array_long; +{ + short Result = 0; + boolean string_found; + short lth1, jpos, kpos, FORLIM; + + lth1 = strlen(oldstring); + FORLIM = array_long - lth1 + 1; + for (kpos = 1; kpos <= FORLIM; kpos++) { /*END DO*/ + string_found = true; + for (jpos = 1; jpos <= lth1; jpos++) /*END DO*/ + string_found = (string_found && + oldstring[jpos-1] == testline[kpos + jpos - 2]); + if (string_found) /*END IF*/ + return kpos; + } + return Result; +} + + +/*---------------------------------------------------------------------------*/ +/* substitute a string with another in output line */ + +Static Void outsubstitute(oldstring, newstring) +Char *oldstring, *newstring; +{ + boolean string_found = true; + short lth1, lth2, jpos, kpos, oldkout; + exline_type oldline; + + lth1 = strlen(oldstring); + lth2 = strlen(newstring); + while (string_found) { /*END DO*/ + kpos = array_pos(oldstring, exline, kout); + string_found = (kpos > 0); + if (!string_found) /*END IF*/ + break; + memcpy(oldline, exline, sizeof(exline_type)); + oldkout = kout; + kout = kpos - 1; + for (jpos = 0; jpos <= lth2 - 1; jpos++) { /*END DO*/ + kout++; + exline[kout-1] = newstring[jpos]; + } + for (jpos = kpos + lth1 - 1; jpos <= oldkout - 1; jpos++) { /*END DO*/ + kout++; + exline[kout-1] = oldline[jpos]; + } + for (jpos = kout; jpos <= olmx - 1; jpos++) /*END DO*/ + exline[jpos] = ' '; + } +} + + +/*---------------------------------------------------------------------------*/ +/* converts an integer number of twips into a decimal string */ + +Static Void str_twips_pt(numval, outpts) +short numval; +Char *outpts; +{ + short k, l; + string24 wk, STR1; + Char STR2[28]; + Char STR3[256]; + Char STR5[256]; + + k = numval * 5; /* convert to hundredth of pts */ + sign_str(k, wk); + if (strlen(wk) < 2) { + sprintf(STR2, "00%s", wk); + strcpy(wk, truncate24(STR1, STR2)); + } + l = strlen(wk); + sprintf(STR5, "%.*s.%s", l - 2, wk, strsub(STR3, wk, l - 1, 2)); + truncate24(outpts, STR5); +} + + +/*---------------------------------------------------------------------------*/ +/* eliminates end replaces useless sequences in output -- pragmatic feature */ + +Static Void simplify(oldstring, newstring) +Char *oldstring, *newstring; +{ + if (simplify_ok) + outsubstitute(oldstring, newstring); +} + + +/*---------------------------------------------------------------------------*/ +/* read the future chars, excluding control chars < ord(' ') */ + +Static Void read_next_char() +{ + short next_ikar = 0; + Char next_char; + + next_char = next_ikar; + while (!P_eof(inputfile) && next_ikar < ' ' && strlen(next_rtf) < 8) + { /*END DO*/ + next_char = getc(inputfile); + _SETIO(next_char != EOF, EndOfFile); + next_ikar = next_char; + if (next_ikar == 13) { + input_line_number++; + memcpy(prev_line, inpline, (long)lmx); + prev_kinp = kinp; + kinp = 0; + } else if (next_ikar >= ' ') { + sprintf(next_rtf + strlen(next_rtf), "%c", next_char); + /*END IF*/ + } + } +} + + +/*---------------------------------------------------------------------------*/ +/* read one char except nulls */ + +Static Void read_char() +{ + if (*next_rtf != '\0') { + kar = next_rtf[0]; + strdelete((Anyptr)next_rtf, 1, 1); + read_next_char(); + } else + kar = '\032'; + /*END IF*/ + ikar = kar; + cat = catcode[ikar]; + if (*next_rtf == '\0') /*END IF*/ + strcat(next_rtf, "\032"); + + if (kinp < lmx) { /*END IF*/ + kinp++; + inpline[kinp-1] = kar; + } +} + + +/*---------------------------------------------------------------------------*/ +/* outputs the stored output line */ + +Static Void output_line() +{ + short i; + string24 simpl_pattern; + short FORLIM; + Char STR1[28]; + Char STR2[26]; + Char STR3[42]; + + numl++; + simplify("{{}", "{"); + simplify("{}}", "}"); + simplify("{}{}", "{}"); + FORLIM = num_diff_sizes; + for (i = 0; i <= FORLIM - 1; i++) { /*END DO*/ + sprintf(STR2, "\\%s", sizekey[i]); + truncate24(simpl_pattern, STR2); + sprintf(STR1, "%s{}\\", simpl_pattern); + sprintf(STR2, "%s\\", simpl_pattern); + simplify(STR1, STR2); + sprintf(STR2, "%s}", simpl_pattern); + simplify(STR2, "}"); + } + simplify("\\root{}\\of{", "\\sqrt{"); + + FORLIM = kout; + for (i = 0; i <= FORLIM - 1; i++) + _SETIO(putc(exline[i], outputfile) >= 0, FileWriteError); + _SETIO(putc('\n', outputfile) >= 0, FileWriteError); + + if (numl % 100 == 0) { /*END IF NUML*/ +/* p2c: rtflatex.cmn, line 915: + * Note: Using % for possibly-negative arguments [317] */ + if (verbose > 0) { + sign_str(numl, works); + sprintf(STR3, "Output : %s lines ", works); + print_msg(1, STR3); + FORLIM = bracelvl; + for (j = 1; j <= FORLIM; j++) + print_msg(1, "{"); + println_msg(1, ""); + } else + putchar('.'); + } + cleanout(); +} + + +/*---------------------------------------------------------------------------*/ +/* write a character into output line */ + +Static Void output_real_line() +{ + if (kout > 0) + output_line(); +} + + +/*---------------------------------------------------------------------------*/ +/* write a character into output line */ + +Static Void outchr(CHARAC) +Char CHARAC; +{ + Char oldchar; + Char newchar = CHARAC; + Char STR1[48]; + + if (kout > 0) { + oldchar = exline[kout-1]; + if (oldchar == ' ' && newchar == ' ') + return; + } else if (kout == 0 && last_percent && CHARAC == ' ') { + kout = 1; + exline[kout-1] = '\\'; + } + /*END IF*/ + last_percent = false; + + if (kout >= olmx - 2) { + /*END IF*/ + sign_str(kout, works); + sprintf(STR1, "Output overflow, KOUT:=%s", works); + println_msg(0, STR1); + /*END IF*/ + return; + } + kout++; + exline[kout-1] = newchar; + if (newchar != '}' || kout <= 80) { + /*END IF*/ + if (newchar == ' ' && kout > 64) + output_line(); + return; + } + if (exline[kout-2] == ';') { + exline[kout-1] = '\\'; + kout++; + exline[kout-1] = 'r'; + kout++; + exline[kout-1] = 'e'; + kout++; + exline[kout-1] = 'l'; + kout++; + exline[kout-1] = 'a'; + kout++; + exline[kout-1] = 'x'; + output_line(); + kout++; + exline[kout-1] = ' '; + kout++; + exline[kout-1] = newchar; + return; + } + if (kout <= 120) + return; + kout++; + exline[kout-1] = '%'; + kout++; + exline[kout-1] = '%'; + output_line(); + last_percent = true; +} + + +/* ===================================================================== */ +/* change contents of bfslcode[bracelvl] : replace first arg with 2nd */ +/* but do not declare font, since output will be standard */ + +Static Void font_subs2e(old, new_) +Char *old, *new_; +{ + Char workstg[49]; + short positn; + + positn = strpos2(bfslcode[bracelvl], old, 1); + if (positn == 0) + return; + if (lvlcode[bracelvl] == 9) /* ignore new fonts in header/footer */ + return; + if (verbose >= 2) + _SETIO(printf("font_subs2e: %s|%s|%s", old, bfslcode[bracelvl], new_) >= 0, + FileWriteError); + strcpy(workstg, bfslcode[bracelvl]); + strdelete((Anyptr)workstg, positn, strlen(old)); + if (strpos2(workstg, new_, 1) == 0) + strinsert(new_, (Anyptr)workstg, positn); + truncate24(bfslcode[bracelvl], workstg); + if (verbose >= 2) + _SETIO(printf("=>%s\n", workstg) >= 0, FileWriteError); +} + + +/*---------------------------------------------------------------------------*/ +/* inserts a new font specification like \bf \rm \sc into bfslcode[bracelvl] */ + +Static Void add_to_bfsl(kod) +Char *kod; +{ /* bfsl_old:=bfslcode[bracelvl]; */ + Char bfsl_try[65]; + Char STR1[256]; + string24 STR2; + + sprintf(bfsl_try, "%s\\", bfslcode[bracelvl]); + sprintf(STR1, "%s\\", kod); + if (strpos2(bfsl_try, STR1, 1) > 0) + return; + sprintf(STR1, "%s%s", bfslcode[bracelvl], kod); + strcpy(bfslcode[bracelvl], truncate24(STR2, STR1)); + /* writeln('add_to:',bfsl_old,'+',kod,'=',bfslcode[bracelvl]); */ +} + + +/*---------------------------------------------------------------------------*/ +/* output one character capitalized if needed */ + +Static Void outchrc(CHARAC) +Char CHARAC; +{ + Char kar; + + if (lvlcode[bracelvl] == 2) + kar = toupper(CHARAC); + else + kar = CHARAC; + outchr(kar); +} + + +/*---------------------------------------------------------------------------*/ +/* write a string into output line */ + +Static Void outstg(CHARACs) +Char *CHARACs; +{ + short k, FORLIM; + + FORLIM = strlen(CHARACs); + for (k = 0; k <= FORLIM - 1; k++) + outchr(CHARACs[k]); +} + + +/* ===================================================================== */ +/* checks the presence of a string at end of current output */ + +Static boolean last_is(CHARACs) +Char *CHARACs; +{ + boolean Result; + short k, long_; + + long_ = strlen(CHARACs); +/* p2c: rtflatex.cmn: Note: Eliminated unused assignment statement [338] */ + if (kout < long_) + return false; + for (k = 0; k <= long_ - 1; k++) { + if (exline[kout - long_ + k] != CHARACs[k]) + return false; + } + return true; +} + + +/* ===================================================================== */ +/* remove one string from output */ + +Static Void outrem(CHARACs) +Char *CHARACs; +{ + short k, long_, FORLIM; + + long_ = strlen(CHARACs); + removed_ok = last_is(CHARACs); + if (!removed_ok) + return; + FORLIM = kout; + for (k = kout - long_ + 1; k <= FORLIM; k++) + exline[kout-1] = ' '; + kout -= long_; +} + + +/* ===================================================================== */ +/* remove all empty pairs of braces at the end of output */ + +Static Void outrem_empty_braces() +{ + short num_removed = 0; + + removed_ok = true; + while (removed_ok) { /*END WHILE*/ + outrem("{}"); + if (removed_ok) + num_removed++; + } + removed_ok = (num_removed > 0); +} + + +/*---------------------------------------------------------------------------*/ +/* output a TeX keyword ( the \ not in args ) on output line EXLINE */ + +Static Void outkeyw(CHARACs) +Char *CHARACs; +{ + short k, FORLIM; + + /* eliminate useless brace pairs terminating a previous keyword*/ + outrem_empty_braces(); + outchr('\\'); + FORLIM = strlen(CHARACs); + for (k = 0; k <= FORLIM - 1; k++) + outchr(CHARACs[k]); +} + + +/*---------------------------------------------------------------------------*/ +/* outputs the new \bf \sl code if different from current at that level */ + +Static Void output_bfsl() +{ + if (!strcmp(bfslcode[bracelvl], currbfsl[bracelvl])) + return; + if (!strcmp(bfslcode[bracelvl], "\\relax")) + return; + if (math_mode[bracelvl] > 0) + return; + outrem_empty_braces(); + outrem(currbfsl[bracelvl]); + font_subs2e("\\rm\\bf", "\\bf"); + font_subs2e("\\rm\\tt", "\\tt"); + font_subs2e("\\rm\\it", "\\it"); + font_subs2e("\\rm\\sf", "\\sf"); + font_subs2e("\\rm\\sl", "\\sl"); + + if (!latex209) { + font_subs2e("\\bf\\it", "\\bfit"); + font_subs2e("\\it\\bf", "\\bfit"); + font_subs2e("\\bf\\sl", "\\bfsl"); + font_subs2e("\\sl\\bf", "\\bfsl"); + font_subs2e("\\bf\\sf", "\\sfbf"); + font_subs2e("\\sf\\bf", "\\sfbf"); + font_subs2e("\\sf\\it", "\\sfit"); + font_subs2e("\\sf\\sl", "\\sfsl"); + font_subs2e("\\tt\\bf", "\\ttbf"); + font_subs2e("\\tt\\it", "\\ttit"); + font_subs2e("\\tt\\sl", "\\ttsl"); + font_subs2e("\\bf\\tt", "\\ttbf"); + font_subs2e("\\it\\tt", "\\ttit"); + font_subs2e("\\sl\\tt", "\\ttsl"); + font_subs2e("\\sfit\\bf", "\\sfbfit"); + font_subs2e("\\sfsl\\bf", "\\sfbfsl"); + font_subs2e("\\bfit\\sf", "\\sfbfit"); + font_subs2e("\\bfsl\\sf", "\\sfbfsl"); + } + /* latex2e */ + /*END IF latex209*/ + outstg(bfslcode[bracelvl]); + outstg("{}"); + strcpy(currbfsl[bracelvl], bfslcode[bracelvl]); +} + + +/*---------------------------------------------------------------------------*/ +/* outputs the new \large code if different from current at that level */ + +Static Void output_size(codesize) +Char *codesize; +{ + if (!strcmp(codesize, currsize[bracelvl])) + return; + if (!strcmp(codesize, "relax")) + return; + if (lvlcode[bracelvl] == 8) + return; + if (lvlcode[bracelvl] == 9) + return; + if (math_mode[bracelvl] > 0) + return; + outkeyw(codesize); + if (!base_flag) { /*END IF*/ + outstg("{}"); + strcpy(currsize[bracelvl], codesize); + } + strcpy(currbfsl[bracelvl], "\\relax"); +} + + +/* ----------------------------------------------------------------------*/ +Static Void ensure_sizebfsl() +{ + if (par_to_begin) + return; + if (last_is("{")) + output_size(sizecode[bracelvl]); + output_bfsl(); +} + + +/* ----------------------------------------------------------------------*/ +Static Void output_skips() +{ + if (leftcurskip != leftskip) { + str_twips_pt(leftskip, worksa); + outkeyw("global\\leftskip "); + outstg(worksa); + outstg("pt\\relax"); + leftcurskip = leftskip; + } + + if (rightcurskip == rightskip) + return; + str_twips_pt(rightskip, worksa); + outkeyw("global\\rightskip "); + outstg(worksa); + outstg("pt\\relax"); + rightcurskip = rightskip; +} + + +/*---------------------------------------------------------------------------*/ +Static Void close_files() +{ + if (outputfile != NULL) + fclose(outputfile); + outputfile = NULL; + if (inputfile != NULL) + fclose(inputfile); + inputfile = NULL; + if (!write_log) + return; + if (logfile != NULL) + fclose(logfile); + logfile = NULL; +} + + +/* ===================================================================== */ +/* remove one keyword from output */ + +Static Void outkrem(CHARACs) +Char *CHARACs; +{ + Char STR1[256]; + + sprintf(STR1, "\\%s", CHARACs); + outrem(STR1); +} + + +/* --------------------------------------------------------------------------*/ +/* open brace and increment bracelvl */ + +Static Void open_brace() +{ + Char STR1[56]; + Char STR2[34]; + + if (bracelvl < maxlevel) { + bracelvl++; + strcpy(bfslcode[bracelvl], bfslcode[bracelvl-1]); + tab_nb_cellx[bracelvl] = tab_nb_cellx[bracelvl-1]; + tab_cellx[bracelvl] = 0; + strcpy(sizecode[bracelvl], sizecode[bracelvl-1]); + strcpy(currsize[bracelvl], currsize[bracelvl-1]); + strcpy(currbfsl[bracelvl], currbfsl[bracelvl-1]); + strcpy(spacingcode[bracelvl], spacingcode[bracelvl-1]); + lvlcode[bracelvl] = lvlcode[bracelvl-1]; + if (bracelvl < maxlevel) + lvlcode[bracelvl+1] = 0; + strcpy(active_RTFf[bracelvl], active_RTFf[bracelvl-1]); + /* propagate math_mode, but say 2 if previous was 1 to avoid extra closins by $ */ + math_mode[bracelvl] = math_mode[bracelvl-1]; + if (math_mode[bracelvl] == 1) + math_mode[bracelvl] = 2; + + flushright_flag[bracelvl] = flushright_flag[bracelvl-1]; + if (flushright_flag[bracelvl] == 2) + flushright_flag[bracelvl] = 3; + + center_flag[bracelvl] = center_flag[bracelvl-1]; + if (center_flag[bracelvl] == 2) + center_flag[bracelvl] = 3; + + underl_flag[bracelvl] = false; + auto_close[bracelvl] = false; + *form_code[bracelvl] = '\0'; + strcpy(close_kar[bracelvl], " "); + if (lvlcode[bracelvl] == 3) { + lvlcode[bracelvl] = 4; + return; + } + if (lvlcode[bracelvl] == 10) { /*in objects*/ + lvlcode[bracelvl] = -lvlcode[bracelvl]; + return; + } + if (lvlcode[bracelvl] == 15) + /*brace opened after \RTFintbl => set normal*/ + lvlcode[bracelvl] = 0; + else if (lvlcode[bracelvl] >= 16) /*in formulas*/ + lvlcode[bracelvl] = -lvlcode[bracelvl]; + return; + } else { + /*END IF*/ + sign_str(maxlevel, works); + sprintf(STR1, "Too many brace levels, max is %s", works); + print_msg(0, STR1); + sign_str(numl + 1, works); + sprintf(STR2, " at line%s", works); + println_msg(0, STR2); + print_line(0); + if (write_log) + close_files(); + _Escape(0); + /*END IF bracelvl<maxlevel*/ + } +} + + +/*---------------------------------------------------------------------------*/ +/* output \begin(<arg>) */ + +Static Void begin_env(environ) +short environ; +{ + if (kout > 0) + output_line(); + outkeyw("begin{"); + outstg(environ_type[environ]); + outstg("}\\strut"); + open_brace(); + output_line(); +} + + +/* ----------------------------------------------------------------------*/ +/* execute \begin{center}/{flushright} is center_flag set to 1 */ +Static Void make_center() +{ + if (center_flag[bracelvl] == 1) { + begin_env(1); + center_flag[bracelvl] = 2; + } + if (flushright_flag[bracelvl] == 1) { + begin_env(2); + flushright_flag[bracelvl] = 2; + } +} + + +/* ----------------------------------------------------------------------*/ +Static Void begin_par() +{ + short k, FORLIM; + + if (!par_to_begin) + return; + if (lvlcode[bracelvl] == 6) + return; + if (lvlcode[bracelvl] == 8) + return; + if (lvlcode[bracelvl] == 9) + return; + if (center_flag[bracelvl] + flushright_flag[bracelvl] == 0) + output_skips(); + space_after = save_skip; + save_skip = 0; + if (num_indent == 0 && lvlcode[bracelvl] != 15 && + center_flag[bracelvl] == 0 && flushright_flag[bracelvl] == 0) + outkeyw("noindent "); + FORLIM = num_indent; + for (k = 2; k <= FORLIM; k++) + outkeyw("indent "); + num_indent = 0; + make_center(); + output_size(sizecode[bracelvl]); + output_bfsl(); + outkeyw("beginparagraph{}"); + par_to_begin = false; +} + + +/*---------------------------------------------------------------------------*/ +/* write a string into math mode onto output line, and leave in math mode */ + +Static Void out_math_leave(CHARACs) +Char *CHARACs; +{ + if (math_mode[bracelvl] > 0) + outchr(' '); + else { + outrem_empty_braces(); + outrem("$"); + if (removed_ok) + math_mode[bracelvl] = 1; + } + /*END IF math_mode*/ + if (math_mode[bracelvl] == 0) { /*END IF math_mode=0*/ + begin_par(); + outchr('$'); + math_mode[bracelvl] = 1; + } + outstg(CHARACs); +} + + +/*---------------------------------------------------------------------------*/ +/* close math_mode if possible, i.e. =1 */ + +Static Void close_math() +{ + if (math_mode[bracelvl] == 1) { /*END IF math_mode*/ + outstg(end_math_code); + math_mode[bracelvl] = 0; + } +} + + +/*---------------------------------------------------------------------------*/ +/* write a string into math mode onto output and close math mode if possible*/ + +Static Void out_math(CHARACs) +Char *CHARACs; +{ + out_math_leave(CHARACs); + close_math(); +} + + +/* ===================================================================== */ +/* output one string and capitalize it if required */ + +Static Void outstgc(CHARACs) +Char *CHARACs; +{ + short k, FORLIM; + + FORLIM = strlen(CHARACs); + for (k = 0; k <= FORLIM - 1; k++) + outchrc(CHARACs[k]); +} + + +/* ===================================================================== */ +/* output a number */ + +Static Void output_num(numb) +short numb; +{ + string24 wkk; + + sign_str(numb, wkk); + outstg(wkk); +} + + +/* ===================================================================== */ +/* output one keyword and capitalize it */ + +Static Void outkeywc(CHARACs) +Char *CHARACs; +{ + short k, FORLIM; + + outrem_empty_braces(); + outchr('\\'); + FORLIM = strlen(CHARACs); + for (k = 0; k <= FORLIM - 1; k++) + outchrc(CHARACs[k]); +} + + +/* ===================================================================== */ +/* close brace pair and remove all sub/superscripted empty pairs at end of output */ + +Static Void close_subs() +{ + if (math_mode[bracelvl] > 0) + outrem(" "); + outchr('}'); + outrem("^{}"); + outrem("_{}"); + outrem("^{ }"); + outrem("_{ }"); +} + + +/* ===================================================================== */ +/* declares a new font as \global, and record it */ + +Static Void declare_font(font_id, fontname, magnification) +Char *font_id, *fontname; +short magnification; +{ + short i, FORLIM; + Char STR2[256]; + + FORLIM = numfonts; + for (i = 0; i <= FORLIM - 1; i++) { + if (!strcmp(newfonts[i], font_id)) + return; + } + if (numfonts >= maxfonts) { /*END IF*/ + sprintf(STR2, "Font %s cannot be declared... too many fonts !", font_id); + println_msg(0, STR2); + return; + } + + numfonts++; + truncate24(newfonts[numfonts-1], font_id); + + if (kout > 1) /* to have font decl at left of a line */ + output_line(); + outstg("\\ifx"); + outstg(font_id); + outstg("\\undefined \\global\\font"); + outstg(font_id); + outstg("=\\FontHdg\\FontHdge "); + outstg(fontname); + sign_str(magnification, works); + outstg(" scaled "); + outstg(works); + outstg("\\fi"); + output_line(); + +} + + +/* ===================================================================== */ +/* change contents of bfslcode[bracelvl] : replace first arg with 2nd */ + +Static Void font_subs(old, new_, fontname, magnification) +Char *old, *new_, *fontname; +short magnification; +{ + Char workstg[49]; + short positn; + + positn = strpos2(bfslcode[bracelvl], old, 1); + if (positn == 0) + return; + if (lvlcode[bracelvl] == 9) /* ignore new fonts in header/footer */ + return; + strcpy(workstg, bfslcode[bracelvl]); + strdelete((Anyptr)workstg, positn, strlen(old)); + if (strpos2(bfslcode[bracelvl], new_, 1) == 0) + strinsert(new_, (Anyptr)workstg, positn); + truncate24(bfslcode[bracelvl], workstg); + declare_font(new_, fontname, magnification); +} + + +/*---------------------------------------------------------------------------*/ +/* builds the correct LaTeX font size according to NUMVAL (unit=1/2 pt) */ +/* stores it in sizecode[bracelvl] ; uses the global variable "stdsize" */ + +Static Void outfsize(numval, magnif) +short numval, *magnif; +{ + short ll; + short selectsize = 0; + short latex_size; + short best_diff = 30000; + Char STR1[68]; + + /* I select the nearest sizemags */ + latex_size = numval * 50; + /* convert from half points to hundredths of points */ + /* big integer */ + strcpy(sizecode[bracelvl], "tiny"); + for (ll = 0; ll <= numsizes - 1; ll++) { /*END DO*/ + if (abs(sizemags[stdkz-1][ll] - latex_size) < best_diff) { /*END IF*/ + strcpy(sizecode[bracelvl], sizekey[ll]); + selectsize = sizemags[stdkz-1][ll]; + *magnif = sizemags[stdkz-1][ll]; + best_diff = abs(selectsize - latex_size); + } + } + + sign_str(selectsize, works); + sprintf(STR1, " selectsize=%s xkey=%s", works, sizecode[bracelvl]); + println_msg(2, STR1); + +} + + +/*---------------------------------------------------------------------------*/ +Static Void font_clean(sizeheader, magnification) +Char *sizeheader; +short magnification; +{ + Char STR1[256]; + + if (latex209) { + sprintf(STR1, "%sbfit", sizeheader); + font_subs("\\rm\\bf\\it", STR1, "bxti10", magnification); + sprintf(STR1, "%sbfit", sizeheader); + font_subs("\\rm\\it\\bf", STR1, "bxti10", magnification); + sprintf(STR1, "%sbfsl", sizeheader); + font_subs("\\rm\\bf\\sl", STR1, "bxsl10", magnification); + sprintf(STR1, "%sbfsl", sizeheader); + font_subs("\\rm\\sl\\bf", STR1, "bxsl10", magnification); + sprintf(STR1, "%ssfbf", sizeheader); + font_subs("\\rm\\bf\\sf", STR1, "ssbx10", magnification); + sprintf(STR1, "%ssfbf", sizeheader); + font_subs("\\rm\\sf\\bf", STR1, "ssbx10", magnification); + sprintf(STR1, "%sbfit", sizeheader); + font_subs("\\bf\\it", STR1, "bxti10", magnification); + sprintf(STR1, "%sbfit", sizeheader); + font_subs("\\it\\bf", STR1, "bxti10", magnification); + sprintf(STR1, "%sbfsl", sizeheader); + font_subs("\\bf\\sl", STR1, "bxsl10", magnification); + sprintf(STR1, "%sbfsl", sizeheader); + font_subs("\\sl\\bf", STR1, "bxsl10", magnification); + sprintf(STR1, "%ssfbf", sizeheader); + font_subs("\\bf\\sf", STR1, "ssbx10", magnification); + sprintf(STR1, "%ssfbf", sizeheader); + font_subs("\\sf\\bf", STR1, "ssbx10", magnification); + if (magnification > 2000) { /*definir explicitement les grosses polices*/ + sprintf(STR1, "%sobf", sizeheader); + font_subs("\\rm\\oul", STR1, "obx10", magnification); + sprintf(STR1, "%ssf", sizeheader); + font_subs("\\rm\\sf", STR1, "ss10", magnification); + sprintf(STR1, "%sit", sizeheader); + font_subs("\\rm\\it", STR1, "ti10", magnification); + sprintf(STR1, "%ssl", sizeheader); + font_subs("\\rm\\sl", STR1, "sl10", magnification); + sprintf(STR1, "%ssc", sizeheader); + font_subs("\\rm\\sc", STR1, "csc10", magnification); + sprintf(STR1, "%stt", sizeheader); + font_subs("\\rm\\tt", STR1, "tt10", magnification); + sprintf(STR1, "%ssf", sizeheader); + font_subs("\\sf", STR1, "ss10", magnification); + sprintf(STR1, "%sit", sizeheader); + font_subs("\\it", STR1, "ti10", magnification); + sprintf(STR1, "%ssl", sizeheader); + font_subs("\\sl", STR1, "sl10", magnification); + sprintf(STR1, "%ssc", sizeheader); + font_subs("\\sc", STR1, "csc10", magnification); + sprintf(STR1, "%stt", sizeheader); + font_subs("\\tt", STR1, "tt10", magnification); + } + } else { + font_subs2e("\\rm\\bf\\it", "\\bfit"); + font_subs2e("\\rm\\it\\bf", "\\bfit"); + font_subs2e("\\rm\\bf\\sl", "\\bfsl"); + font_subs2e("\\rm\\sl\\bf", "\\bfsl"); + font_subs2e("\\rm\\bf\\sf", "\\sfbf"); + font_subs2e("\\rm\\sf\\bf", "\\sfbf"); + font_subs2e("\\rm\\sf\\it", "\\sfit"); + font_subs2e("\\rm\\sf\\sl", "\\sfsl"); + font_subs2e("\\bf\\it", "\\bfit"); + font_subs2e("\\it\\bf", "\\bfit"); + font_subs2e("\\bf\\sl", "\\bfsl"); + font_subs2e("\\sl\\bf", "\\bfsl"); + font_subs2e("\\bf\\sf", "\\sfbf"); + font_subs2e("\\sf\\bf", "\\sfbf"); + font_subs2e("\\sf\\it", "\\sfit"); + font_subs2e("\\sf\\sl", "\\sfsl"); + if (magnification > 2000) { /*definir explicitement les grosses polices*/ + sprintf(STR1, "%sobf", sizeheader); + font_subs("\\rm\\oul", STR1, "obx10", magnification); + sprintf(STR1, "%ssf", sizeheader); + font_subs("\\rm\\sf", STR1, "ss10", magnification); + sprintf(STR1, "%sit", sizeheader); + font_subs("\\rm\\it", STR1, "ti10", magnification); + sprintf(STR1, "%ssl", sizeheader); + font_subs("\\rm\\sl", STR1, "sl10", magnification); + sprintf(STR1, "%ssc", sizeheader); + font_subs("\\rm\\sc", STR1, "csc10", magnification); + sprintf(STR1, "%stt", sizeheader); + font_subs("\\rm\\tt", STR1, "tt10", magnification); + sprintf(STR1, "%ssf", sizeheader); + font_subs("\\sf", STR1, "ss10", magnification); + sprintf(STR1, "%sit", sizeheader); + font_subs("\\it", STR1, "ti10", magnification); + sprintf(STR1, "%ssl", sizeheader); + font_subs("\\sl", STR1, "sl10", magnification); + sprintf(STR1, "%ssc", sizeheader); + font_subs("\\sc", STR1, "csc10", magnification); + sprintf(STR1, "%stt", sizeheader); + font_subs("\\tt", STR1, "tt10", magnification); + } + } + sprintf(STR1, "%sobf", sizeheader); + /* latex2e */ + /*END IF latex209*/ + font_subs("\\rm\\oul", STR1, "obx10", magnification); + +} + + +/*---------------------------------------------------------------------------*/ +/* output the correct LaTeX spacing size according to NUMVAL (unit=1/20 pt) */ +/* stores it in spacingcode[bracelvl] ; uses the global variable "stdsize" */ + +Static Void outpsize(numval) +short numval; +{ + short ll; + short selectsize = 0, best_diff = 30000; + Char STR1[108]; + Char STR3[40]; + + if (base_flag) { + str_twips_pt(numval, worksa); + sprintf(STR3, "baselineskip%spt", worksa); + truncate24(spacingcode[bracelvl], STR3); + return; + } + /* I select the nearest sizeval -- spacings in twips */ + /* big integer */ + strcpy(spacingcode[bracelvl], "tiny"); + for (ll = 0; ll <= numsizes - 1; ll++) { /*END DO*/ + if (abs(sizeval[stdkz-1][ll] - numval) < best_diff) { /*END IF*/ + strcpy(spacingcode[bracelvl], sizekey[ll]); + selectsize = sizeval[stdkz-1][ll]; + best_diff = abs(sizeval[stdkz-1][ll] - numval); + } + } + + sign_str(numval, works); + sign_str(selectsize, worksa); + sprintf(STR1, "--> (\\par)numval=%s selectsize=%s pkey=%s", + works, worksa, spacingcode[bracelvl]); + print_msg(2, STR1); + /*END IF*/ +} + + +/*---------------------------------------------------------------------------*/ +/* remove $^ before, and remove math_mode if possible */ + +Static Void remove_mathat() +{ + if (math_mode[bracelvl] > 0) { /*END IF math_mode*/ + if (auto_close[bracelvl]) { + outrem("{"); + if (removed_ok) + bracelvl--; + } + outrem("^"); + outrem("\\relax"); + if (math_mode[bracelvl] == 1) { + outrem("$"); + if (removed_ok) + math_mode[bracelvl] = 0; + } + } + outrem("{}"); +} + + +/* --------------------------------------------------------------------------*/ +/* close brace and decrement bracelvl */ + +Static Void close_brace() +{ + Char STR1[44]; + Char STR3[68]; + + if (bracelvl <= 0) { + sign_str(numl + 1, works); + sprintf(STR1, "Too many } at line %s", works); + println_msg(0, STR1); + print_line(0); + outstg("}%%%%% *****"); + } else { + if (lvlcode[bracelvl] != 6) { + if (tex_verbose > 1) { + sign_str(bracelvl, worksa); + sign_str(lvlcode[bracelvl], works); + sprintf(STR3, "\\closebr{%s[%s]}\\relax", worksa, works); + outstg(STR3); + output_line(); + } + } + } + bracelvl--; + /* reset footnote cleaning */ + if (lvlcode[bracelvl] == 3) /*END IF bracelvl*/ + lvlcode[bracelvl] = 0; +} + + +/*---------------------------------------------------------------------------*/ +/* output \end(<arg>) */ + +Static Void end_env(environ) +short environ; +{ + output_line(); + outkeyw("end{"); + outstg(environ_type[environ]); + outchr('}'); + close_brace(); + output_line(); +} + + +/*---------------------------------------------------------------------------*/ +/* stores a new couple of word font chars and number taken in +decl_font_num which is a global variable */ + +Static Void store_word_font(font_type) +Char *font_type; +{ + short k; + Char new_fnt_name[256]; + short loc_brace_count = 0; + short FORLIM; + Char STR2[256], STR3[256]; + + sign_str(decl_font_num, works); + FORLIM = num_word_fonts; + for (k = 0; k <= FORLIM - 1; k++) { /*END/IF + END FOR*/ + if (word_font_num[k] == decl_font_num) { + sprintf(STR2, "RTF font No. %s/%s already declared; this one ignored.", + works, font_type); + println_msg(0, STR2); + return; + } + } + if (num_word_fonts >= maxfonts) { /*END IF*/ + sprintf(STR3, "Too many RTF fonts: %s/%s; this one ignored.", + works, font_type); + println_msg(0, STR3); + return; + } + *new_fnt_name = '\0'; + while (kar != ';' && kar != '}' || loc_brace_count > 0) { + /* while (kar<>';') do */ + if (kar == '{') + loc_brace_count++; + if (kar == '}') + loc_brace_count--; + read_char(); + if (kar != ' ') + sprintf(new_fnt_name + strlen(new_fnt_name), "%c", kar); + } + outrem_empty_braces(); + num_word_fonts++; + word_font_num[num_word_fonts-1] = decl_font_num; + truncate24(word_fonts[num_word_fonts-1], font_type); + sign_str(num_word_fonts, worksa); + if (strpos2(new_fnt_name, "Courier", 1) > 0) + strcpy(equiv_fonts[num_word_fonts-1], "\\tt"); + else if (strpos2(new_fnt_name, "TTY", 1) > 0) + strcpy(equiv_fonts[num_word_fonts-1], "\\tt"); + else if (strpos2(new_fnt_name, "Helvetica", 1) > 0) + strcpy(equiv_fonts[num_word_fonts-1], "\\sf"); + else if (strpos2(new_fnt_name, "SansSerif", 1) > 0) + strcpy(equiv_fonts[num_word_fonts-1], "\\sf"); + else + *equiv_fonts[num_word_fonts-1] = '\0'; + sprintf(STR3, "%s Font %s stored: \"%s\" = %s", + worksa, works, font_type, new_fnt_name); + /*END IF*/ + println_msg(2, STR3); +} + + + +/*---------------------------------------------------------------------------*/ +/* sets active_RTFf of current bracelvl at the alpha value recorded with kkk +as \F<number> in \fonttbl declaration */ + +Static Void set_active_RTFf(kkk) +short kkk; +{ + short k, FORLIM; + Char STR1[40]; + Char STR2[100]; + Char STR3[38]; + Char STR4[62]; + Char STR5[82]; + + FORLIM = num_word_fonts; + for (k = 0; k <= FORLIM - 1; k++) { /*END/IF + END FOR*/ + if (word_font_num[k] == kkk) { + sign_str(kkk, works); + sprintf(STR2, "RTF font No. %s of type %s \"%s\"", + works, word_fonts[k], equiv_fonts[k]); + println_msg(2, STR2); + add_to_bfsl(equiv_fonts[k]); + ensure_sizebfsl(); + strcpy(active_RTFf[bracelvl], word_fonts[k]); + return; + } + } + if (lvlcode[bracelvl] != 6) { /*END IF lvlcode*/ + print_line(2); + sign_str(num_word_fonts, works); + sprintf(STR1, "num_word_fonts=%s", works); + println_msg(2, STR1); + FORLIM = num_word_fonts; + for (k = 0; k <= FORLIM - 1; k++) { + sign_str(word_font_num[k], works); + sprintf(STR4, " %s --> \"%s\"", works, word_fonts[k]); + println_msg(2, STR4); + } + sign_str(kkk, works); + sprintf(STR3, "RTF font No. %s", works); + print_msg(2, STR3); + sign_str(lvlcode[bracelvl], works); + sign_str(bracelvl, worksa); + sprintf(STR5, " font of type unknown, lvlcode[%s]=%s", worksa, works); + println_msg(2, STR5); + sign_str(lvlcode[bracelvl-1], works); + sign_str(bracelvl - 1, worksa); + sprintf(STR5, " font of type unknown, lvlcode[%s]=%s", worksa, works); + println_msg(2, STR5); + } + *active_RTFf[bracelvl] = '\0'; +} + + +/* ------------------------------------------------------------------------- */ +/* closing a \sum(...) ... possibly at a ) found !!!!!*/ + +Static Void close_sum() +{ + close_brace(); + close_math(); +} + + +/* ------------------------------------------------------------------------- */ +/* closing a \sum(...) ... possibly at a closing brace if no ) found !!!!!*/ + +Static Void close_sum_emergency(kode) +Char *kode; +{ + short k; + Char STR1[256]; + Char STR3[42]; + short FORLIM; + + sign_str(input_line_number, works); + sprintf(STR1, "Emergency close of \\|su or \\|i due to }%s at inp.line %s", + kode, works); + println_msg(1, STR1); + sign_str(next_rtf[0], works); + sprintf(STR3, "pattern : \"%c%c\" %s", kar, next_rtf[0], works); + print_msg(1, STR3); + print_line(1); + _SETIO(printf("kinp=%d prev_kinp=%d\n", kinp, prev_kinp) >= 0, + FileWriteError); + FORLIM = prev_kinp; + for (k = 0; k <= FORLIM - 1; k++) { + sprintf(STR1, "%c", prev_line[k]); + print_msg(1, STR1); + } + println_msg(1, " "); + FORLIM = kinp; + for (k = 0; k <= FORLIM - 1; k++) { + sprintf(STR1, "%c", inpline[k]); + print_msg(1, STR1); + } + println_msg(1, " "); + outstg("\\emergcA "); + close_sum(); +} + + +/* --------------------------------------------------------------------------*/ +Static Void perform_RTFcell() +{ + if (verbose > 0) + _SETIO(printf("(found)%s[%d,%d,%d]\n", + inkeyw, lvlcode[bracelvl], tab_nb_ands[bracelvl], + bracelvl) >= 0, FileWriteError); + if (lvlcode[bracelvl] == 15) { + output_real_line(); + /* count the number of ampersands in the tabular line */ + tab_nb_ands[bracelvl]++; + if (tab_nb_ands[bracelvl] < tab_nb_cellx[bracelvl]) { + outstg(" & "); + if (verbose > 1) + _SETIO(printf("(after &)%s[%d,%d]\n", + inkeyw, lvlcode[bracelvl], + bracelvl) >= 0, FileWriteError); + return; + } + outstg("\\\\"); + if (clbrdrb) + outkeyw("hline "); + if (verbose > 1) + _SETIO(printf("(after &->\\\\)%s[%d,%d]\n", + inkeyw, lvlcode[bracelvl], + bracelvl) >= 0, FileWriteError); + return; + } + if (verbose > 2) + _SETIO(printf("%s[%d,%d]\n", inkeyw, lvlcode[bracelvl], bracelvl) >= 0, + FileWriteError); + outkeyw("relax"); + output_line(); /* next line to ensure possible removal */ + outkeyw("RTFcell "); + /*END IF lvlcode*/ + +} + + +/* --------------------------------------------------------------------------*/ +/* procedure to close center and flushright environments */ + +Static Void close_envir() +{ + boolean RTF_cell_removed; + + envir_closed_ok = false; + if (center_flag[bracelvl] == 2) { + if (!no_space_conv) + output_size(spacingcode[bracelvl]); + outkrem("RTFcell "); + RTF_cell_removed = removed_ok; + center_flag[bracelvl] = 0; + end_env(1); + if (RTF_cell_removed) + perform_RTFcell(); + output_line(); + envir_closed_ok = true; /* output_line; */ + return; + } + if (flushright_flag[bracelvl] != 2) + return; + if (!no_space_conv) + output_size(spacingcode[bracelvl]); + outkrem("RTFcell "); + RTF_cell_removed = removed_ok; + flushright_flag[bracelvl] = 0; + end_env(2); + if (RTF_cell_removed) + perform_RTFcell(); + output_line(); + envir_closed_ok = true; /* output_line; */ + /*END IF center_flag*/ +} + + +/* --------------------------------------------------------------------------*/ +/* procedure to perform RTFsb/RTFsa */ + +Static Void make_RTFsab(numval) +short numval; +{ + Char STR1[48]; + + if (numval > 300) { + outkeyw("bigskip{}"); + return; + } + if (numval > 200) { + outkeyw("medskip{}"); + return; + } + if (numval > 100) { + outkeyw("smallskip{}"); + return; + } + if (numval > 0) { + outkeyw("vspace 0.5\\smallskipamount{}"); + return; + } + if (numval < 0) { + sign_str(numval, works); + sprintf(STR1, "neg. spacing, NUMVAL:=%s", works); + println_msg(1, STR1); + /*END IF*/ + } +} + + +/* --------------------------------------------------------------------------*/ +/* procedure to perform RTFpar (separate since it may be delayed after a } */ + +Static Void make_RTFpar(texcode) +Char *texcode; +{ + short k; + short num_forced = 0; + boolean was_underl; + Char STR1[72]; + Char STR2[36]; + Char STR3[44]; + + while (math_mode[bracelvl] > 1) { + if (lvlcode[bracelvl] == 16) + outstg("\\relax %%% ???"); + else + outstg("}\\relax %%% !!!"); + output_line(); + close_brace(); + num_forced++; + } + close_math(); + if (num_forced > 0) { /*END IF*/ + close_envir(); + output_size(spacingcode[bracelvl]); + output_line(); + output_line(); + par_to_begin = true; + num_indent = 0; + if (space_after != 0) + make_RTFsab(space_after); + space_after = 0; + sign_str(input_line_number, worksa); + sign_str(bracelvl, works); + sprintf(STR1, "input line %s, bracelvl=%s", worksa, works); + println_msg(0, STR1); + sign_str(num_forced, works); + sprintf(STR2, "num_forced=%s", works); + println_msg(0, STR2); + } + + was_underl = underl_flag[bracelvl]; + outkrem(bfslcode[bracelvl]); + if (was_underl) + outchr('}'); + output_line(); + if (!no_space_conv) + output_size(spacingcode[bracelvl]); + close_envir(); + if (!(envir_closed_ok || no_space_conv)) + outkeyw("null "); + outstg(texcode); + if (space_after != 0) + make_RTFsab(space_after); + space_after = 0; + par_to_begin = true; + num_indent = 0; + + if (was_underl) + outkeyw("underbar{"); + + for (k = 1; k <= num_forced; k++) { /*END DO*/ + outchr('{'); + bracelvl++; + math_mode[bracelvl] = 0; /*do not open ??? */ + } + + sign_str(bracelvl, works); + if (num_forced > 0) { + sprintf(STR3, "restored bracelvl=%s", works); + println_msg(0, STR3); + } +} + + +/* --------------------------------------------------------------------------*/ +/* replace recent space with a ~ (before : ; ? ! in general */ +Static Void insert_tilde(CHARAC) +Char CHARAC; +{ + if (math_mode[bracelvl] == 0) { /*END IF*/ + outrem(" "); + if (removed_ok) + outchr('~'); + } + begin_par(); + outchr(CHARAC); + keyw = 0; +} + + +/* --------------------------------------------------------------------------*/ +/* initiates "tabular" but does not reset parms to zero */ +Static Void perform_RTFtrow() +{ + if (verbose > 0) + _SETIO(printf("(init row)%s[%d,%d]\n", + inkeyw, lvlcode[bracelvl], bracelvl) >= 0, FileWriteError); + open_brace(); + lvlcode[bracelvl] = 13; + if (verbose > 1) + _SETIO(printf("%s(after)[%d,%d]\n", inkeyw, lvlcode[bracelvl], bracelvl) >= 0, + FileWriteError); + tab_nb_ands[bracelvl] = 0; +} + + +/* --------------------------------------------------------------------------*/ +Static Void perform_RTFrow() +{ + if (lvlcode[bracelvl] == 15) { + if (verbose > 0) + _SETIO(printf("\\RTFrow[%d,%d,%d]\n", + lvlcode[bracelvl], tab_nb_cellx[bracelvl], + bracelvl) >= 0, FileWriteError); + close_brace(); + outkeyw("end{tabular}\\par "); + tab_nb_cellx[bracelvl] = tab_nb_cellx[bracelvl+1]; + return; + } + if (verbose > 1) + _SETIO(printf("\\RTFrow[%d,%d]\n", lvlcode[bracelvl], bracelvl) >= 0, + FileWriteError); + output_real_line(); + outkeyw("RTFrow "); + /*END IF lvlcode*/ + +} + + +/* --------------------------------------------------------------------------*/ +Static Void make_closing_brace() +{ + Char pict_byte; + boolean already_closed = false; + Char STR1[142]; + Char STR2[148]; + Char STR3[34]; + + while (auto_close[bracelvl]) { /*END WHILE auto_close*/ + if (math_mode[bracelvl] == 1) + outchr('$'); + outchr('}'); + close_brace(); + } + /* check "*/ + /*" within \|I(...) and similar : then ignore pair */ + if (lvlcode[bracelvl] >= 16 && next_rtf[0] == '{') { + next_rtf[0] = '\0'; + return; + } + if (*form_code[bracelvl] != '\0' && next_rtf[0] == '{') { + next_rtf[0] = '\0'; + return; + } + /* special case of \|su(...) closing */ + if (lvlcode[bracelvl] == 25) + close_sum(); + else if (lvlcode[bracelvl] >= 16) + close_sum_emergency("lvlc"); + /*END IF*/ + close_math(); + + if (lvlcode[bracelvl] != 4) { + if (lvlcode[bracelvl] == 5) { + /* this is \RTFpict closing brace */ + if (pict_left_hexa) { /*END IF pict_left_hexa*/ + /* look whether there is already one hexa digit stored*/ + pict_last_hexa *= 16; + pict_byte = pict_last_hexa; + _SETIO(putc(pict_byte, figurefile) >= 0, FileWriteError); + pict_byte_number++; + pict_last_hexa = 0; + pict_left_hexa = false; + } + + if (figurefile != NULL) + fclose(figurefile); + figurefile = NULL; + sprintf(STR1, "closed file %s", figure_name); + print_msg(1, STR1); + sign_str((int)pict_byte_number, works); + sprintf(STR3, "(%s bytes)", works); + println_msg(1, STR3); + outchr(kar); + } else if (lvlcode[bracelvl] == 10) { + sprintf(STR2, "closed dummy file %s", figure_name); + /* this is \RTFobject closing brace */ + println_msg(1, STR2); + outchr(kar); + } + /* if there was a \cell just before, put it outside the closing brace */ + else if (last_is("\\RTFcell ")) { + if (verbose > 1) + _SETIO(printf("closing}[%d,%d]\n", lvlcode[bracelvl], bracelvl) >= 0, + FileWriteError); + outkrem("RTFcell "); + if (!removed_ok) + _SETIO(printf("*** \\RTFcell not removed before } ***\n") >= 0, + FileWriteError); + outchr(kar); + close_brace(); + already_closed = true; + if (verbose > 0) + _SETIO(printf("moved \\RTFcell [%d,%d]\n", + lvlcode[bracelvl], bracelvl) >= 0, FileWriteError); + perform_RTFcell(); + } + /* if there was a \row just before, put it outside the closing brace */ + else if (last_is("\\RTFrow ")) { + if (verbose > 1) + _SETIO(printf("closing}[%d,%d]\n", lvlcode[bracelvl], bracelvl) >= 0, + FileWriteError); + outkrem("RTFrow "); + outchr(kar); + close_brace(); + already_closed = true; + if (verbose > 0) + _SETIO(printf("moved \\RTFrow [%d,%d]\n", lvlcode[bracelvl], bracelvl) >= + 0, FileWriteError); + perform_RTFrow(); + } else { + /* if there was a \par just before, put it outside the closing brace */ + if (last_is("\\null \\par ")) { + outkrem("null \\par "); + outchr(kar); + if (no_space_conv) + outkeyw("par "); + else + outkeyw("null \\par "); + } else if (last_is("\\par ")) { + outkrem("par "); + outchr(kar); + outkeyw("par "); + } else + outchr(kar); + /*ENF IF*/ + + if (*form_code[bracelvl] != '\0') { /*END IF*/ + if (*form_code[bracelvl-1] == '\0') + strcpy(form_code[bracelvl-1], form_code[bracelvl]); + else { + close_sum_emergency("form"); + /* this is an ordinary closing brace */ + } + } + /*END IF*/ + } + } + /* this is footnote first and dummy RTF argument closing brace */ + + /*END IF*/ + if (!already_closed) { + close_brace(); + /*END IF*/ + } +} + + +/* --------------------------------------------------------------------------*/ +/* special output of single characters due to \TeX special codings */ + +Static Void special_TeX_chars() +{ + Char STR1[256]; + + begin_par(); + if (kar == '$') { + outstg("\\$"); + /*END IF*/ + return; + } + if (kar == '_') { + outstg("\\_"); + return; + } + if (kar == '#') { + outstg("\\#"); + return; + } + if ((kar == '>' || kar == '<') && math_mode[bracelvl] == 0) { + sprintf(STR1, "%c", kar); + out_math(STR1); + return; + } + if (kar == '&') { + outstg("\\&"); + return; + } + if (kar == '%') { + outstg("\\%"); + return; + } + if (kar == '^') { + outstg("\\^{ }"); + return; + } + if (kar == '~') + out_math("\\sim{}"); + else + outchr(kar); +} + + +/* --------------------------------------------------------------------------*/ +/* **************** Beginning of RTF decoding procedures ******************* */ +/*---------------------------------------------------------------------------*/ +/* treats a character when KEYW is 0 */ +/* no keyword decoding presently active */ + +Static Void keyw_is_0() +{ + short hexa_digit; + Char pict_byte; + string24 open_kar, RTFform, acc_converted, STR1; + Char STR2[28]; + Char STR3[26]; + Char STR4[256]; + Char STR5[32]; + Char STR6[36]; + Char STR8[12]; + + if (cat == 0) { /* this is a backslash */ + if (lvlcode[bracelvl] == 3) + return; + /* ignore after \footnote until opening brace */ + if (lvlcode[bracelvl] == 4) + return; + /* ignore after \footnote { (first brace pair after) */ + if (lvlcode[bracelvl] == 9) { + /*END IF active_RTF*/ + return; + } + + keyw = 1; + numval = 0; + numsign = 1; + strcpy(inkeyw, "\\RTF"); + return; + } + /*END IF*/ + if (cat == 1) { /* this is an opening brace */ + if (no_RTFrtf) /* ignore first opening brace before \rtf1 */ + return; + if (lvlcode[bracelvl] == 3) { + open_brace(); + return; + } + if (lvlcode[bracelvl] == 4) { + open_brace(); + return; + } + if (lvlcode[bracelvl] == 6) { + outchr(kar); + open_brace(); + return; + } + if (par_to_begin) + output_size(sizecode[bracelvl]); + make_center(); + outchr(kar); + open_brace(); + return; + } + /*END IF*/ + if (cat == 2) { /* this is a closing brace */ + close_envir(); + if (bracelvl > 0) + make_closing_brace(); + return; + } + if (cat == 3) { /* this is an opening parenthesis '(' */ + if (*form_code[bracelvl] != '\0') { + if (!strcmp(form_code[bracelvl], "\\RTFformulaB")) { + sprintf(STR2, "%sBC(", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR1, STR2)); + } + if (!strcmp(form_code[bracelvl], "\\RTFformulaBLC")) { + sprintf(STR3, "%s(", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR1, STR3)); + } + if (!strcmp(form_code[bracelvl], "\\RTFformulaBRC")) { + sprintf(STR3, "%s(", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR1, STR3)); + } + if (!strcmp(form_code[bracelvl], "\\RTFformulaBBC")) { + sprintf(STR3, "%s(", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR1, STR3)); + } + if (strpos2(form_code[bracelvl], "\\RTFformulaBBC", 1) > 0) { + strcpy(RTFform, form_code[bracelvl]); + sprintf(open_kar, "%c", RTFform[strlen(RTFform) - 1]); + if (!strcmp(open_kar, "{")) + strcpy(open_kar, "\\{"); + out_math_leave("\\left"); + outstg(open_kar); + outchr(' '); + *form_code[bracelvl] = '\0'; + open_brace(); + lvlcode[bracelvl] = 16; /* special code to close with ) */ + if (!strcmp(open_kar, "(")) + strcpy(close_kar[bracelvl], ")"); + else if (!strcmp(open_kar, "[")) + strcpy(close_kar[bracelvl], "]"); + else if (!strcmp(open_kar, "\\{")) + strcpy(close_kar[bracelvl], "\\}"); + else + strcpy(close_kar[bracelvl], open_kar); + /*END IF open_kar*/ + kar = ' '; /* to prevent do_it_again */ + return; + } + if (strpos2(form_code[bracelvl], "\\RTFformulaBLC", 1) > 0) { + strcpy(RTFform, form_code[bracelvl]); + sprintf(open_kar, "%c", RTFform[strlen(RTFform) - 1]); + if (!strcmp(open_kar, "{")) + strcpy(open_kar, "\\{"); + out_math_leave("\\left"); + outstg(open_kar); + outchr(' '); + *form_code[bracelvl] = '\0'; + open_brace(); + lvlcode[bracelvl] = 16; /* special code to close with ) */ + strcpy(close_kar[bracelvl], "."); + kar = ' '; /* to prevent do_it_again */ + return; + } + if (strpos2(form_code[bracelvl], "\\RTFformulaBRC", 1) > 0) { + strcpy(RTFform, form_code[bracelvl]); + sprintf(open_kar, "%c", RTFform[strlen(RTFform) - 1]); + if (!strcmp(open_kar, "{")) + strcpy(open_kar, "\\{"); + out_math_leave("\\left. "); + *form_code[bracelvl] = '\0'; + open_brace(); + lvlcode[bracelvl] = 16; /* special code to close with ) */ + if (!strcmp(open_kar, "(")) + strcpy(close_kar[bracelvl], ")"); + else if (!strcmp(open_kar, "[")) + strcpy(close_kar[bracelvl], "]"); + else if (!strcmp(open_kar, "\\{")) + strcpy(close_kar[bracelvl], "\\}"); + else + strcpy(close_kar[bracelvl], open_kar); + /*END IF open_kar*/ + kar = ' '; /* to prevent do_it_again */ + return; + } + /* case of \|F( ... ; ... ) */ + if (!strcmp("\\RTFformulaF", form_code[bracelvl])) { + *form_code[bracelvl] = '\0'; + out_math_leave("{\\displaystyle "); + open_brace(); + lvlcode[bracelvl] = 17; + kar = ' '; /* to prevent do_it_again */ + return; + } + /* case of \|D\|BA() or \|D\|FO() */ + if (!strcmp("\\RTFformulaDFO", form_code[bracelvl])) { + sign_str(displ_skip, worksa); + *form_code[bracelvl] = '\0'; + sprintf(STR5, "kern %spt", worksa); + outkeyw(STR5); + open_brace(); + lvlcode[bracelvl] = 28; + kar = ' '; /* to prevent do_it_again */ + return; + } + /* case of \|D\|LI() */ + if (!strcmp("\\RTFformulaDLI", form_code[bracelvl])) { + sign_str(displ_skip, worksa); + *form_code[bracelvl] = '\0'; + sprintf(STR6, "RTFhrule %spt", worksa); + outkeyw(STR6); + open_brace(); + lvlcode[bracelvl] = 28; + kar = ' '; /* to prevent do_it_again */ + return; + } + /* case of \|O( ... ; ... ) */ + if (!strcmp("\\RTFformulaO", form_code[bracelvl])) { + *form_code[bracelvl] = '\0'; + begin_par(); + outkeyw("hbox{\\ooalign{\\hfil{}"); + open_brace(); + lvlcode[bracelvl] = 26; + math_mode[bracelvl] = 0; + kar = ' '; /* to prevent do_it_again */ + return; + } + /* case of \|L( ... ; ... ) */ + if (!strcmp("\\RTFformulaL", form_code[bracelvl])) { + *form_code[bracelvl] = '\0'; + begin_par(); + outchr('{'); + open_brace(); + lvlcode[bracelvl] = 27; + kar = ' '; /* to prevent do_it_again */ + return; + } + /* case of \|R( ... ; ... ) */ + if (!strcmp("\\RTFformulaR", form_code[bracelvl])) { + *form_code[bracelvl] = '\0'; + out_math_leave("\\sqrt{"); + open_brace(); + lvlcode[bracelvl] = 23; + kar = ' '; /* to prevent do_it_again */ + return; + } + /* case of \|X( ... ; ... ) */ + if (strpos2(form_code[bracelvl], "\\RTFformulaX", 1) > 0) { + *form_code[bracelvl] = '\0'; + begin_par(); + sprintf(STR8, "\\boxed%s{", strsub(STR4, form_code[bracelvl], 11, 3)); + outstg(STR8); + open_brace(); + lvlcode[bracelvl] = 7; + kar = ' '; /* to prevent do_it_again */ + return; + } + /* case of \|S( ... ; ... ) */ + if (!strcmp("\\RTFformulaS", form_code[bracelvl]) || + !strcmp("\\RTFformulaSUP", form_code[bracelvl])) { + *form_code[bracelvl] = '\0'; + out_math_leave("^{"); + open_brace(); + lvlcode[bracelvl] = 18; + kar = ' '; /* to prevent do_it_again */ + return; + } + /* case of \|SDO( ... ; ... ) */ + if (!strcmp("\\RTFformulaSDO", form_code[bracelvl])) { + *form_code[bracelvl] = '\0'; + out_math_leave("_{"); + open_brace(); + lvlcode[bracelvl] = 19; + kar = ' '; /* to prevent do_it_again */ + return; + } + /* case of \|I( ... ; ... ) */ + if (!strcmp("\\RTFformulaI", form_code[bracelvl])) { + *form_code[bracelvl] = '\0'; + out_math_leave("\\int_{"); + open_brace(); + lvlcode[bracelvl] = 20; + kar = ' '; /* to prevent do_it_again */ + return; + } + /* case of \|ISU( ... ; ... ) */ + if (!strcmp("\\RTFformulaISU", form_code[bracelvl])) { + *form_code[bracelvl] = '\0'; + out_math_leave("\\displaystyle\\sum_{"); + open_brace(); + lvlcode[bracelvl] = 20; + kar = ' '; /* to prevent do_it_again */ + return; + } + /* case of \|IPR( ... ; ... ) */ + if (strcmp("\\RTFformulaIPR", form_code[bracelvl])) + return; + *form_code[bracelvl] = '\0'; + out_math_leave("\\displaystyle\\prod_{"); + open_brace(); + lvlcode[bracelvl] = 20; + kar = ' '; /* to prevent do_it_again */ + return; + } + /* if an opening parenthese is found inside a deep formula, set lvlcode at 25 */ + /*END IF*/ + if (abs(lvlcode[bracelvl]) < 17) { + begin_par(); + outchr(kar); + return; + } + outchr(kar); + open_brace(); + lvlcode[bracelvl] = 25; + return; + } + /*END IF form_code */ + if (cat == 4) { /* this is a closing parenthesis ')' */ + /* test 23 sept */ + while (lvlcode[bracelvl] < 0 && auto_close[bracelvl]) + { /*END WHILE auto_close*/ + if (math_mode[bracelvl] == 1) + outchr('$'); + outchr('}'); + close_brace(); + } + /* fin test 23 sept */ + /* special case of \|B..(...) closing */ + if (lvlcode[bracelvl] == 16) { + outstg("\\right"); + outstg(close_kar[bracelvl]); + close_sum(); + return; + } + /* special case of \|X..(...) closing */ + if (lvlcode[bracelvl] == 7) { + outchr('}'); + close_sum(); + return; + } + /* closing parenthese found inside a formula, was opened with another ( 25 */ + if (lvlcode[bracelvl] == 25) { + outchr(kar); + close_brace(); + return; + } + /* closing parenthese found inside a formula \|O */ + if (lvlcode[bracelvl] == 26) { + close_math(); + outstg("\\hfil}}"); + close_brace(); + return; + } + /* closing parenthese found inside a formula \|L */ + if (lvlcode[bracelvl] == 27) { + outchr('}'); + close_brace(); + return; + } + /* closing parenthese found inside a formula \|D */ + if (lvlcode[bracelvl] == 28) { + outstg("{}"); + close_brace(); + return; + } + /* special case of \|F(...) closing */ + /* special case of \|S(...) closing */ + /* special case of \|SDO(...) closing */ + /* special case of \|I(...) closing */ + /* special case of \|I(..;..) closing */ + /* special case of \|I(..;..;..) closing */ + /* special case of \|R(...) closing */ + if (lvlcode[bracelvl] >= 17) { + close_subs(); + close_sum(); + return; + } + /* closing parenthese found inside a deep formula, make it 1 level lower */ + if (-lvlcode[bracelvl] >= 17) + sprintf(next_rtf, "}){%s", strcpy(STR4, next_rtf)); + else { + begin_par(); + outchr(kar); + } + return; + } + /* Ignore chars to be ignored */ + /*END IF lvlcode*/ + if (lvlcode[bracelvl] == 1) + return; + + if (lvlcode[bracelvl] == 3) + return; + + if (lvlcode[bracelvl] == 4) + return; + + if (lvlcode[bracelvl] == 5) { /* we are in the hexa part of a \RTFpict */ + /* ignore possible blanks and control characters within hexadecimal field */ + if (kar <= 32) /*END IF*/ + return; + hexa_digit = hx_to_i(kar); + pict_char_number++; + if (pict_left_hexa) { + /* there is already one hexa digit stored*/ + pict_last_hexa = pict_last_hexa * 16 + hexa_digit; + pict_byte = pict_last_hexa; + _SETIO(putc(pict_byte, figurefile) >= 0, FileWriteError); + pict_byte_number++; + pict_last_hexa = 0; + pict_left_hexa = false; + return; + } + /* there is no hexa digit stored*/ + pict_last_hexa = hexa_digit; + last_kar = kar; + pict_left_hexa = true; + return; + } + /*END IF pict-left_hexa*/ + if (abs(lvlcode[bracelvl]) == 10) /* we are in \RTFobject */ + return; + + if (abs(lvlcode[bracelvl]) == 9) /* ignore other than braces */ + return; + + if (cat == 11) { /* this is a letter */ + begin_par(); + if (lvlcode[bracelvl] == 2) { /* letters to be capitalized ? */ + kar = toupper(kar); + ikar = kar; + } + /*END IF lvlcode=2*/ + if (!strcmp(active_RTFf[bracelvl], "ftech")) { + strcpy(acc_converted, ftech_transl[ikar]); + if (*acc_converted != '\0') + out_math(acc_converted); + else + outchr(kar); + return; + } + /*END IF acc_converted*/ + outrem("\\beginparagraph{}"); + if (removed_ok && kout > 0) + outstg("{}"); + outchr(kar); + return; + } + /*END IF active_RTF*/ + if (!strcmp(active_RTFf[bracelvl], "ftech")) { + begin_par(); + strcpy(acc_converted, ftech_transl[ikar]); + if (*acc_converted != '\0') + out_math(acc_converted); + else + special_TeX_chars(); + return; + } + /*END IF acc_converted*/ + if (kar == '-') { + if (last_is("\\beginparagraph{}")) { + outrem("\\beginparagraph{}"); + outkeyw("plainitem{--}"); + } else + outchr(kar); + return; + } + /*END IF*/ + if (kar == '"') { + begin_par(); /* test march 94 */ + if (math_mode[bracelvl] == 0 && (kout == 0 || last_is(" "))) + outstg("``"); + else + outstg("''"); + return; + } + /*END IF*/ + if (kar != ';') { + /*END IF*/ + special_TeX_chars(); + return; + } + /* ignore ; in colortbl section */ + if (lvlcode[bracelvl] == 9) + return; + /* special case of \|F(. ; .) intermediate semi-colon */ + if (lvlcode[bracelvl] == 17) { + /* special case of \|S(. ; .) intermediate semi-colon */ + outstg(" \\over\\displaystyle "); + return; + } + if (lvlcode[bracelvl] == 18) { + close_subs(); + out_math_leave(" _{"); + return; + } + /* special case of \|SDO(. ; .) intermediate semi-colon */ + if (lvlcode[bracelvl] == 19) { + close_subs(); + out_math_leave(" ^{"); + return; + } + /* special case of \|I(. ; .) intermediate semi-colon */ + if (lvlcode[bracelvl] == 20) { + close_subs(); + outstg(" ^{"); + lvlcode[bracelvl] = 21; + return; + } + /* special case of \|su(. ; .) second intermediate semi-colon */ + if (lvlcode[bracelvl] == 21) { + close_subs(); + outchr('{'); + lvlcode[bracelvl] = 22; + return; + } + /* special case of \|R(. ; .) intermediate semi-colon */ + if (lvlcode[bracelvl] == 23) { + outsubstitute("\\sqrt{", "\\root{"); + outstg("}\\of{"); + lvlcode[bracelvl] = 24; + output_line(); /* safety */ + return; + } + /* special case of \|O(. ; .) intermediate semi-colon */ + if (lvlcode[bracelvl] == 26) { + /* special case of \|L(. ; .) intermediate semi-colon */ + outstg("\\hfil\\crcr\\hfil{}"); + return; + } + if (lvlcode[bracelvl] == 27) + outchr(','); + else + outchr(kar); +} + + +/*---------------------------------------------------------------------------*/ +/* treats a character when KEYW is 1 */ +/* Keyword being decoded, we are just after the BACKSLASH */ + +Static Void keyw_is_1() +{ + Char STR1[256]; + + if (cat == 11) { /* letter : store and say KEYW:=2 */ + sprintf(inkeyw + strlen(inkeyw), "%c", kar); + keyw = 2; + return; + } + if (cat == 16) { /* case of a digit : store \RTF */ + outrem_empty_braces(); + outstg(inkeyw); + outchr(kar); + keyw = 0; + return; + } + /* turn \{ into \RTFaccol and... try to continue ! */ + if (kar == '{') { + out_math("\\{"); + keyw = 0; + /* inkeyw:=inkeyw+'accol '; keyw:=2 ; */ + return; + } + /* turn \} into \RTFlocca and... try to continue ! */ + if (kar == '}') { + out_math("\\}"); + keyw = 0; + /* inkeyw:=inkeyw+'locca '; keyw:=2 ; */ + return; + } + if (kar == '(') { + begin_par(); + outkeyw("RTFparen "); + keyw = 0; + return; + } + if (kar == '-') { + /* case of a word cutting hyphen \- */ + begin_par(); + sprintf(STR1, "%c", kar); + outkeyw(STR1); + keyw = 0; + return; + } + if (kar == '*') { + if (abs(lvlcode[bracelvl]) < 10 || abs(lvlcode[bracelvl]) > 12) { + begin_par(); + outchr(kar); + } + keyw = 0; /*END IF*/ + return; + } + if (kar == '_') { + /* case of a word non cutting hyphen \_ */ + begin_par(); + outchr('-'); + keyw = 0; + return; + } + if (kar == '~') { + /* case of a non breaking space */ + begin_par(); + outchr(kar); + keyw = 0; + return; + } + if (kar == '\'') { + keyw = 4; + num_hexa = 0; + return; + } + if (kar == ':') { + insert_tilde(kar); + return; + } + if (kar == ';') { + insert_tilde(kar); + return; + } + if (kar == ')') { + begin_par(); + outchr(kar); + return; + } + if (kar == '(') { + begin_par(); + outchr(kar); + return; + } + if (kar == '\\') { + if (next_rtf[0] == 'f' && lvlcode[bracelvl] == 12) { + lvlcode[bracelvl] = 9; + /*END IF*/ + return; + } + begin_par(); + outstg("{\\char92}"); + keyw = 0; + return; + } + if (kar == '|') { + if (next_rtf[0] != '}') { + /* case of \| (in formulae) store as "formula" and expect letters */ + strcat(inkeyw, "formula"); + keyw = 2; + return; + } + /* if \|} cancel \| and post it for later */ + *inkeyw = '\0'; + keyw = 0; + strdelete((Anyptr)next_rtf, 1, 1); + sprintf(next_rtf, "}\\|%s", strcpy(STR1, next_rtf)); + return; + } + /* store \RTF and try again */ + outkeyw("RTF{}"); + keyw = 0; + do_it_again = true; +} + + +/*---------------------------------------------------------------------------*/ +/* treats a character when KEYW is 2 */ +/* We are in a letter keyword */ + +Static Void keyw_is_2() +{ + short poskeyw, k, posbsl, testio; + string24 inkeywb; + Char STR1[256], STR2[256]; + Char STR3[232]; + Char STR4[150]; + string24 STR5; + Char STR6[188]; + Char STR7[28]; + Char STR8[26]; + short FORLIM; + + if (cat == 11) { + /* letter : store and capitalize for formulas */ + if (strpos2(inkeyw, "\\RTFformula", 1) > 0) + sprintf(inkeyw + strlen(inkeyw), "%c", toupper(kar)); + else + sprintf(inkeyw + strlen(inkeyw), "%c", kar); + return; + } + /*END IF*/ + if (cat == 16) { + /* case of a digit : store with opening brace and say KEYW:=3 */ + sprintf(inkeyw + strlen(inkeyw), "{%c", kar); + numval = kar - icharz; + numsign = 1; + keyw = 3; + return; + } + if (kar == '-') { + /* case of a - introduction : store opening brace and say KEYW:=3 */ + strcat(inkeyw, "{-"); + numval = 0; + numsign = -1; + keyw = 3; + return; + } + /* delay \begin(center) to further opening \par */ + if (!strcmp(inkeyw, "\\RTFqc")) { + if (lvlcode[bracelvl] != 9) + center_flag[bracelvl] = 1; + } + /* delay \begin(flushright) to further opening \par */ + else if (!strcmp(inkeyw, "\\RTFqr")) { + if (lvlcode[bracelvl] != 9) + flushright_flag[bracelvl] = 1; + } + /* interpret some other keywords */ + else if (!strcmp(inkeyw, "\\RTFtab")) { + if (par_to_begin) + num_indent++; + else + outkeyw("indent "); + } else if (!strcmp(inkeyw, "\\RTFchpgn")) { + begin_par(); + outkeyw("the\\count0{}"); + } else if (!strcmp(inkeyw, "\\RTFb")) { + add_to_bfsl("\\bf"); + ensure_sizebfsl(); + } else if (!strcmp(inkeyw, "\\RTFscaps")) { + add_to_bfsl("\\sc"); + ensure_sizebfsl(); + } else if (!strcmp(inkeyw, "\\RTFoutl")) { + add_to_bfsl("\\oul"); + ensure_sizebfsl(); + } else if (!strcmp(inkeyw, "\\RTFul")) { + outrem("{"); + if (removed_ok) { + if (math_mode[bracelvl] == 0) { + begin_par(); + outkeyw("underbar{"); + } else { + begin_par(); + outkeyw("underline{"); + } + } else + outkeyw("RTFul{}"); + /*END IF removed_OK*/ + underl_flag[bracelvl] = true; + } else if (!strcmp(inkeyw, "\\RTFuldb")) { + outrem("{"); + if (removed_ok) { + if (math_mode[bracelvl] == 0) { + begin_par(); + outkeyw("underbar{\\bf{}"); + } else { + begin_par(); + outkeyw("underline{"); + } + } else + outkeyw("RTFuldb{}"); + /*END IF removed_OK*/ + underl_flag[bracelvl] = true; + } else if (!strcmp(inkeyw, "\\RTFv")) { + outrem("{"); + if (removed_ok) { + begin_par(); + outkeyw("index{"); + } else + outkeyw("RTFul{}"); + /*END IF removed_OK*/ + underl_flag[bracelvl] = true; + } else if (strpos2(inkeyw, "\\RTFheader", 1) + strpos2(inkeyw, + "\\RTFfooter", 1) > 0) { + outrem("{"); + if (removed_ok) { + sprintf(STR1, "%s{", inkeyw + 1); + outkeyw(STR1); + } else { + sprintf(STR2, "%s{\\relax}", inkeyw + 1); + outkeyw(STR2); + } + /*END IF removed_OK*/ + lvlcode[bracelvl] = 9; + } else if (!strcmp(inkeyw, "\\RTFi")) { + if (use_sl) + add_to_bfsl("\\sl"); + else + add_to_bfsl("\\it"); + /*END IF*/ + ensure_sizebfsl(); + } else if (!strcmp(inkeyw, "\\RTFpard")) + { /* old center_flag[bracelvl]:=0; flushright_flag[bracelvl]:=0; */ + close_math(); + close_envir(); + center_flag[bracelvl] = 0; + flushright_flag[bracelvl] = 0; + strcpy(bfslcode[bracelvl], "\\rm"); + + if (abs(lvlcode[bracelvl]) != 8 && abs(lvlcode[bracelvl]) != 9 && + lvlcode[bracelvl] != 13 && lvlcode[bracelvl] != 15) + { /*END IF*/ + leftskip = 0; + rightskip = 0; + num_indent = 0; + par_to_begin = true; + if (!last_is("\\end{tabular}\\par ")) { + if (kout > 0) + output_line(); + outstg(" %\\check "); + output_line(); /* for testing */ + } + } + /* never cut line+\check after \end{tabular} */ + if (lvlcode[bracelvl] == 2) + lvlcode[bracelvl] = 0; + } else if (!strcmp(inkeyw, "\\RTFpar")) { + if (next_rtf[0] == '}') { + *inkeyw = '\0'; + strdelete((Anyptr)next_rtf, 1, 1); + sprintf(next_rtf, "}\\par %s", strcpy(STR2, next_rtf)); + } else + make_RTFpar("\\par "); + } else if (!strcmp(inkeyw, "\\RTFpagebb")) { + /*END IF next_rtf[1]*/ + if (next_rtf[0] == '}') { + *inkeyw = '\0'; + strdelete((Anyptr)next_rtf, 1, 1); + sprintf(next_rtf, "}\\pagebb %s", strcpy(STR2, next_rtf)); + } else + make_RTFpar("\\clearpage "); + } else if (!strcmp(inkeyw, "\\RTFpage")) { + /*END IF next_rtf[1]*/ + if (next_rtf[0] == '}') { + *inkeyw = '\0'; + strdelete((Anyptr)next_rtf, 1, 1); + sprintf(next_rtf, "}\\page %s", strcpy(STR2, next_rtf)); + } else { + output_size(spacingcode[bracelvl]); + outkeyw("break\\eject\\noindent "); + output_size(sizecode[bracelvl]); + output_bfsl(); + } + } else if (!strcmp(inkeyw, "\\RTFsect")) { + /*END IF next_rtf[1]*/ + if (next_rtf[0] == '}') { + *inkeyw = '\0'; + strdelete((Anyptr)next_rtf, 1, 1); + sprintf(next_rtf, "}\\par %s", strcpy(STR2, next_rtf)); + } else + make_RTFpar("\\par \\relax "); + } else if (!strcmp(inkeyw, "\\RTFrquote")) { + /*END IF next_rtf[1]*/ + outchr('\''); + } else if (!strcmp(inkeyw, "\\RTFlquote")) + outchr('`'); + else if (!strcmp(inkeyw, "\\RTFmac")) + mac_init(); + else if (!strcmp(inkeyw, "\\RTFansi")) + ansi_init(); + else if (!strcmp(inkeyw, "\\RTFline")) { + /* flag to say future capitalized */ + outkeyw("break "); + } else if (!strcmp(inkeyw, "\\RTFcaps")) { + lvlcode[bracelvl] = 2; + /* flag to say we are in \fonttbl block */ + } else if (!strcmp(inkeyw, "\\RTFfonttbl")) { + lvlcode[bracelvl] = 6; + outrem_empty_braces(); + outkrem(sizecode[bracelvl]); + outrem("{"); + if (removed_ok) + outkeyw("RTFfonttbl{"); + else + outkeyw("RTFfonttbl{}{}{}\\relax "); + } else if (!strcmp(inkeyw, "\\RTFcolortbl")) { + /*END IF*/ + outrem_empty_braces(); + lvlcode[bracelvl] = 9; + outkrem(sizecode[bracelvl]); + outrem("{"); + if (removed_ok) + outkeyw("RTFcolortbl{"); + else + outkeyw("RTFcolortbl{}{}{}\\relax "); + } else if (!strcmp(inkeyw, "\\RTFinfo")) { + /*END IF*/ + outrem_empty_braces(); + outkrem(sizecode[bracelvl]); + outrem("{"); + if (removed_ok) + outkeyw("RTFinfo{"); + else + outkeyw("RTFinfo{}{}{}\\relax "); + } else if (!strcmp(inkeyw, "\\RTFstylesheet")) { + /*END IF*/ + outrem_empty_braces(); + outkrem(sizecode[bracelvl]); + outrem("{"); + if (removed_ok) { + outkrem("RTFcolortbl{}"); + outkeyw("RTFstylesheet{"); + } else + outkeyw("RTFstylesheet{}{}{}\\relax "); + /*END IF*/ + lvlcode[bracelvl] = 8; + } else if (!strcmp(inkeyw, "\\RTFfield")) + lvlcode[bracelvl] = 11; + else if (strcmp(inkeyw, "\\RTFflddirty")) { + + if (strpos2(inkeyw, "\\RTFfldinst", 1) > 0 && lvlcode[bracelvl-1] == 11) { + lvlcode[bracelvl] = 12; + return; /* to avoid resetting keyw:=0 */ + } + if (!strcmp(inkeyw, "\\RTFtrowd")) { + perform_RTFtrow(); + outkeyw("begin{tabular}{"); + clbrdrr = false; + clbrdrl = false; + clbrdrt = false; + clbrdrb = false; + tab_nb_cellx[bracelvl] = 0; + tab_cellx[bracelvl] = 0; + } else if (strcmp(inkeyw, "\\RTFbrdrs") || lvlcode[bracelvl] != 13) { + /* ignore */ + if (!strcmp(inkeyw, "\\RTFclbrdrl") && lvlcode[bracelvl] == 13) { + outchr('|'); + if (verbose > 1) + _SETIO(printf("%s[%d,%d]\n", inkeyw, lvlcode[bracelvl], bracelvl) >= + 0, FileWriteError); + clbrdrl = false; + } else if (!strcmp(inkeyw, "\\RTFclbrdrr") && lvlcode[bracelvl] == 13) { + if (verbose > 1) + _SETIO(printf("%s[%d,%d]\n", inkeyw, lvlcode[bracelvl], bracelvl) >= + 0, FileWriteError); + clbrdrr = true; + } else if (!strcmp(inkeyw, "\\RTFclbrdrt") && lvlcode[bracelvl] == 13) { + if (verbose > 1) + _SETIO(printf("%s[%d,%d]\n", inkeyw, lvlcode[bracelvl], bracelvl) >= + 0, FileWriteError); + clbrdrt = true; + } else if (!strcmp(inkeyw, "\\RTFclbrdrb") && lvlcode[bracelvl] == 13) { + if (verbose > 1) + _SETIO(printf("%s[%d,%d]\n", inkeyw, lvlcode[bracelvl], bracelvl) >= + 0, FileWriteError); + clbrdrb = true; + } else if (!strcmp(inkeyw, "\\RTFintbl")) { + if (verbose > 0) + _SETIO(printf("(found)%s[%d,%d]\n", + inkeyw, lvlcode[bracelvl], + bracelvl) >= 0, FileWriteError); + if (lvlcode[bracelvl] == 13) { + if (clbrdrr) + outchr('|'); + clbrdrr = false; + outchr('}'); + lvlcode[bracelvl] = 15; /* second part of \RTFtrowd */ + if (clbrdrt) { + outkeyw("hline"); + output_line(); + } + tab_nb_ands[bracelvl] = 0; + if (verbose > 1) + _SETIO(printf("(after)%s[%d,%d]\n", + inkeyw, lvlcode[bracelvl], + bracelvl) >= 0, FileWriteError); + } else if (lvlcode[bracelvl] == 15) { + if (verbose > 1) + _SETIO(printf("(ignored)%s[%d,%d]\n", + inkeyw, lvlcode[bracelvl], + bracelvl) >= 0, FileWriteError); + } else { + if (verbose > 0) + _SETIO(printf("forcing\\RTFtrowd%s[%d,%d]\n", + inkeyw, lvlcode[bracelvl], + bracelvl) >= 0, FileWriteError); + if (last_is("\\\\\\end{tabular}\\par ")) + outkrem("end{tabular}\\par "); + else if (last_is("\\\\\\hline \\end{tabular}\\par ")) + outkrem("end{tabular}\\par "); + else if (last_is("\\end{tabular}\\par ")) { + outkrem("end{tabular}\\par "); + outstg("\\\\"); + if (clbrdrb) + outkeyw("hline "); + } else + outkeyw("begin{tabular}{ppppppppppppppp}"); + /*END IF last_is(...)*/ + perform_RTFtrow(); + lvlcode[bracelvl] = 15; /* second part of \RTFtrowd */ + if (verbose > 1) { + _SETIO(printf("(<after)%s[%d,%d,%d]\n", + inkeyw, lvlcode[bracelvl], tab_nb_cellx[bracelvl], + bracelvl) >= 0, FileWriteError); + /* force \RTFtrowd if missing */ + /*END IF verbose*/ + } + } + } else if (!strcmp(inkeyw, "\\RTFrow")) + perform_RTFrow(); + else if (!strcmp(inkeyw, "\\RTFcell")) + perform_RTFcell(); + else if (!strcmp(inkeyw, "\\RTFobject")) { + rtfpicw = 0; + rtfpich = 0; /* reset picture width and height to 0 */ + pict_char_number = 0; + pict_byte_number = 0; + pict_last_hexa = 0; /* reset last hexa byte of the picture */ + pict_left_hexa = false; + pict_number++; /* count picture number */ + sign_str(pict_number, pict_name); + sprintf(figure_name, "%s%s%s", figure_path, pict_name, figure_type); + while (strpos2(figure_name, "\\", 1) > 0) { /*END DO*/ + posbsl = strpos2(figure_name, "\\", 1); + figure_name[posbsl-1] = '/'; + } + begin_par(); + sprintf(STR3, "%s{%s}", strsub(STR1, inkeyw, 2, 99), figure_name); + outkeyw(STR3); + sprintf(figure_name, "%s%s%s", figure_path, pict_name, figure_type); + output_line(); + sprintf(STR4, "Skipped object file %s", figure_name); + println_msg(1, STR4); + lvlcode[bracelvl] = 10; + } else if (!strcmp(inkeyw, "\\RTFpict")) { + rtfpicw = 0; + rtfpich = 0; /* reset picture width and height to 0 */ + pict_char_number = 0; + pict_byte_number = 0; + pict_last_hexa = 0; /* reset last hexa byte of the picture */ + pict_left_hexa = false; + pict_number++; /* count picture number */ + sign_str(pict_number, pict_name); + sprintf(figure_name, "%s%s%s", figure_path, pict_name, figure_type); + while (strpos2(figure_name, "\\", 1) > 0) { /*END DO*/ + posbsl = strpos2(figure_name, "\\", 1); + figure_name[posbsl-1] = '/'; + } + begin_par(); + sprintf(STR3, "%s{%s}", strsub(STR1, inkeyw, 2, 99), figure_name); + outkeyw(STR3); + sprintf(figure_name, "%s%s%s", figure_path, pict_name, figure_type); + output_line(); + strcpy(figurefile_NAME, figure_name); + if (figurefile != NULL) + figurefile = freopen(figurefile_NAME, "w", figurefile); + else + figurefile = fopen(figurefile_NAME, "w"); + _SETIO(figurefile != NULL, FileNotFound); + testio = P_ioresult; + if (testio != 0) { /*ENF IF testio*/ + sign_str(testio, works); + sprintf(STR6, "Unable to open figure file %s ; code=%s", + figure_name, works); + println_msg(0, STR6); + close_files(); + _Escape(0); + } + sprintf(STR4, "Opened picture file %s", figure_name); + println_msg(1, STR4); + lvlcode[bracelvl] = 5; + } else if (!strcmp(inkeyw, "\\RTFfootnote")) { + if (math_mode[bracelvl] == 0) { + lvlcode[bracelvl] = 3; + outrem("{"); + if (removed_ok) + outkeyw("footnote{"); + else + outkeyw("footnote "); + } else if (math_mode[bracelvl] == 1) { + /*END IF removed*/ + close_math(); + sprintf(next_rtf, "\\footnote %s", strcpy(STR1, next_rtf)); + } else if (math_mode[bracelvl-1] == 1) + sprintf(next_rtf, "}{\\footnote %s", strcpy(STR1, next_rtf)); + else if (bracelvl >= 2 && math_mode[bracelvl-2] == 1) + sprintf(next_rtf, "}}{{\\footnote %s", strcpy(STR1, next_rtf)); + else if (bracelvl >= 3 && math_mode[bracelvl-3] == 1) + sprintf(next_rtf, "}}}{{{\\footnote %s", strcpy(STR1, next_rtf)); + else + outkeyw("footnote "); + } else if (!strcmp(inkeyw, "\\RTFplain")) { + /*END IF math_mode*/ + outpsize(stdsize * 20); + strcpy(bfslcode[bracelvl], "\\rm"); + strcpy(sizecode[bracelvl], "normalsize"); + } else if (!strcmp(inkeyw, "\\RTFchftn")) + remove_mathat(); + else if (!strcmp(inkeyw, "\\RTFendash")) { + if (math_mode[bracelvl] > 0) + outchr('-'); + else + outstg("--"); + } else if (!strcmp(inkeyw, "\\RTFemdash")) { + if (math_mode[bracelvl] > 0) + outchr('-'); + else + outstg("---"); + } else if (!strcmp(inkeyw, "\\RTFfnil")) + /* decl_font_num is a global variable */ + store_word_font("fnil"); + else if (!strcmp(inkeyw, "\\RTFfroman")) + store_word_font("froman"); + else if (!strcmp(inkeyw, "\\RTFfmodern")) + store_word_font("fmodern"); + else if (!strcmp(inkeyw, "\\RTFfdecor")) + store_word_font("fdecor"); + else if (!strcmp(inkeyw, "\\RTFfswiss")) + store_word_font("fswiss"); + else if (!strcmp(inkeyw, "\\RTFfscript")) + store_word_font("fscript"); + else if (!strcmp(inkeyw, "\\RTFftech")) + store_word_font("ftech"); + else if (!strcmp(inkeyw, "\\RTFformulaB")) + truncate24(form_code[bracelvl], inkeyw); + else if (!strcmp(inkeyw, "\\RTFformulaO")) + truncate24(form_code[bracelvl], inkeyw); + else if (!strcmp(inkeyw, "\\RTFformulaLC")) { + sprintf(STR7, "%sLC", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + } else if (!strcmp(inkeyw, "\\RTFformulaRC")) { + sprintf(STR7, "%sRC", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + } else if (!strcmp(inkeyw, "\\RTFformulaBC")) { + sprintf(STR7, "%sBC", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + } else if (!strcmp(inkeyw, "\\RTFformulaF")) + truncate24(form_code[bracelvl], inkeyw); + else if (!strcmp(inkeyw, "\\RTFformulaR")) + truncate24(form_code[bracelvl], inkeyw); + else if (!strcmp(inkeyw, "\\RTFformulaS")) + truncate24(form_code[bracelvl], inkeyw); + else if (!strcmp(inkeyw, "\\RTFformulaD")) + truncate24(form_code[bracelvl], inkeyw); + else if (!strcmp(inkeyw, "\\RTFformulaX")) + truncate24(form_code[bracelvl], inkeyw); + else if (!strcmp(inkeyw, "\\RTFformulaI")) + truncate24(form_code[bracelvl], inkeyw); + else if (!strcmp(inkeyw, "\\RTFformulaSU")) { + sprintf(STR7, "%sSU", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + } else if (!strcmp(inkeyw, "\\RTFformulaPR")) { + sprintf(STR7, "%sPR", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + } else if (!strcmp(inkeyw, "\\RTFformulaIN")) { + sprintf(STR7, "%sIN", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + } else if (!strcmp(inkeyw, "\\RTFformulaRI")) { + sprintf(STR7, "%sRI", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + } else if (!strcmp(inkeyw, "\\RTFformulaBO")) { + sprintf(STR7, "%sBO", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + } else if (!strcmp(inkeyw, "\\RTFformulaLE")) { + sprintf(STR7, "%sLE", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + } else if (!strcmp(inkeyw, "\\RTFformulaTO")) { + sprintf(STR7, "%sTO", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + /* case of \|<non-alpha> */ + } else if (!strcmp(inkeyw, "\\RTFformula")) { + if (cat == 0 && next_rtf[0] == '{') { + sprintf(STR8, "%s{", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR8)); + kar = ' '; + next_rtf[0] = '\0'; /* to prevent do_it_again */ + } else if (cat == 0 && next_rtf[0] == '}') { + sprintf(STR8, "%s}", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR8)); + kar = ' '; + next_rtf[0] = '\0'; /* to prevent do_it_again */ + } else { + sprintf(STR8, "%s%c", form_code[bracelvl], kar); + strcpy(form_code[bracelvl], truncate24(STR5, STR8)); + kar = ' '; /* to prevent do_it_again */ + } + } + /* case of \{ */ + else if (!strcmp(inkeyw, "\\RTFaccol ")) { + /*END IF*/ + /* case of \} */ + out_math("\\{"); + } else if (!strcmp(inkeyw, "\\RTFlocca ")) + out_math("\\}"); + else { + poskeyw = 0; + sprintf(STR1, "%s ", inkeyw); + truncate24(inkeywb, STR1); + FORLIM = num_skip_strings; + /* check whether this keyword should be skipped in output */ + for (k = 0; k <= FORLIM - 1; k++) /*END DO*/ + poskeyw += strpos2(skip_strings[k], inkeyw, 1); + /* output other keywords with an additional space */ + if (poskeyw == 0) { /*END IF poskeyw*/ + outrem_empty_braces(); + outstg(inkeyw); + /* do not put a space if following is a (, for TeX macros syntax */ + if (kar != '(') + outchr(' '); + } + } + } + } + /*END IF*/ + /* reset KEYW and try again */ + keyw = 0; + if (kar != ' ') { + do_it_again = true; + /*END IF cat=11*/ + } +} + + +/*---------------------------------------------------------------------------*/ +/* treats a character when KEYW is 3 */ +/* Numeric arg of Keyword being decoded */ + +Static Void keyw_is_3() +{ + string24 sizeheader; /* will be 'large', 'Large', 'footnotesize'... */ + short magnification; /* will be 1000, 1095, 900... */ + short diff_cellx, style_ref, poskeyw, k; + string24 acc_converted, inkeywb; + string_RTFstyle test_RTFstyle; + Char STR1[64]; + Char STR2[186]; + Char STR3[58]; + Char STR4[256]; + short FORLIM; + string24 STR5; + Char STR6[26]; + Char STR7[28]; + + if (cat == 16) { + /* case of a digit */ + sprintf(inkeyw + strlen(inkeyw), "%c", kar); + numval = numval * 10 + numsign * (kar - icharz); + return; + } + /* case of a non digit: terminate but ignore some keywords with brace pairs */ + if (strpos2(inkeyw, "RTFsl{", 1) > 0) { + outpsize(numval); + sign_str(numval, works); + sprintf(STR1, "\\RTFsl{%s} --> \\%s", works, spacingcode[bracelvl]); + println_msg(2, STR1); + } else if (strpos2(inkeyw, "RTFli{", 1) > 0 && center_flag[bracelvl] < 2) { + if (lvlcode[bracelvl] != 8) /*END IF*/ + leftskip = numval; + } else if (strpos2(inkeyw, "RTFri{", 1) > 0 && center_flag[bracelvl] < 2) { + if (lvlcode[bracelvl] != 8) /*END IF*/ + rightskip = numval; + } else if (strpos2(inkeyw, "RTFf{", 1) > 0) { + decl_font_num = numval; /* store numval for further use */ + set_active_RTFf(numval); + outstg("{}"); + } + /* use _ and ^ for sub/superscripts and put in math mode if needed */ + else if (strpos2(inkeyw, "RTFup{", 1) > 0) { + out_math_leave("\\relax^{"); + open_brace(); + auto_close[bracelvl] = true; + } else if (strpos2(inkeyw, "RTFdn{", 1) > 0) { + out_math_leave("\\relax_{"); + open_brace(); + auto_close[bracelvl] = true; + } + /* ignore \RTFfi if option '-v' */ + else if (strpos2(inkeyw, "RTFfi{", 1) > 0) { + num_indent = 1; + if (!(no_space_conv && numval > 0)) { + outkeyw("parindent="); + output_num(numval); + outkeyw("RTFtwips"); + output_line(); + } + } + /* style description */ + else if (strpos2(inkeyw, "RTFs{", 1) > 0) { + sign_str(numval, works); + if (abs(lvlcode[bracelvl]) == 8) { + if (num_styles >= maxRTFstyles) { + sprintf(STR3, "Too many styles, style %s ignored.", works); + println_msg(0, STR3); + } else if (numval > 255) { + sprintf(STR1, "Illegal style number, style %s ignored.", works); + println_msg(0, STR1); + } else { + num_styles++; + ref_styles[numval] = num_styles; + sprintf(test_RTFstyle, "%c", kar); + while (kar != ';' && kar != '}') { /*END while*/ + read_char(); + sprintf(test_RTFstyle + strlen(test_RTFstyle), "%c", kar); + } + /* clean style to the first blank after \snext */ + if (kar == ';') + kar = ' '; + k = strpos2(test_RTFstyle, "\\snext", 1); + m = strlen(test_RTFstyle); + FORLIM = strlen(test_RTFstyle); + for (l = k; l <= FORLIM; l++) { + if (test_RTFstyle[l-1] == ' ' && l < m) + m = l; + } + sign_str(num_styles, worksa); + /* start at the first space in style text */ + n = strpos2(test_RTFstyle, " ", 1) + 1; + strsub(RTFstyles[num_styles-1], test_RTFstyle, n, m - n + 1); + sprintf(STR2, "%s --> %s \"%s\"", + works, worksa, RTFstyles[num_styles-1]); + println_msg(2, STR2); + } + } else { + /*END IF*/ + style_ref = ref_styles[numval]; + if (style_ref <= 0 || style_ref > 255) { + sprintf(STR1, "Illegal style number, style %s ignored.", works); + println_msg(0, STR1); + } else { + if (kar != ' ') + sprintf(next_rtf, "%c%s", kar, strcpy(STR4, next_rtf)); + kar = ' '; + sprintf(next_rtf, "%s%s", + RTFstyles[style_ref-1], strcpy(STR4, next_rtf)); + /*END IF*/ + } + } + } + /* font size description */ + else if (strpos2(inkeyw, "RTFfs{", 1) + strpos2(inkeyw, "RTFfldinstfs{", 1) > 0 && + lvlcode[bracelvl] != 8) { + /*END IF*/ + /* before putting \LARGE, \Huge etc., remove previous \bf, \rm, etc. */ + outrem_empty_braces(); + outrem(bfslcode[bracelvl]); + + /* output \large, \normalsize, \footnotesize according to NUMVAL */ + outfsize(numval, &magnification); + + sprintf(STR6, "\\%s", sizecode[bracelvl]); + truncate24(sizeheader, STR6); + if (!strcmp(sizeheader, "\\footnotesize")) + strcpy(sizeheader, "\\footnsize"); + + /* correct font names in bfslcode[bracelvl] according to latex209 or latex2e */ + font_clean(sizeheader, magnification); + + if (!par_to_begin) { /*END IF*/ + output_size(sizecode[bracelvl]); + output_bfsl(); + if (!last_is("}")) { + if (!last_is("{")) + outstg("{}"); + } + } + } else if (strpos2(inkeyw, "RTFsb{", 1) > 0) { + /*END IF*/ + outkrem("par"); + outkrem("par "); + if (lvlcode[bracelvl] != 8 && lvlcode[bracelvl] != 9) + outkeyw("par "); + make_RTFsab(numval); + } else if (strpos2(inkeyw, "RTFsa{", 1) > 0) + save_skip = numval; + else if (strpos2(inkeyw, "RTFtrleft{", 1) <= 0) { /* en attente */ + if (strpos2(inkeyw, "\\RTFcellx{", 1) > 0 && lvlcode[bracelvl] == 13) { + /* \RTCcellx gives absolutes abscissae, but tabular's p{} needs differences */ + diff_cellx = numval - tab_cellx[bracelvl]; + outstg("p{"); + output_num(diff_cellx); + outstg("\\RTFtwips}"); + if (clbrdrl) + outchr('|'); + clbrdrl = false; + tab_nb_cellx[bracelvl]++; + tab_cellx[bracelvl] = numval; + } else if (strpos2(inkeyw, "RTFpicw{", 1) > 0) { + strcat(inkeyw, "}"); + outrem_empty_braces(); + outstg(inkeyw); + rtfpicw = numval; + } else if (strpos2(inkeyw, "RTFpich{", 1) > 0) { + strcat(inkeyw, "}"); + outrem_empty_braces(); + outstg(inkeyw); + rtfpich = numval; + } else if (strpos2(inkeyw, "RTFobjw{", 1) > 0) { + strcat(inkeyw, "}"); + outrem_empty_braces(); + outstg(inkeyw); + rtfpicw = numval; + } else if (strpos2(inkeyw, "RTFobjh{", 1) > 0) { + strcat(inkeyw, "}"); + outrem_empty_braces(); + outstg(inkeyw); + rtfpich = numval; + } + /* case of \|DO( ... ) */ + else if (strpos2(inkeyw, "\\RTFformulaDO{", 1) > 0) { + if (*form_code[bracelvl] == '\0') + strcpy(form_code[bracelvl], "\\RTFformulaSDO"); + else { + sprintf(STR7, "%sDO", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + /* case of \|UP( ... ) */ + } + } else if (strpos2(inkeyw, "\\RTFformulaUP{", 1) > 0) { + if (*form_code[bracelvl] == '\0') + strcpy(form_code[bracelvl], "\\RTFformulaSUP"); + else { + sprintf(STR7, "%sUP", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + /* case of \|FO( ... ) */ + } + } else if (strpos2(inkeyw, "\\RTFformulaFO{", 1) > 0) { + if (*form_code[bracelvl] == '\0') + strcpy(form_code[bracelvl], "\\RTFformulaDFO"); + else { + sprintf(STR7, "%sFO", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + } + displ_skip = numval; + } + /* case of \|UP( ... ) */ + else if (strpos2(inkeyw, "\\RTFformulaBA{", 1) > 0) { + if (*form_code[bracelvl] == '\0') + strcpy(form_code[bracelvl], "\\RTFformulaDFO"); + else { + sprintf(STR7, "%sFO", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + } + displ_skip = -numval; + } + /* case of \|UP( ... ) */ + else if (strpos2(inkeyw, "\\RTFformulaLI{", 1) > 0) { + if (*form_code[bracelvl] == '\0') + strcpy(form_code[bracelvl], "\\RTFformulaDLI"); + else { + sprintf(STR7, "%sLI", form_code[bracelvl]); + strcpy(form_code[bracelvl], truncate24(STR5, STR7)); + } + displ_skip = numval; + } + /* case of \|AI( ... ) */ + else if (strpos2(inkeyw, "\\RTFformulaAI{", 1) <= 0) { + /* case of \|DI( ... ) */ + if (strpos2(inkeyw, "\\RTFformulaDI{", 1) <= 0) { + if (strpos2(inkeyw, "RTFrtf{", 1) > 0) { + no_RTFrtf = false; + strcat(inkeyw, "}"); + outrem_empty_braces(); + outstg(inkeyw); + } + /* explicit references to symbol characters */ + else if (strpos2(inkeyw, "RTFfldinstsymbol", 1) + strpos2(inkeyw, + "RTFfldinstbsymbol", + 1) + strpos2(inkeyw, "RTFfldinstbisymbol", 1) > 0) { + if (numval > 255) + numval = 0; + strcpy(acc_converted, ftech_transl[numval]); + if (*acc_converted != '\0') + out_math(acc_converted); + else + outchr('?'); + } else { + /*END IF acc_converted*/ + poskeyw = 0; + k = strpos2(inkeyw, "{", 1); + if (k > 0) { + sprintf(inkeywb, "%.*s", k, inkeyw); +/* p2c: rtflatex.pas, line 1513: + * Note: Possible faulty string assignment [145] */ +/* p2c: rtflatex.pas, line 1513: + * Note: string[24] := string[255] => unpredictable crashes */ + } else { + sprintf(STR4, "%s}", inkeyw); + truncate24(inkeywb, STR4); + } + FORLIM = num_skip_strings; + /* check whether this keyword should be skipped in output */ + for (k = 0; k <= FORLIM - 1; k++) /*END DO*/ + poskeyw += strpos2(skip_strings[k], inkeywb, 1); + if (poskeyw == 0) { /*END IF poskeyw*/ + strcat(inkeyw, "}"); + outrem_empty_braces(); + outstg(inkeyw); + } + } + } + /* this test is eliminate first brace opened */ + } + } + /*END IF*/ + keyw = 0; + if (kar != ' ') { + do_it_again = true; + /*END IF*/ + } +} + + +/*---------------------------------------------------------------------------*/ +/* treats a character when KEYW is 4 */ +/* Hexadecimal arg of RTFac */ + +Static Void keyw_is_4() +{ + string2 acchexa; + string24 acc_converted; + short posbrace; + Char STR1[256]; + Char STR2[12]; + Char STR3[40]; + + if (cat == 10) + return; + + if (num_hexa == 0) { + num_hexa = 1; + hexaone = kar; + return; + } + if (num_hexa != 1) { + sign_str(num_hexa, works); + sprintf(STR3, "Wrong num_hexa:%s", works); + println_msg(0, STR3); + /*END IF*/ + + return; + } + hexatwo = kar; + sprintf(acchexa, "%c%c", hexaone, hexatwo); +/* p2c: rtflatex.pas, line 1546: + * Note: Possible faulty string assignment [145] */ +/* p2c: rtflatex.pas, line 1546: + * Note: string[2] := string[3] => unpredictable crashes */ + begin_par(); + if (!strcmp(active_RTFf[bracelvl], "ftech")) { + strcpy(acc_converted, ftech_transl[hs_to_i(acchexa)]); + if (*acc_converted != '\0') + out_math(acc_converted); + else { + sprintf(STR2, "RTFac{%s}", acchexa); + outkeyw(STR2); + } + } else { + /*END IF acc_converted*/ + strcpy(acc_converted, acc_transl[hs_to_i(acchexa)]); + if (*acc_converted != '\0') { + if (acc_converted[0] == '\\') + outrem_empty_braces(); + posbrace = strpos2(acc_converted, "{", 1); + if (acc_converted[0] == '$') { + outrem_empty_braces(); + out_math(strcpy(STR1, acc_converted + 1)); + } else if (posbrace <= 1) + outstgc(acc_converted); + else if (strpos2(acc_converted, "\\c{", 1) + strpos2(acc_converted, + "\\dag{", + 1) + strpos2(acc_converted, "\\pound{", 1) + strpos2( + acc_converted, "\\copyright{", + 1) + strpos2(acc_converted, "\\degree{", 1) > 0) { + sprintf(STR1, "%.*s", posbrace - 1, acc_converted); + outstg(STR1); + outstgc(strcpy(STR1, acc_converted + posbrace - 1)); + } else + outstgc(acc_converted); + } else { + /*END IF*/ + outkeyw("RTFac{"); + outstg(acchexa); + outchr('}'); + /*END IF acc_converted*/ + } + } + /*END IF active_RTF*/ + num_hexa = 0; + keyw = 0; +} + + +/*---------------------------------------------------------------------------*/ +Static Void make_latex_header() +{ + short i; + string24 strpts; + Char STR1[28]; + Char STR2[26]; + short FORLIM; + Char STR3[30]; + + if (latex209) + outkeyw("documentstyle["); + else + outkeyw("documentclass["); + /*END IF*/ + if (stdsize != 10) { /*END IF*/ + sign_str(stdsize, strpts); + sprintf(STR1, "%spt,", strpts); + outstg(STR1); + } + outstg("twoside"); + + if (latex209) { + FORLIM = num_latex_options; + for (i = 0; i <= FORLIM; i++) { + sprintf(STR2, ",%s", latex_options[i]); + outstg(STR2); + } + sprintf(STR3, "]{%s}", latex_style); + outstg(STR3); + output_line(); + } else { + sprintf(STR3, "]{%s}", latex_style); + outstg(STR3); + output_line(); + outkeyw("usepackage{"); + outstg(latex_options[0]); + FORLIM = num_latex_options; + for (i = 1; i <= FORLIM; i++) { + sprintf(STR2, ",%s", latex_options[i]); + outstg(STR2); + } + outstg("}"); + output_line(); + } + + + + outkeyw("begin{document}\\RTFsetfontheading"); + output_line(); +} + + +/*---------------------------------------------------------------------------*/ +/* MAIN */ +/*---------------------------------------------------------------------------*/ +main(argc, argv) +int argc; +Char *argv[]; +{ + short FORLIM; + Char STR1[48]; + Char STR2[56]; + Char STR3[50]; + Char STR4[30]; + Char STR5[64]; + + PASCAL_MAIN(argc, argv); + skipfile = NULL; + logfile = NULL; + figurefile = NULL; + outputfile = NULL; + inputfile = NULL; + clean_all(); /* for safety... */ + + latex209 = false; + write_log = false; + use_sl = false; + latex_header = true; + simplify_ok = true; + no_RTFrtf = true; + base_flag = false; + no_space_conv = false; + last_percent = false; + num_latex_options = 0; + strcpy(latex_style, "report"); + strcpy(latex_options[0], "rtflatex"); + kar = '\0'; + save_skip = 0; + space_after = 0; + math_mode[0] = 0; + auto_close[0] = false; + bracelvl = 0; + input_line_number = 1; + /* envir_closed_ok:=FALSE; (test) */ + envir_closed_ok = true; + num_styles = 0; + displ_skip = 0; + for (k = 0; k <= 255; k++) + ref_styles[k] = 0; + + verbose = 1; /* default moderate verbosity */ + tex_verbose = 0; /* no insertion of flags within TeX output */ + + title(); + charinit(); + sizeinit(); + open_files(); + + /* "lvlcode" : say what to do of the contents of that block. 1=ignore +until end of current block, 2=caps, 3=ignore footnote headings, 4= +ignore contents of first arg of \footnote, 5= \RTFpict text, 6= \fonttbl +declaration, 7= \RTFformulaX[xx], 8= within \stylesheet, 9= within +\header/\footer, 9= within \RTFcolortbl, 10= \RTFobject text, 11= +\RTFfield text, 12= inside \RTFfldinst, 13= inside \RTFtrowd/\RTFrow, +15= inside \RTFtrowd/RTFrow after \RTFintbl, 16= +within \RTFformulaB(...), 17= within \RTFformulaF(...), 18= +\RTFformulaSUP(...), 19= \RTFformulaSDO(...), 20= \RTFformulaI, 21= idem +after ";", 22= idem after second ";", 23= \RTFformulaR, 24= \RTFformulaR +after ";", 25= ordinary brace within a formula, 26=\RTFformulaO, +27=\RTFformulaL, 28=\RTFformulaD */ + lvlcode[0] = 0; + + /* bfslcode stores the recorded \bf, \sl, \it, \sf commands + to repeat them AFTER \large, \Large */ + *bfslcode[0] = '\0'; + strcpy(sizecode[0], "normalsize"); + *active_RTFf[0] = '\0'; + strcpy(close_kar[0], " "); + *form_code[0] = '\0'; + strcpy(spacingcode[0], "relax"); + *currsize[0] = '\0'; + *currbfsl[0] = '\0'; + leftskip = 0; + rightskip = 0; + leftcurskip = 0; + rightcurskip = 0; + tab_nb_cellx[0] = 0; + /* the number of cells in a tabular line = #\RTFcellx */ + tab_nb_ands[0] = 0; /* the number of &, must be < #\RTFcellx */ + tab_cellx[0] = 0; /* current \RTFcellx value */ + clbrdrr = false; + clbrdrl = false; + clbrdrt = false; + clbrdrb = false; + + *inkeyw = '\0'; + numl = 0; + numval = 0; + numsign = 1; + num_hexa = 0; + ikar = 0; + kinp = 0; + prev_kinp = 0; + *next_rtf = '\0'; + num_indent = 0; + num_word_fonts = 0; /* number of RTF/Word defined fonts */ + numfonts = 0; /* number of specially defined fonts */ + keyw = 0; /* a flag to say whether we are decoding a keyword */ + pict_number = 0; /* counts the pictures */ + + center_flag[0] = 0; + flushright_flag[0] = 0; + do_it_again = false; + underl_flag[0] = false; + par_to_begin = true; + + cleanout(); /* clean EXFILE for safety */ + + if (latex_header) + make_latex_header(); + + /* main loop to read input RTF file */ + + read_next_char(); + while (ikar != 26) { + /* read one character unless said to be retried */ + if (do_it_again) + do_it_again = false; + else + read_char(); + /*END IF*/ + if (ikar < ' ') /*END IF ikar*/ + continue; + + switch (keyw) { + + case 0: + keyw_is_0(); + break; + + case 1: + keyw_is_1(); + break; + + case 2: + keyw_is_2(); + break; + + case 3: + keyw_is_3(); + break; + + case 4: + keyw_is_4(); + break; + }/* case KEYW */ + } + if (center_flag[bracelvl] > 0) + outkeyw("end{center}"); + if (latex_header) + outkeyw("end{document}"); + else + outkeyw("bye"); + /*END IF latex_header*/ + output_line(); + + println_msg(0, "RTFLaTeX terminated"); + sign_str(bracelvl, works); + sprintf(STR1, "brace level finally is:%s", works); + println_msg(0, STR1); + sign_str(numl, works); + if (numl > 0) { + sprintf(STR2, "%s lines of code were generated.", works); + println_msg(0, STR2); + } + sign_str(numfonts, works); + if (numfonts > 0) { + sprintf(STR3, "%s new fonts were declared:", works); + println_msg(0, STR3); + } + FORLIM = numfonts; + for (k = 1; k <= FORLIM; k++) { + sprintf(STR4, " %s", newfonts[k-1]); + println_msg(0, STR4); + } + sign_str(pict_number, works); + if (pict_number > 0) { + sprintf(STR5, "%s pictures were stored in binary files.", works); + println_msg(0, STR5); + } + close_files(); + if (inputfile != NULL) + fclose(inputfile); + if (outputfile != NULL) + fclose(outputfile); + if (figurefile != NULL) + fclose(figurefile); + if (logfile != NULL) + fclose(logfile); + if (skipfile != NULL) + fclose(skipfile); + exit(EXIT_SUCCESS); +} + + + + + +/* End. */ +/* end of file */ |