17dd7cddfSDavid du Colombier #include <u.h> 27dd7cddfSDavid du Colombier #include <libc.h> 36b6b9ac8SDavid du Colombier #include <ctype.h> 47dd7cddfSDavid du Colombier #include <bio.h> 57dd7cddfSDavid du Colombier 67dd7cddfSDavid du Colombier enum 77dd7cddfSDavid du Colombier { 87dd7cddfSDavid du Colombier SSIZE = 10, 97dd7cddfSDavid du Colombier 107dd7cddfSDavid du Colombier Maxnh= 8, /* highest NH level */ 117dd7cddfSDavid du Colombier HH= 4, /* heading level used for SH and NH */ 127dd7cddfSDavid du Colombier Maxmstack= 10, /* deepest macro/string nesting */ 137dd7cddfSDavid du Colombier Narg= 20, /* max args to a macro */ 147dd7cddfSDavid du Colombier Maxsstack= 5, /* deepest nesting of .so's */ 157dd7cddfSDavid du Colombier Nline= 1024, 167dd7cddfSDavid du Colombier Maxget= 10, 177dd7cddfSDavid du Colombier Maxif = 20, 18*da51d93aSDavid du Colombier Maxfsp = 100, 197dd7cddfSDavid du Colombier 207dd7cddfSDavid du Colombier /* list types */ 217dd7cddfSDavid du Colombier Lordered = 1, 227dd7cddfSDavid du Colombier Lunordered, 237dd7cddfSDavid du Colombier Ldef, 247dd7cddfSDavid du Colombier Lother, 257dd7cddfSDavid du Colombier }; 267dd7cddfSDavid du Colombier 276b6b9ac8SDavid du Colombier char *delim = "$$"; 286b6b9ac8SDavid du Colombier int eqnmode; 296b6b9ac8SDavid du Colombier 307dd7cddfSDavid du Colombier int quiet; 317dd7cddfSDavid du Colombier float indent; /* from .in */ 327dd7cddfSDavid du Colombier Biobuf bout; 337dd7cddfSDavid du Colombier int isup; 347dd7cddfSDavid du Colombier int isdown; 357dd7cddfSDavid du Colombier int debug; 367dd7cddfSDavid du Colombier 377dd7cddfSDavid du Colombier int nh[Maxnh]; 387dd7cddfSDavid du Colombier int ifwastrue[Maxif]; 397dd7cddfSDavid du Colombier 407dd7cddfSDavid du Colombier int list, listnum, example; 417dd7cddfSDavid du Colombier int hangingau, hangingdt, hanginghead; 427dd7cddfSDavid du Colombier int indirective, paragraph, sol, titleseen, ignore_nl, weBref; 437dd7cddfSDavid du Colombier 447dd7cddfSDavid du Colombier typedef struct Goobie Goobie; 457dd7cddfSDavid du Colombier typedef struct Goobieif Goobieif; 467dd7cddfSDavid du Colombier struct Goobie 477dd7cddfSDavid du Colombier { 487dd7cddfSDavid du Colombier char *name; 497dd7cddfSDavid du Colombier void (*f)(int, char**); 507dd7cddfSDavid du Colombier }; 517dd7cddfSDavid du Colombier 527dd7cddfSDavid du Colombier typedef void F(int, char**); 537dd7cddfSDavid du Colombier typedef void Fif(char*, char*); 547dd7cddfSDavid du Colombier 557dd7cddfSDavid du Colombier struct Goobieif 567dd7cddfSDavid du Colombier { 577dd7cddfSDavid du Colombier char *name; 587dd7cddfSDavid du Colombier Fif *f; 597dd7cddfSDavid du Colombier }; 607dd7cddfSDavid du Colombier 617dd7cddfSDavid du Colombier /* if, ie */ 627dd7cddfSDavid du Colombier Fif g_as, g_ds, g_el, g_ie, g_if; 637dd7cddfSDavid du Colombier Goobieif gtabif[] = { 647dd7cddfSDavid du Colombier { "as", g_as }, 657dd7cddfSDavid du Colombier { "ds", g_ds }, 667dd7cddfSDavid du Colombier { "if", g_if }, 677dd7cddfSDavid du Colombier { "ie", g_ie }, 687dd7cddfSDavid du Colombier { "el", g_el }, 697dd7cddfSDavid du Colombier { nil, nil }, 707dd7cddfSDavid du Colombier }; 717dd7cddfSDavid du Colombier 727dd7cddfSDavid du Colombier /* pseudo ops */ 737dd7cddfSDavid du Colombier F g_notyet, g_ignore, g_hrule, g_startgif; 747dd7cddfSDavid du Colombier 757dd7cddfSDavid du Colombier /* ms macros */ 767dd7cddfSDavid du Colombier F g_AU, g_B, g_BI, g_CW, g_I, g_IP, g_LP, g_PP, g_SH, g_NH; 777dd7cddfSDavid du Colombier F g_P1, g_P2, g_TL, g_R, g_AB, g_AE, g_EQ, g_TS, g_TE, g_FS, g_FE; 787dd7cddfSDavid du Colombier F g_PY, g_IH, g_MH, g_HO, g_BX, g_QS, g_QE, g_RS, g_RE; 797dd7cddfSDavid du Colombier 807dd7cddfSDavid du Colombier /* pictures macro */ 817dd7cddfSDavid du Colombier F g_BP; 827dd7cddfSDavid du Colombier 837dd7cddfSDavid du Colombier /* real troff */ 847dd7cddfSDavid du Colombier F g_br, g_ft, g_sp, g_de, g_lf, g_so, g_rm, g_in; 857dd7cddfSDavid du Colombier F g_nr, g_ig, g_RT, g_BS, g_BE, g_LB, g_ta; 867dd7cddfSDavid du Colombier 877dd7cddfSDavid du Colombier /* macros to include ML in output */ 887dd7cddfSDavid du Colombier F g__H, g__T; 897dd7cddfSDavid du Colombier 907dd7cddfSDavid du Colombier Goobie gtab[] = 917dd7cddfSDavid du Colombier { 927dd7cddfSDavid du Colombier { "_T", g__T, }, 937dd7cddfSDavid du Colombier { "_H", g__H, }, 947dd7cddfSDavid du Colombier { "1C", g_ignore, }, 957dd7cddfSDavid du Colombier { "2C", g_ignore, }, 967dd7cddfSDavid du Colombier { "AB", g_AB, }, 977dd7cddfSDavid du Colombier { "AE", g_AE, }, 987dd7cddfSDavid du Colombier { "AI", g_ignore, }, 997dd7cddfSDavid du Colombier { "AU", g_AU, }, 1007dd7cddfSDavid du Colombier { "B", g_B, }, 1017dd7cddfSDavid du Colombier { "B1", g_hrule, }, 1027dd7cddfSDavid du Colombier { "B2", g_hrule, }, 1037dd7cddfSDavid du Colombier { "BI", g_BI, }, 1047dd7cddfSDavid du Colombier { "BP", g_BP, }, 1057dd7cddfSDavid du Colombier { "BT", g_ignore, }, 1067dd7cddfSDavid du Colombier { "BX", g_BX, }, 1077dd7cddfSDavid du Colombier { "CW", g_CW, }, 1087dd7cddfSDavid du Colombier { "CT", g_ignore, }, 1097dd7cddfSDavid du Colombier { "DA", g_ignore, }, 1107dd7cddfSDavid du Colombier { "DE", g_P2, }, 1117dd7cddfSDavid du Colombier { "DS", g_P1, }, 1127dd7cddfSDavid du Colombier { "EG", g_ignore, }, 1137dd7cddfSDavid du Colombier { "EN", g_ignore, }, 1147dd7cddfSDavid du Colombier { "EQ", g_startgif, }, 1157dd7cddfSDavid du Colombier { "FE", g_FE, }, 1167dd7cddfSDavid du Colombier { "FP", g_ignore, }, 1177dd7cddfSDavid du Colombier { "FS", g_FS, }, 1187dd7cddfSDavid du Colombier { "HO", g_HO, }, 1197dd7cddfSDavid du Colombier { "I", g_I, }, 1207dd7cddfSDavid du Colombier { "IH", g_IH, }, 1217dd7cddfSDavid du Colombier { "IM", g_ignore, }, 1227dd7cddfSDavid du Colombier { "IP", g_IP, }, 1237dd7cddfSDavid du Colombier { "KE", g_ignore, }, 1247dd7cddfSDavid du Colombier { "KF", g_ignore, }, 1257dd7cddfSDavid du Colombier { "KS", g_ignore, }, 1267dd7cddfSDavid du Colombier { "LG", g_ignore, }, 1277dd7cddfSDavid du Colombier { "LP", g_LP, }, 1287dd7cddfSDavid du Colombier { "LT", g_ignore, }, 1297dd7cddfSDavid du Colombier { "MF", g_ignore, }, 1307dd7cddfSDavid du Colombier { "MH", g_MH, }, 1317dd7cddfSDavid du Colombier { "MR", g_ignore, }, 1327dd7cddfSDavid du Colombier { "ND", g_ignore, }, 1337dd7cddfSDavid du Colombier { "NH", g_NH, }, 1347dd7cddfSDavid du Colombier { "NL", g_ignore, }, 1357dd7cddfSDavid du Colombier { "P1", g_P1, }, 1367dd7cddfSDavid du Colombier { "P2", g_P2, }, 1377dd7cddfSDavid du Colombier { "PE", g_ignore, }, 1387dd7cddfSDavid du Colombier { "PF", g_ignore, }, 1397dd7cddfSDavid du Colombier { "PP", g_PP, }, 1407dd7cddfSDavid du Colombier { "PS", g_startgif, }, 1417dd7cddfSDavid du Colombier { "PY", g_PY, }, 1427dd7cddfSDavid du Colombier { "QE", g_QE, }, 1437dd7cddfSDavid du Colombier { "QP", g_QS, }, 1447dd7cddfSDavid du Colombier { "QS", g_QS, }, 1457dd7cddfSDavid du Colombier { "R", g_R, }, 1467dd7cddfSDavid du Colombier { "RE", g_RE, }, 1477dd7cddfSDavid du Colombier { "RP", g_ignore, }, 1487dd7cddfSDavid du Colombier { "RS", g_RS, }, 1497dd7cddfSDavid du Colombier { "SG", g_ignore, }, 1507dd7cddfSDavid du Colombier { "SH", g_SH, }, 1517dd7cddfSDavid du Colombier { "SM", g_ignore, }, 1527dd7cddfSDavid du Colombier { "TA", g_ignore, }, 1537dd7cddfSDavid du Colombier { "TE", g_ignore, }, 1547dd7cddfSDavid du Colombier { "TH", g_TL, }, 1557dd7cddfSDavid du Colombier { "TL", g_TL, }, 1567dd7cddfSDavid du Colombier { "TM", g_ignore, }, 1577dd7cddfSDavid du Colombier { "TR", g_ignore, }, 1587dd7cddfSDavid du Colombier { "TS", g_startgif, }, 1597dd7cddfSDavid du Colombier { "UL", g_I, }, 1607dd7cddfSDavid du Colombier { "UX", g_ignore, }, 1617dd7cddfSDavid du Colombier { "WH", g_ignore, }, 1627dd7cddfSDavid du Colombier { "RT", g_RT, }, 1637dd7cddfSDavid du Colombier 1647dd7cddfSDavid du Colombier { "br", g_br, }, 1657dd7cddfSDavid du Colombier { "ti", g_br, }, 1667dd7cddfSDavid du Colombier { "nf", g_P1, }, 1677dd7cddfSDavid du Colombier { "fi", g_P2, }, 1687dd7cddfSDavid du Colombier { "ft", g_ft, }, 1697dd7cddfSDavid du Colombier { "sp", g_sp, }, 1707dd7cddfSDavid du Colombier { "rm", g_rm, }, 1717dd7cddfSDavid du Colombier { "de", g_de, }, 1727dd7cddfSDavid du Colombier { "am", g_de, }, 1737dd7cddfSDavid du Colombier { "lf", g_lf, }, 1747dd7cddfSDavid du Colombier { "so", g_so, }, 1757dd7cddfSDavid du Colombier { "ps", g_ignore }, 1767dd7cddfSDavid du Colombier { "vs", g_ignore }, 1777dd7cddfSDavid du Colombier { "nr", g_nr }, 1787dd7cddfSDavid du Colombier { "in", g_in }, 1797dd7cddfSDavid du Colombier { "ne", g_ignore }, 1807dd7cddfSDavid du Colombier { "ig", g_ig }, 1817dd7cddfSDavid du Colombier { "BS", g_BS }, 1827dd7cddfSDavid du Colombier { "BE", g_BE }, 1837dd7cddfSDavid du Colombier { "LB", g_LB }, 1847dd7cddfSDavid du Colombier { nil, nil }, 1857dd7cddfSDavid du Colombier }; 1867dd7cddfSDavid du Colombier 1877dd7cddfSDavid du Colombier typedef struct Entity Entity; 1887dd7cddfSDavid du Colombier struct Entity 1897dd7cddfSDavid du Colombier { 1907dd7cddfSDavid du Colombier char *name; 1917dd7cddfSDavid du Colombier int value; 1927dd7cddfSDavid du Colombier }; 1937dd7cddfSDavid du Colombier 1947dd7cddfSDavid du Colombier Entity entity[] = 1957dd7cddfSDavid du Colombier { 1967dd7cddfSDavid du Colombier { "&#SPACE;", L' ', }, 1977dd7cddfSDavid du Colombier { "&#RS;", L'\n', }, 1987dd7cddfSDavid du Colombier { "&#RE;", L'\r', }, 1997dd7cddfSDavid du Colombier { """, L'"', }, 2007dd7cddfSDavid du Colombier { "Æ", L'Æ', }, 2017dd7cddfSDavid du Colombier { "Á", L'Á', }, 2027dd7cddfSDavid du Colombier { "Â", L'Â', }, 2037dd7cddfSDavid du Colombier { "À", L'À', }, 2047dd7cddfSDavid du Colombier { "Å", L'Å', }, 2057dd7cddfSDavid du Colombier { "Ã", L'Ã', }, 2067dd7cddfSDavid du Colombier { "Ä", L'Ä', }, 2077dd7cddfSDavid du Colombier { "Ç", L'Ç', }, 2087dd7cddfSDavid du Colombier { "Ð", L'Ð', }, 2097dd7cddfSDavid du Colombier { "É", L'É', }, 2107dd7cddfSDavid du Colombier { "Ê", L'Ê', }, 2117dd7cddfSDavid du Colombier { "È", L'È', }, 2127dd7cddfSDavid du Colombier { "Ë", L'Ë', }, 2137dd7cddfSDavid du Colombier { "Í", L'Í', }, 2147dd7cddfSDavid du Colombier { "Î", L'Î', }, 2157dd7cddfSDavid du Colombier { "Ì", L'Ì', }, 2167dd7cddfSDavid du Colombier { "Ï", L'Ï', }, 2177dd7cddfSDavid du Colombier { "Ñ", L'Ñ', }, 2187dd7cddfSDavid du Colombier { "Ó", L'Ó', }, 2197dd7cddfSDavid du Colombier { "Ô", L'Ô', }, 2207dd7cddfSDavid du Colombier { "Ò", L'Ò', }, 2217dd7cddfSDavid du Colombier { "Ø", L'Ø', }, 2227dd7cddfSDavid du Colombier { "Õ", L'Õ', }, 2237dd7cddfSDavid du Colombier { "Ö", L'Ö', }, 2247dd7cddfSDavid du Colombier { "Þ", L'Þ', }, 2257dd7cddfSDavid du Colombier { "Ú", L'Ú', }, 2267dd7cddfSDavid du Colombier { "Û", L'Û', }, 2277dd7cddfSDavid du Colombier { "Ù", L'Ù', }, 2287dd7cddfSDavid du Colombier { "Ü", L'Ü', }, 2297dd7cddfSDavid du Colombier { "Ý", L'Ý', }, 2307dd7cddfSDavid du Colombier { "á", L'á', }, 2317dd7cddfSDavid du Colombier { "â", L'â', }, 2327dd7cddfSDavid du Colombier { "æ", L'æ', }, 2337dd7cddfSDavid du Colombier { "à", L'à', }, 2347dd7cddfSDavid du Colombier { "&", L'&', }, 2357dd7cddfSDavid du Colombier { "å", L'å', }, 2367dd7cddfSDavid du Colombier { "ã", L'ã', }, 2377dd7cddfSDavid du Colombier { "ä", L'ä', }, 2387dd7cddfSDavid du Colombier { "ç", L'ç', }, 2397dd7cddfSDavid du Colombier { "é", L'é', }, 2407dd7cddfSDavid du Colombier { "ê", L'ê', }, 2417dd7cddfSDavid du Colombier { "è", L'è', }, 2427dd7cddfSDavid du Colombier { "ð", L'ð', }, 2437dd7cddfSDavid du Colombier { "ë", L'ë', }, 2447dd7cddfSDavid du Colombier { ">", L'>', }, 2457dd7cddfSDavid du Colombier { "í", L'í', }, 2467dd7cddfSDavid du Colombier { "î", L'î', }, 2477dd7cddfSDavid du Colombier { "ì", L'ì', }, 2487dd7cddfSDavid du Colombier { "ï", L'ï', }, 2497dd7cddfSDavid du Colombier { "<", L'<', }, 2507dd7cddfSDavid du Colombier { "ñ", L'ñ', }, 2517dd7cddfSDavid du Colombier { "ó", L'ó', }, 2527dd7cddfSDavid du Colombier { "ô", L'ô', }, 2537dd7cddfSDavid du Colombier { "ò", L'ò', }, 2547dd7cddfSDavid du Colombier { "ø", L'ø', }, 2557dd7cddfSDavid du Colombier { "õ", L'õ', }, 2567dd7cddfSDavid du Colombier { "ö", L'ö', }, 2577dd7cddfSDavid du Colombier { "ß", L'ß', }, 2587dd7cddfSDavid du Colombier { "þ", L'þ', }, 2597dd7cddfSDavid du Colombier { "ú", L'ú', }, 2607dd7cddfSDavid du Colombier { "û", L'û', }, 2617dd7cddfSDavid du Colombier { "ù", L'ù', }, 2627dd7cddfSDavid du Colombier { "ü", L'ü', }, 2637dd7cddfSDavid du Colombier { "ý", L'ý', }, 2647dd7cddfSDavid du Colombier { "ÿ", L'ÿ', }, 2657dd7cddfSDavid du Colombier { "¡", L'¡', }, 2667dd7cddfSDavid du Colombier { "¢", L'¢', }, 2677dd7cddfSDavid du Colombier { "£", L'£', }, 2687dd7cddfSDavid du Colombier { "¤", L'¤', }, 2697dd7cddfSDavid du Colombier { "¥", L'¥', }, 2707dd7cddfSDavid du Colombier { "¦", L'¦', }, 2717dd7cddfSDavid du Colombier { "§", L'§', }, 2727dd7cddfSDavid du Colombier { "¨", L'¨', }, 2737dd7cddfSDavid du Colombier { "©", L'©', }, 2747dd7cddfSDavid du Colombier { "ª", L'ª', }, 2757dd7cddfSDavid du Colombier { "«", L'«', }, 2767dd7cddfSDavid du Colombier { "¬", L'¬', }, 2777dd7cddfSDavid du Colombier { "­", L'', }, 2787dd7cddfSDavid du Colombier { "®", L'®', }, 2797dd7cddfSDavid du Colombier { "¯", L'¯', }, 2807dd7cddfSDavid du Colombier { "°", L'°', }, 2817dd7cddfSDavid du Colombier { "±", L'±', }, 2827dd7cddfSDavid du Colombier { "²", L'²', }, 2837dd7cddfSDavid du Colombier { "³", L'³', }, 2847dd7cddfSDavid du Colombier { "´", L'´', }, 2857dd7cddfSDavid du Colombier { "µ", L'µ', }, 2867dd7cddfSDavid du Colombier { "¶", L'¶', }, 2877dd7cddfSDavid du Colombier { "·", L'·', }, 2887dd7cddfSDavid du Colombier { "¸", L'¸', }, 2897dd7cddfSDavid du Colombier { "¹", L'¹', }, 2907dd7cddfSDavid du Colombier { "º", L'º', }, 2917dd7cddfSDavid du Colombier { "»", L'»', }, 2927dd7cddfSDavid du Colombier { "¼", L'¼', }, 2937dd7cddfSDavid du Colombier { "½", L'½', }, 2947dd7cddfSDavid du Colombier { "¾", L'¾', }, 2957dd7cddfSDavid du Colombier { "¿", L'¿', }, 2967dd7cddfSDavid du Colombier 2977dd7cddfSDavid du Colombier { "*", L'•', }, 2987dd7cddfSDavid du Colombier { "¤", L'□', }, 2997dd7cddfSDavid du Colombier { "º", L'◊', }, 3007dd7cddfSDavid du Colombier { "(tm)", L'™', }, 3016b6b9ac8SDavid du Colombier {"Α", L'Α',}, 3026b6b9ac8SDavid du Colombier {"Β", L'Β',}, 3036b6b9ac8SDavid du Colombier {"Γ", L'Γ',}, 3046b6b9ac8SDavid du Colombier {"Δ", L'Δ',}, 3056b6b9ac8SDavid du Colombier {"Ε", L'Ε',}, 3066b6b9ac8SDavid du Colombier {"Ζ", L'Ζ',}, 3076b6b9ac8SDavid du Colombier {"Η", L'Η',}, 3086b6b9ac8SDavid du Colombier {"Θ", L'Θ',}, 3096b6b9ac8SDavid du Colombier {"Ι", L'Ι',}, 3106b6b9ac8SDavid du Colombier {"Κ", L'Κ',}, 3116b6b9ac8SDavid du Colombier {"Λ", L'Λ',}, 3126b6b9ac8SDavid du Colombier {"Μ", L'Μ',}, 3136b6b9ac8SDavid du Colombier {"Ν", L'Ν',}, 3146b6b9ac8SDavid du Colombier {"Ξ", L'Ξ',}, 3156b6b9ac8SDavid du Colombier {"Ο", L'Ο',}, 3166b6b9ac8SDavid du Colombier {"Π", L'Π',}, 3176b6b9ac8SDavid du Colombier {"Ρ", L'Ρ',}, 3186b6b9ac8SDavid du Colombier {"΢", L'',}, 3196b6b9ac8SDavid du Colombier {"Σ", L'Σ',}, 3206b6b9ac8SDavid du Colombier {"Τ", L'Τ',}, 3216b6b9ac8SDavid du Colombier {"Υ", L'Υ',}, 3226b6b9ac8SDavid du Colombier {"Φ", L'Φ',}, 3236b6b9ac8SDavid du Colombier {"Χ", L'Χ',}, 3246b6b9ac8SDavid du Colombier {"Ψ", L'Ψ',}, 3256b6b9ac8SDavid du Colombier {"Ω", L'Ω',}, 3266b6b9ac8SDavid du Colombier {"α", L'α',}, 3276b6b9ac8SDavid du Colombier {"β", L'β',}, 3286b6b9ac8SDavid du Colombier {"γ", L'γ',}, 3296b6b9ac8SDavid du Colombier {"δ", L'δ',}, 3306b6b9ac8SDavid du Colombier {"ε", L'ε',}, 3316b6b9ac8SDavid du Colombier {"ζ", L'ζ',}, 3326b6b9ac8SDavid du Colombier {"η", L'η',}, 3336b6b9ac8SDavid du Colombier {"θ", L'θ',}, 3346b6b9ac8SDavid du Colombier {"ι", L'ι',}, 3356b6b9ac8SDavid du Colombier {"κ", L'κ',}, 3366b6b9ac8SDavid du Colombier {"λ", L'λ',}, 3376b6b9ac8SDavid du Colombier {"μ", L'μ',}, 3386b6b9ac8SDavid du Colombier {"ν", L'ν',}, 3396b6b9ac8SDavid du Colombier {"ξ", L'ξ',}, 3406b6b9ac8SDavid du Colombier {"ο", L'ο',}, 3416b6b9ac8SDavid du Colombier {"π", L'π',}, 3426b6b9ac8SDavid du Colombier {"ρ", L'ρ',}, 3436b6b9ac8SDavid du Colombier {"ς", L'ς',}, 3446b6b9ac8SDavid du Colombier {"σ", L'σ',}, 3456b6b9ac8SDavid du Colombier {"τ", L'τ',}, 3466b6b9ac8SDavid du Colombier {"υ", L'υ',}, 3476b6b9ac8SDavid du Colombier {"φ", L'φ',}, 3486b6b9ac8SDavid du Colombier {"χ", L'χ',}, 3496b6b9ac8SDavid du Colombier {"ψ", L'ψ',}, 3506b6b9ac8SDavid du Colombier {"ω", L'ω',}, 3517dd7cddfSDavid du Colombier 3526b6b9ac8SDavid du Colombier { "<-", L'←', }, 3536b6b9ac8SDavid du Colombier { "^", L'↑', }, 3546b6b9ac8SDavid du Colombier { "->", L'→', }, 3556b6b9ac8SDavid du Colombier { "v", L'↓', }, 3566b6b9ac8SDavid du Colombier { "!=", L'≠', }, 3576b6b9ac8SDavid du Colombier { "<=", L'≤', }, 3586b6b9ac8SDavid du Colombier { "...", L'⋯', }, 3596b6b9ac8SDavid du Colombier {"∈", L'∈', }, 3606b6b9ac8SDavid du Colombier 3616b6b9ac8SDavid du Colombier {"–", L'–', }, 3626b6b9ac8SDavid du Colombier {"—", L'—', }, 3637dd7cddfSDavid du Colombier 3647dd7cddfSDavid du Colombier { "CYRILLIC XYZZY", L'й', }, 3657dd7cddfSDavid du Colombier { "CYRILLIC XYZZY", L'ъ', }, 3667dd7cddfSDavid du Colombier { "CYRILLIC Y", L'ь', }, 3677dd7cddfSDavid du Colombier { "CYRILLIC YA", L'я', }, 3687dd7cddfSDavid du Colombier { "CYRILLIC YA", L'ё', }, 3697dd7cddfSDavid du Colombier { "¿", L'ℱ', }, 3707dd7cddfSDavid du Colombier 3717dd7cddfSDavid du Colombier { nil, 0 }, 3727dd7cddfSDavid du Colombier }; 3737dd7cddfSDavid du Colombier 3747dd7cddfSDavid du Colombier typedef struct Troffspec Troffspec; 3757dd7cddfSDavid du Colombier struct Troffspec 3767dd7cddfSDavid du Colombier { 3777dd7cddfSDavid du Colombier char *name; 3787dd7cddfSDavid du Colombier char *value; 3797dd7cddfSDavid du Colombier }; 3807dd7cddfSDavid du Colombier 3817dd7cddfSDavid du Colombier Troffspec tspec[] = 3827dd7cddfSDavid du Colombier { 3837dd7cddfSDavid du Colombier { "A*", "Å", }, 3847dd7cddfSDavid du Colombier { "o\"", "ö", }, 3857dd7cddfSDavid du Colombier { "ff", "ff", }, 3867dd7cddfSDavid du Colombier { "fi", "fi", }, 3877dd7cddfSDavid du Colombier { "fl", "fl", }, 3887dd7cddfSDavid du Colombier { "Fi", "ffi", }, 3897dd7cddfSDavid du Colombier { "ru", "_", }, 3907dd7cddfSDavid du Colombier { "em", "­", }, 3917dd7cddfSDavid du Colombier { "14", "¼", }, 3927dd7cddfSDavid du Colombier { "12", "½", }, 3937dd7cddfSDavid du Colombier { "co", "©", }, 3947dd7cddfSDavid du Colombier { "de", "°", }, 3957dd7cddfSDavid du Colombier { "dg", "¡", }, 3967dd7cddfSDavid du Colombier { "fm", "´", }, 3977dd7cddfSDavid du Colombier { "rg", "®", }, 3987dd7cddfSDavid du Colombier { "bu", "*", }, 3997dd7cddfSDavid du Colombier { "sq", "¤", }, 4007dd7cddfSDavid du Colombier { "hy", "-", }, 4017dd7cddfSDavid du Colombier { "pl", "+", }, 4027dd7cddfSDavid du Colombier { "mi", "-", }, 4037dd7cddfSDavid du Colombier { "mu", "×", }, 4047dd7cddfSDavid du Colombier { "di", "÷", }, 4057dd7cddfSDavid du Colombier { "eq", "=", }, 4067dd7cddfSDavid du Colombier { "==", "==", }, 4077dd7cddfSDavid du Colombier { ">=", ">=", }, 4087dd7cddfSDavid du Colombier { "<=", "<=", }, 4097dd7cddfSDavid du Colombier { "!=", "!=", }, 4107dd7cddfSDavid du Colombier { "+-", "±", }, 4117dd7cddfSDavid du Colombier { "no", "¬", }, 4127dd7cddfSDavid du Colombier { "sl", "/", }, 4137dd7cddfSDavid du Colombier { "ap", "&", }, 4147dd7cddfSDavid du Colombier { "~=", "~=", }, 4157dd7cddfSDavid du Colombier { "pt", "oc", }, 4167dd7cddfSDavid du Colombier { "gr", "GRAD", }, 4177dd7cddfSDavid du Colombier { "->", "->", }, 4187dd7cddfSDavid du Colombier { "<-", "<-", }, 4197dd7cddfSDavid du Colombier { "ua", "^", }, 4207dd7cddfSDavid du Colombier { "da", "v", }, 4217dd7cddfSDavid du Colombier { "is", "Integral", }, 4227dd7cddfSDavid du Colombier { "pd", "DIV", }, 4237dd7cddfSDavid du Colombier { "if", "oo", }, 4247dd7cddfSDavid du Colombier { "sr", "-/", }, 4257dd7cddfSDavid du Colombier { "sb", "(~", }, 4267dd7cddfSDavid du Colombier { "sp", "~)", }, 4277dd7cddfSDavid du Colombier { "cu", "U", }, 4287dd7cddfSDavid du Colombier { "ca", "(^)", }, 4297dd7cddfSDavid du Colombier { "ib", "(=", }, 4307dd7cddfSDavid du Colombier { "ip", "=)", }, 4317dd7cddfSDavid du Colombier { "mo", "C", }, 4327dd7cddfSDavid du Colombier { "es", "Ø", }, 4337dd7cddfSDavid du Colombier { "aa", "´", }, 4347dd7cddfSDavid du Colombier { "ga", "`", }, 4357dd7cddfSDavid du Colombier { "ci", "O", }, 4367dd7cddfSDavid du Colombier { "L1", "DEATHSTAR", }, 4377dd7cddfSDavid du Colombier { "sc", "§", }, 4387dd7cddfSDavid du Colombier { "dd", "++", }, 4397dd7cddfSDavid du Colombier { "lh", "<=", }, 4407dd7cddfSDavid du Colombier { "rh", "=>", }, 4417dd7cddfSDavid du Colombier { "lt", "(", }, 4427dd7cddfSDavid du Colombier { "rt", ")", }, 4437dd7cddfSDavid du Colombier { "lc", "|", }, 4447dd7cddfSDavid du Colombier { "rc", "|", }, 4457dd7cddfSDavid du Colombier { "lb", "(", }, 4467dd7cddfSDavid du Colombier { "rb", ")", }, 4477dd7cddfSDavid du Colombier { "lf", "|", }, 4487dd7cddfSDavid du Colombier { "rf", "|", }, 4497dd7cddfSDavid du Colombier { "lk", "|", }, 4507dd7cddfSDavid du Colombier { "rk", "|", }, 4517dd7cddfSDavid du Colombier { "bv", "|", }, 4527dd7cddfSDavid du Colombier { "ts", "s", }, 4537dd7cddfSDavid du Colombier { "br", "|", }, 4547dd7cddfSDavid du Colombier { "or", "|", }, 4557dd7cddfSDavid du Colombier { "ul", "_", }, 4567dd7cddfSDavid du Colombier { "rn", " ", }, 4577dd7cddfSDavid du Colombier { "**", "*", }, 4586b6b9ac8SDavid du Colombier { "tm", "™", }, 4597dd7cddfSDavid du Colombier { nil, nil, }, 4607dd7cddfSDavid du Colombier }; 4617dd7cddfSDavid du Colombier 4627dd7cddfSDavid du Colombier typedef struct Font Font; 4637dd7cddfSDavid du Colombier struct Font 4647dd7cddfSDavid du Colombier { 4657dd7cddfSDavid du Colombier char *start; 4667dd7cddfSDavid du Colombier char *end; 4677dd7cddfSDavid du Colombier }; 4687dd7cddfSDavid du Colombier Font bfont = { "<B>", "</B>" }; 4697dd7cddfSDavid du Colombier Font ifont = { "<I>", "</I>" }; 4707dd7cddfSDavid du Colombier Font bifont = { "<B><I>", "</I></B>" }; 4717dd7cddfSDavid du Colombier Font cwfont = { "<TT>", "</TT>" }; 472*da51d93aSDavid du Colombier Font *fstack[Maxfsp]; 473*da51d93aSDavid du Colombier int fsp = -1; 4747dd7cddfSDavid du Colombier 4757dd7cddfSDavid du Colombier typedef struct String String; 4767dd7cddfSDavid du Colombier struct String 4777dd7cddfSDavid du Colombier { 4787dd7cddfSDavid du Colombier String *next; 4797dd7cddfSDavid du Colombier char *name; 4807dd7cddfSDavid du Colombier char *val; 4817dd7cddfSDavid du Colombier }; 4827dd7cddfSDavid du Colombier String *numregs, *strings; 4837dd7cddfSDavid du Colombier char *strstack[Maxmstack]; 4847dd7cddfSDavid du Colombier char *mustfree[Maxmstack]; 4857dd7cddfSDavid du Colombier int strsp = -1; 4867dd7cddfSDavid du Colombier int elsetop = -1; 4877dd7cddfSDavid du Colombier 4887dd7cddfSDavid du Colombier typedef struct Mstack Mstack; 4897dd7cddfSDavid du Colombier struct Mstack 4907dd7cddfSDavid du Colombier { 4917dd7cddfSDavid du Colombier char *ptr; 4927dd7cddfSDavid du Colombier char *argv[Narg+1]; 4937dd7cddfSDavid du Colombier }; 4947dd7cddfSDavid du Colombier String *macros; 4957dd7cddfSDavid du Colombier Mstack mstack[Maxmstack]; 4967dd7cddfSDavid du Colombier int msp = -1; 4977dd7cddfSDavid du Colombier 4987dd7cddfSDavid du Colombier typedef struct Srcstack Srcstack; 4997dd7cddfSDavid du Colombier struct Srcstack 5007dd7cddfSDavid du Colombier { 5017dd7cddfSDavid du Colombier char filename[256]; 5027dd7cddfSDavid du Colombier int fd; 5037dd7cddfSDavid du Colombier int lno; 5047dd7cddfSDavid du Colombier int rlno; 5057dd7cddfSDavid du Colombier Biobuf in; 5067dd7cddfSDavid du Colombier }; 5077dd7cddfSDavid du Colombier Srcstack sstack[Maxsstack]; 5087dd7cddfSDavid du Colombier Srcstack *ssp = &sstack[-1]; 5097dd7cddfSDavid du Colombier 5107dd7cddfSDavid du Colombier char token[128]; 5117dd7cddfSDavid du Colombier 5127dd7cddfSDavid du Colombier void closel(void); 5137dd7cddfSDavid du Colombier void closefont(void); 5147dd7cddfSDavid du Colombier 5157dd7cddfSDavid du Colombier void* 5167dd7cddfSDavid du Colombier emalloc(uint n) 5177dd7cddfSDavid du Colombier { 5187dd7cddfSDavid du Colombier void *p; 5197dd7cddfSDavid du Colombier 5207dd7cddfSDavid du Colombier p = mallocz(n, 1); 5217dd7cddfSDavid du Colombier if(p == nil){ 5227dd7cddfSDavid du Colombier fprint(2, "ms2html: malloc failed: %r\n"); 5237dd7cddfSDavid du Colombier exits("malloc"); 5247dd7cddfSDavid du Colombier } 5257dd7cddfSDavid du Colombier return p; 5267dd7cddfSDavid du Colombier } 5277dd7cddfSDavid du Colombier 5287dd7cddfSDavid du Colombier 5297dd7cddfSDavid du Colombier /* define a string variable */ 5307dd7cddfSDavid du Colombier void 5317dd7cddfSDavid du Colombier dsnr(char *name, char *val, String **l) 5327dd7cddfSDavid du Colombier { 5337dd7cddfSDavid du Colombier String *s; 5347dd7cddfSDavid du Colombier 5357dd7cddfSDavid du Colombier for(s = *l; s != nil; s = *l){ 5367dd7cddfSDavid du Colombier if(strcmp(s->name, name) == 0) 5377dd7cddfSDavid du Colombier break; 5387dd7cddfSDavid du Colombier l = &s->next; 5397dd7cddfSDavid du Colombier } 5407dd7cddfSDavid du Colombier if(s == nil){ 5417dd7cddfSDavid du Colombier s = emalloc(sizeof(String)); 5427dd7cddfSDavid du Colombier *l = s; 5437dd7cddfSDavid du Colombier s->name = strdup(name); 5447dd7cddfSDavid du Colombier } else 5457dd7cddfSDavid du Colombier free(s->val); 5467dd7cddfSDavid du Colombier s->val = strdup(val); 5477dd7cddfSDavid du Colombier } 5487dd7cddfSDavid du Colombier 5497dd7cddfSDavid du Colombier void 5507dd7cddfSDavid du Colombier ds(char *name, char *val) 5517dd7cddfSDavid du Colombier { 5527dd7cddfSDavid du Colombier dsnr(name, val, &strings); 5537dd7cddfSDavid du Colombier } 5547dd7cddfSDavid du Colombier 5557dd7cddfSDavid du Colombier /* look up a defined string */ 5567dd7cddfSDavid du Colombier char* 5577dd7cddfSDavid du Colombier getds(char *name) 5587dd7cddfSDavid du Colombier { 5597dd7cddfSDavid du Colombier String *s; 5607dd7cddfSDavid du Colombier 5617dd7cddfSDavid du Colombier for(s = strings; s != nil; s = s->next) 5627dd7cddfSDavid du Colombier if(strcmp(name, s->name) == 0) 5637dd7cddfSDavid du Colombier break; 5647dd7cddfSDavid du Colombier if(s != nil) 5657dd7cddfSDavid du Colombier return s->val; 5667dd7cddfSDavid du Colombier return ""; 5677dd7cddfSDavid du Colombier } 5687dd7cddfSDavid du Colombier 5697dd7cddfSDavid du Colombier char * 5707dd7cddfSDavid du Colombier getnr(char *name) 5717dd7cddfSDavid du Colombier { 5727dd7cddfSDavid du Colombier String *s; 5737dd7cddfSDavid du Colombier 5747dd7cddfSDavid du Colombier for(s = numregs; s != nil; s = s->next) 5757dd7cddfSDavid du Colombier if(strcmp(name, s->name) == 0) 5767dd7cddfSDavid du Colombier break; 5777dd7cddfSDavid du Colombier if(s != nil) 5787dd7cddfSDavid du Colombier return s->val; 5797dd7cddfSDavid du Colombier return "0"; 5807dd7cddfSDavid du Colombier } 5817dd7cddfSDavid du Colombier 5827dd7cddfSDavid du Colombier void 5837dd7cddfSDavid du Colombier pushstr(char *p) 5847dd7cddfSDavid du Colombier { 5857dd7cddfSDavid du Colombier if(p == nil) 5867dd7cddfSDavid du Colombier return; 5877dd7cddfSDavid du Colombier if(strsp >= Maxmstack - 1) 5887dd7cddfSDavid du Colombier return; 5897dd7cddfSDavid du Colombier strstack[++strsp] = p; 5907dd7cddfSDavid du Colombier } 5917dd7cddfSDavid du Colombier 5927dd7cddfSDavid du Colombier 5937dd7cddfSDavid du Colombier /* lookup a defined macro */ 5947dd7cddfSDavid du Colombier char* 5957dd7cddfSDavid du Colombier getmacro(char *name) 5967dd7cddfSDavid du Colombier { 5977dd7cddfSDavid du Colombier String *s; 5987dd7cddfSDavid du Colombier 5997dd7cddfSDavid du Colombier for(s = macros; s != nil; s = s->next) 6007dd7cddfSDavid du Colombier if(strcmp(name, s->name) == 0) 6017dd7cddfSDavid du Colombier return s->val; 6027dd7cddfSDavid du Colombier return nil; 6037dd7cddfSDavid du Colombier } 6047dd7cddfSDavid du Colombier 6057dd7cddfSDavid du Colombier enum 6067dd7cddfSDavid du Colombier { 6077dd7cddfSDavid du Colombier Dstring, 6087dd7cddfSDavid du Colombier Macro, 6097dd7cddfSDavid du Colombier Input, 6107dd7cddfSDavid du Colombier }; 6117dd7cddfSDavid du Colombier int lastsrc; 6127dd7cddfSDavid du Colombier 6137dd7cddfSDavid du Colombier void 6147dd7cddfSDavid du Colombier pushsrc(char *name) 6157dd7cddfSDavid du Colombier { 6169a747e4fSDavid du Colombier Dir *d; 6177dd7cddfSDavid du Colombier int fd; 6187dd7cddfSDavid du Colombier 6197dd7cddfSDavid du Colombier if(ssp == &sstack[Maxsstack-1]){ 6207dd7cddfSDavid du Colombier fprint(2, "ms2html: .so's too deep\n"); 6217dd7cddfSDavid du Colombier return; 6227dd7cddfSDavid du Colombier } 6239a747e4fSDavid du Colombier d = nil; 6247dd7cddfSDavid du Colombier if(name == nil){ 6259a747e4fSDavid du Colombier d = dirfstat(0); 6269a747e4fSDavid du Colombier if(d == nil){ 6279a747e4fSDavid du Colombier fprint(2, "ms2html: can't stat %s: %r\n", name); 6289a747e4fSDavid du Colombier return; 6299a747e4fSDavid du Colombier } 6309a747e4fSDavid du Colombier name = d->name; 6317dd7cddfSDavid du Colombier fd = 0; 6327dd7cddfSDavid du Colombier } else { 6337dd7cddfSDavid du Colombier fd = open(name, OREAD); 6347dd7cddfSDavid du Colombier if(fd < 0){ 6359a747e4fSDavid du Colombier fprint(2, "ms2html: can't open %s: %r\n", name); 6367dd7cddfSDavid du Colombier return; 6377dd7cddfSDavid du Colombier } 6387dd7cddfSDavid du Colombier } 6397dd7cddfSDavid du Colombier ssp++; 6407dd7cddfSDavid du Colombier ssp->fd = fd; 6417dd7cddfSDavid du Colombier Binit(&ssp->in, fd, OREAD); 6427dd7cddfSDavid du Colombier snprint(ssp->filename, sizeof(ssp->filename), "%s", name); 6437dd7cddfSDavid du Colombier ssp->lno = ssp->rlno = 1; 6449a747e4fSDavid du Colombier free(d); 6457dd7cddfSDavid du Colombier } 6467dd7cddfSDavid du Colombier 6477dd7cddfSDavid du Colombier /* get next logical byte. from stdin or a defined string */ 6487dd7cddfSDavid du Colombier int 6497dd7cddfSDavid du Colombier getrune(void) 6507dd7cddfSDavid du Colombier { 6517dd7cddfSDavid du Colombier int i; 6527dd7cddfSDavid du Colombier Rune r; 6537dd7cddfSDavid du Colombier int c; 6547dd7cddfSDavid du Colombier Mstack *m; 6557dd7cddfSDavid du Colombier 6567dd7cddfSDavid du Colombier while(strsp >= 0){ 6577dd7cddfSDavid du Colombier i = chartorune(&r, strstack[strsp]); 6587dd7cddfSDavid du Colombier if(r != 0){ 6597dd7cddfSDavid du Colombier strstack[strsp] += i; 6607dd7cddfSDavid du Colombier lastsrc = Dstring; 6617dd7cddfSDavid du Colombier return r; 6627dd7cddfSDavid du Colombier } 6637dd7cddfSDavid du Colombier if (mustfree[strsp]) { 6647dd7cddfSDavid du Colombier free(mustfree[strsp]); 6657dd7cddfSDavid du Colombier mustfree[strsp] = nil; 6667dd7cddfSDavid du Colombier } 6677dd7cddfSDavid du Colombier strsp--; 6687dd7cddfSDavid du Colombier } 6697dd7cddfSDavid du Colombier while(msp >= 0){ 6707dd7cddfSDavid du Colombier m = &mstack[msp]; 6717dd7cddfSDavid du Colombier i = chartorune(&r, m->ptr); 6727dd7cddfSDavid du Colombier if(r != 0){ 6737dd7cddfSDavid du Colombier m->ptr += i; 6747dd7cddfSDavid du Colombier lastsrc = Macro; 6757dd7cddfSDavid du Colombier return r; 6767dd7cddfSDavid du Colombier } 6777dd7cddfSDavid du Colombier for(i = 0; m->argv[i] != nil; i++) 6787dd7cddfSDavid du Colombier free(m->argv[i]); 6797dd7cddfSDavid du Colombier msp--; 6807dd7cddfSDavid du Colombier } 6817dd7cddfSDavid du Colombier 6827dd7cddfSDavid du Colombier lastsrc = Input; 6837dd7cddfSDavid du Colombier do { 6847dd7cddfSDavid du Colombier if(ssp < sstack) 6857dd7cddfSDavid du Colombier return -1; 6867dd7cddfSDavid du Colombier c = Bgetrune(&ssp->in); 6877dd7cddfSDavid du Colombier if(c >= 0){ 6887dd7cddfSDavid du Colombier r = c; 6897dd7cddfSDavid du Colombier break; 6907dd7cddfSDavid du Colombier } 6917dd7cddfSDavid du Colombier close(ssp->fd); 6927dd7cddfSDavid du Colombier ssp--; 6937dd7cddfSDavid du Colombier } while(r < 0); 6947dd7cddfSDavid du Colombier 6957dd7cddfSDavid du Colombier return r; 6967dd7cddfSDavid du Colombier } 6977dd7cddfSDavid du Colombier 6987dd7cddfSDavid du Colombier void 6997dd7cddfSDavid du Colombier ungetrune(void) 7007dd7cddfSDavid du Colombier { 7017dd7cddfSDavid du Colombier switch(lastsrc){ 7027dd7cddfSDavid du Colombier case Dstring: 7037dd7cddfSDavid du Colombier if(strsp >= 0) 7047dd7cddfSDavid du Colombier strstack[strsp]--; 7057dd7cddfSDavid du Colombier break; 7067dd7cddfSDavid du Colombier case Macro: 7077dd7cddfSDavid du Colombier if(msp >= 0) 7087dd7cddfSDavid du Colombier mstack[msp].ptr--; 7097dd7cddfSDavid du Colombier break; 7107dd7cddfSDavid du Colombier case Input: 7117dd7cddfSDavid du Colombier if(ssp >= sstack) 7127dd7cddfSDavid du Colombier Bungetrune(&ssp->in); 7137dd7cddfSDavid du Colombier break; 7147dd7cddfSDavid du Colombier } 7157dd7cddfSDavid du Colombier } 7167dd7cddfSDavid du Colombier 7177dd7cddfSDavid du Colombier int vert; 7187dd7cddfSDavid du Colombier 7197dd7cddfSDavid du Colombier char* 7207dd7cddfSDavid du Colombier changefont(Font *f) 7217dd7cddfSDavid du Colombier { 7227dd7cddfSDavid du Colombier token[0] = 0; 723*da51d93aSDavid du Colombier if(fsp == Maxfsp) 724*da51d93aSDavid du Colombier return token; 725*da51d93aSDavid du Colombier if(fsp >= 0 && fstack[fsp]) 726*da51d93aSDavid du Colombier strcpy(token, fstack[fsp]->end); 7277dd7cddfSDavid du Colombier if(f != nil) 7287dd7cddfSDavid du Colombier strcat(token, f->start); 729*da51d93aSDavid du Colombier fstack[++fsp] = f; 730*da51d93aSDavid du Colombier return token; 731*da51d93aSDavid du Colombier } 732*da51d93aSDavid du Colombier 733*da51d93aSDavid du Colombier char* 734*da51d93aSDavid du Colombier changebackfont(void) 735*da51d93aSDavid du Colombier { 736*da51d93aSDavid du Colombier token[0] = 0; 737*da51d93aSDavid du Colombier if(fsp >= 0){ 738*da51d93aSDavid du Colombier if(fstack[fsp]) 739*da51d93aSDavid du Colombier strcpy(token, fstack[fsp]->end); 740*da51d93aSDavid du Colombier fsp--; 741*da51d93aSDavid du Colombier } 742*da51d93aSDavid du Colombier if(fsp >= 0 && fstack[fsp]) 743*da51d93aSDavid du Colombier strcat(token, fstack[fsp]->start); 7447dd7cddfSDavid du Colombier return token; 7457dd7cddfSDavid du Colombier } 7467dd7cddfSDavid du Colombier 7476b6b9ac8SDavid du Colombier char* 7486b6b9ac8SDavid du Colombier changesize(int amount) 7496b6b9ac8SDavid du Colombier { 7506b6b9ac8SDavid du Colombier static int curamount; 7516b6b9ac8SDavid du Colombier static char buf[200]; 7526b6b9ac8SDavid du Colombier int i; 7536b6b9ac8SDavid du Colombier 7546b6b9ac8SDavid du Colombier buf[0] = 0; 7556b6b9ac8SDavid du Colombier if (curamount >= 0) 7566b6b9ac8SDavid du Colombier for (i = 0; i < curamount; i++) 7576b6b9ac8SDavid du Colombier strcat(buf, "</big>"); 7586b6b9ac8SDavid du Colombier else 7596b6b9ac8SDavid du Colombier for (i = 0; i < -curamount; i++) 7606b6b9ac8SDavid du Colombier strcat(buf, "</small>"); 7616b6b9ac8SDavid du Colombier curamount = 0; 7626b6b9ac8SDavid du Colombier if (amount >= 0) 7636b6b9ac8SDavid du Colombier for (i = 0; i < amount; i++) 7646b6b9ac8SDavid du Colombier strcat(buf, "<big>"); 7656b6b9ac8SDavid du Colombier else 7666b6b9ac8SDavid du Colombier for (i = 0; i < -amount; i++) 7676b6b9ac8SDavid du Colombier strcat(buf, "<small>"); 7686b6b9ac8SDavid du Colombier curamount = amount; 7696b6b9ac8SDavid du Colombier return buf; 7706b6b9ac8SDavid du Colombier } 7716b6b9ac8SDavid du Colombier 7729a747e4fSDavid du Colombier /* get next logical character. expand it with escapes */ 7737dd7cddfSDavid du Colombier char* 7747dd7cddfSDavid du Colombier getnext(void) 7757dd7cddfSDavid du Colombier { 7769a747e4fSDavid du Colombier int r; 7777dd7cddfSDavid du Colombier Entity *e; 7787dd7cddfSDavid du Colombier Troffspec *t; 7797dd7cddfSDavid du Colombier Rune R; 7807dd7cddfSDavid du Colombier char str[4]; 7816b6b9ac8SDavid du Colombier static char buf[8]; 7827dd7cddfSDavid du Colombier 7837dd7cddfSDavid du Colombier r = getrune(); 7847dd7cddfSDavid du Colombier if(r < 0) 7857dd7cddfSDavid du Colombier return nil; 7869a747e4fSDavid du Colombier if(r > 128 || r == '<' || r == '>'){ 7877dd7cddfSDavid du Colombier for(e = entity; e->name; e++) 7887dd7cddfSDavid du Colombier if(e->value == r) 7897dd7cddfSDavid du Colombier return e->name; 7906b6b9ac8SDavid du Colombier sprint(buf, "&#%d;", r); 7916b6b9ac8SDavid du Colombier return buf; 7927dd7cddfSDavid du Colombier } 7937dd7cddfSDavid du Colombier 7946b6b9ac8SDavid du Colombier if (r == delim[eqnmode]){ 7956b6b9ac8SDavid du Colombier if (eqnmode == 0){ 7966b6b9ac8SDavid du Colombier eqnmode = 1; 7976b6b9ac8SDavid du Colombier return changefont(&ifont); 7986b6b9ac8SDavid du Colombier } 7996b6b9ac8SDavid du Colombier eqnmode = 0; 800*da51d93aSDavid du Colombier return changebackfont(); 8016b6b9ac8SDavid du Colombier } 8027dd7cddfSDavid du Colombier switch(r){ 8037dd7cddfSDavid du Colombier case '\\': 8047dd7cddfSDavid du Colombier r = getrune(); 8057dd7cddfSDavid du Colombier if(r < 0) 8067dd7cddfSDavid du Colombier return nil; 8077dd7cddfSDavid du Colombier switch(r){ 8087dd7cddfSDavid du Colombier case ' ': 8097dd7cddfSDavid du Colombier return " "; 8107dd7cddfSDavid du Colombier 8117dd7cddfSDavid du Colombier /* chars to ignore */ 8127dd7cddfSDavid du Colombier case '&': 8137dd7cddfSDavid du Colombier case '|': 8147dd7cddfSDavid du Colombier case '%': 8157dd7cddfSDavid du Colombier return ""; 8167dd7cddfSDavid du Colombier 8177dd7cddfSDavid du Colombier /* small space in troff, nothing in nroff */ 8187dd7cddfSDavid du Colombier case '^': 8197dd7cddfSDavid du Colombier return getnext(); 8207dd7cddfSDavid du Colombier 8217dd7cddfSDavid du Colombier /* ignore arg */ 8227dd7cddfSDavid du Colombier case 'k': 8237dd7cddfSDavid du Colombier getrune(); 8247dd7cddfSDavid du Colombier return getnext(); 8257dd7cddfSDavid du Colombier 8267dd7cddfSDavid du Colombier /* comment */ 8277dd7cddfSDavid du Colombier case '"': 8287dd7cddfSDavid du Colombier while(getrune() != '\n') 8297dd7cddfSDavid du Colombier ; 8307dd7cddfSDavid du Colombier return "\n"; 8317dd7cddfSDavid du Colombier /* ignore line */ 8327dd7cddfSDavid du Colombier case '!': 8337dd7cddfSDavid du Colombier while(getrune() != '\n') 8347dd7cddfSDavid du Colombier ; 8357dd7cddfSDavid du Colombier ungetrune(); 8367dd7cddfSDavid du Colombier return getnext(); 8377dd7cddfSDavid du Colombier 8387dd7cddfSDavid du Colombier /* defined strings */ 8397dd7cddfSDavid du Colombier case '*': 8407dd7cddfSDavid du Colombier r = getrune(); 8417dd7cddfSDavid du Colombier if(r == '('){ 8427dd7cddfSDavid du Colombier str[0] = getrune(); 8437dd7cddfSDavid du Colombier str[1] = getrune(); 8447dd7cddfSDavid du Colombier str[2] = 0; 8457dd7cddfSDavid du Colombier } else { 8467dd7cddfSDavid du Colombier str[0] = r; 8477dd7cddfSDavid du Colombier str[1] = 0; 8487dd7cddfSDavid du Colombier } 8497dd7cddfSDavid du Colombier pushstr(getds(str)); 8507dd7cddfSDavid du Colombier return getnext(); 8517dd7cddfSDavid du Colombier 8527dd7cddfSDavid du Colombier /* macro args */ 8537dd7cddfSDavid du Colombier case '$': 8547dd7cddfSDavid du Colombier r = getrune(); 8557dd7cddfSDavid du Colombier if(r < '1' || r > '9'){ 8567dd7cddfSDavid du Colombier token[0] = '\\'; 8577dd7cddfSDavid du Colombier token[1] = '$'; 8587dd7cddfSDavid du Colombier token[2] = r; 8597dd7cddfSDavid du Colombier token[3] = 0; 8607dd7cddfSDavid du Colombier return token; 8617dd7cddfSDavid du Colombier } 8627dd7cddfSDavid du Colombier r -= '0'; 8637dd7cddfSDavid du Colombier if(msp >= 0) 8647dd7cddfSDavid du Colombier pushstr(mstack[msp].argv[r]); 8657dd7cddfSDavid du Colombier return getnext(); 8667dd7cddfSDavid du Colombier 8677dd7cddfSDavid du Colombier /* special chars */ 8687dd7cddfSDavid du Colombier case '(': 8697dd7cddfSDavid du Colombier token[0] = getrune(); 8707dd7cddfSDavid du Colombier token[1] = getrune(); 8717dd7cddfSDavid du Colombier token[2] = 0; 8727dd7cddfSDavid du Colombier for(t = tspec; t->name; t++) 8737dd7cddfSDavid du Colombier if(strcmp(token, t->name) == 0) 8747dd7cddfSDavid du Colombier return t->value; 8757dd7cddfSDavid du Colombier return "¿"; 8767dd7cddfSDavid du Colombier 8777dd7cddfSDavid du Colombier /* ignore immediately following newline */ 8787dd7cddfSDavid du Colombier case 'c': 8797dd7cddfSDavid du Colombier r = getrune(); 8807dd7cddfSDavid du Colombier if (r == '\n') { 8817dd7cddfSDavid du Colombier sol = ignore_nl = 1; 8827dd7cddfSDavid du Colombier if (indirective) 8837dd7cddfSDavid du Colombier break; 8847dd7cddfSDavid du Colombier } 8857dd7cddfSDavid du Colombier else 8867dd7cddfSDavid du Colombier ungetrune(); 8877dd7cddfSDavid du Colombier return getnext(); 8887dd7cddfSDavid du Colombier 8897dd7cddfSDavid du Colombier /* escape backslash */ 8907dd7cddfSDavid du Colombier case 'e': 8917dd7cddfSDavid du Colombier return "\\"; 8927dd7cddfSDavid du Colombier break; 8937dd7cddfSDavid du Colombier 8947dd7cddfSDavid du Colombier /* font change */ 8957dd7cddfSDavid du Colombier case 'f': 8967dd7cddfSDavid du Colombier r = getrune(); 8977dd7cddfSDavid du Colombier switch(r){ 8987dd7cddfSDavid du Colombier case '(': 8997dd7cddfSDavid du Colombier str[0] = getrune(); 9007dd7cddfSDavid du Colombier str[1] = getrune(); 9017dd7cddfSDavid du Colombier str[2] = 0; 9027dd7cddfSDavid du Colombier token[0] = 0; 9037dd7cddfSDavid du Colombier if(strcmp("BI", str) == 0) 9047dd7cddfSDavid du Colombier return changefont(&bifont); 9057dd7cddfSDavid du Colombier else if(strcmp("CW", str) == 0) 9067dd7cddfSDavid du Colombier return changefont(&cwfont); 9077dd7cddfSDavid du Colombier else 9087dd7cddfSDavid du Colombier return changefont(nil); 9097dd7cddfSDavid du Colombier case '3': 9107dd7cddfSDavid du Colombier case 'B': 9117dd7cddfSDavid du Colombier return changefont(&bfont); 9127dd7cddfSDavid du Colombier case '2': 9137dd7cddfSDavid du Colombier case 'I': 9147dd7cddfSDavid du Colombier return changefont(&ifont); 9157dd7cddfSDavid du Colombier case '4': 9167dd7cddfSDavid du Colombier return changefont(&bifont); 9177dd7cddfSDavid du Colombier case '5': 9187dd7cddfSDavid du Colombier return changefont(&cwfont); 9197dd7cddfSDavid du Colombier case 'P': 920*da51d93aSDavid du Colombier return changebackfont(); 9217dd7cddfSDavid du Colombier case 'R': 9227dd7cddfSDavid du Colombier default: 9237dd7cddfSDavid du Colombier return changefont(nil); 9247dd7cddfSDavid du Colombier } 9257dd7cddfSDavid du Colombier 9267dd7cddfSDavid du Colombier /* number register */ 9277dd7cddfSDavid du Colombier case 'n': 9287dd7cddfSDavid du Colombier r = getrune(); 9297dd7cddfSDavid du Colombier if (r == '(') /*)*/ { 9307dd7cddfSDavid du Colombier r = getrune(); 9317dd7cddfSDavid du Colombier if (r < 0) 9327dd7cddfSDavid du Colombier return nil; 9337dd7cddfSDavid du Colombier str[0] = r; 9347dd7cddfSDavid du Colombier r = getrune(); 9357dd7cddfSDavid du Colombier if (r < 0) 9367dd7cddfSDavid du Colombier return nil; 9377dd7cddfSDavid du Colombier str[1] = r; 9387dd7cddfSDavid du Colombier str[2] = 0; 9397dd7cddfSDavid du Colombier } 9407dd7cddfSDavid du Colombier else { 9417dd7cddfSDavid du Colombier str[0] = r; 9427dd7cddfSDavid du Colombier str[1] = 0; 9437dd7cddfSDavid du Colombier } 9447dd7cddfSDavid du Colombier pushstr(getnr(str)); 9457dd7cddfSDavid du Colombier return getnext(); 9467dd7cddfSDavid du Colombier 9477dd7cddfSDavid du Colombier /* font size */ 9487dd7cddfSDavid du Colombier case 's': 9496b6b9ac8SDavid du Colombier r = getrune(); 9506b6b9ac8SDavid du Colombier switch(r){ 9516b6b9ac8SDavid du Colombier case '0': 9526b6b9ac8SDavid du Colombier return changesize(0); 9536b6b9ac8SDavid du Colombier case '-': 9546b6b9ac8SDavid du Colombier r = getrune(); 9556b6b9ac8SDavid du Colombier if (!isdigit(r)) 9567dd7cddfSDavid du Colombier return getnext(); 9576b6b9ac8SDavid du Colombier return changesize(-(r - '0')); 9586b6b9ac8SDavid du Colombier case '+': 9596b6b9ac8SDavid du Colombier r = getrune(); 9606b6b9ac8SDavid du Colombier if (!isdigit(r)) 9616b6b9ac8SDavid du Colombier return getnext(); 9626b6b9ac8SDavid du Colombier return changesize(r - '0'); 9636b6b9ac8SDavid du Colombier } 9646b6b9ac8SDavid du Colombier return getnext(); 9657dd7cddfSDavid du Colombier /* vertical movement */ 9667dd7cddfSDavid du Colombier case 'v': 9677dd7cddfSDavid du Colombier r = getrune(); 9687dd7cddfSDavid du Colombier if(r != '\''){ 9697dd7cddfSDavid du Colombier ungetrune(); 9707dd7cddfSDavid du Colombier return getnext(); 9717dd7cddfSDavid du Colombier } 9727dd7cddfSDavid du Colombier r = getrune(); 9737dd7cddfSDavid du Colombier if(r != '-') 9747dd7cddfSDavid du Colombier vert--; 9757dd7cddfSDavid du Colombier else 9767dd7cddfSDavid du Colombier vert++; 9777dd7cddfSDavid du Colombier while(r != '\'' && r != '\n') 9787dd7cddfSDavid du Colombier r = getrune(); 9797dd7cddfSDavid du Colombier if(r != '\'') 9807dd7cddfSDavid du Colombier ungetrune(); 9817dd7cddfSDavid du Colombier 9827dd7cddfSDavid du Colombier if(vert > 0) 9837dd7cddfSDavid du Colombier return "^"; 9847dd7cddfSDavid du Colombier return getnext(); 9857dd7cddfSDavid du Colombier 9867dd7cddfSDavid du Colombier 9877dd7cddfSDavid du Colombier /* horizontal line */ 9887dd7cddfSDavid du Colombier case 'l': 9897dd7cddfSDavid du Colombier r = getrune(); 9907dd7cddfSDavid du Colombier if(r != '\''){ 9917dd7cddfSDavid du Colombier ungetrune(); 9927dd7cddfSDavid du Colombier return "<HR>"; 9937dd7cddfSDavid du Colombier } 9947dd7cddfSDavid du Colombier while(getrune() != '\'') 9957dd7cddfSDavid du Colombier ; 9967dd7cddfSDavid du Colombier return "<HR>"; 9977dd7cddfSDavid du Colombier 9987dd7cddfSDavid du Colombier /* character height and slant */ 9997dd7cddfSDavid du Colombier case 'S': 10007dd7cddfSDavid du Colombier case 'H': 10017dd7cddfSDavid du Colombier r = getrune(); 10027dd7cddfSDavid du Colombier if(r != '\''){ 10037dd7cddfSDavid du Colombier ungetrune(); 10047dd7cddfSDavid du Colombier return "<HR>"; 10057dd7cddfSDavid du Colombier } 10067dd7cddfSDavid du Colombier while(getrune() != '\'') 10077dd7cddfSDavid du Colombier ; 10087dd7cddfSDavid du Colombier return getnext(); 10097dd7cddfSDavid du Colombier 10107dd7cddfSDavid du Colombier /* digit-width space */ 10117dd7cddfSDavid du Colombier case '0': 10127dd7cddfSDavid du Colombier return " "; 10137dd7cddfSDavid du Colombier 10147dd7cddfSDavid du Colombier /*for .if, .ie, .el */ 10157dd7cddfSDavid du Colombier case '{': 10167dd7cddfSDavid du Colombier return "\\{"; /*}*/ 10177dd7cddfSDavid du Colombier case '}': 10187dd7cddfSDavid du Colombier return ""; 10197dd7cddfSDavid du Colombier /* up and down */ 10207dd7cddfSDavid du Colombier case 'u': 10217dd7cddfSDavid du Colombier if (isdown) { 10227dd7cddfSDavid du Colombier isdown = 0; 10237dd7cddfSDavid du Colombier return "</sub>"; 10247dd7cddfSDavid du Colombier } 10257dd7cddfSDavid du Colombier isup = 1; 10267dd7cddfSDavid du Colombier return "<sup>"; 10277dd7cddfSDavid du Colombier case 'd': 10287dd7cddfSDavid du Colombier if (isup) { 10297dd7cddfSDavid du Colombier isup = 0; 10307dd7cddfSDavid du Colombier return "</sup>"; 10317dd7cddfSDavid du Colombier } 10327dd7cddfSDavid du Colombier isdown = 1; 10337dd7cddfSDavid du Colombier return "<sub>"; 10347dd7cddfSDavid du Colombier } 10357dd7cddfSDavid du Colombier break; 10367dd7cddfSDavid du Colombier case '&': 10377dd7cddfSDavid du Colombier if(msp >= 0 || strsp >= 0) 10387dd7cddfSDavid du Colombier return "&"; 10397dd7cddfSDavid du Colombier return "&"; 10407dd7cddfSDavid du Colombier case '<': 10417dd7cddfSDavid du Colombier if(msp >= 0 || strsp >= 0) 10427dd7cddfSDavid du Colombier return "<"; 10437dd7cddfSDavid du Colombier return "<"; 10447dd7cddfSDavid du Colombier case '>': 10457dd7cddfSDavid du Colombier if(msp >= 0 || strsp >= 0) 10467dd7cddfSDavid du Colombier return ">"; 10477dd7cddfSDavid du Colombier return ">"; 10487dd7cddfSDavid du Colombier } 10497dd7cddfSDavid du Colombier if (r < Runeself) { 10507dd7cddfSDavid du Colombier token[0] = r; 10517dd7cddfSDavid du Colombier token[1] = 0; 10527dd7cddfSDavid du Colombier } 10537dd7cddfSDavid du Colombier else { 10547dd7cddfSDavid du Colombier R = r; 10557dd7cddfSDavid du Colombier token[runetochar(token,&R)] = 0; 10567dd7cddfSDavid du Colombier } 10577dd7cddfSDavid du Colombier return token; 10587dd7cddfSDavid du Colombier } 10597dd7cddfSDavid du Colombier 1060*da51d93aSDavid du Colombier /* if arg0 is set, read up to (and expand) to the next whitespace, else to the end of line */ 10617dd7cddfSDavid du Colombier char* 10627dd7cddfSDavid du Colombier copyline(char *p, char *e, int arg0) 10637dd7cddfSDavid du Colombier { 10647dd7cddfSDavid du Colombier int c; 10657dd7cddfSDavid du Colombier Rune r; 10667dd7cddfSDavid du Colombier char *p1; 10677dd7cddfSDavid du Colombier 10687dd7cddfSDavid du Colombier while((c = getrune()) == ' ' || c == '\t') 10697dd7cddfSDavid du Colombier ; 10707dd7cddfSDavid du Colombier for(indirective = 1; p < e; c = getrune()) { 10717dd7cddfSDavid du Colombier if (c < 0) 10727dd7cddfSDavid du Colombier goto done; 10737dd7cddfSDavid du Colombier switch(c) { 10747dd7cddfSDavid du Colombier case '\\': 10757dd7cddfSDavid du Colombier break; 10767dd7cddfSDavid du Colombier case '\n': 10777dd7cddfSDavid du Colombier if (arg0) 10787dd7cddfSDavid du Colombier ungetrune(); 10797dd7cddfSDavid du Colombier goto done; 10807dd7cddfSDavid du Colombier case ' ': 10817dd7cddfSDavid du Colombier case '\t': 10827dd7cddfSDavid du Colombier if (arg0) 10837dd7cddfSDavid du Colombier goto done; 10847dd7cddfSDavid du Colombier default: 10857dd7cddfSDavid du Colombier r = c; 10867dd7cddfSDavid du Colombier p += runetochar(p,&r); 10877dd7cddfSDavid du Colombier continue; 10887dd7cddfSDavid du Colombier } 10897dd7cddfSDavid du Colombier ungetrune(); 10907dd7cddfSDavid du Colombier p1 = getnext(); 10917dd7cddfSDavid du Colombier if (p1 == nil) 10927dd7cddfSDavid du Colombier goto done; 10937dd7cddfSDavid du Colombier if (*p1 == '\n') { 10947dd7cddfSDavid du Colombier if (arg0) 10957dd7cddfSDavid du Colombier ungetrune(); 10967dd7cddfSDavid du Colombier break; 10977dd7cddfSDavid du Colombier } 10987dd7cddfSDavid du Colombier while((*p = *p1++) && p < e) 10997dd7cddfSDavid du Colombier p++; 11007dd7cddfSDavid du Colombier } 11017dd7cddfSDavid du Colombier done: 11027dd7cddfSDavid du Colombier indirective = 0; 11037dd7cddfSDavid du Colombier *p++ = 0; 11047dd7cddfSDavid du Colombier return p; 11057dd7cddfSDavid du Colombier } 11067dd7cddfSDavid du Colombier 11077dd7cddfSDavid du Colombier char* 11087dd7cddfSDavid du Colombier copyarg(char *p, char *e, int *nullarg) 11097dd7cddfSDavid du Colombier { 1110*da51d93aSDavid du Colombier int c, quoted, last; 11117dd7cddfSDavid du Colombier Rune r; 11127dd7cddfSDavid du Colombier 11137dd7cddfSDavid du Colombier *nullarg = 0; 11147dd7cddfSDavid du Colombier quoted = 0; 11157dd7cddfSDavid du Colombier do{ 11167dd7cddfSDavid du Colombier c = getrune(); 11177dd7cddfSDavid du Colombier } while(c == ' ' || c == '\t'); 11187dd7cddfSDavid du Colombier 11197dd7cddfSDavid du Colombier if(c == '"'){ 11207dd7cddfSDavid du Colombier quoted = 1; 11217dd7cddfSDavid du Colombier *nullarg = 1; 11227dd7cddfSDavid du Colombier c = getrune(); 11237dd7cddfSDavid du Colombier } 11247dd7cddfSDavid du Colombier 11257dd7cddfSDavid du Colombier if(c == '\n') 11267dd7cddfSDavid du Colombier goto done; 11277dd7cddfSDavid du Colombier 1128*da51d93aSDavid du Colombier last = 0; 11297dd7cddfSDavid du Colombier for(; p < e; c = getrune()) { 11307dd7cddfSDavid du Colombier if (c < 0) 11317dd7cddfSDavid du Colombier break; 11327dd7cddfSDavid du Colombier switch(c) { 11337dd7cddfSDavid du Colombier case '\n': 11347dd7cddfSDavid du Colombier ungetrune(); 11357dd7cddfSDavid du Colombier goto done; 1136*da51d93aSDavid du Colombier case '\\': 1137*da51d93aSDavid du Colombier r = c; 1138*da51d93aSDavid du Colombier p += runetochar(p,&r); 1139*da51d93aSDavid du Colombier if(last == '\\') 1140*da51d93aSDavid du Colombier r = 0; 1141*da51d93aSDavid du Colombier break; 11427dd7cddfSDavid du Colombier case ' ': 11437dd7cddfSDavid du Colombier case '\t': 1144*da51d93aSDavid du Colombier if(!quoted && last != '\\') 11457dd7cddfSDavid du Colombier goto done; 11467dd7cddfSDavid du Colombier r = c; 11477dd7cddfSDavid du Colombier p += runetochar(p,&r); 1148*da51d93aSDavid du Colombier break; 11497dd7cddfSDavid du Colombier case '"': 1150*da51d93aSDavid du Colombier if(quoted && last != '\\') 11517dd7cddfSDavid du Colombier goto done; 11527dd7cddfSDavid du Colombier r = c; 11537dd7cddfSDavid du Colombier p += runetochar(p,&r); 1154*da51d93aSDavid du Colombier break; 11557dd7cddfSDavid du Colombier default: 11567dd7cddfSDavid du Colombier r = c; 11577dd7cddfSDavid du Colombier p += runetochar(p,&r); 1158*da51d93aSDavid du Colombier break; 11597dd7cddfSDavid du Colombier } 1160*da51d93aSDavid du Colombier last = r; 11617dd7cddfSDavid du Colombier } 11627dd7cddfSDavid du Colombier done: 11637dd7cddfSDavid du Colombier *p++ = 0; 11647dd7cddfSDavid du Colombier return p; 11657dd7cddfSDavid du Colombier 11667dd7cddfSDavid du Colombier } 11677dd7cddfSDavid du Colombier 11687dd7cddfSDavid du Colombier int 11697dd7cddfSDavid du Colombier parseargs(char *p, char *e, char **argv) 11707dd7cddfSDavid du Colombier { 11717dd7cddfSDavid du Colombier int argc; 11727dd7cddfSDavid du Colombier char *np; 11737dd7cddfSDavid du Colombier int nullarg; 11747dd7cddfSDavid du Colombier 11757dd7cddfSDavid du Colombier indirective = 1; 11767dd7cddfSDavid du Colombier *p++ = 0; 11777dd7cddfSDavid du Colombier for(argc = 1; argc < Narg; argc++){ 11787dd7cddfSDavid du Colombier np = copyarg(p, e, &nullarg); 11797dd7cddfSDavid du Colombier if(nullarg==0 && np == p+1) 11807dd7cddfSDavid du Colombier break; 11817dd7cddfSDavid du Colombier argv[argc] = p; 11827dd7cddfSDavid du Colombier p = np; 11837dd7cddfSDavid du Colombier } 11847dd7cddfSDavid du Colombier argv[argc] = nil; 11857dd7cddfSDavid du Colombier indirective = 0; 11867dd7cddfSDavid du Colombier 11877dd7cddfSDavid du Colombier 11887dd7cddfSDavid du Colombier return argc; 11897dd7cddfSDavid du Colombier } 11907dd7cddfSDavid du Colombier 11917dd7cddfSDavid du Colombier void 11927dd7cddfSDavid du Colombier dodirective(void) 11937dd7cddfSDavid du Colombier { 11947dd7cddfSDavid du Colombier char *p, *e; 11957dd7cddfSDavid du Colombier Goobie *g; 11967dd7cddfSDavid du Colombier Goobieif *gif; 11977dd7cddfSDavid du Colombier char line[Nline], *line1; 11987dd7cddfSDavid du Colombier int i, argc; 11997dd7cddfSDavid du Colombier char *argv[Narg]; 12007dd7cddfSDavid du Colombier Mstack *m; 12017dd7cddfSDavid du Colombier 12027dd7cddfSDavid du Colombier /* read line, translate special bytes */ 12037dd7cddfSDavid du Colombier e = line + sizeof(line) - UTFmax - 1; 12047dd7cddfSDavid du Colombier line1 = copyline(line, e, 1); 12057dd7cddfSDavid du Colombier if (!line[0]) 12067dd7cddfSDavid du Colombier return; 12077dd7cddfSDavid du Colombier argv[0] = line; 12087dd7cddfSDavid du Colombier 12097dd7cddfSDavid du Colombier /* first look through user defined macros */ 12107dd7cddfSDavid du Colombier p = getmacro(argv[0]); 12117dd7cddfSDavid du Colombier if(p != nil){ 12127dd7cddfSDavid du Colombier if(msp == Maxmstack-1){ 12137dd7cddfSDavid du Colombier fprint(2, "ms2html: macro stack overflow\n"); 12147dd7cddfSDavid du Colombier return; 12157dd7cddfSDavid du Colombier } 12167dd7cddfSDavid du Colombier argc = parseargs(line1, e, argv); 12177dd7cddfSDavid du Colombier m = &mstack[++msp]; 12187dd7cddfSDavid du Colombier m->ptr = p; 12197dd7cddfSDavid du Colombier memset(m->argv, 0, sizeof(m->argv)); 12207dd7cddfSDavid du Colombier for(i = 0; i < argc; i++) 12217dd7cddfSDavid du Colombier m->argv[i] = strdup(argv[i]); 12227dd7cddfSDavid du Colombier return; 12237dd7cddfSDavid du Colombier } 12247dd7cddfSDavid du Colombier 12257dd7cddfSDavid du Colombier /* check for .if or .ie */ 12267dd7cddfSDavid du Colombier for(gif = gtabif; gif->name; gif++) 12277dd7cddfSDavid du Colombier if(strcmp(gif->name, argv[0]) == 0){ 12287dd7cddfSDavid du Colombier (*gif->f)(line1, e); 12297dd7cddfSDavid du Colombier return; 12307dd7cddfSDavid du Colombier } 12317dd7cddfSDavid du Colombier 12327dd7cddfSDavid du Colombier argc = parseargs(line1, e, argv); 12337dd7cddfSDavid du Colombier 12347dd7cddfSDavid du Colombier /* try standard ms macros */ 12357dd7cddfSDavid du Colombier for(g = gtab; g->name; g++) 12367dd7cddfSDavid du Colombier if(strcmp(g->name, argv[0]) == 0){ 12377dd7cddfSDavid du Colombier (*g->f)(argc, argv); 12387dd7cddfSDavid du Colombier return; 12397dd7cddfSDavid du Colombier } 12407dd7cddfSDavid du Colombier 12417dd7cddfSDavid du Colombier if(debug) 12427dd7cddfSDavid du Colombier fprint(2, "stdin %d(%s:%d): unknown directive %s\n", 12437dd7cddfSDavid du Colombier ssp->lno, ssp->filename, ssp->rlno, line); 12447dd7cddfSDavid du Colombier } 12457dd7cddfSDavid du Colombier 12467dd7cddfSDavid du Colombier void 12477dd7cddfSDavid du Colombier printarg(char *a) 12487dd7cddfSDavid du Colombier { 12497dd7cddfSDavid du Colombier char *e, *p; 12507dd7cddfSDavid du Colombier 12517dd7cddfSDavid du Colombier e = a + strlen(a); 12527dd7cddfSDavid du Colombier pushstr(a); 12537dd7cddfSDavid du Colombier while(strsp >= 0 && strstack[strsp] >= a && strstack[strsp] < e){ 12547dd7cddfSDavid du Colombier p = getnext(); 12557dd7cddfSDavid du Colombier if(p == nil) 12567dd7cddfSDavid du Colombier return; 12577dd7cddfSDavid du Colombier Bprint(&bout, "%s", p); 12587dd7cddfSDavid du Colombier } 12597dd7cddfSDavid du Colombier } 12607dd7cddfSDavid du Colombier 12617dd7cddfSDavid du Colombier void 12627dd7cddfSDavid du Colombier printargs(int argc, char **argv) 12637dd7cddfSDavid du Colombier { 12647dd7cddfSDavid du Colombier argc--; 12657dd7cddfSDavid du Colombier argv++; 12667dd7cddfSDavid du Colombier while(--argc > 0){ 12677dd7cddfSDavid du Colombier printarg(*argv++); 12687dd7cddfSDavid du Colombier Bprint(&bout, " "); 12697dd7cddfSDavid du Colombier } 12707dd7cddfSDavid du Colombier if(argc == 0) 12717dd7cddfSDavid du Colombier printarg(*argv); 12727dd7cddfSDavid du Colombier } 12737dd7cddfSDavid du Colombier 12747dd7cddfSDavid du Colombier void 12757dd7cddfSDavid du Colombier dohangingdt(void) 12767dd7cddfSDavid du Colombier { 12777dd7cddfSDavid du Colombier switch(hangingdt){ 12787dd7cddfSDavid du Colombier case 3: 12797dd7cddfSDavid du Colombier hangingdt--; 12807dd7cddfSDavid du Colombier break; 12817dd7cddfSDavid du Colombier case 2: 12827dd7cddfSDavid du Colombier Bprint(&bout, "<dd>"); 12837dd7cddfSDavid du Colombier hangingdt = 0; 12847dd7cddfSDavid du Colombier break; 12857dd7cddfSDavid du Colombier } 12867dd7cddfSDavid du Colombier 12877dd7cddfSDavid du Colombier } 12887dd7cddfSDavid du Colombier 12897dd7cddfSDavid du Colombier void 12907dd7cddfSDavid du Colombier dohangingau(void) 12917dd7cddfSDavid du Colombier { 12927dd7cddfSDavid du Colombier if(hangingau == 0) 12937dd7cddfSDavid du Colombier return; 12947dd7cddfSDavid du Colombier Bprint(&bout, "</I></DL>\n"); 12957dd7cddfSDavid du Colombier hangingau = 0; 12967dd7cddfSDavid du Colombier } 12977dd7cddfSDavid du Colombier 12987dd7cddfSDavid du Colombier void 12997dd7cddfSDavid du Colombier dohanginghead(void) 13007dd7cddfSDavid du Colombier { 13017dd7cddfSDavid du Colombier if(hanginghead == 0) 13027dd7cddfSDavid du Colombier return; 13037dd7cddfSDavid du Colombier Bprint(&bout, "</H%d>\n", hanginghead); 13047dd7cddfSDavid du Colombier hanginghead = 0; 13057dd7cddfSDavid du Colombier } 13067dd7cddfSDavid du Colombier 13077dd7cddfSDavid du Colombier /* 13087dd7cddfSDavid du Colombier * convert a man page to html and output 13097dd7cddfSDavid du Colombier */ 13107dd7cddfSDavid du Colombier void 13117dd7cddfSDavid du Colombier doconvert(void) 13127dd7cddfSDavid du Colombier { 13137dd7cddfSDavid du Colombier char c, *p; 13147dd7cddfSDavid du Colombier Tm *t; 13157dd7cddfSDavid du Colombier 13167dd7cddfSDavid du Colombier pushsrc(nil); 13177dd7cddfSDavid du Colombier 13187dd7cddfSDavid du Colombier sol = 1; 13197dd7cddfSDavid du Colombier Bprint(&bout, "<html>\n"); 13207dd7cddfSDavid du Colombier Bflush(&bout); 13217dd7cddfSDavid du Colombier for(;;){ 13227dd7cddfSDavid du Colombier p = getnext(); 13237dd7cddfSDavid du Colombier if(p == nil) 13247dd7cddfSDavid du Colombier break; 13257dd7cddfSDavid du Colombier c = *p; 13267dd7cddfSDavid du Colombier if(c == '.' && sol){ 13277dd7cddfSDavid du Colombier dodirective(); 13287dd7cddfSDavid du Colombier dohangingdt(); 13297dd7cddfSDavid du Colombier ssp->lno++; 13307dd7cddfSDavid du Colombier ssp->rlno++; 13317dd7cddfSDavid du Colombier sol = 1; 13327dd7cddfSDavid du Colombier } else if(c == '\n'){ 13337dd7cddfSDavid du Colombier if (ignore_nl) 13347dd7cddfSDavid du Colombier ignore_nl = 0; 13357dd7cddfSDavid du Colombier else { 13367dd7cddfSDavid du Colombier if(hangingau) 13377dd7cddfSDavid du Colombier Bprint(&bout, "<br>\n"); 13387dd7cddfSDavid du Colombier else 13397dd7cddfSDavid du Colombier Bprint(&bout, "%s", p); 13407dd7cddfSDavid du Colombier dohangingdt(); 13417dd7cddfSDavid du Colombier } 13427dd7cddfSDavid du Colombier ssp->lno++; 13437dd7cddfSDavid du Colombier ssp->rlno++; 13447dd7cddfSDavid du Colombier sol = 1; 13457dd7cddfSDavid du Colombier } else{ 13467dd7cddfSDavid du Colombier Bprint(&bout, "%s", p); 13477dd7cddfSDavid du Colombier ignore_nl = sol = 0; 13487dd7cddfSDavid du Colombier } 13497dd7cddfSDavid du Colombier } 13507dd7cddfSDavid du Colombier dohanginghead(); 13517dd7cddfSDavid du Colombier dohangingdt(); 13527dd7cddfSDavid du Colombier closel(); 1353*da51d93aSDavid du Colombier if(fsp >= 0 && fstack[fsp]) 1354*da51d93aSDavid du Colombier Bprint(&bout, "%s", fstack[fsp]->end); 13557dd7cddfSDavid du Colombier Bprint(&bout, "<br> <br>\n"); 13567dd7cddfSDavid du Colombier Bprint(&bout, "<A href=http://www.lucent.com/copyright.html>\n"); 13577dd7cddfSDavid du Colombier t = localtime(time(nil)); 13587dd7cddfSDavid du Colombier Bprint(&bout, "Copyright</A> © %d Lucent Technologies Inc. All rights reserved.\n", 13597dd7cddfSDavid du Colombier t->year+1900); 13607dd7cddfSDavid du Colombier Bprint(&bout, "</body></html>\n"); 13617dd7cddfSDavid du Colombier } 13627dd7cddfSDavid du Colombier 13636b6b9ac8SDavid du Colombier static void 13646b6b9ac8SDavid du Colombier usage(void) 13656b6b9ac8SDavid du Colombier { 13666b6b9ac8SDavid du Colombier sysfatal("Usage: %s\n", argv0); 13676b6b9ac8SDavid du Colombier } 13686b6b9ac8SDavid du Colombier 13697dd7cddfSDavid du Colombier void 13707dd7cddfSDavid du Colombier main(int argc, char **argv) 13717dd7cddfSDavid du Colombier { 13727dd7cddfSDavid du Colombier quiet = 1; 13736b6b9ac8SDavid du Colombier ARGBEGIN { 13746b6b9ac8SDavid du Colombier case 'q': 13757dd7cddfSDavid du Colombier quiet = 0; 13766b6b9ac8SDavid du Colombier break; 13776b6b9ac8SDavid du Colombier case 'd': 13786b6b9ac8SDavid du Colombier delim = EARGF(usage()); 13796b6b9ac8SDavid du Colombier break; 13806b6b9ac8SDavid du Colombier case '?': 13816b6b9ac8SDavid du Colombier default: 13826b6b9ac8SDavid du Colombier usage(); 13836b6b9ac8SDavid du Colombier } ARGEND; 13847dd7cddfSDavid du Colombier 13857dd7cddfSDavid du Colombier Binit(&bout, 1, OWRITE); 13867dd7cddfSDavid du Colombier 13877dd7cddfSDavid du Colombier ds("R", "®"); 13887dd7cddfSDavid du Colombier 13897dd7cddfSDavid du Colombier doconvert(); 13907dd7cddfSDavid du Colombier exits(nil); 13917dd7cddfSDavid du Colombier } 13927dd7cddfSDavid du Colombier 13937dd7cddfSDavid du Colombier void 13947dd7cddfSDavid du Colombier g_notyet(int, char **argv) 13957dd7cddfSDavid du Colombier { 13967dd7cddfSDavid du Colombier fprint(2, "ms2html: .%s not yet supported\n", argv[0]); 13977dd7cddfSDavid du Colombier } 13987dd7cddfSDavid du Colombier 13997dd7cddfSDavid du Colombier void 14007dd7cddfSDavid du Colombier g_ignore(int, char **argv) 14017dd7cddfSDavid du Colombier { 14027dd7cddfSDavid du Colombier if(quiet) 14037dd7cddfSDavid du Colombier return; 14047dd7cddfSDavid du Colombier fprint(2, "ms2html: line %d: ignoring .%s\n", ssp->lno, argv[0]); 14057dd7cddfSDavid du Colombier } 14067dd7cddfSDavid du Colombier 14077dd7cddfSDavid du Colombier void 14087dd7cddfSDavid du Colombier g_PP(int, char**) 14097dd7cddfSDavid du Colombier { 14107dd7cddfSDavid du Colombier dohanginghead(); 14117dd7cddfSDavid du Colombier closel(); 14127dd7cddfSDavid du Colombier closefont(); 14137dd7cddfSDavid du Colombier Bprint(&bout, "<P>\n"); 14147dd7cddfSDavid du Colombier paragraph = 1; 14157dd7cddfSDavid du Colombier } 14167dd7cddfSDavid du Colombier 14177dd7cddfSDavid du Colombier void 14187dd7cddfSDavid du Colombier g_LP(int, char**) 14197dd7cddfSDavid du Colombier { 14207dd7cddfSDavid du Colombier dohanginghead(); 14217dd7cddfSDavid du Colombier closel(); 14227dd7cddfSDavid du Colombier closefont(); 14237dd7cddfSDavid du Colombier Bprint(&bout, "<br> <br>\n"); 14247dd7cddfSDavid du Colombier } 14257dd7cddfSDavid du Colombier 14267dd7cddfSDavid du Colombier /* close a list */ 14277dd7cddfSDavid du Colombier void 14287dd7cddfSDavid du Colombier closel(void) 14297dd7cddfSDavid du Colombier { 14307dd7cddfSDavid du Colombier g_P2(1, nil); 14317dd7cddfSDavid du Colombier dohangingau(); 14327dd7cddfSDavid du Colombier if(paragraph){ 14337dd7cddfSDavid du Colombier Bprint(&bout, "</P>\n"); 14347dd7cddfSDavid du Colombier paragraph = 0; 14357dd7cddfSDavid du Colombier } 14367dd7cddfSDavid du Colombier switch(list){ 14377dd7cddfSDavid du Colombier case Lordered: 14387dd7cddfSDavid du Colombier Bprint(&bout, "</ol>\n"); 14397dd7cddfSDavid du Colombier break; 14407dd7cddfSDavid du Colombier case Lunordered: 14417dd7cddfSDavid du Colombier Bprint(&bout, "</ul>\n"); 14427dd7cddfSDavid du Colombier break; 14437dd7cddfSDavid du Colombier case Lother: 14447dd7cddfSDavid du Colombier case Ldef: 14457dd7cddfSDavid du Colombier Bprint(&bout, "</dl>\n"); 14467dd7cddfSDavid du Colombier break; 14477dd7cddfSDavid du Colombier } 14487dd7cddfSDavid du Colombier list = 0; 14497dd7cddfSDavid du Colombier 14507dd7cddfSDavid du Colombier } 14517dd7cddfSDavid du Colombier 14527dd7cddfSDavid du Colombier 14537dd7cddfSDavid du Colombier void 14547dd7cddfSDavid du Colombier g_IP(int argc, char **argv) 14557dd7cddfSDavid du Colombier { 14567dd7cddfSDavid du Colombier switch(list){ 14577dd7cddfSDavid du Colombier default: 14587dd7cddfSDavid du Colombier closel(); 14597dd7cddfSDavid du Colombier if(argc > 1){ 14607dd7cddfSDavid du Colombier if(strcmp(argv[1], "1") == 0){ 14617dd7cddfSDavid du Colombier list = Lordered; 14627dd7cddfSDavid du Colombier listnum = 1; 14637dd7cddfSDavid du Colombier Bprint(&bout, "<OL>\n"); 14647dd7cddfSDavid du Colombier } else if(strcmp(argv[1], "\\(bu") == 0){ 14657dd7cddfSDavid du Colombier list = Lunordered; 14667dd7cddfSDavid du Colombier Bprint(&bout, "<UL>\n"); 14677dd7cddfSDavid du Colombier } else { 14687dd7cddfSDavid du Colombier list = Lother; 14697dd7cddfSDavid du Colombier Bprint(&bout, "<DL COMPACT>\n"); 14707dd7cddfSDavid du Colombier } 14717dd7cddfSDavid du Colombier } else { 14727dd7cddfSDavid du Colombier list = Lother; 14737dd7cddfSDavid du Colombier Bprint(&bout, "<DL>\n"); 14747dd7cddfSDavid du Colombier } 14757dd7cddfSDavid du Colombier break; 14767dd7cddfSDavid du Colombier case Lother: 14777dd7cddfSDavid du Colombier case Lordered: 14787dd7cddfSDavid du Colombier case Lunordered: 14797dd7cddfSDavid du Colombier break; 14807dd7cddfSDavid du Colombier } 14817dd7cddfSDavid du Colombier 14827dd7cddfSDavid du Colombier switch(list){ 14837dd7cddfSDavid du Colombier case Lother: 14847dd7cddfSDavid du Colombier Bprint(&bout, "<DT>"); 14857dd7cddfSDavid du Colombier if(argc > 1) 14867dd7cddfSDavid du Colombier printarg(argv[1]); 14877dd7cddfSDavid du Colombier else 14887dd7cddfSDavid du Colombier Bprint(&bout, "<DT> "); 14897dd7cddfSDavid du Colombier Bprint(&bout, "<DD>\n"); 14907dd7cddfSDavid du Colombier break; 14917dd7cddfSDavid du Colombier case Lordered: 14927dd7cddfSDavid du Colombier case Lunordered: 14937dd7cddfSDavid du Colombier Bprint(&bout, "<LI>\n"); 14947dd7cddfSDavid du Colombier break; 14957dd7cddfSDavid du Colombier } 14967dd7cddfSDavid du Colombier } 14977dd7cddfSDavid du Colombier 14987dd7cddfSDavid du Colombier /* 14997dd7cddfSDavid du Colombier * .5i is one <DL><DT><DD> 15007dd7cddfSDavid du Colombier */ 15017dd7cddfSDavid du Colombier void 15027dd7cddfSDavid du Colombier g_in(int argc, char **argv) 15037dd7cddfSDavid du Colombier { 15047dd7cddfSDavid du Colombier float f; 15057dd7cddfSDavid du Colombier int delta, x; 15067dd7cddfSDavid du Colombier char *p; 15077dd7cddfSDavid du Colombier 15087dd7cddfSDavid du Colombier f = indent/0.5; 15097dd7cddfSDavid du Colombier delta = f; 15107dd7cddfSDavid du Colombier if(argc <= 1){ 15117dd7cddfSDavid du Colombier indent = 0.0; 15127dd7cddfSDavid du Colombier } else { 15137dd7cddfSDavid du Colombier f = strtod(argv[1], &p); 15147dd7cddfSDavid du Colombier switch(*p){ 15157dd7cddfSDavid du Colombier case 'i': 15167dd7cddfSDavid du Colombier break; 15177dd7cddfSDavid du Colombier case 'c': 15187dd7cddfSDavid du Colombier f = f / 2.54; 15197dd7cddfSDavid du Colombier break; 15207dd7cddfSDavid du Colombier case 'P': 15217dd7cddfSDavid du Colombier f = f / 6; 15227dd7cddfSDavid du Colombier break; 15237dd7cddfSDavid du Colombier default: 15247dd7cddfSDavid du Colombier case 'u': 15257dd7cddfSDavid du Colombier case 'm': 15267dd7cddfSDavid du Colombier f = f * (12 / 72); 15277dd7cddfSDavid du Colombier break; 15287dd7cddfSDavid du Colombier case 'n': 15297dd7cddfSDavid du Colombier f = f * (6 / 72); 15307dd7cddfSDavid du Colombier break; 15317dd7cddfSDavid du Colombier case 'p': 15327dd7cddfSDavid du Colombier f = f / 72.0; 15337dd7cddfSDavid du Colombier break; 15347dd7cddfSDavid du Colombier } 15357dd7cddfSDavid du Colombier switch(argv[1][0]){ 15367dd7cddfSDavid du Colombier case '+': 15377dd7cddfSDavid du Colombier case '-': 15387dd7cddfSDavid du Colombier indent += f; 15397dd7cddfSDavid du Colombier break; 15407dd7cddfSDavid du Colombier default: 15417dd7cddfSDavid du Colombier indent = f; 15427dd7cddfSDavid du Colombier break; 15437dd7cddfSDavid du Colombier } 15447dd7cddfSDavid du Colombier } 15457dd7cddfSDavid du Colombier if(indent < 0.0) 15467dd7cddfSDavid du Colombier indent = 0.0; 15477dd7cddfSDavid du Colombier f = (indent/0.5); 15487dd7cddfSDavid du Colombier x = f; 15497dd7cddfSDavid du Colombier delta = x - delta; 15507dd7cddfSDavid du Colombier while(delta < 0){ 15517dd7cddfSDavid du Colombier Bprint(&bout, "</DL>\n"); 15527dd7cddfSDavid du Colombier delta++; 15537dd7cddfSDavid du Colombier } 15547dd7cddfSDavid du Colombier while(delta > 0){ 15557dd7cddfSDavid du Colombier Bprint(&bout, "<DL><DT><DD>\n"); 15567dd7cddfSDavid du Colombier delta--; 15577dd7cddfSDavid du Colombier } 15587dd7cddfSDavid du Colombier } 15597dd7cddfSDavid du Colombier 15607dd7cddfSDavid du Colombier void 15617dd7cddfSDavid du Colombier g_HP(int, char**) 15627dd7cddfSDavid du Colombier { 15637dd7cddfSDavid du Colombier switch(list){ 15647dd7cddfSDavid du Colombier default: 15657dd7cddfSDavid du Colombier closel(); 15667dd7cddfSDavid du Colombier list = Ldef; 15677dd7cddfSDavid du Colombier hangingdt = 1; 15687dd7cddfSDavid du Colombier Bprint(&bout, "<DL><DT>\n"); 15697dd7cddfSDavid du Colombier break; 15707dd7cddfSDavid du Colombier case Ldef: 15717dd7cddfSDavid du Colombier if(hangingdt) 15727dd7cddfSDavid du Colombier Bprint(&bout, "<DD>"); 15737dd7cddfSDavid du Colombier Bprint(&bout, "<DT>"); 15747dd7cddfSDavid du Colombier hangingdt = 1; 15757dd7cddfSDavid du Colombier break; 15767dd7cddfSDavid du Colombier } 15777dd7cddfSDavid du Colombier } 15787dd7cddfSDavid du Colombier 15797dd7cddfSDavid du Colombier void 15807dd7cddfSDavid du Colombier g_SH(int, char**) 15817dd7cddfSDavid du Colombier { 15827dd7cddfSDavid du Colombier dohanginghead(); 15837dd7cddfSDavid du Colombier closel(); 15847dd7cddfSDavid du Colombier closefont(); 15857dd7cddfSDavid du Colombier Bprint(&bout, "<H%d>", HH); 15867dd7cddfSDavid du Colombier hanginghead = HH; 15877dd7cddfSDavid du Colombier } 15887dd7cddfSDavid du Colombier 15897dd7cddfSDavid du Colombier void 15907dd7cddfSDavid du Colombier g_NH(int argc, char **argv) 15917dd7cddfSDavid du Colombier { 15927dd7cddfSDavid du Colombier int i, level; 15937dd7cddfSDavid du Colombier 15947dd7cddfSDavid du Colombier closel(); 15957dd7cddfSDavid du Colombier closefont(); 15967dd7cddfSDavid du Colombier 15977dd7cddfSDavid du Colombier if(argc == 1) 15987dd7cddfSDavid du Colombier level = 0; 15997dd7cddfSDavid du Colombier else { 16007dd7cddfSDavid du Colombier level = atoi(argv[1])-1; 16017dd7cddfSDavid du Colombier if(level < 0 || level >= Maxnh) 16027dd7cddfSDavid du Colombier level = Maxnh - 1; 16037dd7cddfSDavid du Colombier } 16047dd7cddfSDavid du Colombier nh[level]++; 16057dd7cddfSDavid du Colombier 16067dd7cddfSDavid du Colombier Bprint(&bout, "<H%d>", HH); 16077dd7cddfSDavid du Colombier hanginghead = HH; 16087dd7cddfSDavid du Colombier 16097dd7cddfSDavid du Colombier Bprint(&bout, "%d", nh[0]); 16107dd7cddfSDavid du Colombier for(i = 1; i <= level; i++) 16117dd7cddfSDavid du Colombier Bprint(&bout, ".%d", nh[i]); 16127dd7cddfSDavid du Colombier Bprint(&bout, " "); 16137dd7cddfSDavid du Colombier 16147dd7cddfSDavid du Colombier for(i = level+1; i < Maxnh; i++) 16157dd7cddfSDavid du Colombier nh[i] = 0; 16167dd7cddfSDavid du Colombier } 16177dd7cddfSDavid du Colombier 16187dd7cddfSDavid du Colombier void 16197dd7cddfSDavid du Colombier g_TL(int, char**) 16207dd7cddfSDavid du Colombier { 16217dd7cddfSDavid du Colombier char *p, *np; 16227dd7cddfSDavid du Colombier char name[128]; 16237dd7cddfSDavid du Colombier 16247dd7cddfSDavid du Colombier closefont(); 16257dd7cddfSDavid du Colombier 16267dd7cddfSDavid du Colombier if(!titleseen){ 16277dd7cddfSDavid du Colombier /* get base part of filename */ 16287dd7cddfSDavid du Colombier p = strrchr(ssp->filename, '/'); 16297dd7cddfSDavid du Colombier if(p == nil) 16307dd7cddfSDavid du Colombier p = ssp->filename; 16317dd7cddfSDavid du Colombier else 16327dd7cddfSDavid du Colombier p++; 16337dd7cddfSDavid du Colombier strncpy(name, p, sizeof(name)); 16347dd7cddfSDavid du Colombier name[sizeof(name)-1] = 0; 16357dd7cddfSDavid du Colombier 16367dd7cddfSDavid du Colombier /* dump any extensions */ 16377dd7cddfSDavid du Colombier np = strchr(name, '.'); 16387dd7cddfSDavid du Colombier if(np) 16397dd7cddfSDavid du Colombier *np = 0; 16407dd7cddfSDavid du Colombier 16417dd7cddfSDavid du Colombier Bprint(&bout, "<title>\n"); 16427dd7cddfSDavid du Colombier Bprint(&bout, "%s\n", p); 16437dd7cddfSDavid du Colombier Bprint(&bout, "</title>\n"); 16447dd7cddfSDavid du Colombier Bprint(&bout, "<body BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\" LINK=\"#0000FF\" VLINK=\"#330088\" ALINK=\"#FF0044\">\n"); 16457dd7cddfSDavid du Colombier titleseen = 1; 16467dd7cddfSDavid du Colombier } 16477dd7cddfSDavid du Colombier 16487dd7cddfSDavid du Colombier Bprint(&bout, "<H%d>", 1); 16497dd7cddfSDavid du Colombier hanginghead = 1; 16507dd7cddfSDavid du Colombier } 16517dd7cddfSDavid du Colombier 16527dd7cddfSDavid du Colombier void 16537dd7cddfSDavid du Colombier g_AU(int, char**) 16547dd7cddfSDavid du Colombier { 16557dd7cddfSDavid du Colombier closel(); 16567dd7cddfSDavid du Colombier dohanginghead(); 16577dd7cddfSDavid du Colombier Bprint(&bout, "<DL><DD><I>"); 16587dd7cddfSDavid du Colombier hangingau = 1; 16597dd7cddfSDavid du Colombier } 16607dd7cddfSDavid du Colombier 16617dd7cddfSDavid du Colombier void 1662*da51d93aSDavid du Colombier pushfont(Font *f) 16637dd7cddfSDavid du Colombier { 1664*da51d93aSDavid du Colombier if(fsp == Maxfsp) 1665*da51d93aSDavid du Colombier return; 1666*da51d93aSDavid du Colombier if(fsp >= 0 && fstack[fsp]) 1667*da51d93aSDavid du Colombier Bprint(&bout, "%s", fstack[fsp]->end); 16687dd7cddfSDavid du Colombier if(f != nil) 16697dd7cddfSDavid du Colombier Bprint(&bout, "%s", f->start); 1670*da51d93aSDavid du Colombier fstack[++fsp] = f; 1671*da51d93aSDavid du Colombier } 1672*da51d93aSDavid du Colombier 1673*da51d93aSDavid du Colombier void 1674*da51d93aSDavid du Colombier popfont(void) 1675*da51d93aSDavid du Colombier { 1676*da51d93aSDavid du Colombier if(fsp >= 0){ 1677*da51d93aSDavid du Colombier if(fstack[fsp]) 1678*da51d93aSDavid du Colombier Bprint(&bout, "%s", fstack[fsp]->end); 1679*da51d93aSDavid du Colombier fsp--; 1680*da51d93aSDavid du Colombier } 16817dd7cddfSDavid du Colombier } 16827dd7cddfSDavid du Colombier 16837dd7cddfSDavid du Colombier /* 16847dd7cddfSDavid du Colombier * for 3 args print arg3 \fxarg1\fP arg2 16857dd7cddfSDavid du Colombier * for 2 args print arg1 \fxarg2\fP 16867dd7cddfSDavid du Colombier * for 1 args print \fxarg1\fP 16877dd7cddfSDavid du Colombier */ 16887dd7cddfSDavid du Colombier void 16897dd7cddfSDavid du Colombier font(Font *f, int argc, char **argv) 16907dd7cddfSDavid du Colombier { 16917dd7cddfSDavid du Colombier if(argc == 1){ 1692*da51d93aSDavid du Colombier pushfont(nil); 16937dd7cddfSDavid du Colombier return; 16947dd7cddfSDavid du Colombier } 16957dd7cddfSDavid du Colombier if(argc > 3) 16967dd7cddfSDavid du Colombier printarg(argv[3]); 1697*da51d93aSDavid du Colombier pushfont(f); 16987dd7cddfSDavid du Colombier printarg(argv[1]); 1699*da51d93aSDavid du Colombier popfont(); 17007dd7cddfSDavid du Colombier if(argc > 2) 17017dd7cddfSDavid du Colombier printarg(argv[2]); 17027dd7cddfSDavid du Colombier Bprint(&bout, "\n"); 17037dd7cddfSDavid du Colombier } 17047dd7cddfSDavid du Colombier 17057dd7cddfSDavid du Colombier void 17067dd7cddfSDavid du Colombier closefont(void) 17077dd7cddfSDavid du Colombier { 1708*da51d93aSDavid du Colombier if(fsp >= 0 && fstack[fsp]) 1709*da51d93aSDavid du Colombier Bprint(&bout, "%s", fstack[fsp]->end); 1710*da51d93aSDavid du Colombier fsp = -1; 17117dd7cddfSDavid du Colombier } 17127dd7cddfSDavid du Colombier 17137dd7cddfSDavid du Colombier void 17147dd7cddfSDavid du Colombier g_B(int argc, char **argv) 17157dd7cddfSDavid du Colombier { 17167dd7cddfSDavid du Colombier font(&bfont, argc, argv); 17177dd7cddfSDavid du Colombier } 17187dd7cddfSDavid du Colombier 17197dd7cddfSDavid du Colombier void 17207dd7cddfSDavid du Colombier g_R(int argc, char **argv) 17217dd7cddfSDavid du Colombier { 17227dd7cddfSDavid du Colombier font(nil, argc, argv); 17237dd7cddfSDavid du Colombier } 17247dd7cddfSDavid du Colombier 17257dd7cddfSDavid du Colombier void 17267dd7cddfSDavid du Colombier g_BI(int argc, char **argv) 17277dd7cddfSDavid du Colombier { 17287dd7cddfSDavid du Colombier font(&bifont, argc, argv); 17297dd7cddfSDavid du Colombier } 17307dd7cddfSDavid du Colombier 17317dd7cddfSDavid du Colombier void 17327dd7cddfSDavid du Colombier g_CW(int argc, char **argv) 17337dd7cddfSDavid du Colombier { 17347dd7cddfSDavid du Colombier font(&cwfont, argc, argv); 17357dd7cddfSDavid du Colombier } 17367dd7cddfSDavid du Colombier 17377dd7cddfSDavid du Colombier char* 17387dd7cddfSDavid du Colombier lower(char *p) 17397dd7cddfSDavid du Colombier { 17407dd7cddfSDavid du Colombier char *x; 17417dd7cddfSDavid du Colombier 17427dd7cddfSDavid du Colombier for(x = p; *x; x++) 17437dd7cddfSDavid du Colombier if(*x >= 'A' && *x <= 'Z') 17447dd7cddfSDavid du Colombier *x -= 'A' - 'a'; 17457dd7cddfSDavid du Colombier return p; 17467dd7cddfSDavid du Colombier } 17477dd7cddfSDavid du Colombier 17487dd7cddfSDavid du Colombier void 17497dd7cddfSDavid du Colombier g_I(int argc, char **argv) 17507dd7cddfSDavid du Colombier { 17517dd7cddfSDavid du Colombier int anchor; 17527dd7cddfSDavid du Colombier char *p; 17537dd7cddfSDavid du Colombier 17547dd7cddfSDavid du Colombier anchor = 0; 17557dd7cddfSDavid du Colombier if(argc > 2){ 17567dd7cddfSDavid du Colombier p = argv[2]; 17577dd7cddfSDavid du Colombier if(p[0] == '(') 17587dd7cddfSDavid du Colombier if(p[1] >= '0' && p[1] <= '9') 17597dd7cddfSDavid du Colombier if(p[2] == ')'){ 17607dd7cddfSDavid du Colombier anchor = 1; 17617dd7cddfSDavid du Colombier Bprint(&bout, "<A href=\"/magic/man2html/%c/%s\">", 17627dd7cddfSDavid du Colombier p[1], lower(argv[1])); 17637dd7cddfSDavid du Colombier } 17647dd7cddfSDavid du Colombier } 17657dd7cddfSDavid du Colombier font(&ifont, argc, argv); 17667dd7cddfSDavid du Colombier if(anchor) 17677dd7cddfSDavid du Colombier Bprint(&bout, "</A>"); 17687dd7cddfSDavid du Colombier } 17697dd7cddfSDavid du Colombier 17707dd7cddfSDavid du Colombier void 17717dd7cddfSDavid du Colombier g_br(int, char**) 17727dd7cddfSDavid du Colombier { 17737dd7cddfSDavid du Colombier if(hangingdt){ 17747dd7cddfSDavid du Colombier Bprint(&bout, "<dd>"); 17757dd7cddfSDavid du Colombier hangingdt = 0; 17767dd7cddfSDavid du Colombier }else 17777dd7cddfSDavid du Colombier Bprint(&bout, "<br>\n"); 17787dd7cddfSDavid du Colombier } 17797dd7cddfSDavid du Colombier 17807dd7cddfSDavid du Colombier void 17817dd7cddfSDavid du Colombier g_P1(int, char**) 17827dd7cddfSDavid du Colombier { 17837dd7cddfSDavid du Colombier if(example == 0){ 17847dd7cddfSDavid du Colombier example = 1; 17857dd7cddfSDavid du Colombier Bprint(&bout, "<DL><DT><DD><TT><PRE>\n"); 17867dd7cddfSDavid du Colombier } 17877dd7cddfSDavid du Colombier } 17887dd7cddfSDavid du Colombier 17897dd7cddfSDavid du Colombier void 17907dd7cddfSDavid du Colombier g_P2(int, char**) 17917dd7cddfSDavid du Colombier { 17927dd7cddfSDavid du Colombier if(example){ 17937dd7cddfSDavid du Colombier example = 0; 17947dd7cddfSDavid du Colombier Bprint(&bout, "</PRE></TT></DL>\n"); 17957dd7cddfSDavid du Colombier } 17967dd7cddfSDavid du Colombier } 17977dd7cddfSDavid du Colombier 17987dd7cddfSDavid du Colombier void 17997dd7cddfSDavid du Colombier g_SM(int, char **argv) 18007dd7cddfSDavid du Colombier { 18017dd7cddfSDavid du Colombier Bprint(&bout, "%s", argv[1]); 18027dd7cddfSDavid du Colombier } 18037dd7cddfSDavid du Colombier 18047dd7cddfSDavid du Colombier void 18057dd7cddfSDavid du Colombier g_ft(int argc, char **argv) 18067dd7cddfSDavid du Colombier { 18077dd7cddfSDavid du Colombier if(argc < 2){ 1808*da51d93aSDavid du Colombier pushfont(nil); 18097dd7cddfSDavid du Colombier return; 18107dd7cddfSDavid du Colombier } 18117dd7cddfSDavid du Colombier 18127dd7cddfSDavid du Colombier switch(argv[1][0]){ 18137dd7cddfSDavid du Colombier case '3': 18147dd7cddfSDavid du Colombier case 'B': 1815*da51d93aSDavid du Colombier pushfont(&bfont); 18167dd7cddfSDavid du Colombier break; 18177dd7cddfSDavid du Colombier case '2': 18187dd7cddfSDavid du Colombier case 'I': 1819*da51d93aSDavid du Colombier pushfont(&ifont); 18207dd7cddfSDavid du Colombier break; 18217dd7cddfSDavid du Colombier case '4': 1822*da51d93aSDavid du Colombier pushfont(&bifont); 18237dd7cddfSDavid du Colombier break; 18247dd7cddfSDavid du Colombier case '5': 1825*da51d93aSDavid du Colombier pushfont(&cwfont); 18267dd7cddfSDavid du Colombier break; 18277dd7cddfSDavid du Colombier case 'P': 1828*da51d93aSDavid du Colombier popfont(); 18297dd7cddfSDavid du Colombier break; 18307dd7cddfSDavid du Colombier case 'R': 18317dd7cddfSDavid du Colombier default: 1832*da51d93aSDavid du Colombier pushfont(nil); 18337dd7cddfSDavid du Colombier break; 18347dd7cddfSDavid du Colombier } 18357dd7cddfSDavid du Colombier } 18367dd7cddfSDavid du Colombier 18377dd7cddfSDavid du Colombier void 18387dd7cddfSDavid du Colombier g_sp(int argc, char **argv) 18397dd7cddfSDavid du Colombier { 18407dd7cddfSDavid du Colombier int n; 18417dd7cddfSDavid du Colombier 18427dd7cddfSDavid du Colombier n = 1; 18437dd7cddfSDavid du Colombier if(argc > 1){ 18447dd7cddfSDavid du Colombier n = atoi(argv[1]); 18457dd7cddfSDavid du Colombier if(n < 1) 18467dd7cddfSDavid du Colombier n = 1; 18477dd7cddfSDavid du Colombier if(argv[1][strlen(argv[1])-1] == 'i') 18487dd7cddfSDavid du Colombier n *= 4; 18497dd7cddfSDavid du Colombier } 18507dd7cddfSDavid du Colombier if(n > 5){ 18517dd7cddfSDavid du Colombier Bprint(&bout, "<br> <br>\n"); 18527dd7cddfSDavid du Colombier Bprint(&bout, "<HR>\n"); 18537dd7cddfSDavid du Colombier Bprint(&bout, "<br> <br>\n"); 18547dd7cddfSDavid du Colombier } else 18557dd7cddfSDavid du Colombier for(; n > 0; n--) 18567dd7cddfSDavid du Colombier Bprint(&bout, "<br> <br>\n"); 18577dd7cddfSDavid du Colombier } 18587dd7cddfSDavid du Colombier 18597dd7cddfSDavid du Colombier void 18607dd7cddfSDavid du Colombier rm_loop(char *name, String **l) 18617dd7cddfSDavid du Colombier { 18627dd7cddfSDavid du Colombier String *s; 18637dd7cddfSDavid du Colombier for(s = *l; s != nil; s = *l){ 18647dd7cddfSDavid du Colombier if(strcmp(name, s->name) == 0){ 18657dd7cddfSDavid du Colombier *l = s->next; 18667dd7cddfSDavid du Colombier free(s->name); 18677dd7cddfSDavid du Colombier free(s->val); 18687dd7cddfSDavid du Colombier free(s); 18697dd7cddfSDavid du Colombier break; 18707dd7cddfSDavid du Colombier } 18717dd7cddfSDavid du Colombier l = &s->next; 18727dd7cddfSDavid du Colombier } 18737dd7cddfSDavid du Colombier } 18747dd7cddfSDavid du Colombier 18757dd7cddfSDavid du Colombier void 18767dd7cddfSDavid du Colombier g_rm(int argc, char **argv) 18777dd7cddfSDavid du Colombier { 18787dd7cddfSDavid du Colombier Goobie *g; 18797dd7cddfSDavid du Colombier char *name; 18807dd7cddfSDavid du Colombier int i; 18817dd7cddfSDavid du Colombier 18827dd7cddfSDavid du Colombier for(i = 1; i < argc; i++) { 18837dd7cddfSDavid du Colombier name = argv[i]; 18847dd7cddfSDavid du Colombier rm_loop(name, &strings); 18857dd7cddfSDavid du Colombier rm_loop(name, ¯os); 18867dd7cddfSDavid du Colombier for(g = gtab; g->name; g++) 18877dd7cddfSDavid du Colombier if (strcmp(g->name, name) == 0) { 18887dd7cddfSDavid du Colombier g->f = g_ignore; 18897dd7cddfSDavid du Colombier break; 18907dd7cddfSDavid du Colombier } 18917dd7cddfSDavid du Colombier } 18927dd7cddfSDavid du Colombier } 18937dd7cddfSDavid du Colombier 18947dd7cddfSDavid du Colombier void 18957dd7cddfSDavid du Colombier g_AB(int, char**) 18967dd7cddfSDavid du Colombier { 18977dd7cddfSDavid du Colombier closel(); 18987dd7cddfSDavid du Colombier Bprint(&bout, "<DL><DD><H4>ABSTRACT</H4>\n"); 18997dd7cddfSDavid du Colombier } 19007dd7cddfSDavid du Colombier 19017dd7cddfSDavid du Colombier void 19027dd7cddfSDavid du Colombier g_AE(int, char**) 19037dd7cddfSDavid du Colombier { 19047dd7cddfSDavid du Colombier Bprint(&bout, "</DL>\n"); 19057dd7cddfSDavid du Colombier } 19067dd7cddfSDavid du Colombier 19077dd7cddfSDavid du Colombier void 19087dd7cddfSDavid du Colombier g_FS(int, char **) 19097dd7cddfSDavid du Colombier { 19107dd7cddfSDavid du Colombier char *argv[3]; 19117dd7cddfSDavid du Colombier 19127dd7cddfSDavid du Colombier argv[0] = "IP"; 19137dd7cddfSDavid du Colombier argv[1] = nil; 19147dd7cddfSDavid du Colombier argv[2] = nil; 19157dd7cddfSDavid du Colombier g_IP(1, argv); 19167dd7cddfSDavid du Colombier Bprint(&bout, "NOTE:<I> "); 19177dd7cddfSDavid du Colombier } 19187dd7cddfSDavid du Colombier 19197dd7cddfSDavid du Colombier void 19207dd7cddfSDavid du Colombier g_FE(int, char **) 19217dd7cddfSDavid du Colombier { 19227dd7cddfSDavid du Colombier Bprint(&bout, "</I><DT> <DD>"); 19237dd7cddfSDavid du Colombier closel(); 19247dd7cddfSDavid du Colombier Bprint(&bout, "<br>\n"); 19257dd7cddfSDavid du Colombier } 19267dd7cddfSDavid du Colombier 19277dd7cddfSDavid du Colombier void 19287dd7cddfSDavid du Colombier g_de(int argc, char **argv) 19297dd7cddfSDavid du Colombier { 19307dd7cddfSDavid du Colombier int r; 19317dd7cddfSDavid du Colombier char *p, *cp; 19327dd7cddfSDavid du Colombier String *m; 19337dd7cddfSDavid du Colombier int len; 19347dd7cddfSDavid du Colombier 19357dd7cddfSDavid du Colombier if(argc < 2) 19367dd7cddfSDavid du Colombier return; 19377dd7cddfSDavid du Colombier 19387dd7cddfSDavid du Colombier m = nil; 19397dd7cddfSDavid du Colombier len = 0; 19407dd7cddfSDavid du Colombier if(strcmp(argv[0], "am") == 0){ 19417dd7cddfSDavid du Colombier for(m = macros; m != nil; m = m->next) 19427dd7cddfSDavid du Colombier if(strcmp(argv[1], m->name) == 0){ 19437dd7cddfSDavid du Colombier len = strlen(m->val); 19447dd7cddfSDavid du Colombier break; 19457dd7cddfSDavid du Colombier } 19467dd7cddfSDavid du Colombier 19477dd7cddfSDavid du Colombier if(m == nil){ 19487dd7cddfSDavid du Colombier /* nothing to append to */ 19497dd7cddfSDavid du Colombier for(;;){ 19507dd7cddfSDavid du Colombier p = Brdline(&ssp->in, '\n'); 19517dd7cddfSDavid du Colombier if(p == nil) 19527dd7cddfSDavid du Colombier break; 19537dd7cddfSDavid du Colombier p[Blinelen(&ssp->in)-1] = 0; 19547dd7cddfSDavid du Colombier if(strcmp(p, "..") == 0) 19557dd7cddfSDavid du Colombier break; 19567dd7cddfSDavid du Colombier } 19577dd7cddfSDavid du Colombier return; 19587dd7cddfSDavid du Colombier } 19597dd7cddfSDavid du Colombier } 19607dd7cddfSDavid du Colombier 19617dd7cddfSDavid du Colombier if(m == nil){ 19627dd7cddfSDavid du Colombier m = emalloc(sizeof(*m)); 19637dd7cddfSDavid du Colombier m->next = macros; 19647dd7cddfSDavid du Colombier macros = m; 19657dd7cddfSDavid du Colombier m->name = strdup(argv[1]); 19667dd7cddfSDavid du Colombier m->val = nil; 19677dd7cddfSDavid du Colombier len = 0; 19687dd7cddfSDavid du Colombier } 19697dd7cddfSDavid du Colombier 19707dd7cddfSDavid du Colombier /* read up to a .. removing double backslashes */ 19717dd7cddfSDavid du Colombier for(;;){ 19727dd7cddfSDavid du Colombier p = Brdline(&ssp->in, '\n'); 19737dd7cddfSDavid du Colombier if(p == nil) 19747dd7cddfSDavid du Colombier break; 19757dd7cddfSDavid du Colombier p[Blinelen(&ssp->in)-1] = 0; 19767dd7cddfSDavid du Colombier if(strcmp(p, "..") == 0) 19777dd7cddfSDavid du Colombier break; 19787dd7cddfSDavid du Colombier m->val = realloc(m->val, len + Blinelen(&ssp->in)+1); 19797dd7cddfSDavid du Colombier cp = m->val + len; 19807dd7cddfSDavid du Colombier while(*p){ 19817dd7cddfSDavid du Colombier r = *p++; 19827dd7cddfSDavid du Colombier if(r == '\\' && *p == '\\') 19837dd7cddfSDavid du Colombier p++; 19847dd7cddfSDavid du Colombier *cp++ = r; 19857dd7cddfSDavid du Colombier } 19867dd7cddfSDavid du Colombier *cp++ = '\n'; 19877dd7cddfSDavid du Colombier len = cp - m->val; 19887dd7cddfSDavid du Colombier *cp = 0; 19897dd7cddfSDavid du Colombier } 19907dd7cddfSDavid du Colombier } 19917dd7cddfSDavid du Colombier 19927dd7cddfSDavid du Colombier void 19937dd7cddfSDavid du Colombier g_hrule(int, char**) 19947dd7cddfSDavid du Colombier { 19957dd7cddfSDavid du Colombier Bprint(&bout, "<HR>\n"); 19967dd7cddfSDavid du Colombier } 19977dd7cddfSDavid du Colombier 19987dd7cddfSDavid du Colombier void 19997dd7cddfSDavid du Colombier g_BX(int argc, char **argv) 20007dd7cddfSDavid du Colombier { 20017dd7cddfSDavid du Colombier Bprint(&bout, "<HR>\n"); 20027dd7cddfSDavid du Colombier printargs(argc, argv); 20037dd7cddfSDavid du Colombier Bprint(&bout, "<HR>\n"); 20047dd7cddfSDavid du Colombier } 20057dd7cddfSDavid du Colombier 20067dd7cddfSDavid du Colombier void 20077dd7cddfSDavid du Colombier g_IH(int, char**) 20087dd7cddfSDavid du Colombier { 20097dd7cddfSDavid du Colombier Bprint(&bout, "Bell Laboratories, Naperville, Illinois, 60540\n"); 20107dd7cddfSDavid du Colombier } 20117dd7cddfSDavid du Colombier 20127dd7cddfSDavid du Colombier void 20137dd7cddfSDavid du Colombier g_MH(int, char**) 20147dd7cddfSDavid du Colombier { 20157dd7cddfSDavid du Colombier Bprint(&bout, "Bell Laboratories, Murray Hill, NJ, 07974\n"); 20167dd7cddfSDavid du Colombier } 20177dd7cddfSDavid du Colombier 20187dd7cddfSDavid du Colombier void 20197dd7cddfSDavid du Colombier g_PY(int, char**) 20207dd7cddfSDavid du Colombier { 20217dd7cddfSDavid du Colombier Bprint(&bout, "Bell Laboratories, Piscataway, NJ, 08854\n"); 20227dd7cddfSDavid du Colombier } 20237dd7cddfSDavid du Colombier 20247dd7cddfSDavid du Colombier void 20257dd7cddfSDavid du Colombier g_HO(int, char**) 20267dd7cddfSDavid du Colombier { 20277dd7cddfSDavid du Colombier Bprint(&bout, "Bell Laboratories, Holmdel, NJ, 07733\n"); 20287dd7cddfSDavid du Colombier } 20297dd7cddfSDavid du Colombier 20307dd7cddfSDavid du Colombier void 20317dd7cddfSDavid du Colombier g_QS(int, char**) 20327dd7cddfSDavid du Colombier { 20337dd7cddfSDavid du Colombier Bprint(&bout, "<BLOCKQUOTE>\n"); 20347dd7cddfSDavid du Colombier } 20357dd7cddfSDavid du Colombier 20367dd7cddfSDavid du Colombier void 20377dd7cddfSDavid du Colombier g_QE(int, char**) 20387dd7cddfSDavid du Colombier { 20397dd7cddfSDavid du Colombier Bprint(&bout, "</BLOCKQUOTE>\n"); 20407dd7cddfSDavid du Colombier } 20417dd7cddfSDavid du Colombier 20427dd7cddfSDavid du Colombier void 20437dd7cddfSDavid du Colombier g_RS(int, char**) 20447dd7cddfSDavid du Colombier { 20457dd7cddfSDavid du Colombier Bprint(&bout, "<DL><DD>\n"); 20467dd7cddfSDavid du Colombier } 20477dd7cddfSDavid du Colombier 20487dd7cddfSDavid du Colombier void 20497dd7cddfSDavid du Colombier g_RE(int, char**) 20507dd7cddfSDavid du Colombier { 20517dd7cddfSDavid du Colombier Bprint(&bout, "</DL>\n"); 20527dd7cddfSDavid du Colombier } 20537dd7cddfSDavid du Colombier 20547dd7cddfSDavid du Colombier int gif; 20557dd7cddfSDavid du Colombier 20567dd7cddfSDavid du Colombier void 20577dd7cddfSDavid du Colombier g_startgif(int, char **argv) 20587dd7cddfSDavid du Colombier { 20597dd7cddfSDavid du Colombier int fd; 20607dd7cddfSDavid du Colombier int pfd[2]; 20617dd7cddfSDavid du Colombier char *e, *p; 20627dd7cddfSDavid du Colombier char name[32]; 20639a747e4fSDavid du Colombier Dir *d; 20647dd7cddfSDavid du Colombier 20657dd7cddfSDavid du Colombier if(strcmp(argv[0], "EQ") == 0) 20667dd7cddfSDavid du Colombier e = ".EN"; 20677dd7cddfSDavid du Colombier else if(strcmp(argv[0], "TS") == 0) 20687dd7cddfSDavid du Colombier e = ".TE"; 20697dd7cddfSDavid du Colombier else if(strcmp(argv[0], "PS") == 0) 20707dd7cddfSDavid du Colombier e = ".PE"; 20717dd7cddfSDavid du Colombier else 20727dd7cddfSDavid du Colombier return; 20737dd7cddfSDavid du Colombier 20747dd7cddfSDavid du Colombier p = strrchr(sstack[0].filename, '/'); 20757dd7cddfSDavid du Colombier if(p != nil) 20767dd7cddfSDavid du Colombier p++; 20777dd7cddfSDavid du Colombier else 20787dd7cddfSDavid du Colombier p = sstack[0].filename; 20797dd7cddfSDavid du Colombier snprint(name, sizeof(name), "%s.%d%d.gif", p, getpid(), gif++); 20807dd7cddfSDavid du Colombier fd = create(name, OWRITE, 0664); 20817dd7cddfSDavid du Colombier if(fd < 0){ 20827dd7cddfSDavid du Colombier fprint(2, "ms2html: can't create %s: %r\n", name); 20837dd7cddfSDavid du Colombier return; 20847dd7cddfSDavid du Colombier } 20857dd7cddfSDavid du Colombier 20867dd7cddfSDavid du Colombier if(pipe(pfd) < 0){ 20877dd7cddfSDavid du Colombier fprint(2, "ms2html: can't create pipe: %r\n"); 20887dd7cddfSDavid du Colombier close(fd); 20897dd7cddfSDavid du Colombier return; 20907dd7cddfSDavid du Colombier } 20917dd7cddfSDavid du Colombier switch(rfork(RFFDG|RFPROC)){ 20927dd7cddfSDavid du Colombier case -1: 20937dd7cddfSDavid du Colombier fprint(2, "ms2html: can't fork: %r\n"); 20947dd7cddfSDavid du Colombier close(fd); 20957dd7cddfSDavid du Colombier return; 20967dd7cddfSDavid du Colombier case 0: 20977dd7cddfSDavid du Colombier dup(fd, 1); 20987dd7cddfSDavid du Colombier close(fd); 20997dd7cddfSDavid du Colombier dup(pfd[0], 0); 21007dd7cddfSDavid du Colombier close(pfd[0]); 21017dd7cddfSDavid du Colombier close(pfd[1]); 21027dd7cddfSDavid du Colombier execl("/bin/troff2gif", "troff2gif", 0); 21037dd7cddfSDavid du Colombier fprint(2, "ms2html: couldn't exec troff2gif: %r\n"); 21047dd7cddfSDavid du Colombier _exits(nil); 21057dd7cddfSDavid du Colombier default: 21067dd7cddfSDavid du Colombier close(fd); 21077dd7cddfSDavid du Colombier close(pfd[0]); 21087dd7cddfSDavid du Colombier fprint(pfd[1], ".ll 7i\n"); 21096b6b9ac8SDavid du Colombier fprint(pfd[1], ".EQ\ndelim %s\n.EN\n", delim); 21106b6b9ac8SDavid du Colombier fprint(pfd[1], ".%s\n", argv[0]); 21117dd7cddfSDavid du Colombier for(;;){ 21127dd7cddfSDavid du Colombier p = Brdline(&ssp->in, '\n'); 21137dd7cddfSDavid du Colombier if(p == nil) 21147dd7cddfSDavid du Colombier break; 21157dd7cddfSDavid du Colombier ssp->lno++; 21167dd7cddfSDavid du Colombier ssp->rlno++; 21177dd7cddfSDavid du Colombier if(write(pfd[1], p, Blinelen(&ssp->in)) < 0) 21187dd7cddfSDavid du Colombier break; 21196b6b9ac8SDavid du Colombier if(strncmp(p, e, 3) == 0) 21206b6b9ac8SDavid du Colombier break; 21217dd7cddfSDavid du Colombier } 21227dd7cddfSDavid du Colombier close(pfd[1]); 21239a747e4fSDavid du Colombier waitpid(); 21249a747e4fSDavid du Colombier d = dirstat(name); 21259a747e4fSDavid du Colombier if(d == nil) 21267dd7cddfSDavid du Colombier break; 21279a747e4fSDavid du Colombier if(d->length == 0){ 21287dd7cddfSDavid du Colombier remove(name); 21299a747e4fSDavid du Colombier free(d); 21307dd7cddfSDavid du Colombier break; 21317dd7cddfSDavid du Colombier } 21329a747e4fSDavid du Colombier free(d); 21337dd7cddfSDavid du Colombier fprint(2, "ms2html: created auxiliary file %s\n", name); 21347dd7cddfSDavid du Colombier Bprint(&bout, "<br><img src=\"%s\"><br>\n", name); 21357dd7cddfSDavid du Colombier break; 21367dd7cddfSDavid du Colombier } 21377dd7cddfSDavid du Colombier } 21387dd7cddfSDavid du Colombier 21397dd7cddfSDavid du Colombier void 21407dd7cddfSDavid du Colombier g_lf(int argc, char **argv) 21417dd7cddfSDavid du Colombier { 21427dd7cddfSDavid du Colombier if(argc > 2) 21437dd7cddfSDavid du Colombier snprint(ssp->filename, sizeof(ssp->filename), argv[2]); 21447dd7cddfSDavid du Colombier if(argc > 1) 21457dd7cddfSDavid du Colombier ssp->rlno = atoi(argv[1]); 21467dd7cddfSDavid du Colombier } 21477dd7cddfSDavid du Colombier 21487dd7cddfSDavid du Colombier void 21497dd7cddfSDavid du Colombier g_so(int argc, char **argv) 21507dd7cddfSDavid du Colombier { 21517dd7cddfSDavid du Colombier ssp->lno++; 21527dd7cddfSDavid du Colombier ssp->rlno++; 21537dd7cddfSDavid du Colombier if(argc > 1) 21547dd7cddfSDavid du Colombier pushsrc(argv[1]); 21557dd7cddfSDavid du Colombier } 21567dd7cddfSDavid du Colombier 21577dd7cddfSDavid du Colombier 21587dd7cddfSDavid du Colombier void 21597dd7cddfSDavid du Colombier g_BP(int argc, char **argv) 21607dd7cddfSDavid du Colombier { 21617dd7cddfSDavid du Colombier int fd; 21627dd7cddfSDavid du Colombier char *p, *ext; 21637dd7cddfSDavid du Colombier char name[32]; 21649a747e4fSDavid du Colombier Dir *d; 21657dd7cddfSDavid du Colombier 21667dd7cddfSDavid du Colombier if(argc < 2) 21677dd7cddfSDavid du Colombier return; 21687dd7cddfSDavid du Colombier 21697dd7cddfSDavid du Colombier p = strrchr(argv[1], '/'); 21707dd7cddfSDavid du Colombier if(p != nil) 21717dd7cddfSDavid du Colombier p++; 21727dd7cddfSDavid du Colombier else 21737dd7cddfSDavid du Colombier p = argv[1]; 21747dd7cddfSDavid du Colombier 21757dd7cddfSDavid du Colombier 21767dd7cddfSDavid du Colombier ext = strrchr(p, '.'); 21777dd7cddfSDavid du Colombier if(ext){ 21787dd7cddfSDavid du Colombier if(strcmp(ext, ".jpeg") == 0 21797dd7cddfSDavid du Colombier || strcmp(ext, ".gif") == 0){ 21807dd7cddfSDavid du Colombier Bprint(&bout, "<br><img src=\"%s\"><br>\n", argv[1]); 21817dd7cddfSDavid du Colombier return; 21827dd7cddfSDavid du Colombier } 21837dd7cddfSDavid du Colombier } 21847dd7cddfSDavid du Colombier 21857dd7cddfSDavid du Colombier 21867dd7cddfSDavid du Colombier snprint(name, sizeof(name), "%s.%d%d.gif", p, getpid(), gif++); 21877dd7cddfSDavid du Colombier fd = create(name, OWRITE, 0664); 21887dd7cddfSDavid du Colombier if(fd < 0){ 21897dd7cddfSDavid du Colombier fprint(2, "ms2html: can't create %s: %r\n", name); 21907dd7cddfSDavid du Colombier return; 21917dd7cddfSDavid du Colombier } 21927dd7cddfSDavid du Colombier 21937dd7cddfSDavid du Colombier switch(rfork(RFFDG|RFPROC)){ 21947dd7cddfSDavid du Colombier case -1: 21957dd7cddfSDavid du Colombier fprint(2, "ms2html: can't fork: %r\n"); 21967dd7cddfSDavid du Colombier close(fd); 21977dd7cddfSDavid du Colombier return; 21987dd7cddfSDavid du Colombier case 0: 21997dd7cddfSDavid du Colombier dup(fd, 1); 22007dd7cddfSDavid du Colombier close(fd); 22017dd7cddfSDavid du Colombier execl("/bin/ps2gif", "ps2gif", argv[1], 0); 22027dd7cddfSDavid du Colombier fprint(2, "ms2html: couldn't exec ps2gif: %r\n"); 22037dd7cddfSDavid du Colombier _exits(nil); 22047dd7cddfSDavid du Colombier default: 22057dd7cddfSDavid du Colombier close(fd); 22069a747e4fSDavid du Colombier waitpid(); 22079a747e4fSDavid du Colombier d = dirstat(name); 22089a747e4fSDavid du Colombier if(d == nil) 22097dd7cddfSDavid du Colombier break; 22109a747e4fSDavid du Colombier if(d->length == 0){ 22117dd7cddfSDavid du Colombier remove(name); 22129a747e4fSDavid du Colombier free(d); 22137dd7cddfSDavid du Colombier break; 22147dd7cddfSDavid du Colombier } 22159a747e4fSDavid du Colombier free(d); 22167dd7cddfSDavid du Colombier fprint(2, "ms2html: created auxiliary file %s\n", name); 22177dd7cddfSDavid du Colombier Bprint(&bout, "<br><img src=\"%s\"><br>\n", name); 22187dd7cddfSDavid du Colombier break; 22197dd7cddfSDavid du Colombier } 22207dd7cddfSDavid du Colombier } 22217dd7cddfSDavid du Colombier 22227dd7cddfSDavid du Colombier /* insert straight HTML into output */ 22237dd7cddfSDavid du Colombier void 22247dd7cddfSDavid du Colombier g__H(int argc, char **argv) 22257dd7cddfSDavid du Colombier { 22267dd7cddfSDavid du Colombier int i; 22277dd7cddfSDavid du Colombier 22287dd7cddfSDavid du Colombier for(i = 1; i < argc; i++) 22297dd7cddfSDavid du Colombier Bprint(&bout, "%s ", argv[i]); 22307dd7cddfSDavid du Colombier Bprint(&bout, "\n"); 22317dd7cddfSDavid du Colombier } 22327dd7cddfSDavid du Colombier 22337dd7cddfSDavid du Colombier /* HTML page title */ 22347dd7cddfSDavid du Colombier void 22357dd7cddfSDavid du Colombier g__T(int argc, char **argv) 22367dd7cddfSDavid du Colombier { 22377dd7cddfSDavid du Colombier if(titleseen) 22387dd7cddfSDavid du Colombier return; 22397dd7cddfSDavid du Colombier 22407dd7cddfSDavid du Colombier Bprint(&bout, "<title>\n"); 22417dd7cddfSDavid du Colombier printargs(argc, argv); 22427dd7cddfSDavid du Colombier Bprint(&bout, "</title></head><body>\n"); 22437dd7cddfSDavid du Colombier titleseen = 1; 22447dd7cddfSDavid du Colombier } 22457dd7cddfSDavid du Colombier 22467dd7cddfSDavid du Colombier void 22477dd7cddfSDavid du Colombier g_nr(int argc, char **argv) 22487dd7cddfSDavid du Colombier { 22497dd7cddfSDavid du Colombier char *val; 22507dd7cddfSDavid du Colombier 22517dd7cddfSDavid du Colombier if (argc > 1) { 22527dd7cddfSDavid du Colombier if (argc == 2) 22537dd7cddfSDavid du Colombier val = "0"; 22547dd7cddfSDavid du Colombier else 22557dd7cddfSDavid du Colombier val = argv[2]; 22567dd7cddfSDavid du Colombier dsnr(argv[1], val, &numregs); 22577dd7cddfSDavid du Colombier } 22587dd7cddfSDavid du Colombier } 22597dd7cddfSDavid du Colombier 22607dd7cddfSDavid du Colombier void 22617dd7cddfSDavid du Colombier zerodivide(void) 22627dd7cddfSDavid du Colombier { 22637dd7cddfSDavid du Colombier fprint(2, "stdin %d(%s:%d): division by 0\n", 22647dd7cddfSDavid du Colombier ssp->lno, ssp->filename, ssp->rlno); 22657dd7cddfSDavid du Colombier } 22667dd7cddfSDavid du Colombier 22677dd7cddfSDavid du Colombier int 22687dd7cddfSDavid du Colombier numval(char **pline, int recur) 22697dd7cddfSDavid du Colombier { 22707dd7cddfSDavid du Colombier char *p; 22717dd7cddfSDavid du Colombier int neg, x, y; 22727dd7cddfSDavid du Colombier 22737dd7cddfSDavid du Colombier x = neg = 0; 22747dd7cddfSDavid du Colombier p = *pline; 22757dd7cddfSDavid du Colombier while(*p == '-') { 22767dd7cddfSDavid du Colombier neg = 1 - neg; 22777dd7cddfSDavid du Colombier p++; 22787dd7cddfSDavid du Colombier } 22797dd7cddfSDavid du Colombier if (*p == '(') { 22807dd7cddfSDavid du Colombier p++; 22817dd7cddfSDavid du Colombier x = numval(&p, 1); 22827dd7cddfSDavid du Colombier if (*p != ')') 22837dd7cddfSDavid du Colombier goto done; 22847dd7cddfSDavid du Colombier p++; 22857dd7cddfSDavid du Colombier } 22867dd7cddfSDavid du Colombier else while(*p >= '0' && *p <= '9') 22877dd7cddfSDavid du Colombier x = 10*x + *p++ - '0'; 22887dd7cddfSDavid du Colombier if (neg) 22897dd7cddfSDavid du Colombier x = -x; 22907dd7cddfSDavid du Colombier if (recur) 22917dd7cddfSDavid du Colombier for(;;) { 22927dd7cddfSDavid du Colombier switch(*p++) { 22937dd7cddfSDavid du Colombier case '+': 22947dd7cddfSDavid du Colombier x += numval(&p, 0); 22957dd7cddfSDavid du Colombier continue; 22967dd7cddfSDavid du Colombier case '-': 22977dd7cddfSDavid du Colombier x -= numval(&p, 0); 22987dd7cddfSDavid du Colombier continue; 22997dd7cddfSDavid du Colombier case '*': 23007dd7cddfSDavid du Colombier x *= numval(&p, 0); 23017dd7cddfSDavid du Colombier continue; 23027dd7cddfSDavid du Colombier case '/': 23037dd7cddfSDavid du Colombier y = numval(&p, 0); 23047dd7cddfSDavid du Colombier if (y == 0) { 23057dd7cddfSDavid du Colombier zerodivide(); 23067dd7cddfSDavid du Colombier x = 0; 23077dd7cddfSDavid du Colombier goto done; 23087dd7cddfSDavid du Colombier } 23097dd7cddfSDavid du Colombier x /= y; 23107dd7cddfSDavid du Colombier continue; 23117dd7cddfSDavid du Colombier case '<': 23127dd7cddfSDavid du Colombier if (*p == '=') { 23137dd7cddfSDavid du Colombier p++; 23147dd7cddfSDavid du Colombier x = x <= numval(&p, 0); 23157dd7cddfSDavid du Colombier continue; 23167dd7cddfSDavid du Colombier } 23177dd7cddfSDavid du Colombier x = x < numval(&p, 0); 23187dd7cddfSDavid du Colombier continue; 23197dd7cddfSDavid du Colombier case '>': 23207dd7cddfSDavid du Colombier if (*p == '=') { 23217dd7cddfSDavid du Colombier p++; 23227dd7cddfSDavid du Colombier x = x >= numval(&p, 0); 23237dd7cddfSDavid du Colombier continue; 23247dd7cddfSDavid du Colombier } 23257dd7cddfSDavid du Colombier x = x > numval(&p, 0); 23267dd7cddfSDavid du Colombier continue; 23277dd7cddfSDavid du Colombier case '=': 23287dd7cddfSDavid du Colombier if (*p == '=') 23297dd7cddfSDavid du Colombier p++; 23307dd7cddfSDavid du Colombier x = x == numval(&p, 0); 23317dd7cddfSDavid du Colombier continue; 23327dd7cddfSDavid du Colombier case '&': 23337dd7cddfSDavid du Colombier x &= numval(&p, 0); 23347dd7cddfSDavid du Colombier continue; 23357dd7cddfSDavid du Colombier case ':': 23367dd7cddfSDavid du Colombier x |= numval(&p, 0); 23377dd7cddfSDavid du Colombier continue; 23387dd7cddfSDavid du Colombier case '%': 23397dd7cddfSDavid du Colombier y = numval(&p, 0); 23407dd7cddfSDavid du Colombier if (!y) { 23417dd7cddfSDavid du Colombier zerodivide(); 23427dd7cddfSDavid du Colombier goto done; 23437dd7cddfSDavid du Colombier } 23447dd7cddfSDavid du Colombier x %= y; 23457dd7cddfSDavid du Colombier continue; 23467dd7cddfSDavid du Colombier } 23477dd7cddfSDavid du Colombier --p; 23487dd7cddfSDavid du Colombier break; 23497dd7cddfSDavid du Colombier } 23507dd7cddfSDavid du Colombier done: 23517dd7cddfSDavid du Colombier *pline = p; 23527dd7cddfSDavid du Colombier return x; 23537dd7cddfSDavid du Colombier } 23547dd7cddfSDavid du Colombier 23557dd7cddfSDavid du Colombier int 23567dd7cddfSDavid du Colombier iftest(char *p, char **bp) 23577dd7cddfSDavid du Colombier { 23587dd7cddfSDavid du Colombier char *p1; 23597dd7cddfSDavid du Colombier int c, neg, rv; 23607dd7cddfSDavid du Colombier 23617dd7cddfSDavid du Colombier rv = neg = 0; 23627dd7cddfSDavid du Colombier if (*p == '!') { 23637dd7cddfSDavid du Colombier neg = 1; 23647dd7cddfSDavid du Colombier p++; 23657dd7cddfSDavid du Colombier } 23667dd7cddfSDavid du Colombier c = *p; 23677dd7cddfSDavid du Colombier if (c >= '0' && c <= '9' || c == '+' || c == '-' || c == '('/*)*/) { 23687dd7cddfSDavid du Colombier if (numval(&p,1) >= 1) 23697dd7cddfSDavid du Colombier rv = 1; 23707dd7cddfSDavid du Colombier goto done; 23717dd7cddfSDavid du Colombier } 23727dd7cddfSDavid du Colombier switch(c) { 23737dd7cddfSDavid du Colombier case 't': 23747dd7cddfSDavid du Colombier case 'o': 23757dd7cddfSDavid du Colombier rv = 1; 23767dd7cddfSDavid du Colombier case 'n': 23777dd7cddfSDavid du Colombier case 'e': 23787dd7cddfSDavid du Colombier p++; 23797dd7cddfSDavid du Colombier goto done; 23807dd7cddfSDavid du Colombier } 23817dd7cddfSDavid du Colombier for(p1 = ++p; *p != c; p++) 23827dd7cddfSDavid du Colombier if (!*p) 23837dd7cddfSDavid du Colombier goto done; 23847dd7cddfSDavid du Colombier for(p++;;) { 23857dd7cddfSDavid du Colombier if (*p != *p1++) { 23867dd7cddfSDavid du Colombier while(*p && *p++ != c); 23877dd7cddfSDavid du Colombier goto done; 23887dd7cddfSDavid du Colombier } 23897dd7cddfSDavid du Colombier if (*p++ == c) 23907dd7cddfSDavid du Colombier break; 23917dd7cddfSDavid du Colombier } 23927dd7cddfSDavid du Colombier rv = 1; 23937dd7cddfSDavid du Colombier done: 23947dd7cddfSDavid du Colombier if (neg) 23957dd7cddfSDavid du Colombier rv = 1 - rv; 23967dd7cddfSDavid du Colombier while(*p == ' ' || *p == '\t') 23977dd7cddfSDavid du Colombier p++; 23987dd7cddfSDavid du Colombier *bp = p; 23997dd7cddfSDavid du Colombier return rv; 24007dd7cddfSDavid du Colombier } 24017dd7cddfSDavid du Colombier 24027dd7cddfSDavid du Colombier void 24037dd7cddfSDavid du Colombier scanline(char *p, char *e, int wantnl) 24047dd7cddfSDavid du Colombier { 24057dd7cddfSDavid du Colombier int c; 24067dd7cddfSDavid du Colombier Rune r; 24077dd7cddfSDavid du Colombier 24087dd7cddfSDavid du Colombier while((c = getrune()) == ' ' || c == '\t') ; 24097dd7cddfSDavid du Colombier while(p < e) { 24107dd7cddfSDavid du Colombier if (c < 0) 24117dd7cddfSDavid du Colombier break; 24127dd7cddfSDavid du Colombier if (c < Runeself) { 24137dd7cddfSDavid du Colombier if (c == '\n') { 24147dd7cddfSDavid du Colombier if (wantnl) 24157dd7cddfSDavid du Colombier *p++ = c; 24167dd7cddfSDavid du Colombier break; 24177dd7cddfSDavid du Colombier } 24187dd7cddfSDavid du Colombier *p++ = c; 24197dd7cddfSDavid du Colombier } 24207dd7cddfSDavid du Colombier else { 24217dd7cddfSDavid du Colombier r = c; 24227dd7cddfSDavid du Colombier p += runetochar(p, &r); 24237dd7cddfSDavid du Colombier } 24247dd7cddfSDavid du Colombier c = getrune(); 24257dd7cddfSDavid du Colombier } 24267dd7cddfSDavid du Colombier *p = 0; 24277dd7cddfSDavid du Colombier } 24287dd7cddfSDavid du Colombier 24297dd7cddfSDavid du Colombier void 24307dd7cddfSDavid du Colombier pushbody(char *line) 24317dd7cddfSDavid du Colombier { 24327dd7cddfSDavid du Colombier char *b; 24337dd7cddfSDavid du Colombier 24347dd7cddfSDavid du Colombier if (line[0] == '\\' && line[1] == '{' /*}*/ ) 24357dd7cddfSDavid du Colombier line += 2; 24367dd7cddfSDavid du Colombier if (strsp < Maxmstack - 1) { 24377dd7cddfSDavid du Colombier pushstr(b = strdup(line)); 24387dd7cddfSDavid du Colombier mustfree[strsp] = b; 24397dd7cddfSDavid du Colombier } 24407dd7cddfSDavid du Colombier } 24417dd7cddfSDavid du Colombier 24427dd7cddfSDavid du Colombier void 24437dd7cddfSDavid du Colombier skipbody(char *line) 24447dd7cddfSDavid du Colombier { 24457dd7cddfSDavid du Colombier int c, n; 24467dd7cddfSDavid du Colombier 24477dd7cddfSDavid du Colombier if (line[0] != '\\' || line[1] != '{' /*}*/ ) 24487dd7cddfSDavid du Colombier return; 24497dd7cddfSDavid du Colombier for(n = 1;;) { 24507dd7cddfSDavid du Colombier while((c = getrune()) != '\\') 24517dd7cddfSDavid du Colombier if (c < 0) 24527dd7cddfSDavid du Colombier return; 24537dd7cddfSDavid du Colombier c = getrune(); 24547dd7cddfSDavid du Colombier if (c == '{') 24557dd7cddfSDavid du Colombier n++; 24567dd7cddfSDavid du Colombier else if ((c == '}' && (c = getrune()) == '\n' && !--n) 24577dd7cddfSDavid du Colombier || c < 0) 24587dd7cddfSDavid du Colombier return; 24597dd7cddfSDavid du Colombier } 24607dd7cddfSDavid du Colombier } 24617dd7cddfSDavid du Colombier 24627dd7cddfSDavid du Colombier int 24637dd7cddfSDavid du Colombier ifstart(char *line, char *e, char **bp) 24647dd7cddfSDavid du Colombier { 24657dd7cddfSDavid du Colombier int it; 24667dd7cddfSDavid du Colombier char *b; 24677dd7cddfSDavid du Colombier 24687dd7cddfSDavid du Colombier b = copyline(line, e, 1); 24697dd7cddfSDavid du Colombier ungetrune(); 24707dd7cddfSDavid du Colombier b[-1] = getrune(); 24717dd7cddfSDavid du Colombier scanline(b, e, 1); 24727dd7cddfSDavid du Colombier it = iftest(line, bp); 24737dd7cddfSDavid du Colombier return it; 24747dd7cddfSDavid du Colombier } 24757dd7cddfSDavid du Colombier 24767dd7cddfSDavid du Colombier void 24777dd7cddfSDavid du Colombier g_ie(char *line, char *e) 24787dd7cddfSDavid du Colombier { 24797dd7cddfSDavid du Colombier char *b; 24807dd7cddfSDavid du Colombier 24817dd7cddfSDavid du Colombier if (elsetop >= Maxif-1) { 24827dd7cddfSDavid du Colombier fprint(2, "ms2html: .ie's too deep\n"); 24837dd7cddfSDavid du Colombier return; 24847dd7cddfSDavid du Colombier } 24857dd7cddfSDavid du Colombier if (ifwastrue[++elsetop] = ifstart(line, e, &b)) 24867dd7cddfSDavid du Colombier pushbody(b); 24877dd7cddfSDavid du Colombier else 24887dd7cddfSDavid du Colombier skipbody(b); 24897dd7cddfSDavid du Colombier } 24907dd7cddfSDavid du Colombier 24917dd7cddfSDavid du Colombier void 24927dd7cddfSDavid du Colombier g_if(char *line, char *e) 24937dd7cddfSDavid du Colombier { 24947dd7cddfSDavid du Colombier char *b; 24957dd7cddfSDavid du Colombier 24967dd7cddfSDavid du Colombier if (ifstart(line, e, &b)) 24977dd7cddfSDavid du Colombier pushbody(b); 24987dd7cddfSDavid du Colombier else 24997dd7cddfSDavid du Colombier skipbody(b); 25007dd7cddfSDavid du Colombier } 25017dd7cddfSDavid du Colombier 25027dd7cddfSDavid du Colombier void 25037dd7cddfSDavid du Colombier g_el(char *line, char *e) 25047dd7cddfSDavid du Colombier { 25057dd7cddfSDavid du Colombier if (elsetop < 0) 25067dd7cddfSDavid du Colombier return; 25077dd7cddfSDavid du Colombier scanline(line, e, 1); 25087dd7cddfSDavid du Colombier if (ifwastrue[elsetop--]) 25097dd7cddfSDavid du Colombier skipbody(line); 25107dd7cddfSDavid du Colombier else 25117dd7cddfSDavid du Colombier pushbody(line); 25127dd7cddfSDavid du Colombier } 25137dd7cddfSDavid du Colombier 25147dd7cddfSDavid du Colombier void 25157dd7cddfSDavid du Colombier g_ig(int argc, char **argv) 25167dd7cddfSDavid du Colombier { 25177dd7cddfSDavid du Colombier char *p, *s; 25187dd7cddfSDavid du Colombier 25197dd7cddfSDavid du Colombier s = ".."; 25207dd7cddfSDavid du Colombier if (argc > 1) 25217dd7cddfSDavid du Colombier s = argv[1]; 25227dd7cddfSDavid du Colombier for(;;) { 25237dd7cddfSDavid du Colombier p = Brdline(&ssp->in, '\n'); 25247dd7cddfSDavid du Colombier if(p == nil) 25257dd7cddfSDavid du Colombier break; 25267dd7cddfSDavid du Colombier p[Blinelen(&ssp->in)-1] = 0; 25277dd7cddfSDavid du Colombier if(strcmp(p, s) == 0) 25287dd7cddfSDavid du Colombier break; 25297dd7cddfSDavid du Colombier } 25307dd7cddfSDavid du Colombier } 25317dd7cddfSDavid du Colombier 25327dd7cddfSDavid du Colombier void 25337dd7cddfSDavid du Colombier g_ds(char *line, char *e) 25347dd7cddfSDavid du Colombier { 25357dd7cddfSDavid du Colombier char *b; 25367dd7cddfSDavid du Colombier 25377dd7cddfSDavid du Colombier b = copyline(line, e, 1); 25387dd7cddfSDavid du Colombier if (b > line) { 25397dd7cddfSDavid du Colombier copyline(b, e, 0); 25407dd7cddfSDavid du Colombier if (*b == '"') 25417dd7cddfSDavid du Colombier b++; 25427dd7cddfSDavid du Colombier ds(line, b); 25437dd7cddfSDavid du Colombier } 25447dd7cddfSDavid du Colombier } 25457dd7cddfSDavid du Colombier 25467dd7cddfSDavid du Colombier void 25477dd7cddfSDavid du Colombier g_as(char *line, char *e) 25487dd7cddfSDavid du Colombier { 25497dd7cddfSDavid du Colombier String *s; 25507dd7cddfSDavid du Colombier char *b; 25517dd7cddfSDavid du Colombier 25527dd7cddfSDavid du Colombier b = copyline(line, e, 1); 25537dd7cddfSDavid du Colombier if (b == line) 25547dd7cddfSDavid du Colombier return; 25557dd7cddfSDavid du Colombier copyline(b, e, 0); 25567dd7cddfSDavid du Colombier if (*b == '"') 25577dd7cddfSDavid du Colombier b++; 25587dd7cddfSDavid du Colombier for(s = strings; s != nil; s = s->next) 25597dd7cddfSDavid du Colombier if(strcmp(line, s->name) == 0) 25607dd7cddfSDavid du Colombier break; 25617dd7cddfSDavid du Colombier 25627dd7cddfSDavid du Colombier if(s == nil){ 25637dd7cddfSDavid du Colombier ds(line, b); 25647dd7cddfSDavid du Colombier return; 25657dd7cddfSDavid du Colombier } 25667dd7cddfSDavid du Colombier 25677dd7cddfSDavid du Colombier s->val = realloc(s->val, strlen(s->val) + strlen(b) + 1); 25687dd7cddfSDavid du Colombier strcat(s->val, b); 25697dd7cddfSDavid du Colombier } 25707dd7cddfSDavid du Colombier 25717dd7cddfSDavid du Colombier void 25727dd7cddfSDavid du Colombier g_BS(int argc, char **argv) 25737dd7cddfSDavid du Colombier { 25747dd7cddfSDavid du Colombier int i; 25757dd7cddfSDavid du Colombier 25767dd7cddfSDavid du Colombier if (argc > 1 && !weBref) { 25777dd7cddfSDavid du Colombier Bprint(&bout, "<a href=\"%s\"", argv[1]); 25787dd7cddfSDavid du Colombier for(i = 2; i < argc; i++) 25797dd7cddfSDavid du Colombier Bprint(&bout, " %s", argv[i]); 25807dd7cddfSDavid du Colombier Bprint(&bout, ">"); 25817dd7cddfSDavid du Colombier weBref = 1; 25827dd7cddfSDavid du Colombier } 25837dd7cddfSDavid du Colombier } 25847dd7cddfSDavid du Colombier 25857dd7cddfSDavid du Colombier void 25867dd7cddfSDavid du Colombier g_BE(int, char**) 25877dd7cddfSDavid du Colombier { 25887dd7cddfSDavid du Colombier if (weBref) { 25897dd7cddfSDavid du Colombier Bprint(&bout, "</a>"); 25907dd7cddfSDavid du Colombier weBref = 0; 25917dd7cddfSDavid du Colombier } 25927dd7cddfSDavid du Colombier } 25937dd7cddfSDavid du Colombier 25947dd7cddfSDavid du Colombier void 25957dd7cddfSDavid du Colombier g_LB(int argc, char **argv) 25967dd7cddfSDavid du Colombier { 25977dd7cddfSDavid du Colombier if (argc > 1) { 25987dd7cddfSDavid du Colombier if (weBref) 25997dd7cddfSDavid du Colombier g_BE(0,nil); 26007dd7cddfSDavid du Colombier Bprint(&bout, "<a name=\"%s\"></a>", argv[1]); 26017dd7cddfSDavid du Colombier } 26027dd7cddfSDavid du Colombier } 26037dd7cddfSDavid du Colombier 26047dd7cddfSDavid du Colombier void 26057dd7cddfSDavid du Colombier g_RT(int, char**) 26067dd7cddfSDavid du Colombier { 26077dd7cddfSDavid du Colombier g_BE(0,nil); 26087dd7cddfSDavid du Colombier dohanginghead(); 26097dd7cddfSDavid du Colombier closel(); 26107dd7cddfSDavid du Colombier closefont(); 26117dd7cddfSDavid du Colombier } 2612