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, 18da51d93aSDavid 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 = "$$"; 28*73e742d7SDavid du Colombier char *basename; 29*73e742d7SDavid du Colombier char *title; 306b6b9ac8SDavid du Colombier int eqnmode; 316b6b9ac8SDavid du Colombier 327dd7cddfSDavid du Colombier int quiet; 337dd7cddfSDavid du Colombier float indent; /* from .in */ 347dd7cddfSDavid du Colombier Biobuf bout; 357dd7cddfSDavid du Colombier int isup; 367dd7cddfSDavid du Colombier int isdown; 377dd7cddfSDavid du Colombier int debug; 387dd7cddfSDavid du Colombier 397dd7cddfSDavid du Colombier int nh[Maxnh]; 407dd7cddfSDavid du Colombier int ifwastrue[Maxif]; 417dd7cddfSDavid du Colombier 427dd7cddfSDavid du Colombier int list, listnum, example; 43*73e742d7SDavid du Colombier int hangingau, hangingdt, hanginghead, hangingcenter; 447dd7cddfSDavid du Colombier int indirective, paragraph, sol, titleseen, ignore_nl, weBref; 45*73e742d7SDavid du Colombier void dohangingcenter(void); 467dd7cddfSDavid du Colombier 477dd7cddfSDavid du Colombier typedef struct Goobie Goobie; 487dd7cddfSDavid du Colombier typedef struct Goobieif Goobieif; 497dd7cddfSDavid du Colombier struct Goobie 507dd7cddfSDavid du Colombier { 517dd7cddfSDavid du Colombier char *name; 527dd7cddfSDavid du Colombier void (*f)(int, char**); 537dd7cddfSDavid du Colombier }; 547dd7cddfSDavid du Colombier 557dd7cddfSDavid du Colombier typedef void F(int, char**); 567dd7cddfSDavid du Colombier typedef void Fif(char*, char*); 577dd7cddfSDavid du Colombier 587dd7cddfSDavid du Colombier struct Goobieif 597dd7cddfSDavid du Colombier { 607dd7cddfSDavid du Colombier char *name; 617dd7cddfSDavid du Colombier Fif *f; 627dd7cddfSDavid du Colombier }; 637dd7cddfSDavid du Colombier 647dd7cddfSDavid du Colombier /* if, ie */ 657dd7cddfSDavid du Colombier Fif g_as, g_ds, g_el, g_ie, g_if; 667dd7cddfSDavid du Colombier Goobieif gtabif[] = { 677dd7cddfSDavid du Colombier { "as", g_as }, 687dd7cddfSDavid du Colombier { "ds", g_ds }, 697dd7cddfSDavid du Colombier { "if", g_if }, 707dd7cddfSDavid du Colombier { "ie", g_ie }, 717dd7cddfSDavid du Colombier { "el", g_el }, 727dd7cddfSDavid du Colombier { nil, nil }, 737dd7cddfSDavid du Colombier }; 747dd7cddfSDavid du Colombier 757dd7cddfSDavid du Colombier /* pseudo ops */ 767dd7cddfSDavid du Colombier F g_notyet, g_ignore, g_hrule, g_startgif; 777dd7cddfSDavid du Colombier 787dd7cddfSDavid du Colombier /* ms macros */ 797dd7cddfSDavid du Colombier F g_AU, g_B, g_BI, g_CW, g_I, g_IP, g_LP, g_PP, g_SH, g_NH; 807dd7cddfSDavid 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; 817dd7cddfSDavid du Colombier F g_PY, g_IH, g_MH, g_HO, g_BX, g_QS, g_QE, g_RS, g_RE; 827dd7cddfSDavid du Colombier 837dd7cddfSDavid du Colombier /* pictures macro */ 847dd7cddfSDavid du Colombier F g_BP; 857dd7cddfSDavid du Colombier 867dd7cddfSDavid du Colombier /* real troff */ 877dd7cddfSDavid du Colombier F g_br, g_ft, g_sp, g_de, g_lf, g_so, g_rm, g_in; 887dd7cddfSDavid du Colombier F g_nr, g_ig, g_RT, g_BS, g_BE, g_LB, g_ta; 897dd7cddfSDavid du Colombier 907dd7cddfSDavid du Colombier /* macros to include ML in output */ 917dd7cddfSDavid du Colombier F g__H, g__T; 927dd7cddfSDavid du Colombier 937dd7cddfSDavid du Colombier Goobie gtab[] = 947dd7cddfSDavid du Colombier { 957dd7cddfSDavid du Colombier { "_T", g__T, }, 967dd7cddfSDavid du Colombier { "_H", g__H, }, 977dd7cddfSDavid du Colombier { "1C", g_ignore, }, 987dd7cddfSDavid du Colombier { "2C", g_ignore, }, 997dd7cddfSDavid du Colombier { "AB", g_AB, }, 1007dd7cddfSDavid du Colombier { "AE", g_AE, }, 1017dd7cddfSDavid du Colombier { "AI", g_ignore, }, 1027dd7cddfSDavid du Colombier { "AU", g_AU, }, 1037dd7cddfSDavid du Colombier { "B", g_B, }, 1047dd7cddfSDavid du Colombier { "B1", g_hrule, }, 1057dd7cddfSDavid du Colombier { "B2", g_hrule, }, 1067dd7cddfSDavid du Colombier { "BI", g_BI, }, 1077dd7cddfSDavid du Colombier { "BP", g_BP, }, 1087dd7cddfSDavid du Colombier { "BT", g_ignore, }, 1097dd7cddfSDavid du Colombier { "BX", g_BX, }, 1107dd7cddfSDavid du Colombier { "CW", g_CW, }, 1117dd7cddfSDavid du Colombier { "CT", g_ignore, }, 1127dd7cddfSDavid du Colombier { "DA", g_ignore, }, 1137dd7cddfSDavid du Colombier { "DE", g_P2, }, 1147dd7cddfSDavid du Colombier { "DS", g_P1, }, 1157dd7cddfSDavid du Colombier { "EG", g_ignore, }, 1167dd7cddfSDavid du Colombier { "EN", g_ignore, }, 1177dd7cddfSDavid du Colombier { "EQ", g_startgif, }, 1187dd7cddfSDavid du Colombier { "FE", g_FE, }, 1197dd7cddfSDavid du Colombier { "FP", g_ignore, }, 1207dd7cddfSDavid du Colombier { "FS", g_FS, }, 1217dd7cddfSDavid du Colombier { "HO", g_HO, }, 1227dd7cddfSDavid du Colombier { "I", g_I, }, 1237dd7cddfSDavid du Colombier { "IH", g_IH, }, 1247dd7cddfSDavid du Colombier { "IM", g_ignore, }, 1257dd7cddfSDavid du Colombier { "IP", g_IP, }, 1267dd7cddfSDavid du Colombier { "KE", g_ignore, }, 1277dd7cddfSDavid du Colombier { "KF", g_ignore, }, 1287dd7cddfSDavid du Colombier { "KS", g_ignore, }, 1297dd7cddfSDavid du Colombier { "LG", g_ignore, }, 1307dd7cddfSDavid du Colombier { "LP", g_LP, }, 1317dd7cddfSDavid du Colombier { "LT", g_ignore, }, 1327dd7cddfSDavid du Colombier { "MF", g_ignore, }, 1337dd7cddfSDavid du Colombier { "MH", g_MH, }, 1347dd7cddfSDavid du Colombier { "MR", g_ignore, }, 1357dd7cddfSDavid du Colombier { "ND", g_ignore, }, 1367dd7cddfSDavid du Colombier { "NH", g_NH, }, 1377dd7cddfSDavid du Colombier { "NL", g_ignore, }, 1387dd7cddfSDavid du Colombier { "P1", g_P1, }, 1397dd7cddfSDavid du Colombier { "P2", g_P2, }, 1407dd7cddfSDavid du Colombier { "PE", g_ignore, }, 1417dd7cddfSDavid du Colombier { "PF", g_ignore, }, 1427dd7cddfSDavid du Colombier { "PP", g_PP, }, 1437dd7cddfSDavid du Colombier { "PS", g_startgif, }, 1447dd7cddfSDavid du Colombier { "PY", g_PY, }, 1457dd7cddfSDavid du Colombier { "QE", g_QE, }, 1467dd7cddfSDavid du Colombier { "QP", g_QS, }, 1477dd7cddfSDavid du Colombier { "QS", g_QS, }, 1487dd7cddfSDavid du Colombier { "R", g_R, }, 1497dd7cddfSDavid du Colombier { "RE", g_RE, }, 1507dd7cddfSDavid du Colombier { "RP", g_ignore, }, 1517dd7cddfSDavid du Colombier { "RS", g_RS, }, 1527dd7cddfSDavid du Colombier { "SG", g_ignore, }, 1537dd7cddfSDavid du Colombier { "SH", g_SH, }, 1547dd7cddfSDavid du Colombier { "SM", g_ignore, }, 1557dd7cddfSDavid du Colombier { "TA", g_ignore, }, 1567dd7cddfSDavid du Colombier { "TE", g_ignore, }, 1577dd7cddfSDavid du Colombier { "TH", g_TL, }, 1587dd7cddfSDavid du Colombier { "TL", g_TL, }, 1597dd7cddfSDavid du Colombier { "TM", g_ignore, }, 1607dd7cddfSDavid du Colombier { "TR", g_ignore, }, 1617dd7cddfSDavid du Colombier { "TS", g_startgif, }, 1627dd7cddfSDavid du Colombier { "UL", g_I, }, 1637dd7cddfSDavid du Colombier { "UX", g_ignore, }, 1647dd7cddfSDavid du Colombier { "WH", g_ignore, }, 1657dd7cddfSDavid du Colombier { "RT", g_RT, }, 1667dd7cddfSDavid du Colombier 1677dd7cddfSDavid du Colombier { "br", g_br, }, 1687dd7cddfSDavid du Colombier { "ti", g_br, }, 1697dd7cddfSDavid du Colombier { "nf", g_P1, }, 1707dd7cddfSDavid du Colombier { "fi", g_P2, }, 1717dd7cddfSDavid du Colombier { "ft", g_ft, }, 1727dd7cddfSDavid du Colombier { "sp", g_sp, }, 1737dd7cddfSDavid du Colombier { "rm", g_rm, }, 1747dd7cddfSDavid du Colombier { "de", g_de, }, 1757dd7cddfSDavid du Colombier { "am", g_de, }, 1767dd7cddfSDavid du Colombier { "lf", g_lf, }, 1777dd7cddfSDavid du Colombier { "so", g_so, }, 1787dd7cddfSDavid du Colombier { "ps", g_ignore }, 1797dd7cddfSDavid du Colombier { "vs", g_ignore }, 1807dd7cddfSDavid du Colombier { "nr", g_nr }, 1817dd7cddfSDavid du Colombier { "in", g_in }, 1827dd7cddfSDavid du Colombier { "ne", g_ignore }, 1837dd7cddfSDavid du Colombier { "ig", g_ig }, 1847dd7cddfSDavid du Colombier { "BS", g_BS }, 1857dd7cddfSDavid du Colombier { "BE", g_BE }, 1867dd7cddfSDavid du Colombier { "LB", g_LB }, 1877dd7cddfSDavid du Colombier { nil, nil }, 1887dd7cddfSDavid du Colombier }; 1897dd7cddfSDavid du Colombier 1907dd7cddfSDavid du Colombier typedef struct Entity Entity; 1917dd7cddfSDavid du Colombier struct Entity 1927dd7cddfSDavid du Colombier { 1937dd7cddfSDavid du Colombier char *name; 1947dd7cddfSDavid du Colombier int value; 1957dd7cddfSDavid du Colombier }; 1967dd7cddfSDavid du Colombier 1977dd7cddfSDavid du Colombier Entity entity[] = 1987dd7cddfSDavid du Colombier { 1997dd7cddfSDavid du Colombier { "&#SPACE;", L' ', }, 2007dd7cddfSDavid du Colombier { "&#RS;", L'\n', }, 2017dd7cddfSDavid du Colombier { "&#RE;", L'\r', }, 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 { "½", L'½', }, 2977dd7cddfSDavid du Colombier { "¾", L'¾', }, 2987dd7cddfSDavid du Colombier { "¿", L'¿', }, 2997dd7cddfSDavid du Colombier 3007dd7cddfSDavid du Colombier { "*", L'•', }, 3017dd7cddfSDavid du Colombier { "¤", L'□', }, 3027dd7cddfSDavid du Colombier { "º", L'◊', }, 3037dd7cddfSDavid du Colombier { "(tm)", 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'φ',}, 3516b6b9ac8SDavid du Colombier {"χ", L'χ',}, 3526b6b9ac8SDavid du Colombier {"ψ", L'ψ',}, 3536b6b9ac8SDavid du Colombier {"ω", L'ω',}, 3547dd7cddfSDavid du Colombier 3556b6b9ac8SDavid du Colombier { "<-", L'←', }, 3566b6b9ac8SDavid du Colombier { "^", L'↑', }, 3576b6b9ac8SDavid du Colombier { "->", L'→', }, 3586b6b9ac8SDavid du Colombier { "v", L'↓', }, 3596b6b9ac8SDavid du Colombier { "!=", L'≠', }, 3606b6b9ac8SDavid du Colombier { "<=", L'≤', }, 3616b6b9ac8SDavid du Colombier { "...", L'⋯', }, 3626b6b9ac8SDavid du Colombier {"∈", L'∈', }, 3636b6b9ac8SDavid du Colombier 3646b6b9ac8SDavid du Colombier {"–", L'–', }, 3656b6b9ac8SDavid du Colombier {"—", L'—', }, 3667dd7cddfSDavid du Colombier 3677dd7cddfSDavid du Colombier { "CYRILLIC XYZZY", L'й', }, 3687dd7cddfSDavid du Colombier { "CYRILLIC XYZZY", L'ъ', }, 3697dd7cddfSDavid du Colombier { "CYRILLIC Y", L'ь', }, 3707dd7cddfSDavid du Colombier { "CYRILLIC YA", L'я', }, 3717dd7cddfSDavid du Colombier { "CYRILLIC YA", L'ё', }, 3727dd7cddfSDavid du Colombier { "¿", L'ℱ', }, 3737dd7cddfSDavid du Colombier 3747dd7cddfSDavid du Colombier { nil, 0 }, 3757dd7cddfSDavid du Colombier }; 3767dd7cddfSDavid du Colombier 3777dd7cddfSDavid du Colombier typedef struct Troffspec Troffspec; 3787dd7cddfSDavid du Colombier struct Troffspec 3797dd7cddfSDavid du Colombier { 3807dd7cddfSDavid du Colombier char *name; 3817dd7cddfSDavid du Colombier char *value; 3827dd7cddfSDavid du Colombier }; 3837dd7cddfSDavid du Colombier 3847dd7cddfSDavid du Colombier Troffspec tspec[] = 3857dd7cddfSDavid du Colombier { 3867dd7cddfSDavid du Colombier { "A*", "Å", }, 3877dd7cddfSDavid du Colombier { "o\"", "ö", }, 3887dd7cddfSDavid du Colombier { "ff", "ff", }, 3897dd7cddfSDavid du Colombier { "fi", "fi", }, 3907dd7cddfSDavid du Colombier { "fl", "fl", }, 3917dd7cddfSDavid du Colombier { "Fi", "ffi", }, 3927dd7cddfSDavid du Colombier { "ru", "_", }, 3937dd7cddfSDavid du Colombier { "em", "­", }, 3947dd7cddfSDavid du Colombier { "14", "¼", }, 3957dd7cddfSDavid du Colombier { "12", "½", }, 3967dd7cddfSDavid du Colombier { "co", "©", }, 3977dd7cddfSDavid du Colombier { "de", "°", }, 3987dd7cddfSDavid du Colombier { "dg", "¡", }, 3997dd7cddfSDavid du Colombier { "fm", "´", }, 4007dd7cddfSDavid du Colombier { "rg", "®", }, 4017dd7cddfSDavid du Colombier { "bu", "*", }, 4027dd7cddfSDavid du Colombier { "sq", "¤", }, 4037dd7cddfSDavid du Colombier { "hy", "-", }, 4047dd7cddfSDavid du Colombier { "pl", "+", }, 4057dd7cddfSDavid du Colombier { "mi", "-", }, 4067dd7cddfSDavid du Colombier { "mu", "×", }, 4077dd7cddfSDavid du Colombier { "di", "÷", }, 4087dd7cddfSDavid du Colombier { "eq", "=", }, 4097dd7cddfSDavid du Colombier { "==", "==", }, 4107dd7cddfSDavid du Colombier { ">=", ">=", }, 4117dd7cddfSDavid du Colombier { "<=", "<=", }, 4127dd7cddfSDavid du Colombier { "!=", "!=", }, 4137dd7cddfSDavid du Colombier { "+-", "±", }, 4147dd7cddfSDavid du Colombier { "no", "¬", }, 4157dd7cddfSDavid du Colombier { "sl", "/", }, 4167dd7cddfSDavid du Colombier { "ap", "&", }, 4177dd7cddfSDavid du Colombier { "~=", "~=", }, 4187dd7cddfSDavid du Colombier { "pt", "oc", }, 4197dd7cddfSDavid du Colombier { "gr", "GRAD", }, 4207dd7cddfSDavid du Colombier { "->", "->", }, 4217dd7cddfSDavid du Colombier { "<-", "<-", }, 4227dd7cddfSDavid du Colombier { "ua", "^", }, 4237dd7cddfSDavid du Colombier { "da", "v", }, 4247dd7cddfSDavid du Colombier { "is", "Integral", }, 4257dd7cddfSDavid du Colombier { "pd", "DIV", }, 4267dd7cddfSDavid du Colombier { "if", "oo", }, 4277dd7cddfSDavid du Colombier { "sr", "-/", }, 4287dd7cddfSDavid du Colombier { "sb", "(~", }, 4297dd7cddfSDavid du Colombier { "sp", "~)", }, 4307dd7cddfSDavid du Colombier { "cu", "U", }, 4317dd7cddfSDavid du Colombier { "ca", "(^)", }, 4327dd7cddfSDavid du Colombier { "ib", "(=", }, 4337dd7cddfSDavid du Colombier { "ip", "=)", }, 4347dd7cddfSDavid du Colombier { "mo", "C", }, 4357dd7cddfSDavid du Colombier { "es", "Ø", }, 4367dd7cddfSDavid du Colombier { "aa", "´", }, 4377dd7cddfSDavid du Colombier { "ga", "`", }, 4387dd7cddfSDavid du Colombier { "ci", "O", }, 4397dd7cddfSDavid du Colombier { "L1", "DEATHSTAR", }, 4407dd7cddfSDavid du Colombier { "sc", "§", }, 4417dd7cddfSDavid du Colombier { "dd", "++", }, 4427dd7cddfSDavid du Colombier { "lh", "<=", }, 4437dd7cddfSDavid du Colombier { "rh", "=>", }, 4447dd7cddfSDavid du Colombier { "lt", "(", }, 4457dd7cddfSDavid du Colombier { "rt", ")", }, 4467dd7cddfSDavid du Colombier { "lc", "|", }, 4477dd7cddfSDavid du Colombier { "rc", "|", }, 4487dd7cddfSDavid du Colombier { "lb", "(", }, 4497dd7cddfSDavid du Colombier { "rb", ")", }, 4507dd7cddfSDavid du Colombier { "lf", "|", }, 4517dd7cddfSDavid du Colombier { "rf", "|", }, 4527dd7cddfSDavid du Colombier { "lk", "|", }, 4537dd7cddfSDavid du Colombier { "rk", "|", }, 4547dd7cddfSDavid du Colombier { "bv", "|", }, 4557dd7cddfSDavid du Colombier { "ts", "s", }, 4567dd7cddfSDavid du Colombier { "br", "|", }, 4577dd7cddfSDavid du Colombier { "or", "|", }, 4587dd7cddfSDavid du Colombier { "ul", "_", }, 4597dd7cddfSDavid du Colombier { "rn", " ", }, 4607dd7cddfSDavid du Colombier { "**", "*", }, 4616b6b9ac8SDavid du Colombier { "tm", "™", }, 4627dd7cddfSDavid du Colombier { nil, nil, }, 4637dd7cddfSDavid du Colombier }; 4647dd7cddfSDavid du Colombier 4657dd7cddfSDavid du Colombier typedef struct Font Font; 4667dd7cddfSDavid du Colombier struct Font 4677dd7cddfSDavid du Colombier { 4687dd7cddfSDavid du Colombier char *start; 4697dd7cddfSDavid du Colombier char *end; 4707dd7cddfSDavid du Colombier }; 4717dd7cddfSDavid du Colombier Font bfont = { "<B>", "</B>" }; 4727dd7cddfSDavid du Colombier Font ifont = { "<I>", "</I>" }; 4737dd7cddfSDavid du Colombier Font bifont = { "<B><I>", "</I></B>" }; 4747dd7cddfSDavid du Colombier Font cwfont = { "<TT>", "</TT>" }; 475da51d93aSDavid du Colombier Font *fstack[Maxfsp]; 476da51d93aSDavid du Colombier int fsp = -1; 4777dd7cddfSDavid du Colombier 4787dd7cddfSDavid du Colombier typedef struct String String; 4797dd7cddfSDavid du Colombier struct String 4807dd7cddfSDavid du Colombier { 4817dd7cddfSDavid du Colombier String *next; 4827dd7cddfSDavid du Colombier char *name; 4837dd7cddfSDavid du Colombier char *val; 4847dd7cddfSDavid du Colombier }; 4857dd7cddfSDavid du Colombier String *numregs, *strings; 4867dd7cddfSDavid du Colombier char *strstack[Maxmstack]; 4877dd7cddfSDavid du Colombier char *mustfree[Maxmstack]; 4887dd7cddfSDavid du Colombier int strsp = -1; 4897dd7cddfSDavid du Colombier int elsetop = -1; 4907dd7cddfSDavid du Colombier 4917dd7cddfSDavid du Colombier typedef struct Mstack Mstack; 4927dd7cddfSDavid du Colombier struct Mstack 4937dd7cddfSDavid du Colombier { 4947dd7cddfSDavid du Colombier char *ptr; 4957dd7cddfSDavid du Colombier char *argv[Narg+1]; 4967dd7cddfSDavid du Colombier }; 4977dd7cddfSDavid du Colombier String *macros; 4987dd7cddfSDavid du Colombier Mstack mstack[Maxmstack]; 4997dd7cddfSDavid du Colombier int msp = -1; 5007dd7cddfSDavid du Colombier 5017dd7cddfSDavid du Colombier typedef struct Srcstack Srcstack; 5027dd7cddfSDavid du Colombier struct Srcstack 5037dd7cddfSDavid du Colombier { 5047dd7cddfSDavid du Colombier char filename[256]; 5057dd7cddfSDavid du Colombier int fd; 5067dd7cddfSDavid du Colombier int lno; 5077dd7cddfSDavid du Colombier int rlno; 5087dd7cddfSDavid du Colombier Biobuf in; 5097dd7cddfSDavid du Colombier }; 5107dd7cddfSDavid du Colombier Srcstack sstack[Maxsstack]; 5117dd7cddfSDavid du Colombier Srcstack *ssp = &sstack[-1]; 5127dd7cddfSDavid du Colombier 5137dd7cddfSDavid du Colombier char token[128]; 5147dd7cddfSDavid du Colombier 5157dd7cddfSDavid du Colombier void closel(void); 5167dd7cddfSDavid du Colombier void closefont(void); 5177dd7cddfSDavid du Colombier 5187dd7cddfSDavid du Colombier void* 5197dd7cddfSDavid du Colombier emalloc(uint n) 5207dd7cddfSDavid du Colombier { 5217dd7cddfSDavid du Colombier void *p; 5227dd7cddfSDavid du Colombier 5237dd7cddfSDavid du Colombier p = mallocz(n, 1); 5247dd7cddfSDavid du Colombier if(p == nil){ 5257dd7cddfSDavid du Colombier fprint(2, "ms2html: malloc failed: %r\n"); 5267dd7cddfSDavid du Colombier exits("malloc"); 5277dd7cddfSDavid du Colombier } 5287dd7cddfSDavid du Colombier return p; 5297dd7cddfSDavid du Colombier } 5307dd7cddfSDavid du Colombier 5317dd7cddfSDavid du Colombier 5327dd7cddfSDavid du Colombier /* define a string variable */ 5337dd7cddfSDavid du Colombier void 5347dd7cddfSDavid du Colombier dsnr(char *name, char *val, String **l) 5357dd7cddfSDavid du Colombier { 5367dd7cddfSDavid du Colombier String *s; 5377dd7cddfSDavid du Colombier 5387dd7cddfSDavid du Colombier for(s = *l; s != nil; s = *l){ 5397dd7cddfSDavid du Colombier if(strcmp(s->name, name) == 0) 5407dd7cddfSDavid du Colombier break; 5417dd7cddfSDavid du Colombier l = &s->next; 5427dd7cddfSDavid du Colombier } 5437dd7cddfSDavid du Colombier if(s == nil){ 5447dd7cddfSDavid du Colombier s = emalloc(sizeof(String)); 5457dd7cddfSDavid du Colombier *l = s; 5467dd7cddfSDavid du Colombier s->name = strdup(name); 5477dd7cddfSDavid du Colombier } else 5487dd7cddfSDavid du Colombier free(s->val); 5497dd7cddfSDavid du Colombier s->val = strdup(val); 5507dd7cddfSDavid du Colombier } 5517dd7cddfSDavid du Colombier 5527dd7cddfSDavid du Colombier void 5537dd7cddfSDavid du Colombier ds(char *name, char *val) 5547dd7cddfSDavid du Colombier { 5557dd7cddfSDavid du Colombier dsnr(name, val, &strings); 5567dd7cddfSDavid du Colombier } 5577dd7cddfSDavid du Colombier 5587dd7cddfSDavid du Colombier /* look up a defined string */ 5597dd7cddfSDavid du Colombier char* 5607dd7cddfSDavid du Colombier getds(char *name) 5617dd7cddfSDavid du Colombier { 5627dd7cddfSDavid du Colombier String *s; 5637dd7cddfSDavid du Colombier 5647dd7cddfSDavid du Colombier for(s = strings; s != nil; s = s->next) 5657dd7cddfSDavid du Colombier if(strcmp(name, s->name) == 0) 5667dd7cddfSDavid du Colombier break; 5677dd7cddfSDavid du Colombier if(s != nil) 5687dd7cddfSDavid du Colombier return s->val; 5697dd7cddfSDavid du Colombier return ""; 5707dd7cddfSDavid du Colombier } 5717dd7cddfSDavid du Colombier 5727dd7cddfSDavid du Colombier char * 5737dd7cddfSDavid du Colombier getnr(char *name) 5747dd7cddfSDavid du Colombier { 5757dd7cddfSDavid du Colombier String *s; 5767dd7cddfSDavid du Colombier 5777dd7cddfSDavid du Colombier for(s = numregs; s != nil; s = s->next) 5787dd7cddfSDavid du Colombier if(strcmp(name, s->name) == 0) 5797dd7cddfSDavid du Colombier break; 5807dd7cddfSDavid du Colombier if(s != nil) 5817dd7cddfSDavid du Colombier return s->val; 5827dd7cddfSDavid du Colombier return "0"; 5837dd7cddfSDavid du Colombier } 5847dd7cddfSDavid du Colombier 5857dd7cddfSDavid du Colombier void 5867dd7cddfSDavid du Colombier pushstr(char *p) 5877dd7cddfSDavid du Colombier { 5887dd7cddfSDavid du Colombier if(p == nil) 5897dd7cddfSDavid du Colombier return; 5907dd7cddfSDavid du Colombier if(strsp >= Maxmstack - 1) 5917dd7cddfSDavid du Colombier return; 5927dd7cddfSDavid du Colombier strstack[++strsp] = p; 5937dd7cddfSDavid du Colombier } 5947dd7cddfSDavid du Colombier 5957dd7cddfSDavid du Colombier 5967dd7cddfSDavid du Colombier /* lookup a defined macro */ 5977dd7cddfSDavid du Colombier char* 5987dd7cddfSDavid du Colombier getmacro(char *name) 5997dd7cddfSDavid du Colombier { 6007dd7cddfSDavid du Colombier String *s; 6017dd7cddfSDavid du Colombier 6027dd7cddfSDavid du Colombier for(s = macros; s != nil; s = s->next) 6037dd7cddfSDavid du Colombier if(strcmp(name, s->name) == 0) 6047dd7cddfSDavid du Colombier return s->val; 6057dd7cddfSDavid du Colombier return nil; 6067dd7cddfSDavid du Colombier } 6077dd7cddfSDavid du Colombier 6087dd7cddfSDavid du Colombier enum 6097dd7cddfSDavid du Colombier { 6107dd7cddfSDavid du Colombier Dstring, 6117dd7cddfSDavid du Colombier Macro, 6127dd7cddfSDavid du Colombier Input, 6137dd7cddfSDavid du Colombier }; 6147dd7cddfSDavid du Colombier int lastsrc; 6157dd7cddfSDavid du Colombier 6167dd7cddfSDavid du Colombier void 6177dd7cddfSDavid du Colombier pushsrc(char *name) 6187dd7cddfSDavid du Colombier { 6199a747e4fSDavid du Colombier Dir *d; 6207dd7cddfSDavid du Colombier int fd; 6217dd7cddfSDavid du Colombier 6227dd7cddfSDavid du Colombier if(ssp == &sstack[Maxsstack-1]){ 6237dd7cddfSDavid du Colombier fprint(2, "ms2html: .so's too deep\n"); 6247dd7cddfSDavid du Colombier return; 6257dd7cddfSDavid du Colombier } 6269a747e4fSDavid du Colombier d = nil; 6277dd7cddfSDavid du Colombier if(name == nil){ 6289a747e4fSDavid du Colombier d = dirfstat(0); 6299a747e4fSDavid du Colombier if(d == nil){ 6309a747e4fSDavid du Colombier fprint(2, "ms2html: can't stat %s: %r\n", name); 6319a747e4fSDavid du Colombier return; 6329a747e4fSDavid du Colombier } 6339a747e4fSDavid du Colombier name = d->name; 6347dd7cddfSDavid du Colombier fd = 0; 6357dd7cddfSDavid du Colombier } else { 6367dd7cddfSDavid du Colombier fd = open(name, OREAD); 6377dd7cddfSDavid du Colombier if(fd < 0){ 6389a747e4fSDavid du Colombier fprint(2, "ms2html: can't open %s: %r\n", name); 6397dd7cddfSDavid du Colombier return; 6407dd7cddfSDavid du Colombier } 6417dd7cddfSDavid du Colombier } 6427dd7cddfSDavid du Colombier ssp++; 6437dd7cddfSDavid du Colombier ssp->fd = fd; 6447dd7cddfSDavid du Colombier Binit(&ssp->in, fd, OREAD); 6457dd7cddfSDavid du Colombier snprint(ssp->filename, sizeof(ssp->filename), "%s", name); 6467dd7cddfSDavid du Colombier ssp->lno = ssp->rlno = 1; 6479a747e4fSDavid du Colombier free(d); 6487dd7cddfSDavid du Colombier } 6497dd7cddfSDavid du Colombier 6507dd7cddfSDavid du Colombier /* get next logical byte. from stdin or a defined string */ 6517dd7cddfSDavid du Colombier int 6527dd7cddfSDavid du Colombier getrune(void) 6537dd7cddfSDavid du Colombier { 6547dd7cddfSDavid du Colombier int i; 6557dd7cddfSDavid du Colombier Rune r; 6567dd7cddfSDavid du Colombier int c; 6577dd7cddfSDavid du Colombier Mstack *m; 6587dd7cddfSDavid du Colombier 6597dd7cddfSDavid du Colombier while(strsp >= 0){ 6607dd7cddfSDavid du Colombier i = chartorune(&r, strstack[strsp]); 6617dd7cddfSDavid du Colombier if(r != 0){ 6627dd7cddfSDavid du Colombier strstack[strsp] += i; 6637dd7cddfSDavid du Colombier lastsrc = Dstring; 6647dd7cddfSDavid du Colombier return r; 6657dd7cddfSDavid du Colombier } 6667dd7cddfSDavid du Colombier if (mustfree[strsp]) { 6677dd7cddfSDavid du Colombier free(mustfree[strsp]); 6687dd7cddfSDavid du Colombier mustfree[strsp] = nil; 6697dd7cddfSDavid du Colombier } 6707dd7cddfSDavid du Colombier strsp--; 6717dd7cddfSDavid du Colombier } 6727dd7cddfSDavid du Colombier while(msp >= 0){ 6737dd7cddfSDavid du Colombier m = &mstack[msp]; 6747dd7cddfSDavid du Colombier i = chartorune(&r, m->ptr); 6757dd7cddfSDavid du Colombier if(r != 0){ 6767dd7cddfSDavid du Colombier m->ptr += i; 6777dd7cddfSDavid du Colombier lastsrc = Macro; 6787dd7cddfSDavid du Colombier return r; 6797dd7cddfSDavid du Colombier } 6807dd7cddfSDavid du Colombier for(i = 0; m->argv[i] != nil; i++) 6817dd7cddfSDavid du Colombier free(m->argv[i]); 6827dd7cddfSDavid du Colombier msp--; 6837dd7cddfSDavid du Colombier } 6847dd7cddfSDavid du Colombier 6857dd7cddfSDavid du Colombier lastsrc = Input; 6867dd7cddfSDavid du Colombier do { 6877dd7cddfSDavid du Colombier if(ssp < sstack) 6887dd7cddfSDavid du Colombier return -1; 6897dd7cddfSDavid du Colombier c = Bgetrune(&ssp->in); 6907dd7cddfSDavid du Colombier if(c >= 0){ 6917dd7cddfSDavid du Colombier r = c; 6927dd7cddfSDavid du Colombier break; 6937dd7cddfSDavid du Colombier } 6947dd7cddfSDavid du Colombier close(ssp->fd); 6957dd7cddfSDavid du Colombier ssp--; 6967dd7cddfSDavid du Colombier } while(r < 0); 6977dd7cddfSDavid du Colombier 6987dd7cddfSDavid du Colombier return r; 6997dd7cddfSDavid du Colombier } 7007dd7cddfSDavid du Colombier 7017dd7cddfSDavid du Colombier void 7027dd7cddfSDavid du Colombier ungetrune(void) 7037dd7cddfSDavid du Colombier { 7047dd7cddfSDavid du Colombier switch(lastsrc){ 7057dd7cddfSDavid du Colombier case Dstring: 7067dd7cddfSDavid du Colombier if(strsp >= 0) 7077dd7cddfSDavid du Colombier strstack[strsp]--; 7087dd7cddfSDavid du Colombier break; 7097dd7cddfSDavid du Colombier case Macro: 7107dd7cddfSDavid du Colombier if(msp >= 0) 7117dd7cddfSDavid du Colombier mstack[msp].ptr--; 7127dd7cddfSDavid du Colombier break; 7137dd7cddfSDavid du Colombier case Input: 7147dd7cddfSDavid du Colombier if(ssp >= sstack) 7157dd7cddfSDavid du Colombier Bungetrune(&ssp->in); 7167dd7cddfSDavid du Colombier break; 7177dd7cddfSDavid du Colombier } 7187dd7cddfSDavid du Colombier } 7197dd7cddfSDavid du Colombier 7207dd7cddfSDavid du Colombier int vert; 7217dd7cddfSDavid du Colombier 7227dd7cddfSDavid du Colombier char* 7237dd7cddfSDavid du Colombier changefont(Font *f) 7247dd7cddfSDavid du Colombier { 7257dd7cddfSDavid du Colombier token[0] = 0; 726da51d93aSDavid du Colombier if(fsp == Maxfsp) 727da51d93aSDavid du Colombier return token; 728da51d93aSDavid du Colombier if(fsp >= 0 && fstack[fsp]) 729da51d93aSDavid du Colombier strcpy(token, fstack[fsp]->end); 7307dd7cddfSDavid du Colombier if(f != nil) 7317dd7cddfSDavid du Colombier strcat(token, f->start); 732da51d93aSDavid du Colombier fstack[++fsp] = f; 733da51d93aSDavid du Colombier return token; 734da51d93aSDavid du Colombier } 735da51d93aSDavid du Colombier 736da51d93aSDavid du Colombier char* 737da51d93aSDavid du Colombier changebackfont(void) 738da51d93aSDavid du Colombier { 739da51d93aSDavid du Colombier token[0] = 0; 740da51d93aSDavid du Colombier if(fsp >= 0){ 741da51d93aSDavid du Colombier if(fstack[fsp]) 742da51d93aSDavid du Colombier strcpy(token, fstack[fsp]->end); 743da51d93aSDavid du Colombier fsp--; 744da51d93aSDavid du Colombier } 745da51d93aSDavid du Colombier if(fsp >= 0 && fstack[fsp]) 746da51d93aSDavid du Colombier strcat(token, fstack[fsp]->start); 7477dd7cddfSDavid du Colombier return token; 7487dd7cddfSDavid du Colombier } 7497dd7cddfSDavid du Colombier 7506b6b9ac8SDavid du Colombier char* 7516b6b9ac8SDavid du Colombier changesize(int amount) 7526b6b9ac8SDavid du Colombier { 7536b6b9ac8SDavid du Colombier static int curamount; 7546b6b9ac8SDavid du Colombier static char buf[200]; 7556b6b9ac8SDavid du Colombier int i; 7566b6b9ac8SDavid du Colombier 7576b6b9ac8SDavid du Colombier buf[0] = 0; 7586b6b9ac8SDavid du Colombier if (curamount >= 0) 7596b6b9ac8SDavid du Colombier for (i = 0; i < curamount; i++) 7606b6b9ac8SDavid du Colombier strcat(buf, "</big>"); 7616b6b9ac8SDavid du Colombier else 7626b6b9ac8SDavid du Colombier for (i = 0; i < -curamount; i++) 7636b6b9ac8SDavid du Colombier strcat(buf, "</small>"); 7646b6b9ac8SDavid du Colombier curamount = 0; 7656b6b9ac8SDavid du Colombier if (amount >= 0) 7666b6b9ac8SDavid du Colombier for (i = 0; i < amount; i++) 7676b6b9ac8SDavid du Colombier strcat(buf, "<big>"); 7686b6b9ac8SDavid du Colombier else 7696b6b9ac8SDavid du Colombier for (i = 0; i < -amount; i++) 7706b6b9ac8SDavid du Colombier strcat(buf, "<small>"); 7716b6b9ac8SDavid du Colombier curamount = amount; 7726b6b9ac8SDavid du Colombier return buf; 7736b6b9ac8SDavid du Colombier } 7746b6b9ac8SDavid du Colombier 7759a747e4fSDavid du Colombier /* get next logical character. expand it with escapes */ 7767dd7cddfSDavid du Colombier char* 7777dd7cddfSDavid du Colombier getnext(void) 7787dd7cddfSDavid du Colombier { 7799a747e4fSDavid du Colombier int r; 7807dd7cddfSDavid du Colombier Entity *e; 7817dd7cddfSDavid du Colombier Troffspec *t; 7827dd7cddfSDavid du Colombier Rune R; 7837dd7cddfSDavid du Colombier char str[4]; 7846b6b9ac8SDavid du Colombier static char buf[8]; 7857dd7cddfSDavid du Colombier 7867dd7cddfSDavid du Colombier r = getrune(); 7877dd7cddfSDavid du Colombier if(r < 0) 7887dd7cddfSDavid du Colombier return nil; 7899a747e4fSDavid du Colombier if(r > 128 || r == '<' || r == '>'){ 7907dd7cddfSDavid du Colombier for(e = entity; e->name; e++) 7917dd7cddfSDavid du Colombier if(e->value == r) 7927dd7cddfSDavid du Colombier return e->name; 7936b6b9ac8SDavid du Colombier sprint(buf, "&#%d;", r); 7946b6b9ac8SDavid du Colombier return buf; 7957dd7cddfSDavid du Colombier } 7967dd7cddfSDavid du Colombier 7976b6b9ac8SDavid du Colombier if (r == delim[eqnmode]){ 7986b6b9ac8SDavid du Colombier if (eqnmode == 0){ 7996b6b9ac8SDavid du Colombier eqnmode = 1; 8006b6b9ac8SDavid du Colombier return changefont(&ifont); 8016b6b9ac8SDavid du Colombier } 8026b6b9ac8SDavid du Colombier eqnmode = 0; 803da51d93aSDavid du Colombier return changebackfont(); 8046b6b9ac8SDavid du Colombier } 8057dd7cddfSDavid du Colombier switch(r){ 8067dd7cddfSDavid du Colombier case '\\': 8077dd7cddfSDavid du Colombier r = getrune(); 8087dd7cddfSDavid du Colombier if(r < 0) 8097dd7cddfSDavid du Colombier return nil; 8107dd7cddfSDavid du Colombier switch(r){ 8117dd7cddfSDavid du Colombier case ' ': 8127dd7cddfSDavid du Colombier return " "; 8137dd7cddfSDavid du Colombier 8147dd7cddfSDavid du Colombier /* chars to ignore */ 8157dd7cddfSDavid du Colombier case '&': 8167dd7cddfSDavid du Colombier case '|': 8177dd7cddfSDavid du Colombier case '%': 8187dd7cddfSDavid du Colombier return ""; 8197dd7cddfSDavid du Colombier 8207dd7cddfSDavid du Colombier /* small space in troff, nothing in nroff */ 8217dd7cddfSDavid du Colombier case '^': 8227dd7cddfSDavid du Colombier return getnext(); 8237dd7cddfSDavid du Colombier 8247dd7cddfSDavid du Colombier /* ignore arg */ 8257dd7cddfSDavid du Colombier case 'k': 8267dd7cddfSDavid du Colombier getrune(); 8277dd7cddfSDavid du Colombier return getnext(); 8287dd7cddfSDavid du Colombier 8297dd7cddfSDavid du Colombier /* comment */ 8307dd7cddfSDavid du Colombier case '"': 8317dd7cddfSDavid du Colombier while(getrune() != '\n') 8327dd7cddfSDavid du Colombier ; 8337dd7cddfSDavid du Colombier return "\n"; 8347dd7cddfSDavid du Colombier /* ignore line */ 8357dd7cddfSDavid du Colombier case '!': 8367dd7cddfSDavid du Colombier while(getrune() != '\n') 8377dd7cddfSDavid du Colombier ; 8387dd7cddfSDavid du Colombier ungetrune(); 8397dd7cddfSDavid du Colombier return getnext(); 8407dd7cddfSDavid du Colombier 8417dd7cddfSDavid du Colombier /* defined strings */ 8427dd7cddfSDavid du Colombier case '*': 8437dd7cddfSDavid du Colombier r = getrune(); 8447dd7cddfSDavid du Colombier if(r == '('){ 8457dd7cddfSDavid du Colombier str[0] = getrune(); 8467dd7cddfSDavid du Colombier str[1] = getrune(); 8477dd7cddfSDavid du Colombier str[2] = 0; 8487dd7cddfSDavid du Colombier } else { 8497dd7cddfSDavid du Colombier str[0] = r; 8507dd7cddfSDavid du Colombier str[1] = 0; 8517dd7cddfSDavid du Colombier } 8527dd7cddfSDavid du Colombier pushstr(getds(str)); 8537dd7cddfSDavid du Colombier return getnext(); 8547dd7cddfSDavid du Colombier 8557dd7cddfSDavid du Colombier /* macro args */ 8567dd7cddfSDavid du Colombier case '$': 8577dd7cddfSDavid du Colombier r = getrune(); 8587dd7cddfSDavid du Colombier if(r < '1' || r > '9'){ 8597dd7cddfSDavid du Colombier token[0] = '\\'; 8607dd7cddfSDavid du Colombier token[1] = '$'; 8617dd7cddfSDavid du Colombier token[2] = r; 8627dd7cddfSDavid du Colombier token[3] = 0; 8637dd7cddfSDavid du Colombier return token; 8647dd7cddfSDavid du Colombier } 8657dd7cddfSDavid du Colombier r -= '0'; 8667dd7cddfSDavid du Colombier if(msp >= 0) 8677dd7cddfSDavid du Colombier pushstr(mstack[msp].argv[r]); 8687dd7cddfSDavid du Colombier return getnext(); 8697dd7cddfSDavid du Colombier 8707dd7cddfSDavid du Colombier /* special chars */ 8717dd7cddfSDavid du Colombier case '(': 8727dd7cddfSDavid du Colombier token[0] = getrune(); 8737dd7cddfSDavid du Colombier token[1] = getrune(); 8747dd7cddfSDavid du Colombier token[2] = 0; 8757dd7cddfSDavid du Colombier for(t = tspec; t->name; t++) 8767dd7cddfSDavid du Colombier if(strcmp(token, t->name) == 0) 8777dd7cddfSDavid du Colombier return t->value; 8787dd7cddfSDavid du Colombier return "¿"; 8797dd7cddfSDavid du Colombier 8807dd7cddfSDavid du Colombier /* ignore immediately following newline */ 8817dd7cddfSDavid du Colombier case 'c': 8827dd7cddfSDavid du Colombier r = getrune(); 8837dd7cddfSDavid du Colombier if (r == '\n') { 8847dd7cddfSDavid du Colombier sol = ignore_nl = 1; 8857dd7cddfSDavid du Colombier if (indirective) 8867dd7cddfSDavid du Colombier break; 8877dd7cddfSDavid du Colombier } 8887dd7cddfSDavid du Colombier else 8897dd7cddfSDavid du Colombier ungetrune(); 8907dd7cddfSDavid du Colombier return getnext(); 8917dd7cddfSDavid du Colombier 8927dd7cddfSDavid du Colombier /* escape backslash */ 8937dd7cddfSDavid du Colombier case 'e': 8947dd7cddfSDavid du Colombier return "\\"; 8957dd7cddfSDavid du Colombier break; 8967dd7cddfSDavid du Colombier 8977dd7cddfSDavid du Colombier /* font change */ 8987dd7cddfSDavid du Colombier case 'f': 8997dd7cddfSDavid du Colombier r = getrune(); 9007dd7cddfSDavid du Colombier switch(r){ 9017dd7cddfSDavid du Colombier case '(': 9027dd7cddfSDavid du Colombier str[0] = getrune(); 9037dd7cddfSDavid du Colombier str[1] = getrune(); 9047dd7cddfSDavid du Colombier str[2] = 0; 9057dd7cddfSDavid du Colombier token[0] = 0; 9067dd7cddfSDavid du Colombier if(strcmp("BI", str) == 0) 9077dd7cddfSDavid du Colombier return changefont(&bifont); 9087dd7cddfSDavid du Colombier else if(strcmp("CW", str) == 0) 9097dd7cddfSDavid du Colombier return changefont(&cwfont); 9107dd7cddfSDavid du Colombier else 9117dd7cddfSDavid du Colombier return changefont(nil); 9127dd7cddfSDavid du Colombier case '3': 9137dd7cddfSDavid du Colombier case 'B': 9147dd7cddfSDavid du Colombier return changefont(&bfont); 9157dd7cddfSDavid du Colombier case '2': 9167dd7cddfSDavid du Colombier case 'I': 9177dd7cddfSDavid du Colombier return changefont(&ifont); 9187dd7cddfSDavid du Colombier case '4': 9197dd7cddfSDavid du Colombier return changefont(&bifont); 9207dd7cddfSDavid du Colombier case '5': 9217dd7cddfSDavid du Colombier return changefont(&cwfont); 9227dd7cddfSDavid du Colombier case 'P': 923da51d93aSDavid du Colombier return changebackfont(); 9247dd7cddfSDavid du Colombier case 'R': 9257dd7cddfSDavid du Colombier default: 9267dd7cddfSDavid du Colombier return changefont(nil); 9277dd7cddfSDavid du Colombier } 9287dd7cddfSDavid du Colombier 9297dd7cddfSDavid du Colombier /* number register */ 9307dd7cddfSDavid du Colombier case 'n': 9317dd7cddfSDavid du Colombier r = getrune(); 9327dd7cddfSDavid du Colombier if (r == '(') /*)*/ { 9337dd7cddfSDavid du Colombier r = getrune(); 9347dd7cddfSDavid du Colombier if (r < 0) 9357dd7cddfSDavid du Colombier return nil; 9367dd7cddfSDavid du Colombier str[0] = r; 9377dd7cddfSDavid du Colombier r = getrune(); 9387dd7cddfSDavid du Colombier if (r < 0) 9397dd7cddfSDavid du Colombier return nil; 9407dd7cddfSDavid du Colombier str[1] = r; 9417dd7cddfSDavid du Colombier str[2] = 0; 9427dd7cddfSDavid du Colombier } 9437dd7cddfSDavid du Colombier else { 9447dd7cddfSDavid du Colombier str[0] = r; 9457dd7cddfSDavid du Colombier str[1] = 0; 9467dd7cddfSDavid du Colombier } 9477dd7cddfSDavid du Colombier pushstr(getnr(str)); 9487dd7cddfSDavid du Colombier return getnext(); 9497dd7cddfSDavid du Colombier 9507dd7cddfSDavid du Colombier /* font size */ 9517dd7cddfSDavid du Colombier case 's': 9526b6b9ac8SDavid du Colombier r = getrune(); 9536b6b9ac8SDavid du Colombier switch(r){ 9546b6b9ac8SDavid du Colombier case '0': 9556b6b9ac8SDavid du Colombier return changesize(0); 9566b6b9ac8SDavid du Colombier case '-': 9576b6b9ac8SDavid du Colombier r = getrune(); 9586b6b9ac8SDavid du Colombier if (!isdigit(r)) 9597dd7cddfSDavid du Colombier return getnext(); 9606b6b9ac8SDavid du Colombier return changesize(-(r - '0')); 9616b6b9ac8SDavid du Colombier case '+': 9626b6b9ac8SDavid du Colombier r = getrune(); 9636b6b9ac8SDavid du Colombier if (!isdigit(r)) 9646b6b9ac8SDavid du Colombier return getnext(); 9656b6b9ac8SDavid du Colombier return changesize(r - '0'); 9666b6b9ac8SDavid du Colombier } 9676b6b9ac8SDavid du Colombier return getnext(); 9687dd7cddfSDavid du Colombier /* vertical movement */ 9697dd7cddfSDavid du Colombier case 'v': 9707dd7cddfSDavid du Colombier r = getrune(); 9717dd7cddfSDavid du Colombier if(r != '\''){ 9727dd7cddfSDavid du Colombier ungetrune(); 9737dd7cddfSDavid du Colombier return getnext(); 9747dd7cddfSDavid du Colombier } 9757dd7cddfSDavid du Colombier r = getrune(); 9767dd7cddfSDavid du Colombier if(r != '-') 9777dd7cddfSDavid du Colombier vert--; 9787dd7cddfSDavid du Colombier else 9797dd7cddfSDavid du Colombier vert++; 9807dd7cddfSDavid du Colombier while(r != '\'' && r != '\n') 9817dd7cddfSDavid du Colombier r = getrune(); 9827dd7cddfSDavid du Colombier if(r != '\'') 9837dd7cddfSDavid du Colombier ungetrune(); 9847dd7cddfSDavid du Colombier 9857dd7cddfSDavid du Colombier if(vert > 0) 9867dd7cddfSDavid du Colombier return "^"; 9877dd7cddfSDavid du Colombier return getnext(); 9887dd7cddfSDavid du Colombier 9897dd7cddfSDavid du Colombier 9907dd7cddfSDavid du Colombier /* horizontal line */ 9917dd7cddfSDavid du Colombier case 'l': 9927dd7cddfSDavid du Colombier r = getrune(); 9937dd7cddfSDavid du Colombier if(r != '\''){ 9947dd7cddfSDavid du Colombier ungetrune(); 9957dd7cddfSDavid du Colombier return "<HR>"; 9967dd7cddfSDavid du Colombier } 9977dd7cddfSDavid du Colombier while(getrune() != '\'') 9987dd7cddfSDavid du Colombier ; 9997dd7cddfSDavid du Colombier return "<HR>"; 10007dd7cddfSDavid du Colombier 10017dd7cddfSDavid du Colombier /* character height and slant */ 10027dd7cddfSDavid du Colombier case 'S': 10037dd7cddfSDavid du Colombier case 'H': 10047dd7cddfSDavid du Colombier r = getrune(); 10057dd7cddfSDavid du Colombier if(r != '\''){ 10067dd7cddfSDavid du Colombier ungetrune(); 10077dd7cddfSDavid du Colombier return "<HR>"; 10087dd7cddfSDavid du Colombier } 10097dd7cddfSDavid du Colombier while(getrune() != '\'') 10107dd7cddfSDavid du Colombier ; 10117dd7cddfSDavid du Colombier return getnext(); 10127dd7cddfSDavid du Colombier 10137dd7cddfSDavid du Colombier /* digit-width space */ 10147dd7cddfSDavid du Colombier case '0': 10157dd7cddfSDavid du Colombier return " "; 10167dd7cddfSDavid du Colombier 10177dd7cddfSDavid du Colombier /*for .if, .ie, .el */ 10187dd7cddfSDavid du Colombier case '{': 10197dd7cddfSDavid du Colombier return "\\{"; /*}*/ 10207dd7cddfSDavid du Colombier case '}': 10217dd7cddfSDavid du Colombier return ""; 10227dd7cddfSDavid du Colombier /* up and down */ 10237dd7cddfSDavid du Colombier case 'u': 10247dd7cddfSDavid du Colombier if (isdown) { 10257dd7cddfSDavid du Colombier isdown = 0; 10267dd7cddfSDavid du Colombier return "</sub>"; 10277dd7cddfSDavid du Colombier } 10287dd7cddfSDavid du Colombier isup = 1; 10297dd7cddfSDavid du Colombier return "<sup>"; 10307dd7cddfSDavid du Colombier case 'd': 10317dd7cddfSDavid du Colombier if (isup) { 10327dd7cddfSDavid du Colombier isup = 0; 10337dd7cddfSDavid du Colombier return "</sup>"; 10347dd7cddfSDavid du Colombier } 10357dd7cddfSDavid du Colombier isdown = 1; 10367dd7cddfSDavid du Colombier return "<sub>"; 10377dd7cddfSDavid du Colombier } 10387dd7cddfSDavid du Colombier break; 10397dd7cddfSDavid du Colombier case '&': 10407dd7cddfSDavid du Colombier if(msp >= 0 || strsp >= 0) 10417dd7cddfSDavid du Colombier return "&"; 10427dd7cddfSDavid du Colombier return "&"; 10437dd7cddfSDavid du Colombier case '<': 10447dd7cddfSDavid du Colombier if(msp >= 0 || strsp >= 0) 10457dd7cddfSDavid du Colombier return "<"; 10467dd7cddfSDavid du Colombier return "<"; 10477dd7cddfSDavid du Colombier case '>': 10487dd7cddfSDavid du Colombier if(msp >= 0 || strsp >= 0) 10497dd7cddfSDavid du Colombier return ">"; 10507dd7cddfSDavid du Colombier return ">"; 10517dd7cddfSDavid du Colombier } 10527dd7cddfSDavid du Colombier if (r < Runeself) { 10537dd7cddfSDavid du Colombier token[0] = r; 10547dd7cddfSDavid du Colombier token[1] = 0; 10557dd7cddfSDavid du Colombier } 10567dd7cddfSDavid du Colombier else { 10577dd7cddfSDavid du Colombier R = r; 10587dd7cddfSDavid du Colombier token[runetochar(token,&R)] = 0; 10597dd7cddfSDavid du Colombier } 10607dd7cddfSDavid du Colombier return token; 10617dd7cddfSDavid du Colombier } 10627dd7cddfSDavid du Colombier 1063da51d93aSDavid du Colombier /* if arg0 is set, read up to (and expand) to the next whitespace, else to the end of line */ 10647dd7cddfSDavid du Colombier char* 10657dd7cddfSDavid du Colombier copyline(char *p, char *e, int arg0) 10667dd7cddfSDavid du Colombier { 10677dd7cddfSDavid du Colombier int c; 10687dd7cddfSDavid du Colombier Rune r; 10697dd7cddfSDavid du Colombier char *p1; 10707dd7cddfSDavid du Colombier 10717dd7cddfSDavid du Colombier while((c = getrune()) == ' ' || c == '\t') 10727dd7cddfSDavid du Colombier ; 10737dd7cddfSDavid du Colombier for(indirective = 1; p < e; c = getrune()) { 10747dd7cddfSDavid du Colombier if (c < 0) 10757dd7cddfSDavid du Colombier goto done; 10767dd7cddfSDavid du Colombier switch(c) { 10777dd7cddfSDavid du Colombier case '\\': 10787dd7cddfSDavid du Colombier break; 10797dd7cddfSDavid du Colombier case '\n': 10807dd7cddfSDavid du Colombier if (arg0) 10817dd7cddfSDavid du Colombier ungetrune(); 10827dd7cddfSDavid du Colombier goto done; 10837dd7cddfSDavid du Colombier case ' ': 10847dd7cddfSDavid du Colombier case '\t': 10857dd7cddfSDavid du Colombier if (arg0) 10867dd7cddfSDavid du Colombier goto done; 10877dd7cddfSDavid du Colombier default: 10887dd7cddfSDavid du Colombier r = c; 10897dd7cddfSDavid du Colombier p += runetochar(p,&r); 10907dd7cddfSDavid du Colombier continue; 10917dd7cddfSDavid du Colombier } 10927dd7cddfSDavid du Colombier ungetrune(); 10937dd7cddfSDavid du Colombier p1 = getnext(); 10947dd7cddfSDavid du Colombier if (p1 == nil) 10957dd7cddfSDavid du Colombier goto done; 10967dd7cddfSDavid du Colombier if (*p1 == '\n') { 10977dd7cddfSDavid du Colombier if (arg0) 10987dd7cddfSDavid du Colombier ungetrune(); 10997dd7cddfSDavid du Colombier break; 11007dd7cddfSDavid du Colombier } 11017dd7cddfSDavid du Colombier while((*p = *p1++) && p < e) 11027dd7cddfSDavid du Colombier p++; 11037dd7cddfSDavid du Colombier } 11047dd7cddfSDavid du Colombier done: 11057dd7cddfSDavid du Colombier indirective = 0; 11067dd7cddfSDavid du Colombier *p++ = 0; 11077dd7cddfSDavid du Colombier return p; 11087dd7cddfSDavid du Colombier } 11097dd7cddfSDavid du Colombier 11107dd7cddfSDavid du Colombier char* 11117dd7cddfSDavid du Colombier copyarg(char *p, char *e, int *nullarg) 11127dd7cddfSDavid du Colombier { 1113da51d93aSDavid du Colombier int c, quoted, last; 11147dd7cddfSDavid du Colombier Rune r; 11157dd7cddfSDavid du Colombier 11167dd7cddfSDavid du Colombier *nullarg = 0; 11177dd7cddfSDavid du Colombier quoted = 0; 11187dd7cddfSDavid du Colombier do{ 11197dd7cddfSDavid du Colombier c = getrune(); 11207dd7cddfSDavid du Colombier } while(c == ' ' || c == '\t'); 11217dd7cddfSDavid du Colombier 11227dd7cddfSDavid du Colombier if(c == '"'){ 11237dd7cddfSDavid du Colombier quoted = 1; 11247dd7cddfSDavid du Colombier *nullarg = 1; 11257dd7cddfSDavid du Colombier c = getrune(); 11267dd7cddfSDavid du Colombier } 11277dd7cddfSDavid du Colombier 11287dd7cddfSDavid du Colombier if(c == '\n') 11297dd7cddfSDavid du Colombier goto done; 11307dd7cddfSDavid du Colombier 1131da51d93aSDavid du Colombier last = 0; 11327dd7cddfSDavid du Colombier for(; p < e; c = getrune()) { 11337dd7cddfSDavid du Colombier if (c < 0) 11347dd7cddfSDavid du Colombier break; 11357dd7cddfSDavid du Colombier switch(c) { 11367dd7cddfSDavid du Colombier case '\n': 11377dd7cddfSDavid du Colombier ungetrune(); 11387dd7cddfSDavid du Colombier goto done; 1139da51d93aSDavid du Colombier case '\\': 1140da51d93aSDavid du Colombier r = c; 1141da51d93aSDavid du Colombier p += runetochar(p,&r); 1142da51d93aSDavid du Colombier if(last == '\\') 1143da51d93aSDavid du Colombier r = 0; 1144da51d93aSDavid du Colombier break; 11457dd7cddfSDavid du Colombier case ' ': 11467dd7cddfSDavid du Colombier case '\t': 1147da51d93aSDavid du Colombier if(!quoted && last != '\\') 11487dd7cddfSDavid du Colombier goto done; 11497dd7cddfSDavid du Colombier r = c; 11507dd7cddfSDavid du Colombier p += runetochar(p,&r); 1151da51d93aSDavid du Colombier break; 11527dd7cddfSDavid du Colombier case '"': 1153da51d93aSDavid du Colombier if(quoted && last != '\\') 11547dd7cddfSDavid du Colombier goto done; 11557dd7cddfSDavid du Colombier r = c; 11567dd7cddfSDavid du Colombier p += runetochar(p,&r); 1157da51d93aSDavid du Colombier break; 11587dd7cddfSDavid du Colombier default: 11597dd7cddfSDavid du Colombier r = c; 11607dd7cddfSDavid du Colombier p += runetochar(p,&r); 1161da51d93aSDavid du Colombier break; 11627dd7cddfSDavid du Colombier } 1163da51d93aSDavid du Colombier last = r; 11647dd7cddfSDavid du Colombier } 11657dd7cddfSDavid du Colombier done: 11667dd7cddfSDavid du Colombier *p++ = 0; 11677dd7cddfSDavid du Colombier return p; 11687dd7cddfSDavid du Colombier 11697dd7cddfSDavid du Colombier } 11707dd7cddfSDavid du Colombier 11717dd7cddfSDavid du Colombier int 11727dd7cddfSDavid du Colombier parseargs(char *p, char *e, char **argv) 11737dd7cddfSDavid du Colombier { 11747dd7cddfSDavid du Colombier int argc; 11757dd7cddfSDavid du Colombier char *np; 11767dd7cddfSDavid du Colombier int nullarg; 11777dd7cddfSDavid du Colombier 11787dd7cddfSDavid du Colombier indirective = 1; 11797dd7cddfSDavid du Colombier *p++ = 0; 11807dd7cddfSDavid du Colombier for(argc = 1; argc < Narg; argc++){ 11817dd7cddfSDavid du Colombier np = copyarg(p, e, &nullarg); 11827dd7cddfSDavid du Colombier if(nullarg==0 && np == p+1) 11837dd7cddfSDavid du Colombier break; 11847dd7cddfSDavid du Colombier argv[argc] = p; 11857dd7cddfSDavid du Colombier p = np; 11867dd7cddfSDavid du Colombier } 11877dd7cddfSDavid du Colombier argv[argc] = nil; 11887dd7cddfSDavid du Colombier indirective = 0; 11897dd7cddfSDavid du Colombier 11907dd7cddfSDavid du Colombier 11917dd7cddfSDavid du Colombier return argc; 11927dd7cddfSDavid du Colombier } 11937dd7cddfSDavid du Colombier 11947dd7cddfSDavid du Colombier void 11957dd7cddfSDavid du Colombier dodirective(void) 11967dd7cddfSDavid du Colombier { 11977dd7cddfSDavid du Colombier char *p, *e; 11987dd7cddfSDavid du Colombier Goobie *g; 11997dd7cddfSDavid du Colombier Goobieif *gif; 12007dd7cddfSDavid du Colombier char line[Nline], *line1; 12017dd7cddfSDavid du Colombier int i, argc; 12027dd7cddfSDavid du Colombier char *argv[Narg]; 12037dd7cddfSDavid du Colombier Mstack *m; 12047dd7cddfSDavid du Colombier 12057dd7cddfSDavid du Colombier /* read line, translate special bytes */ 12067dd7cddfSDavid du Colombier e = line + sizeof(line) - UTFmax - 1; 12077dd7cddfSDavid du Colombier line1 = copyline(line, e, 1); 12087dd7cddfSDavid du Colombier if (!line[0]) 12097dd7cddfSDavid du Colombier return; 12107dd7cddfSDavid du Colombier argv[0] = line; 12117dd7cddfSDavid du Colombier 12127dd7cddfSDavid du Colombier /* first look through user defined macros */ 12137dd7cddfSDavid du Colombier p = getmacro(argv[0]); 12147dd7cddfSDavid du Colombier if(p != nil){ 12157dd7cddfSDavid du Colombier if(msp == Maxmstack-1){ 12167dd7cddfSDavid du Colombier fprint(2, "ms2html: macro stack overflow\n"); 12177dd7cddfSDavid du Colombier return; 12187dd7cddfSDavid du Colombier } 12197dd7cddfSDavid du Colombier argc = parseargs(line1, e, argv); 12207dd7cddfSDavid du Colombier m = &mstack[++msp]; 12217dd7cddfSDavid du Colombier m->ptr = p; 12227dd7cddfSDavid du Colombier memset(m->argv, 0, sizeof(m->argv)); 12237dd7cddfSDavid du Colombier for(i = 0; i < argc; i++) 12247dd7cddfSDavid du Colombier m->argv[i] = strdup(argv[i]); 12257dd7cddfSDavid du Colombier return; 12267dd7cddfSDavid du Colombier } 12277dd7cddfSDavid du Colombier 12287dd7cddfSDavid du Colombier /* check for .if or .ie */ 12297dd7cddfSDavid du Colombier for(gif = gtabif; gif->name; gif++) 12307dd7cddfSDavid du Colombier if(strcmp(gif->name, argv[0]) == 0){ 12317dd7cddfSDavid du Colombier (*gif->f)(line1, e); 12327dd7cddfSDavid du Colombier return; 12337dd7cddfSDavid du Colombier } 12347dd7cddfSDavid du Colombier 12357dd7cddfSDavid du Colombier argc = parseargs(line1, e, argv); 12367dd7cddfSDavid du Colombier 12377dd7cddfSDavid du Colombier /* try standard ms macros */ 12387dd7cddfSDavid du Colombier for(g = gtab; g->name; g++) 12397dd7cddfSDavid du Colombier if(strcmp(g->name, argv[0]) == 0){ 12407dd7cddfSDavid du Colombier (*g->f)(argc, argv); 12417dd7cddfSDavid du Colombier return; 12427dd7cddfSDavid du Colombier } 12437dd7cddfSDavid du Colombier 12447dd7cddfSDavid du Colombier if(debug) 12457dd7cddfSDavid du Colombier fprint(2, "stdin %d(%s:%d): unknown directive %s\n", 12467dd7cddfSDavid du Colombier ssp->lno, ssp->filename, ssp->rlno, line); 12477dd7cddfSDavid du Colombier } 12487dd7cddfSDavid du Colombier 12497dd7cddfSDavid du Colombier void 12507dd7cddfSDavid du Colombier printarg(char *a) 12517dd7cddfSDavid du Colombier { 12527dd7cddfSDavid du Colombier char *e, *p; 12537dd7cddfSDavid du Colombier 12547dd7cddfSDavid du Colombier e = a + strlen(a); 12557dd7cddfSDavid du Colombier pushstr(a); 12567dd7cddfSDavid du Colombier while(strsp >= 0 && strstack[strsp] >= a && strstack[strsp] < e){ 12577dd7cddfSDavid du Colombier p = getnext(); 12587dd7cddfSDavid du Colombier if(p == nil) 12597dd7cddfSDavid du Colombier return; 12607dd7cddfSDavid du Colombier Bprint(&bout, "%s", p); 12617dd7cddfSDavid du Colombier } 12627dd7cddfSDavid du Colombier } 12637dd7cddfSDavid du Colombier 12647dd7cddfSDavid du Colombier void 12657dd7cddfSDavid du Colombier printargs(int argc, char **argv) 12667dd7cddfSDavid du Colombier { 12677dd7cddfSDavid du Colombier argc--; 12687dd7cddfSDavid du Colombier argv++; 12697dd7cddfSDavid du Colombier while(--argc > 0){ 12707dd7cddfSDavid du Colombier printarg(*argv++); 12717dd7cddfSDavid du Colombier Bprint(&bout, " "); 12727dd7cddfSDavid du Colombier } 12737dd7cddfSDavid du Colombier if(argc == 0) 12747dd7cddfSDavid du Colombier printarg(*argv); 12757dd7cddfSDavid du Colombier } 12767dd7cddfSDavid du Colombier 12777dd7cddfSDavid du Colombier void 12787dd7cddfSDavid du Colombier dohangingdt(void) 12797dd7cddfSDavid du Colombier { 12807dd7cddfSDavid du Colombier switch(hangingdt){ 12817dd7cddfSDavid du Colombier case 3: 12827dd7cddfSDavid du Colombier hangingdt--; 12837dd7cddfSDavid du Colombier break; 12847dd7cddfSDavid du Colombier case 2: 12857dd7cddfSDavid du Colombier Bprint(&bout, "<dd>"); 12867dd7cddfSDavid du Colombier hangingdt = 0; 12877dd7cddfSDavid du Colombier break; 12887dd7cddfSDavid du Colombier } 12897dd7cddfSDavid du Colombier 12907dd7cddfSDavid du Colombier } 12917dd7cddfSDavid du Colombier 12927dd7cddfSDavid du Colombier void 12937dd7cddfSDavid du Colombier dohangingau(void) 12947dd7cddfSDavid du Colombier { 12957dd7cddfSDavid du Colombier if(hangingau == 0) 12967dd7cddfSDavid du Colombier return; 12977dd7cddfSDavid du Colombier Bprint(&bout, "</I></DL>\n"); 12987dd7cddfSDavid du Colombier hangingau = 0; 12997dd7cddfSDavid du Colombier } 13007dd7cddfSDavid du Colombier 13017dd7cddfSDavid du Colombier void 13027dd7cddfSDavid du Colombier dohanginghead(void) 13037dd7cddfSDavid du Colombier { 13047dd7cddfSDavid du Colombier if(hanginghead == 0) 13057dd7cddfSDavid du Colombier return; 13067dd7cddfSDavid du Colombier Bprint(&bout, "</H%d>\n", hanginghead); 13077dd7cddfSDavid du Colombier hanginghead = 0; 13087dd7cddfSDavid du Colombier } 13097dd7cddfSDavid du Colombier 13107dd7cddfSDavid du Colombier /* 13117dd7cddfSDavid du Colombier * convert a man page to html and output 13127dd7cddfSDavid du Colombier */ 13137dd7cddfSDavid du Colombier void 13147dd7cddfSDavid du Colombier doconvert(void) 13157dd7cddfSDavid du Colombier { 13167dd7cddfSDavid du Colombier char c, *p; 13177dd7cddfSDavid du Colombier Tm *t; 13187dd7cddfSDavid du Colombier 13197dd7cddfSDavid du Colombier pushsrc(nil); 13207dd7cddfSDavid du Colombier 13217dd7cddfSDavid du Colombier sol = 1; 13227dd7cddfSDavid du Colombier Bprint(&bout, "<html>\n"); 13237dd7cddfSDavid du Colombier Bflush(&bout); 13247dd7cddfSDavid du Colombier for(;;){ 13257dd7cddfSDavid du Colombier p = getnext(); 13267dd7cddfSDavid du Colombier if(p == nil) 13277dd7cddfSDavid du Colombier break; 13287dd7cddfSDavid du Colombier c = *p; 13297dd7cddfSDavid du Colombier if(c == '.' && sol){ 13307dd7cddfSDavid du Colombier dodirective(); 13317dd7cddfSDavid du Colombier dohangingdt(); 13327dd7cddfSDavid du Colombier ssp->lno++; 13337dd7cddfSDavid du Colombier ssp->rlno++; 13347dd7cddfSDavid du Colombier sol = 1; 13357dd7cddfSDavid du Colombier } else if(c == '\n'){ 13367dd7cddfSDavid du Colombier if (ignore_nl) 13377dd7cddfSDavid du Colombier ignore_nl = 0; 13387dd7cddfSDavid du Colombier else { 13397dd7cddfSDavid du Colombier if(hangingau) 13407dd7cddfSDavid du Colombier Bprint(&bout, "<br>\n"); 13417dd7cddfSDavid du Colombier else 13427dd7cddfSDavid du Colombier Bprint(&bout, "%s", p); 13437dd7cddfSDavid du Colombier dohangingdt(); 13447dd7cddfSDavid du Colombier } 13457dd7cddfSDavid du Colombier ssp->lno++; 13467dd7cddfSDavid du Colombier ssp->rlno++; 13477dd7cddfSDavid du Colombier sol = 1; 13487dd7cddfSDavid du Colombier } else{ 13497dd7cddfSDavid du Colombier Bprint(&bout, "%s", p); 13507dd7cddfSDavid du Colombier ignore_nl = sol = 0; 13517dd7cddfSDavid du Colombier } 13527dd7cddfSDavid du Colombier } 13537dd7cddfSDavid du Colombier dohanginghead(); 13547dd7cddfSDavid du Colombier dohangingdt(); 13557dd7cddfSDavid du Colombier closel(); 1356da51d93aSDavid du Colombier if(fsp >= 0 && fstack[fsp]) 1357da51d93aSDavid du Colombier Bprint(&bout, "%s", fstack[fsp]->end); 13587dd7cddfSDavid du Colombier Bprint(&bout, "<br> <br>\n"); 13597dd7cddfSDavid du Colombier Bprint(&bout, "<A href=http://www.lucent.com/copyright.html>\n"); 13607dd7cddfSDavid du Colombier t = localtime(time(nil)); 13617dd7cddfSDavid du Colombier Bprint(&bout, "Copyright</A> © %d Lucent Technologies Inc. All rights reserved.\n", 13627dd7cddfSDavid du Colombier t->year+1900); 13637dd7cddfSDavid du Colombier Bprint(&bout, "</body></html>\n"); 13647dd7cddfSDavid du Colombier } 13657dd7cddfSDavid du Colombier 13666b6b9ac8SDavid du Colombier static void 13676b6b9ac8SDavid du Colombier usage(void) 13686b6b9ac8SDavid du Colombier { 1369*73e742d7SDavid du Colombier sysfatal("usage: ms2html [-q] [-b basename] [-d '$$'] [-t title]\n"); 13706b6b9ac8SDavid du Colombier } 13716b6b9ac8SDavid du Colombier 13727dd7cddfSDavid du Colombier void 13737dd7cddfSDavid du Colombier main(int argc, char **argv) 13747dd7cddfSDavid du Colombier { 13757dd7cddfSDavid du Colombier quiet = 1; 13766b6b9ac8SDavid du Colombier ARGBEGIN { 1377*73e742d7SDavid du Colombier case 't': 1378*73e742d7SDavid du Colombier title = EARGF(usage()); 1379*73e742d7SDavid du Colombier break; 1380*73e742d7SDavid du Colombier case 'b': 1381*73e742d7SDavid du Colombier basename = EARGF(usage()); 1382*73e742d7SDavid du Colombier break; 13836b6b9ac8SDavid du Colombier case 'q': 13847dd7cddfSDavid du Colombier quiet = 0; 13856b6b9ac8SDavid du Colombier break; 13866b6b9ac8SDavid du Colombier case 'd': 13876b6b9ac8SDavid du Colombier delim = EARGF(usage()); 13886b6b9ac8SDavid du Colombier break; 13896b6b9ac8SDavid du Colombier case '?': 13906b6b9ac8SDavid du Colombier default: 13916b6b9ac8SDavid du Colombier usage(); 13926b6b9ac8SDavid du Colombier } ARGEND; 13937dd7cddfSDavid du Colombier 13947dd7cddfSDavid du Colombier Binit(&bout, 1, OWRITE); 13957dd7cddfSDavid du Colombier 13967dd7cddfSDavid du Colombier ds("R", "®"); 13977dd7cddfSDavid du Colombier 13987dd7cddfSDavid du Colombier doconvert(); 13997dd7cddfSDavid du Colombier exits(nil); 14007dd7cddfSDavid du Colombier } 14017dd7cddfSDavid du Colombier 14027dd7cddfSDavid du Colombier void 14037dd7cddfSDavid du Colombier g_notyet(int, char **argv) 14047dd7cddfSDavid du Colombier { 14057dd7cddfSDavid du Colombier fprint(2, "ms2html: .%s not yet supported\n", argv[0]); 14067dd7cddfSDavid du Colombier } 14077dd7cddfSDavid du Colombier 14087dd7cddfSDavid du Colombier void 14097dd7cddfSDavid du Colombier g_ignore(int, char **argv) 14107dd7cddfSDavid du Colombier { 14117dd7cddfSDavid du Colombier if(quiet) 14127dd7cddfSDavid du Colombier return; 14137dd7cddfSDavid du Colombier fprint(2, "ms2html: line %d: ignoring .%s\n", ssp->lno, argv[0]); 14147dd7cddfSDavid du Colombier } 14157dd7cddfSDavid du Colombier 14167dd7cddfSDavid du Colombier void 14177dd7cddfSDavid du Colombier g_PP(int, char**) 14187dd7cddfSDavid du Colombier { 14197dd7cddfSDavid du Colombier dohanginghead(); 14207dd7cddfSDavid du Colombier closel(); 14217dd7cddfSDavid du Colombier closefont(); 14227dd7cddfSDavid du Colombier Bprint(&bout, "<P>\n"); 14237dd7cddfSDavid du Colombier paragraph = 1; 14247dd7cddfSDavid du Colombier } 14257dd7cddfSDavid du Colombier 14267dd7cddfSDavid du Colombier void 14277dd7cddfSDavid du Colombier g_LP(int, char**) 14287dd7cddfSDavid du Colombier { 14297dd7cddfSDavid du Colombier dohanginghead(); 14307dd7cddfSDavid du Colombier closel(); 14317dd7cddfSDavid du Colombier closefont(); 14327dd7cddfSDavid du Colombier Bprint(&bout, "<br> <br>\n"); 14337dd7cddfSDavid du Colombier } 14347dd7cddfSDavid du Colombier 14357dd7cddfSDavid du Colombier /* close a list */ 14367dd7cddfSDavid du Colombier void 14377dd7cddfSDavid du Colombier closel(void) 14387dd7cddfSDavid du Colombier { 14397dd7cddfSDavid du Colombier g_P2(1, nil); 14407dd7cddfSDavid du Colombier dohangingau(); 14417dd7cddfSDavid du Colombier if(paragraph){ 14427dd7cddfSDavid du Colombier Bprint(&bout, "</P>\n"); 14437dd7cddfSDavid du Colombier paragraph = 0; 14447dd7cddfSDavid du Colombier } 14457dd7cddfSDavid du Colombier switch(list){ 14467dd7cddfSDavid du Colombier case Lordered: 14477dd7cddfSDavid du Colombier Bprint(&bout, "</ol>\n"); 14487dd7cddfSDavid du Colombier break; 14497dd7cddfSDavid du Colombier case Lunordered: 14507dd7cddfSDavid du Colombier Bprint(&bout, "</ul>\n"); 14517dd7cddfSDavid du Colombier break; 14527dd7cddfSDavid du Colombier case Lother: 14537dd7cddfSDavid du Colombier case Ldef: 14547dd7cddfSDavid du Colombier Bprint(&bout, "</dl>\n"); 14557dd7cddfSDavid du Colombier break; 14567dd7cddfSDavid du Colombier } 14577dd7cddfSDavid du Colombier list = 0; 14587dd7cddfSDavid du Colombier 14597dd7cddfSDavid du Colombier } 14607dd7cddfSDavid du Colombier 14617dd7cddfSDavid du Colombier 14627dd7cddfSDavid du Colombier void 14637dd7cddfSDavid du Colombier g_IP(int argc, char **argv) 14647dd7cddfSDavid du Colombier { 14657dd7cddfSDavid du Colombier switch(list){ 14667dd7cddfSDavid du Colombier default: 14677dd7cddfSDavid du Colombier closel(); 14687dd7cddfSDavid du Colombier if(argc > 1){ 14697dd7cddfSDavid du Colombier if(strcmp(argv[1], "1") == 0){ 14707dd7cddfSDavid du Colombier list = Lordered; 14717dd7cddfSDavid du Colombier listnum = 1; 14727dd7cddfSDavid du Colombier Bprint(&bout, "<OL>\n"); 14737dd7cddfSDavid du Colombier } else if(strcmp(argv[1], "\\(bu") == 0){ 14747dd7cddfSDavid du Colombier list = Lunordered; 14757dd7cddfSDavid du Colombier Bprint(&bout, "<UL>\n"); 14767dd7cddfSDavid du Colombier } else { 14777dd7cddfSDavid du Colombier list = Lother; 14787dd7cddfSDavid du Colombier Bprint(&bout, "<DL COMPACT>\n"); 14797dd7cddfSDavid du Colombier } 14807dd7cddfSDavid du Colombier } else { 14817dd7cddfSDavid du Colombier list = Lother; 14827dd7cddfSDavid du Colombier Bprint(&bout, "<DL>\n"); 14837dd7cddfSDavid du Colombier } 14847dd7cddfSDavid du Colombier break; 14857dd7cddfSDavid du Colombier case Lother: 14867dd7cddfSDavid du Colombier case Lordered: 14877dd7cddfSDavid du Colombier case Lunordered: 14887dd7cddfSDavid du Colombier break; 14897dd7cddfSDavid du Colombier } 14907dd7cddfSDavid du Colombier 14917dd7cddfSDavid du Colombier switch(list){ 14927dd7cddfSDavid du Colombier case Lother: 14937dd7cddfSDavid du Colombier Bprint(&bout, "<DT>"); 14947dd7cddfSDavid du Colombier if(argc > 1) 14957dd7cddfSDavid du Colombier printarg(argv[1]); 14967dd7cddfSDavid du Colombier else 14977dd7cddfSDavid du Colombier Bprint(&bout, "<DT> "); 14987dd7cddfSDavid du Colombier Bprint(&bout, "<DD>\n"); 14997dd7cddfSDavid du Colombier break; 15007dd7cddfSDavid du Colombier case Lordered: 15017dd7cddfSDavid du Colombier case Lunordered: 15027dd7cddfSDavid du Colombier Bprint(&bout, "<LI>\n"); 15037dd7cddfSDavid du Colombier break; 15047dd7cddfSDavid du Colombier } 15057dd7cddfSDavid du Colombier } 15067dd7cddfSDavid du Colombier 15077dd7cddfSDavid du Colombier /* 15087dd7cddfSDavid du Colombier * .5i is one <DL><DT><DD> 15097dd7cddfSDavid du Colombier */ 15107dd7cddfSDavid du Colombier void 15117dd7cddfSDavid du Colombier g_in(int argc, char **argv) 15127dd7cddfSDavid du Colombier { 15137dd7cddfSDavid du Colombier float f; 15147dd7cddfSDavid du Colombier int delta, x; 15157dd7cddfSDavid du Colombier char *p; 15167dd7cddfSDavid du Colombier 15177dd7cddfSDavid du Colombier f = indent/0.5; 15187dd7cddfSDavid du Colombier delta = f; 15197dd7cddfSDavid du Colombier if(argc <= 1){ 15207dd7cddfSDavid du Colombier indent = 0.0; 15217dd7cddfSDavid du Colombier } else { 15227dd7cddfSDavid du Colombier f = strtod(argv[1], &p); 15237dd7cddfSDavid du Colombier switch(*p){ 15247dd7cddfSDavid du Colombier case 'i': 15257dd7cddfSDavid du Colombier break; 15267dd7cddfSDavid du Colombier case 'c': 15277dd7cddfSDavid du Colombier f = f / 2.54; 15287dd7cddfSDavid du Colombier break; 15297dd7cddfSDavid du Colombier case 'P': 15307dd7cddfSDavid du Colombier f = f / 6; 15317dd7cddfSDavid du Colombier break; 15327dd7cddfSDavid du Colombier default: 15337dd7cddfSDavid du Colombier case 'u': 15347dd7cddfSDavid du Colombier case 'm': 15357dd7cddfSDavid du Colombier f = f * (12 / 72); 15367dd7cddfSDavid du Colombier break; 15377dd7cddfSDavid du Colombier case 'n': 15387dd7cddfSDavid du Colombier f = f * (6 / 72); 15397dd7cddfSDavid du Colombier break; 15407dd7cddfSDavid du Colombier case 'p': 15417dd7cddfSDavid du Colombier f = f / 72.0; 15427dd7cddfSDavid du Colombier break; 15437dd7cddfSDavid du Colombier } 15447dd7cddfSDavid du Colombier switch(argv[1][0]){ 15457dd7cddfSDavid du Colombier case '+': 15467dd7cddfSDavid du Colombier case '-': 15477dd7cddfSDavid du Colombier indent += f; 15487dd7cddfSDavid du Colombier break; 15497dd7cddfSDavid du Colombier default: 15507dd7cddfSDavid du Colombier indent = f; 15517dd7cddfSDavid du Colombier break; 15527dd7cddfSDavid du Colombier } 15537dd7cddfSDavid du Colombier } 15547dd7cddfSDavid du Colombier if(indent < 0.0) 15557dd7cddfSDavid du Colombier indent = 0.0; 15567dd7cddfSDavid du Colombier f = (indent/0.5); 15577dd7cddfSDavid du Colombier x = f; 15587dd7cddfSDavid du Colombier delta = x - delta; 15597dd7cddfSDavid du Colombier while(delta < 0){ 15607dd7cddfSDavid du Colombier Bprint(&bout, "</DL>\n"); 15617dd7cddfSDavid du Colombier delta++; 15627dd7cddfSDavid du Colombier } 15637dd7cddfSDavid du Colombier while(delta > 0){ 15647dd7cddfSDavid du Colombier Bprint(&bout, "<DL><DT><DD>\n"); 15657dd7cddfSDavid du Colombier delta--; 15667dd7cddfSDavid du Colombier } 15677dd7cddfSDavid du Colombier } 15687dd7cddfSDavid du Colombier 15697dd7cddfSDavid du Colombier void 15707dd7cddfSDavid du Colombier g_HP(int, char**) 15717dd7cddfSDavid du Colombier { 15727dd7cddfSDavid du Colombier switch(list){ 15737dd7cddfSDavid du Colombier default: 15747dd7cddfSDavid du Colombier closel(); 15757dd7cddfSDavid du Colombier list = Ldef; 15767dd7cddfSDavid du Colombier hangingdt = 1; 15777dd7cddfSDavid du Colombier Bprint(&bout, "<DL><DT>\n"); 15787dd7cddfSDavid du Colombier break; 15797dd7cddfSDavid du Colombier case Ldef: 15807dd7cddfSDavid du Colombier if(hangingdt) 15817dd7cddfSDavid du Colombier Bprint(&bout, "<DD>"); 15827dd7cddfSDavid du Colombier Bprint(&bout, "<DT>"); 15837dd7cddfSDavid du Colombier hangingdt = 1; 15847dd7cddfSDavid du Colombier break; 15857dd7cddfSDavid du Colombier } 15867dd7cddfSDavid du Colombier } 15877dd7cddfSDavid du Colombier 15887dd7cddfSDavid du Colombier void 15897dd7cddfSDavid du Colombier g_SH(int, char**) 15907dd7cddfSDavid du Colombier { 15917dd7cddfSDavid du Colombier dohanginghead(); 1592*73e742d7SDavid du Colombier dohangingcenter(); 15937dd7cddfSDavid du Colombier closel(); 15947dd7cddfSDavid du Colombier closefont(); 15957dd7cddfSDavid du Colombier Bprint(&bout, "<H%d>", HH); 15967dd7cddfSDavid du Colombier hanginghead = HH; 15977dd7cddfSDavid du Colombier } 15987dd7cddfSDavid du Colombier 15997dd7cddfSDavid du Colombier void 16007dd7cddfSDavid du Colombier g_NH(int argc, char **argv) 16017dd7cddfSDavid du Colombier { 16027dd7cddfSDavid du Colombier int i, level; 16037dd7cddfSDavid du Colombier 16047dd7cddfSDavid du Colombier closel(); 16057dd7cddfSDavid du Colombier closefont(); 16067dd7cddfSDavid du Colombier 1607*73e742d7SDavid du Colombier dohangingcenter(); 16087dd7cddfSDavid du Colombier if(argc == 1) 16097dd7cddfSDavid du Colombier level = 0; 16107dd7cddfSDavid du Colombier else { 16117dd7cddfSDavid du Colombier level = atoi(argv[1])-1; 16127dd7cddfSDavid du Colombier if(level < 0 || level >= Maxnh) 16137dd7cddfSDavid du Colombier level = Maxnh - 1; 16147dd7cddfSDavid du Colombier } 16157dd7cddfSDavid du Colombier nh[level]++; 16167dd7cddfSDavid du Colombier 16177dd7cddfSDavid du Colombier Bprint(&bout, "<H%d>", HH); 16187dd7cddfSDavid du Colombier hanginghead = HH; 16197dd7cddfSDavid du Colombier 16207dd7cddfSDavid du Colombier Bprint(&bout, "%d", nh[0]); 16217dd7cddfSDavid du Colombier for(i = 1; i <= level; i++) 16227dd7cddfSDavid du Colombier Bprint(&bout, ".%d", nh[i]); 16237dd7cddfSDavid du Colombier Bprint(&bout, " "); 16247dd7cddfSDavid du Colombier 16257dd7cddfSDavid du Colombier for(i = level+1; i < Maxnh; i++) 16267dd7cddfSDavid du Colombier nh[i] = 0; 16277dd7cddfSDavid du Colombier } 16287dd7cddfSDavid du Colombier 16297dd7cddfSDavid du Colombier void 16307dd7cddfSDavid du Colombier g_TL(int, char**) 16317dd7cddfSDavid du Colombier { 16327dd7cddfSDavid du Colombier char *p, *np; 16337dd7cddfSDavid du Colombier char name[128]; 16347dd7cddfSDavid du Colombier 16357dd7cddfSDavid du Colombier closefont(); 16367dd7cddfSDavid du Colombier 16377dd7cddfSDavid du Colombier if(!titleseen){ 1638*73e742d7SDavid du Colombier if(!title){ 16397dd7cddfSDavid du Colombier /* get base part of filename */ 16407dd7cddfSDavid du Colombier p = strrchr(ssp->filename, '/'); 16417dd7cddfSDavid du Colombier if(p == nil) 16427dd7cddfSDavid du Colombier p = ssp->filename; 16437dd7cddfSDavid du Colombier else 16447dd7cddfSDavid du Colombier p++; 16457dd7cddfSDavid du Colombier strncpy(name, p, sizeof(name)); 16467dd7cddfSDavid du Colombier name[sizeof(name)-1] = 0; 16477dd7cddfSDavid du Colombier 16487dd7cddfSDavid du Colombier /* dump any extensions */ 16497dd7cddfSDavid du Colombier np = strchr(name, '.'); 16507dd7cddfSDavid du Colombier if(np) 16517dd7cddfSDavid du Colombier *np = 0; 1652*73e742d7SDavid du Colombier title = p; 1653*73e742d7SDavid du Colombier } 16547dd7cddfSDavid du Colombier Bprint(&bout, "<title>\n"); 1655*73e742d7SDavid du Colombier Bprint(&bout, "%s\n", title); 16567dd7cddfSDavid du Colombier Bprint(&bout, "</title>\n"); 16577dd7cddfSDavid du Colombier Bprint(&bout, "<body BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\" LINK=\"#0000FF\" VLINK=\"#330088\" ALINK=\"#FF0044\">\n"); 16587dd7cddfSDavid du Colombier titleseen = 1; 16597dd7cddfSDavid du Colombier } 16607dd7cddfSDavid du Colombier 1661*73e742d7SDavid du Colombier Bprint(&bout, "<center>"); 1662*73e742d7SDavid du Colombier hangingcenter = 1; 16637dd7cddfSDavid du Colombier Bprint(&bout, "<H%d>", 1); 16647dd7cddfSDavid du Colombier hanginghead = 1; 16657dd7cddfSDavid du Colombier } 16667dd7cddfSDavid du Colombier 16677dd7cddfSDavid du Colombier void 1668*73e742d7SDavid du Colombier dohangingcenter(void) 1669*73e742d7SDavid du Colombier { 1670*73e742d7SDavid du Colombier if(hangingcenter){ 1671*73e742d7SDavid du Colombier Bprint(&bout, "</center>"); 1672*73e742d7SDavid du Colombier hangingcenter = 1; 1673*73e742d7SDavid du Colombier } 1674*73e742d7SDavid du Colombier } 1675*73e742d7SDavid du Colombier 1676*73e742d7SDavid du Colombier void 16777dd7cddfSDavid du Colombier g_AU(int, char**) 16787dd7cddfSDavid du Colombier { 16797dd7cddfSDavid du Colombier closel(); 16807dd7cddfSDavid du Colombier dohanginghead(); 16817dd7cddfSDavid du Colombier Bprint(&bout, "<DL><DD><I>"); 16827dd7cddfSDavid du Colombier hangingau = 1; 16837dd7cddfSDavid du Colombier } 16847dd7cddfSDavid du Colombier 16857dd7cddfSDavid du Colombier void 1686da51d93aSDavid du Colombier pushfont(Font *f) 16877dd7cddfSDavid du Colombier { 1688da51d93aSDavid du Colombier if(fsp == Maxfsp) 1689da51d93aSDavid du Colombier return; 1690da51d93aSDavid du Colombier if(fsp >= 0 && fstack[fsp]) 1691da51d93aSDavid du Colombier Bprint(&bout, "%s", fstack[fsp]->end); 16927dd7cddfSDavid du Colombier if(f != nil) 16937dd7cddfSDavid du Colombier Bprint(&bout, "%s", f->start); 1694da51d93aSDavid du Colombier fstack[++fsp] = f; 1695da51d93aSDavid du Colombier } 1696da51d93aSDavid du Colombier 1697da51d93aSDavid du Colombier void 1698da51d93aSDavid du Colombier popfont(void) 1699da51d93aSDavid du Colombier { 1700da51d93aSDavid du Colombier if(fsp >= 0){ 1701da51d93aSDavid du Colombier if(fstack[fsp]) 1702da51d93aSDavid du Colombier Bprint(&bout, "%s", fstack[fsp]->end); 1703da51d93aSDavid du Colombier fsp--; 1704da51d93aSDavid du Colombier } 17057dd7cddfSDavid du Colombier } 17067dd7cddfSDavid du Colombier 17077dd7cddfSDavid du Colombier /* 17087dd7cddfSDavid du Colombier * for 3 args print arg3 \fxarg1\fP arg2 17097dd7cddfSDavid du Colombier * for 2 args print arg1 \fxarg2\fP 17107dd7cddfSDavid du Colombier * for 1 args print \fxarg1\fP 17117dd7cddfSDavid du Colombier */ 17127dd7cddfSDavid du Colombier void 17137dd7cddfSDavid du Colombier font(Font *f, int argc, char **argv) 17147dd7cddfSDavid du Colombier { 17157dd7cddfSDavid du Colombier if(argc == 1){ 1716da51d93aSDavid du Colombier pushfont(nil); 17177dd7cddfSDavid du Colombier return; 17187dd7cddfSDavid du Colombier } 17197dd7cddfSDavid du Colombier if(argc > 3) 17207dd7cddfSDavid du Colombier printarg(argv[3]); 1721da51d93aSDavid du Colombier pushfont(f); 17227dd7cddfSDavid du Colombier printarg(argv[1]); 1723da51d93aSDavid du Colombier popfont(); 17247dd7cddfSDavid du Colombier if(argc > 2) 17257dd7cddfSDavid du Colombier printarg(argv[2]); 17267dd7cddfSDavid du Colombier Bprint(&bout, "\n"); 17277dd7cddfSDavid du Colombier } 17287dd7cddfSDavid du Colombier 17297dd7cddfSDavid du Colombier void 17307dd7cddfSDavid du Colombier closefont(void) 17317dd7cddfSDavid du Colombier { 1732da51d93aSDavid du Colombier if(fsp >= 0 && fstack[fsp]) 1733da51d93aSDavid du Colombier Bprint(&bout, "%s", fstack[fsp]->end); 1734da51d93aSDavid du Colombier fsp = -1; 17357dd7cddfSDavid du Colombier } 17367dd7cddfSDavid du Colombier 17377dd7cddfSDavid du Colombier void 17387dd7cddfSDavid du Colombier g_B(int argc, char **argv) 17397dd7cddfSDavid du Colombier { 17407dd7cddfSDavid du Colombier font(&bfont, argc, argv); 17417dd7cddfSDavid du Colombier } 17427dd7cddfSDavid du Colombier 17437dd7cddfSDavid du Colombier void 17447dd7cddfSDavid du Colombier g_R(int argc, char **argv) 17457dd7cddfSDavid du Colombier { 17467dd7cddfSDavid du Colombier font(nil, argc, argv); 17477dd7cddfSDavid du Colombier } 17487dd7cddfSDavid du Colombier 17497dd7cddfSDavid du Colombier void 17507dd7cddfSDavid du Colombier g_BI(int argc, char **argv) 17517dd7cddfSDavid du Colombier { 17527dd7cddfSDavid du Colombier font(&bifont, argc, argv); 17537dd7cddfSDavid du Colombier } 17547dd7cddfSDavid du Colombier 17557dd7cddfSDavid du Colombier void 17567dd7cddfSDavid du Colombier g_CW(int argc, char **argv) 17577dd7cddfSDavid du Colombier { 17587dd7cddfSDavid du Colombier font(&cwfont, argc, argv); 17597dd7cddfSDavid du Colombier } 17607dd7cddfSDavid du Colombier 17617dd7cddfSDavid du Colombier char* 17627dd7cddfSDavid du Colombier lower(char *p) 17637dd7cddfSDavid du Colombier { 17647dd7cddfSDavid du Colombier char *x; 17657dd7cddfSDavid du Colombier 17667dd7cddfSDavid du Colombier for(x = p; *x; x++) 17677dd7cddfSDavid du Colombier if(*x >= 'A' && *x <= 'Z') 17687dd7cddfSDavid du Colombier *x -= 'A' - 'a'; 17697dd7cddfSDavid du Colombier return p; 17707dd7cddfSDavid du Colombier } 17717dd7cddfSDavid du Colombier 17727dd7cddfSDavid du Colombier void 17737dd7cddfSDavid du Colombier g_I(int argc, char **argv) 17747dd7cddfSDavid du Colombier { 17757dd7cddfSDavid du Colombier int anchor; 17767dd7cddfSDavid du Colombier char *p; 17777dd7cddfSDavid du Colombier 17787dd7cddfSDavid du Colombier anchor = 0; 17797dd7cddfSDavid du Colombier if(argc > 2){ 17807dd7cddfSDavid du Colombier p = argv[2]; 17817dd7cddfSDavid du Colombier if(p[0] == '(') 17827dd7cddfSDavid du Colombier if(p[1] >= '0' && p[1] <= '9') 17837dd7cddfSDavid du Colombier if(p[2] == ')'){ 17847dd7cddfSDavid du Colombier anchor = 1; 17857dd7cddfSDavid du Colombier Bprint(&bout, "<A href=\"/magic/man2html/%c/%s\">", 17867dd7cddfSDavid du Colombier p[1], lower(argv[1])); 17877dd7cddfSDavid du Colombier } 17887dd7cddfSDavid du Colombier } 17897dd7cddfSDavid du Colombier font(&ifont, argc, argv); 17907dd7cddfSDavid du Colombier if(anchor) 17917dd7cddfSDavid du Colombier Bprint(&bout, "</A>"); 17927dd7cddfSDavid du Colombier } 17937dd7cddfSDavid du Colombier 17947dd7cddfSDavid du Colombier void 17957dd7cddfSDavid du Colombier g_br(int, char**) 17967dd7cddfSDavid du Colombier { 17977dd7cddfSDavid du Colombier if(hangingdt){ 17987dd7cddfSDavid du Colombier Bprint(&bout, "<dd>"); 17997dd7cddfSDavid du Colombier hangingdt = 0; 18007dd7cddfSDavid du Colombier }else 18017dd7cddfSDavid du Colombier Bprint(&bout, "<br>\n"); 18027dd7cddfSDavid du Colombier } 18037dd7cddfSDavid du Colombier 18047dd7cddfSDavid du Colombier void 18057dd7cddfSDavid du Colombier g_P1(int, char**) 18067dd7cddfSDavid du Colombier { 18077dd7cddfSDavid du Colombier if(example == 0){ 18087dd7cddfSDavid du Colombier example = 1; 18097dd7cddfSDavid du Colombier Bprint(&bout, "<DL><DT><DD><TT><PRE>\n"); 18107dd7cddfSDavid du Colombier } 18117dd7cddfSDavid du Colombier } 18127dd7cddfSDavid du Colombier 18137dd7cddfSDavid du Colombier void 18147dd7cddfSDavid du Colombier g_P2(int, char**) 18157dd7cddfSDavid du Colombier { 18167dd7cddfSDavid du Colombier if(example){ 18177dd7cddfSDavid du Colombier example = 0; 18187dd7cddfSDavid du Colombier Bprint(&bout, "</PRE></TT></DL>\n"); 18197dd7cddfSDavid du Colombier } 18207dd7cddfSDavid du Colombier } 18217dd7cddfSDavid du Colombier 18227dd7cddfSDavid du Colombier void 18237dd7cddfSDavid du Colombier g_SM(int, char **argv) 18247dd7cddfSDavid du Colombier { 18257dd7cddfSDavid du Colombier Bprint(&bout, "%s", argv[1]); 18267dd7cddfSDavid du Colombier } 18277dd7cddfSDavid du Colombier 18287dd7cddfSDavid du Colombier void 18297dd7cddfSDavid du Colombier g_ft(int argc, char **argv) 18307dd7cddfSDavid du Colombier { 18317dd7cddfSDavid du Colombier if(argc < 2){ 1832da51d93aSDavid du Colombier pushfont(nil); 18337dd7cddfSDavid du Colombier return; 18347dd7cddfSDavid du Colombier } 18357dd7cddfSDavid du Colombier 18367dd7cddfSDavid du Colombier switch(argv[1][0]){ 18377dd7cddfSDavid du Colombier case '3': 18387dd7cddfSDavid du Colombier case 'B': 1839da51d93aSDavid du Colombier pushfont(&bfont); 18407dd7cddfSDavid du Colombier break; 18417dd7cddfSDavid du Colombier case '2': 18427dd7cddfSDavid du Colombier case 'I': 1843da51d93aSDavid du Colombier pushfont(&ifont); 18447dd7cddfSDavid du Colombier break; 18457dd7cddfSDavid du Colombier case '4': 1846da51d93aSDavid du Colombier pushfont(&bifont); 18477dd7cddfSDavid du Colombier break; 18487dd7cddfSDavid du Colombier case '5': 1849da51d93aSDavid du Colombier pushfont(&cwfont); 18507dd7cddfSDavid du Colombier break; 18517dd7cddfSDavid du Colombier case 'P': 1852da51d93aSDavid du Colombier popfont(); 18537dd7cddfSDavid du Colombier break; 18547dd7cddfSDavid du Colombier case 'R': 18557dd7cddfSDavid du Colombier default: 1856da51d93aSDavid du Colombier pushfont(nil); 18577dd7cddfSDavid du Colombier break; 18587dd7cddfSDavid du Colombier } 18597dd7cddfSDavid du Colombier } 18607dd7cddfSDavid du Colombier 18617dd7cddfSDavid du Colombier void 18627dd7cddfSDavid du Colombier g_sp(int argc, char **argv) 18637dd7cddfSDavid du Colombier { 18647dd7cddfSDavid du Colombier int n; 18657dd7cddfSDavid du Colombier 18667dd7cddfSDavid du Colombier n = 1; 18677dd7cddfSDavid du Colombier if(argc > 1){ 18687dd7cddfSDavid du Colombier n = atoi(argv[1]); 18697dd7cddfSDavid du Colombier if(n < 1) 18707dd7cddfSDavid du Colombier n = 1; 18717dd7cddfSDavid du Colombier if(argv[1][strlen(argv[1])-1] == 'i') 18727dd7cddfSDavid du Colombier n *= 4; 18737dd7cddfSDavid du Colombier } 18747dd7cddfSDavid du Colombier if(n > 5){ 18757dd7cddfSDavid du Colombier Bprint(&bout, "<br> <br>\n"); 18767dd7cddfSDavid du Colombier Bprint(&bout, "<HR>\n"); 18777dd7cddfSDavid du Colombier Bprint(&bout, "<br> <br>\n"); 18787dd7cddfSDavid du Colombier } else 18797dd7cddfSDavid du Colombier for(; n > 0; n--) 18807dd7cddfSDavid du Colombier Bprint(&bout, "<br> <br>\n"); 18817dd7cddfSDavid du Colombier } 18827dd7cddfSDavid du Colombier 18837dd7cddfSDavid du Colombier void 18847dd7cddfSDavid du Colombier rm_loop(char *name, String **l) 18857dd7cddfSDavid du Colombier { 18867dd7cddfSDavid du Colombier String *s; 18877dd7cddfSDavid du Colombier for(s = *l; s != nil; s = *l){ 18887dd7cddfSDavid du Colombier if(strcmp(name, s->name) == 0){ 18897dd7cddfSDavid du Colombier *l = s->next; 18907dd7cddfSDavid du Colombier free(s->name); 18917dd7cddfSDavid du Colombier free(s->val); 18927dd7cddfSDavid du Colombier free(s); 18937dd7cddfSDavid du Colombier break; 18947dd7cddfSDavid du Colombier } 18957dd7cddfSDavid du Colombier l = &s->next; 18967dd7cddfSDavid du Colombier } 18977dd7cddfSDavid du Colombier } 18987dd7cddfSDavid du Colombier 18997dd7cddfSDavid du Colombier void 19007dd7cddfSDavid du Colombier g_rm(int argc, char **argv) 19017dd7cddfSDavid du Colombier { 19027dd7cddfSDavid du Colombier Goobie *g; 19037dd7cddfSDavid du Colombier char *name; 19047dd7cddfSDavid du Colombier int i; 19057dd7cddfSDavid du Colombier 19067dd7cddfSDavid du Colombier for(i = 1; i < argc; i++) { 19077dd7cddfSDavid du Colombier name = argv[i]; 19087dd7cddfSDavid du Colombier rm_loop(name, &strings); 19097dd7cddfSDavid du Colombier rm_loop(name, ¯os); 19107dd7cddfSDavid du Colombier for(g = gtab; g->name; g++) 19117dd7cddfSDavid du Colombier if (strcmp(g->name, name) == 0) { 19127dd7cddfSDavid du Colombier g->f = g_ignore; 19137dd7cddfSDavid du Colombier break; 19147dd7cddfSDavid du Colombier } 19157dd7cddfSDavid du Colombier } 19167dd7cddfSDavid du Colombier } 19177dd7cddfSDavid du Colombier 19187dd7cddfSDavid du Colombier void 19197dd7cddfSDavid du Colombier g_AB(int, char**) 19207dd7cddfSDavid du Colombier { 19217dd7cddfSDavid du Colombier closel(); 1922*73e742d7SDavid du Colombier dohangingcenter(); 1923*73e742d7SDavid du Colombier Bprint(&bout, "<center><H4>ABSTRACT</H4></center><DL><DD>\n"); 19247dd7cddfSDavid du Colombier } 19257dd7cddfSDavid du Colombier 19267dd7cddfSDavid du Colombier void 19277dd7cddfSDavid du Colombier g_AE(int, char**) 19287dd7cddfSDavid du Colombier { 19297dd7cddfSDavid du Colombier Bprint(&bout, "</DL>\n"); 19307dd7cddfSDavid du Colombier } 19317dd7cddfSDavid du Colombier 19327dd7cddfSDavid du Colombier void 19337dd7cddfSDavid du Colombier g_FS(int, char **) 19347dd7cddfSDavid du Colombier { 19357dd7cddfSDavid du Colombier char *argv[3]; 19367dd7cddfSDavid du Colombier 19377dd7cddfSDavid du Colombier argv[0] = "IP"; 19387dd7cddfSDavid du Colombier argv[1] = nil; 19397dd7cddfSDavid du Colombier argv[2] = nil; 19407dd7cddfSDavid du Colombier g_IP(1, argv); 19417dd7cddfSDavid du Colombier Bprint(&bout, "NOTE:<I> "); 19427dd7cddfSDavid du Colombier } 19437dd7cddfSDavid du Colombier 19447dd7cddfSDavid du Colombier void 19457dd7cddfSDavid du Colombier g_FE(int, char **) 19467dd7cddfSDavid du Colombier { 19477dd7cddfSDavid du Colombier Bprint(&bout, "</I><DT> <DD>"); 19487dd7cddfSDavid du Colombier closel(); 19497dd7cddfSDavid du Colombier Bprint(&bout, "<br>\n"); 19507dd7cddfSDavid du Colombier } 19517dd7cddfSDavid du Colombier 19527dd7cddfSDavid du Colombier void 19537dd7cddfSDavid du Colombier g_de(int argc, char **argv) 19547dd7cddfSDavid du Colombier { 19557dd7cddfSDavid du Colombier int r; 19567dd7cddfSDavid du Colombier char *p, *cp; 19577dd7cddfSDavid du Colombier String *m; 19587dd7cddfSDavid du Colombier int len; 19597dd7cddfSDavid du Colombier 19607dd7cddfSDavid du Colombier if(argc < 2) 19617dd7cddfSDavid du Colombier return; 19627dd7cddfSDavid du Colombier 19637dd7cddfSDavid du Colombier m = nil; 19647dd7cddfSDavid du Colombier len = 0; 19657dd7cddfSDavid du Colombier if(strcmp(argv[0], "am") == 0){ 19667dd7cddfSDavid du Colombier for(m = macros; m != nil; m = m->next) 19677dd7cddfSDavid du Colombier if(strcmp(argv[1], m->name) == 0){ 19687dd7cddfSDavid du Colombier len = strlen(m->val); 19697dd7cddfSDavid du Colombier break; 19707dd7cddfSDavid du Colombier } 19717dd7cddfSDavid du Colombier 19727dd7cddfSDavid du Colombier if(m == nil){ 19737dd7cddfSDavid du Colombier /* nothing to append to */ 19747dd7cddfSDavid du Colombier for(;;){ 19757dd7cddfSDavid du Colombier p = Brdline(&ssp->in, '\n'); 19767dd7cddfSDavid du Colombier if(p == nil) 19777dd7cddfSDavid du Colombier break; 19787dd7cddfSDavid du Colombier p[Blinelen(&ssp->in)-1] = 0; 19797dd7cddfSDavid du Colombier if(strcmp(p, "..") == 0) 19807dd7cddfSDavid du Colombier break; 19817dd7cddfSDavid du Colombier } 19827dd7cddfSDavid du Colombier return; 19837dd7cddfSDavid du Colombier } 19847dd7cddfSDavid du Colombier } 19857dd7cddfSDavid du Colombier 19867dd7cddfSDavid du Colombier if(m == nil){ 19877dd7cddfSDavid du Colombier m = emalloc(sizeof(*m)); 19887dd7cddfSDavid du Colombier m->next = macros; 19897dd7cddfSDavid du Colombier macros = m; 19907dd7cddfSDavid du Colombier m->name = strdup(argv[1]); 19917dd7cddfSDavid du Colombier m->val = nil; 19927dd7cddfSDavid du Colombier len = 0; 19937dd7cddfSDavid du Colombier } 19947dd7cddfSDavid du Colombier 19957dd7cddfSDavid du Colombier /* read up to a .. removing double backslashes */ 19967dd7cddfSDavid du Colombier for(;;){ 19977dd7cddfSDavid du Colombier p = Brdline(&ssp->in, '\n'); 19987dd7cddfSDavid du Colombier if(p == nil) 19997dd7cddfSDavid du Colombier break; 20007dd7cddfSDavid du Colombier p[Blinelen(&ssp->in)-1] = 0; 20017dd7cddfSDavid du Colombier if(strcmp(p, "..") == 0) 20027dd7cddfSDavid du Colombier break; 20037dd7cddfSDavid du Colombier m->val = realloc(m->val, len + Blinelen(&ssp->in)+1); 20047dd7cddfSDavid du Colombier cp = m->val + len; 20057dd7cddfSDavid du Colombier while(*p){ 20067dd7cddfSDavid du Colombier r = *p++; 20077dd7cddfSDavid du Colombier if(r == '\\' && *p == '\\') 20087dd7cddfSDavid du Colombier p++; 20097dd7cddfSDavid du Colombier *cp++ = r; 20107dd7cddfSDavid du Colombier } 20117dd7cddfSDavid du Colombier *cp++ = '\n'; 20127dd7cddfSDavid du Colombier len = cp - m->val; 20137dd7cddfSDavid du Colombier *cp = 0; 20147dd7cddfSDavid du Colombier } 20157dd7cddfSDavid du Colombier } 20167dd7cddfSDavid du Colombier 20177dd7cddfSDavid du Colombier void 20187dd7cddfSDavid du Colombier g_hrule(int, char**) 20197dd7cddfSDavid du Colombier { 20207dd7cddfSDavid du Colombier Bprint(&bout, "<HR>\n"); 20217dd7cddfSDavid du Colombier } 20227dd7cddfSDavid du Colombier 20237dd7cddfSDavid du Colombier void 20247dd7cddfSDavid du Colombier g_BX(int argc, char **argv) 20257dd7cddfSDavid du Colombier { 20267dd7cddfSDavid du Colombier Bprint(&bout, "<HR>\n"); 20277dd7cddfSDavid du Colombier printargs(argc, argv); 20287dd7cddfSDavid du Colombier Bprint(&bout, "<HR>\n"); 20297dd7cddfSDavid du Colombier } 20307dd7cddfSDavid du Colombier 20317dd7cddfSDavid du Colombier void 20327dd7cddfSDavid du Colombier g_IH(int, char**) 20337dd7cddfSDavid du Colombier { 20347dd7cddfSDavid du Colombier Bprint(&bout, "Bell Laboratories, Naperville, Illinois, 60540\n"); 20357dd7cddfSDavid du Colombier } 20367dd7cddfSDavid du Colombier 20377dd7cddfSDavid du Colombier void 20387dd7cddfSDavid du Colombier g_MH(int, char**) 20397dd7cddfSDavid du Colombier { 20407dd7cddfSDavid du Colombier Bprint(&bout, "Bell Laboratories, Murray Hill, NJ, 07974\n"); 20417dd7cddfSDavid du Colombier } 20427dd7cddfSDavid du Colombier 20437dd7cddfSDavid du Colombier void 20447dd7cddfSDavid du Colombier g_PY(int, char**) 20457dd7cddfSDavid du Colombier { 20467dd7cddfSDavid du Colombier Bprint(&bout, "Bell Laboratories, Piscataway, NJ, 08854\n"); 20477dd7cddfSDavid du Colombier } 20487dd7cddfSDavid du Colombier 20497dd7cddfSDavid du Colombier void 20507dd7cddfSDavid du Colombier g_HO(int, char**) 20517dd7cddfSDavid du Colombier { 20527dd7cddfSDavid du Colombier Bprint(&bout, "Bell Laboratories, Holmdel, NJ, 07733\n"); 20537dd7cddfSDavid du Colombier } 20547dd7cddfSDavid du Colombier 20557dd7cddfSDavid du Colombier void 20567dd7cddfSDavid du Colombier g_QS(int, char**) 20577dd7cddfSDavid du Colombier { 20587dd7cddfSDavid du Colombier Bprint(&bout, "<BLOCKQUOTE>\n"); 20597dd7cddfSDavid du Colombier } 20607dd7cddfSDavid du Colombier 20617dd7cddfSDavid du Colombier void 20627dd7cddfSDavid du Colombier g_QE(int, char**) 20637dd7cddfSDavid du Colombier { 20647dd7cddfSDavid du Colombier Bprint(&bout, "</BLOCKQUOTE>\n"); 20657dd7cddfSDavid du Colombier } 20667dd7cddfSDavid du Colombier 20677dd7cddfSDavid du Colombier void 20687dd7cddfSDavid du Colombier g_RS(int, char**) 20697dd7cddfSDavid du Colombier { 20707dd7cddfSDavid du Colombier Bprint(&bout, "<DL><DD>\n"); 20717dd7cddfSDavid du Colombier } 20727dd7cddfSDavid du Colombier 20737dd7cddfSDavid du Colombier void 20747dd7cddfSDavid du Colombier g_RE(int, char**) 20757dd7cddfSDavid du Colombier { 20767dd7cddfSDavid du Colombier Bprint(&bout, "</DL>\n"); 20777dd7cddfSDavid du Colombier } 20787dd7cddfSDavid du Colombier 20797dd7cddfSDavid du Colombier int gif; 20807dd7cddfSDavid du Colombier 20817dd7cddfSDavid du Colombier void 20827dd7cddfSDavid du Colombier g_startgif(int, char **argv) 20837dd7cddfSDavid du Colombier { 20847dd7cddfSDavid du Colombier int fd; 20857dd7cddfSDavid du Colombier int pfd[2]; 20867dd7cddfSDavid du Colombier char *e, *p; 20877dd7cddfSDavid du Colombier char name[32]; 20889a747e4fSDavid du Colombier Dir *d; 20897dd7cddfSDavid du Colombier 20907dd7cddfSDavid du Colombier if(strcmp(argv[0], "EQ") == 0) 20917dd7cddfSDavid du Colombier e = ".EN"; 20927dd7cddfSDavid du Colombier else if(strcmp(argv[0], "TS") == 0) 20937dd7cddfSDavid du Colombier e = ".TE"; 20947dd7cddfSDavid du Colombier else if(strcmp(argv[0], "PS") == 0) 20957dd7cddfSDavid du Colombier e = ".PE"; 20967dd7cddfSDavid du Colombier else 20977dd7cddfSDavid du Colombier return; 20987dd7cddfSDavid du Colombier 2099*73e742d7SDavid du Colombier if(basename) 2100*73e742d7SDavid du Colombier p = basename; 2101*73e742d7SDavid du Colombier else{ 21027dd7cddfSDavid du Colombier p = strrchr(sstack[0].filename, '/'); 21037dd7cddfSDavid du Colombier if(p != nil) 21047dd7cddfSDavid du Colombier p++; 21057dd7cddfSDavid du Colombier else 21067dd7cddfSDavid du Colombier p = sstack[0].filename; 2107*73e742d7SDavid du Colombier } 2108*73e742d7SDavid du Colombier snprint(name, sizeof(name), "%s.%d.gif", p, gif++); 21097dd7cddfSDavid du Colombier fd = create(name, OWRITE, 0664); 21107dd7cddfSDavid du Colombier if(fd < 0){ 21117dd7cddfSDavid du Colombier fprint(2, "ms2html: can't create %s: %r\n", name); 21127dd7cddfSDavid du Colombier return; 21137dd7cddfSDavid du Colombier } 21147dd7cddfSDavid du Colombier 21157dd7cddfSDavid du Colombier if(pipe(pfd) < 0){ 21167dd7cddfSDavid du Colombier fprint(2, "ms2html: can't create pipe: %r\n"); 21177dd7cddfSDavid du Colombier close(fd); 21187dd7cddfSDavid du Colombier return; 21197dd7cddfSDavid du Colombier } 21207dd7cddfSDavid du Colombier switch(rfork(RFFDG|RFPROC)){ 21217dd7cddfSDavid du Colombier case -1: 21227dd7cddfSDavid du Colombier fprint(2, "ms2html: can't fork: %r\n"); 21237dd7cddfSDavid du Colombier close(fd); 21247dd7cddfSDavid du Colombier return; 21257dd7cddfSDavid du Colombier case 0: 21267dd7cddfSDavid du Colombier dup(fd, 1); 21277dd7cddfSDavid du Colombier close(fd); 21287dd7cddfSDavid du Colombier dup(pfd[0], 0); 21297dd7cddfSDavid du Colombier close(pfd[0]); 21307dd7cddfSDavid du Colombier close(pfd[1]); 2131f19e7b74SDavid du Colombier execl("/bin/troff2gif", "troff2gif", nil); 21327dd7cddfSDavid du Colombier fprint(2, "ms2html: couldn't exec troff2gif: %r\n"); 21337dd7cddfSDavid du Colombier _exits(nil); 21347dd7cddfSDavid du Colombier default: 21357dd7cddfSDavid du Colombier close(fd); 21367dd7cddfSDavid du Colombier close(pfd[0]); 21377dd7cddfSDavid du Colombier fprint(pfd[1], ".ll 7i\n"); 2138*73e742d7SDavid du Colombier /* fprint(pfd[1], ".EQ\ndelim %s\n.EN\n", delim); */ 2139*73e742d7SDavid du Colombier /* fprint(pfd[1], ".%s\n", argv[0]); */ 21407dd7cddfSDavid du Colombier for(;;){ 21417dd7cddfSDavid du Colombier p = Brdline(&ssp->in, '\n'); 21427dd7cddfSDavid du Colombier if(p == nil) 21437dd7cddfSDavid du Colombier break; 21447dd7cddfSDavid du Colombier ssp->lno++; 21457dd7cddfSDavid du Colombier ssp->rlno++; 21467dd7cddfSDavid du Colombier if(write(pfd[1], p, Blinelen(&ssp->in)) < 0) 21477dd7cddfSDavid du Colombier break; 21486b6b9ac8SDavid du Colombier if(strncmp(p, e, 3) == 0) 21496b6b9ac8SDavid du Colombier break; 21507dd7cddfSDavid du Colombier } 21517dd7cddfSDavid du Colombier close(pfd[1]); 21529a747e4fSDavid du Colombier waitpid(); 21539a747e4fSDavid du Colombier d = dirstat(name); 21549a747e4fSDavid du Colombier if(d == nil) 21557dd7cddfSDavid du Colombier break; 21569a747e4fSDavid du Colombier if(d->length == 0){ 21577dd7cddfSDavid du Colombier remove(name); 21589a747e4fSDavid du Colombier free(d); 21597dd7cddfSDavid du Colombier break; 21607dd7cddfSDavid du Colombier } 21619a747e4fSDavid du Colombier free(d); 21627dd7cddfSDavid du Colombier fprint(2, "ms2html: created auxiliary file %s\n", name); 21637dd7cddfSDavid du Colombier Bprint(&bout, "<br><img src=\"%s\"><br>\n", name); 21647dd7cddfSDavid du Colombier break; 21657dd7cddfSDavid du Colombier } 21667dd7cddfSDavid du Colombier } 21677dd7cddfSDavid du Colombier 21687dd7cddfSDavid du Colombier void 21697dd7cddfSDavid du Colombier g_lf(int argc, char **argv) 21707dd7cddfSDavid du Colombier { 21717dd7cddfSDavid du Colombier if(argc > 2) 21727dd7cddfSDavid du Colombier snprint(ssp->filename, sizeof(ssp->filename), argv[2]); 21737dd7cddfSDavid du Colombier if(argc > 1) 21747dd7cddfSDavid du Colombier ssp->rlno = atoi(argv[1]); 21757dd7cddfSDavid du Colombier } 21767dd7cddfSDavid du Colombier 21777dd7cddfSDavid du Colombier void 21787dd7cddfSDavid du Colombier g_so(int argc, char **argv) 21797dd7cddfSDavid du Colombier { 21807dd7cddfSDavid du Colombier ssp->lno++; 21817dd7cddfSDavid du Colombier ssp->rlno++; 21827dd7cddfSDavid du Colombier if(argc > 1) 21837dd7cddfSDavid du Colombier pushsrc(argv[1]); 21847dd7cddfSDavid du Colombier } 21857dd7cddfSDavid du Colombier 21867dd7cddfSDavid du Colombier 21877dd7cddfSDavid du Colombier void 21887dd7cddfSDavid du Colombier g_BP(int argc, char **argv) 21897dd7cddfSDavid du Colombier { 21907dd7cddfSDavid du Colombier int fd; 21917dd7cddfSDavid du Colombier char *p, *ext; 21927dd7cddfSDavid du Colombier char name[32]; 21939a747e4fSDavid du Colombier Dir *d; 21947dd7cddfSDavid du Colombier 21957dd7cddfSDavid du Colombier if(argc < 2) 21967dd7cddfSDavid du Colombier return; 21977dd7cddfSDavid du Colombier 21987dd7cddfSDavid du Colombier p = strrchr(argv[1], '/'); 21997dd7cddfSDavid du Colombier if(p != nil) 22007dd7cddfSDavid du Colombier p++; 22017dd7cddfSDavid du Colombier else 22027dd7cddfSDavid du Colombier p = argv[1]; 22037dd7cddfSDavid du Colombier 22047dd7cddfSDavid du Colombier 22057dd7cddfSDavid du Colombier ext = strrchr(p, '.'); 22067dd7cddfSDavid du Colombier if(ext){ 22077dd7cddfSDavid du Colombier if(strcmp(ext, ".jpeg") == 0 22087dd7cddfSDavid du Colombier || strcmp(ext, ".gif") == 0){ 22097dd7cddfSDavid du Colombier Bprint(&bout, "<br><img src=\"%s\"><br>\n", argv[1]); 22107dd7cddfSDavid du Colombier return; 22117dd7cddfSDavid du Colombier } 22127dd7cddfSDavid du Colombier } 22137dd7cddfSDavid du Colombier 22147dd7cddfSDavid du Colombier 22157dd7cddfSDavid du Colombier snprint(name, sizeof(name), "%s.%d%d.gif", p, getpid(), gif++); 22167dd7cddfSDavid du Colombier fd = create(name, OWRITE, 0664); 22177dd7cddfSDavid du Colombier if(fd < 0){ 22187dd7cddfSDavid du Colombier fprint(2, "ms2html: can't create %s: %r\n", name); 22197dd7cddfSDavid du Colombier return; 22207dd7cddfSDavid du Colombier } 22217dd7cddfSDavid du Colombier 22227dd7cddfSDavid du Colombier switch(rfork(RFFDG|RFPROC)){ 22237dd7cddfSDavid du Colombier case -1: 22247dd7cddfSDavid du Colombier fprint(2, "ms2html: can't fork: %r\n"); 22257dd7cddfSDavid du Colombier close(fd); 22267dd7cddfSDavid du Colombier return; 22277dd7cddfSDavid du Colombier case 0: 22287dd7cddfSDavid du Colombier dup(fd, 1); 22297dd7cddfSDavid du Colombier close(fd); 2230f19e7b74SDavid du Colombier execl("/bin/ps2gif", "ps2gif", argv[1], nil); 22317dd7cddfSDavid du Colombier fprint(2, "ms2html: couldn't exec ps2gif: %r\n"); 22327dd7cddfSDavid du Colombier _exits(nil); 22337dd7cddfSDavid du Colombier default: 22347dd7cddfSDavid du Colombier close(fd); 22359a747e4fSDavid du Colombier waitpid(); 22369a747e4fSDavid du Colombier d = dirstat(name); 22379a747e4fSDavid du Colombier if(d == nil) 22387dd7cddfSDavid du Colombier break; 22399a747e4fSDavid du Colombier if(d->length == 0){ 22407dd7cddfSDavid du Colombier remove(name); 22419a747e4fSDavid du Colombier free(d); 22427dd7cddfSDavid du Colombier break; 22437dd7cddfSDavid du Colombier } 22449a747e4fSDavid du Colombier free(d); 22457dd7cddfSDavid du Colombier fprint(2, "ms2html: created auxiliary file %s\n", name); 22467dd7cddfSDavid du Colombier Bprint(&bout, "<br><img src=\"%s\"><br>\n", name); 22477dd7cddfSDavid du Colombier break; 22487dd7cddfSDavid du Colombier } 22497dd7cddfSDavid du Colombier } 22507dd7cddfSDavid du Colombier 22517dd7cddfSDavid du Colombier /* insert straight HTML into output */ 22527dd7cddfSDavid du Colombier void 22537dd7cddfSDavid du Colombier g__H(int argc, char **argv) 22547dd7cddfSDavid du Colombier { 22557dd7cddfSDavid du Colombier int i; 22567dd7cddfSDavid du Colombier 22577dd7cddfSDavid du Colombier for(i = 1; i < argc; i++) 22587dd7cddfSDavid du Colombier Bprint(&bout, "%s ", argv[i]); 22597dd7cddfSDavid du Colombier Bprint(&bout, "\n"); 22607dd7cddfSDavid du Colombier } 22617dd7cddfSDavid du Colombier 22627dd7cddfSDavid du Colombier /* HTML page title */ 22637dd7cddfSDavid du Colombier void 22647dd7cddfSDavid du Colombier g__T(int argc, char **argv) 22657dd7cddfSDavid du Colombier { 22667dd7cddfSDavid du Colombier if(titleseen) 22677dd7cddfSDavid du Colombier return; 22687dd7cddfSDavid du Colombier 22697dd7cddfSDavid du Colombier Bprint(&bout, "<title>\n"); 22707dd7cddfSDavid du Colombier printargs(argc, argv); 22717dd7cddfSDavid du Colombier Bprint(&bout, "</title></head><body>\n"); 22727dd7cddfSDavid du Colombier titleseen = 1; 22737dd7cddfSDavid du Colombier } 22747dd7cddfSDavid du Colombier 22757dd7cddfSDavid du Colombier void 22767dd7cddfSDavid du Colombier g_nr(int argc, char **argv) 22777dd7cddfSDavid du Colombier { 22787dd7cddfSDavid du Colombier char *val; 22797dd7cddfSDavid du Colombier 22807dd7cddfSDavid du Colombier if (argc > 1) { 22817dd7cddfSDavid du Colombier if (argc == 2) 22827dd7cddfSDavid du Colombier val = "0"; 22837dd7cddfSDavid du Colombier else 22847dd7cddfSDavid du Colombier val = argv[2]; 22857dd7cddfSDavid du Colombier dsnr(argv[1], val, &numregs); 22867dd7cddfSDavid du Colombier } 22877dd7cddfSDavid du Colombier } 22887dd7cddfSDavid du Colombier 22897dd7cddfSDavid du Colombier void 22907dd7cddfSDavid du Colombier zerodivide(void) 22917dd7cddfSDavid du Colombier { 22927dd7cddfSDavid du Colombier fprint(2, "stdin %d(%s:%d): division by 0\n", 22937dd7cddfSDavid du Colombier ssp->lno, ssp->filename, ssp->rlno); 22947dd7cddfSDavid du Colombier } 22957dd7cddfSDavid du Colombier 22967dd7cddfSDavid du Colombier int 22977dd7cddfSDavid du Colombier numval(char **pline, int recur) 22987dd7cddfSDavid du Colombier { 22997dd7cddfSDavid du Colombier char *p; 23007dd7cddfSDavid du Colombier int neg, x, y; 23017dd7cddfSDavid du Colombier 23027dd7cddfSDavid du Colombier x = neg = 0; 23037dd7cddfSDavid du Colombier p = *pline; 23047dd7cddfSDavid du Colombier while(*p == '-') { 23057dd7cddfSDavid du Colombier neg = 1 - neg; 23067dd7cddfSDavid du Colombier p++; 23077dd7cddfSDavid du Colombier } 23087dd7cddfSDavid du Colombier if (*p == '(') { 23097dd7cddfSDavid du Colombier p++; 23107dd7cddfSDavid du Colombier x = numval(&p, 1); 23117dd7cddfSDavid du Colombier if (*p != ')') 23127dd7cddfSDavid du Colombier goto done; 23137dd7cddfSDavid du Colombier p++; 23147dd7cddfSDavid du Colombier } 23157dd7cddfSDavid du Colombier else while(*p >= '0' && *p <= '9') 23167dd7cddfSDavid du Colombier x = 10*x + *p++ - '0'; 23177dd7cddfSDavid du Colombier if (neg) 23187dd7cddfSDavid du Colombier x = -x; 23197dd7cddfSDavid du Colombier if (recur) 23207dd7cddfSDavid du Colombier for(;;) { 23217dd7cddfSDavid du Colombier switch(*p++) { 23227dd7cddfSDavid du Colombier case '+': 23237dd7cddfSDavid du Colombier x += numval(&p, 0); 23247dd7cddfSDavid du Colombier continue; 23257dd7cddfSDavid du Colombier case '-': 23267dd7cddfSDavid du Colombier x -= numval(&p, 0); 23277dd7cddfSDavid du Colombier continue; 23287dd7cddfSDavid du Colombier case '*': 23297dd7cddfSDavid du Colombier x *= numval(&p, 0); 23307dd7cddfSDavid du Colombier continue; 23317dd7cddfSDavid du Colombier case '/': 23327dd7cddfSDavid du Colombier y = numval(&p, 0); 23337dd7cddfSDavid du Colombier if (y == 0) { 23347dd7cddfSDavid du Colombier zerodivide(); 23357dd7cddfSDavid du Colombier x = 0; 23367dd7cddfSDavid du Colombier goto done; 23377dd7cddfSDavid du Colombier } 23387dd7cddfSDavid du Colombier x /= y; 23397dd7cddfSDavid du Colombier continue; 23407dd7cddfSDavid du Colombier case '<': 23417dd7cddfSDavid du Colombier if (*p == '=') { 23427dd7cddfSDavid du Colombier p++; 23437dd7cddfSDavid du Colombier x = x <= numval(&p, 0); 23447dd7cddfSDavid du Colombier continue; 23457dd7cddfSDavid du Colombier } 23467dd7cddfSDavid du Colombier x = x < numval(&p, 0); 23477dd7cddfSDavid du Colombier continue; 23487dd7cddfSDavid du Colombier case '>': 23497dd7cddfSDavid du Colombier if (*p == '=') { 23507dd7cddfSDavid du Colombier p++; 23517dd7cddfSDavid du Colombier x = x >= numval(&p, 0); 23527dd7cddfSDavid du Colombier continue; 23537dd7cddfSDavid du Colombier } 23547dd7cddfSDavid du Colombier x = x > numval(&p, 0); 23557dd7cddfSDavid du Colombier continue; 23567dd7cddfSDavid du Colombier case '=': 23577dd7cddfSDavid du Colombier if (*p == '=') 23587dd7cddfSDavid du Colombier p++; 23597dd7cddfSDavid du Colombier x = x == numval(&p, 0); 23607dd7cddfSDavid du Colombier continue; 23617dd7cddfSDavid du Colombier case '&': 23627dd7cddfSDavid du Colombier x &= numval(&p, 0); 23637dd7cddfSDavid du Colombier continue; 23647dd7cddfSDavid du Colombier case ':': 23657dd7cddfSDavid du Colombier x |= numval(&p, 0); 23667dd7cddfSDavid du Colombier continue; 23677dd7cddfSDavid du Colombier case '%': 23687dd7cddfSDavid du Colombier y = numval(&p, 0); 23697dd7cddfSDavid du Colombier if (!y) { 23707dd7cddfSDavid du Colombier zerodivide(); 23717dd7cddfSDavid du Colombier goto done; 23727dd7cddfSDavid du Colombier } 23737dd7cddfSDavid du Colombier x %= y; 23747dd7cddfSDavid du Colombier continue; 23757dd7cddfSDavid du Colombier } 23767dd7cddfSDavid du Colombier --p; 23777dd7cddfSDavid du Colombier break; 23787dd7cddfSDavid du Colombier } 23797dd7cddfSDavid du Colombier done: 23807dd7cddfSDavid du Colombier *pline = p; 23817dd7cddfSDavid du Colombier return x; 23827dd7cddfSDavid du Colombier } 23837dd7cddfSDavid du Colombier 23847dd7cddfSDavid du Colombier int 23857dd7cddfSDavid du Colombier iftest(char *p, char **bp) 23867dd7cddfSDavid du Colombier { 23877dd7cddfSDavid du Colombier char *p1; 23887dd7cddfSDavid du Colombier int c, neg, rv; 23897dd7cddfSDavid du Colombier 23907dd7cddfSDavid du Colombier rv = neg = 0; 23917dd7cddfSDavid du Colombier if (*p == '!') { 23927dd7cddfSDavid du Colombier neg = 1; 23937dd7cddfSDavid du Colombier p++; 23947dd7cddfSDavid du Colombier } 23957dd7cddfSDavid du Colombier c = *p; 23967dd7cddfSDavid du Colombier if (c >= '0' && c <= '9' || c == '+' || c == '-' || c == '('/*)*/) { 23977dd7cddfSDavid du Colombier if (numval(&p,1) >= 1) 23987dd7cddfSDavid du Colombier rv = 1; 23997dd7cddfSDavid du Colombier goto done; 24007dd7cddfSDavid du Colombier } 24017dd7cddfSDavid du Colombier switch(c) { 24027dd7cddfSDavid du Colombier case 't': 24037dd7cddfSDavid du Colombier case 'o': 24047dd7cddfSDavid du Colombier rv = 1; 24057dd7cddfSDavid du Colombier case 'n': 24067dd7cddfSDavid du Colombier case 'e': 24077dd7cddfSDavid du Colombier p++; 24087dd7cddfSDavid du Colombier goto done; 24097dd7cddfSDavid du Colombier } 24107dd7cddfSDavid du Colombier for(p1 = ++p; *p != c; p++) 24117dd7cddfSDavid du Colombier if (!*p) 24127dd7cddfSDavid du Colombier goto done; 24137dd7cddfSDavid du Colombier for(p++;;) { 24147dd7cddfSDavid du Colombier if (*p != *p1++) { 24157dd7cddfSDavid du Colombier while(*p && *p++ != c); 24167dd7cddfSDavid du Colombier goto done; 24177dd7cddfSDavid du Colombier } 24187dd7cddfSDavid du Colombier if (*p++ == c) 24197dd7cddfSDavid du Colombier break; 24207dd7cddfSDavid du Colombier } 24217dd7cddfSDavid du Colombier rv = 1; 24227dd7cddfSDavid du Colombier done: 24237dd7cddfSDavid du Colombier if (neg) 24247dd7cddfSDavid du Colombier rv = 1 - rv; 24257dd7cddfSDavid du Colombier while(*p == ' ' || *p == '\t') 24267dd7cddfSDavid du Colombier p++; 24277dd7cddfSDavid du Colombier *bp = p; 24287dd7cddfSDavid du Colombier return rv; 24297dd7cddfSDavid du Colombier } 24307dd7cddfSDavid du Colombier 24317dd7cddfSDavid du Colombier void 24327dd7cddfSDavid du Colombier scanline(char *p, char *e, int wantnl) 24337dd7cddfSDavid du Colombier { 24347dd7cddfSDavid du Colombier int c; 24357dd7cddfSDavid du Colombier Rune r; 24367dd7cddfSDavid du Colombier 24377dd7cddfSDavid du Colombier while((c = getrune()) == ' ' || c == '\t') ; 24387dd7cddfSDavid du Colombier while(p < e) { 24397dd7cddfSDavid du Colombier if (c < 0) 24407dd7cddfSDavid du Colombier break; 24417dd7cddfSDavid du Colombier if (c < Runeself) { 24427dd7cddfSDavid du Colombier if (c == '\n') { 24437dd7cddfSDavid du Colombier if (wantnl) 24447dd7cddfSDavid du Colombier *p++ = c; 24457dd7cddfSDavid du Colombier break; 24467dd7cddfSDavid du Colombier } 24477dd7cddfSDavid du Colombier *p++ = c; 24487dd7cddfSDavid du Colombier } 24497dd7cddfSDavid du Colombier else { 24507dd7cddfSDavid du Colombier r = c; 24517dd7cddfSDavid du Colombier p += runetochar(p, &r); 24527dd7cddfSDavid du Colombier } 24537dd7cddfSDavid du Colombier c = getrune(); 24547dd7cddfSDavid du Colombier } 24557dd7cddfSDavid du Colombier *p = 0; 24567dd7cddfSDavid du Colombier } 24577dd7cddfSDavid du Colombier 24587dd7cddfSDavid du Colombier void 24597dd7cddfSDavid du Colombier pushbody(char *line) 24607dd7cddfSDavid du Colombier { 24617dd7cddfSDavid du Colombier char *b; 24627dd7cddfSDavid du Colombier 24637dd7cddfSDavid du Colombier if (line[0] == '\\' && line[1] == '{' /*}*/ ) 24647dd7cddfSDavid du Colombier line += 2; 24657dd7cddfSDavid du Colombier if (strsp < Maxmstack - 1) { 24667dd7cddfSDavid du Colombier pushstr(b = strdup(line)); 24677dd7cddfSDavid du Colombier mustfree[strsp] = b; 24687dd7cddfSDavid du Colombier } 24697dd7cddfSDavid du Colombier } 24707dd7cddfSDavid du Colombier 24717dd7cddfSDavid du Colombier void 24727dd7cddfSDavid du Colombier skipbody(char *line) 24737dd7cddfSDavid du Colombier { 24747dd7cddfSDavid du Colombier int c, n; 24757dd7cddfSDavid du Colombier 24767dd7cddfSDavid du Colombier if (line[0] != '\\' || line[1] != '{' /*}*/ ) 24777dd7cddfSDavid du Colombier return; 24787dd7cddfSDavid du Colombier for(n = 1;;) { 24797dd7cddfSDavid du Colombier while((c = getrune()) != '\\') 24807dd7cddfSDavid du Colombier if (c < 0) 24817dd7cddfSDavid du Colombier return; 24827dd7cddfSDavid du Colombier c = getrune(); 24837dd7cddfSDavid du Colombier if (c == '{') 24847dd7cddfSDavid du Colombier n++; 24857dd7cddfSDavid du Colombier else if ((c == '}' && (c = getrune()) == '\n' && !--n) 24867dd7cddfSDavid du Colombier || c < 0) 24877dd7cddfSDavid du Colombier return; 24887dd7cddfSDavid du Colombier } 24897dd7cddfSDavid du Colombier } 24907dd7cddfSDavid du Colombier 24917dd7cddfSDavid du Colombier int 24927dd7cddfSDavid du Colombier ifstart(char *line, char *e, char **bp) 24937dd7cddfSDavid du Colombier { 24947dd7cddfSDavid du Colombier int it; 24957dd7cddfSDavid du Colombier char *b; 24967dd7cddfSDavid du Colombier 24977dd7cddfSDavid du Colombier b = copyline(line, e, 1); 24987dd7cddfSDavid du Colombier ungetrune(); 24997dd7cddfSDavid du Colombier b[-1] = getrune(); 25007dd7cddfSDavid du Colombier scanline(b, e, 1); 25017dd7cddfSDavid du Colombier it = iftest(line, bp); 25027dd7cddfSDavid du Colombier return it; 25037dd7cddfSDavid du Colombier } 25047dd7cddfSDavid du Colombier 25057dd7cddfSDavid du Colombier void 25067dd7cddfSDavid du Colombier g_ie(char *line, char *e) 25077dd7cddfSDavid du Colombier { 25087dd7cddfSDavid du Colombier char *b; 25097dd7cddfSDavid du Colombier 25107dd7cddfSDavid du Colombier if (elsetop >= Maxif-1) { 25117dd7cddfSDavid du Colombier fprint(2, "ms2html: .ie's too deep\n"); 25127dd7cddfSDavid du Colombier return; 25137dd7cddfSDavid du Colombier } 25147dd7cddfSDavid du Colombier if (ifwastrue[++elsetop] = ifstart(line, e, &b)) 25157dd7cddfSDavid du Colombier pushbody(b); 25167dd7cddfSDavid du Colombier else 25177dd7cddfSDavid du Colombier skipbody(b); 25187dd7cddfSDavid du Colombier } 25197dd7cddfSDavid du Colombier 25207dd7cddfSDavid du Colombier void 25217dd7cddfSDavid du Colombier g_if(char *line, char *e) 25227dd7cddfSDavid du Colombier { 25237dd7cddfSDavid du Colombier char *b; 25247dd7cddfSDavid du Colombier 25257dd7cddfSDavid du Colombier if (ifstart(line, e, &b)) 25267dd7cddfSDavid du Colombier pushbody(b); 25277dd7cddfSDavid du Colombier else 25287dd7cddfSDavid du Colombier skipbody(b); 25297dd7cddfSDavid du Colombier } 25307dd7cddfSDavid du Colombier 25317dd7cddfSDavid du Colombier void 25327dd7cddfSDavid du Colombier g_el(char *line, char *e) 25337dd7cddfSDavid du Colombier { 25347dd7cddfSDavid du Colombier if (elsetop < 0) 25357dd7cddfSDavid du Colombier return; 25367dd7cddfSDavid du Colombier scanline(line, e, 1); 25377dd7cddfSDavid du Colombier if (ifwastrue[elsetop--]) 25387dd7cddfSDavid du Colombier skipbody(line); 25397dd7cddfSDavid du Colombier else 25407dd7cddfSDavid du Colombier pushbody(line); 25417dd7cddfSDavid du Colombier } 25427dd7cddfSDavid du Colombier 25437dd7cddfSDavid du Colombier void 25447dd7cddfSDavid du Colombier g_ig(int argc, char **argv) 25457dd7cddfSDavid du Colombier { 25467dd7cddfSDavid du Colombier char *p, *s; 25477dd7cddfSDavid du Colombier 25487dd7cddfSDavid du Colombier s = ".."; 25497dd7cddfSDavid du Colombier if (argc > 1) 25507dd7cddfSDavid du Colombier s = argv[1]; 25517dd7cddfSDavid du Colombier for(;;) { 25527dd7cddfSDavid du Colombier p = Brdline(&ssp->in, '\n'); 25537dd7cddfSDavid du Colombier if(p == nil) 25547dd7cddfSDavid du Colombier break; 25557dd7cddfSDavid du Colombier p[Blinelen(&ssp->in)-1] = 0; 25567dd7cddfSDavid du Colombier if(strcmp(p, s) == 0) 25577dd7cddfSDavid du Colombier break; 25587dd7cddfSDavid du Colombier } 25597dd7cddfSDavid du Colombier } 25607dd7cddfSDavid du Colombier 25617dd7cddfSDavid du Colombier void 25627dd7cddfSDavid du Colombier g_ds(char *line, char *e) 25637dd7cddfSDavid du Colombier { 25647dd7cddfSDavid du Colombier char *b; 25657dd7cddfSDavid du Colombier 25667dd7cddfSDavid du Colombier b = copyline(line, e, 1); 25677dd7cddfSDavid du Colombier if (b > line) { 25687dd7cddfSDavid du Colombier copyline(b, e, 0); 25697dd7cddfSDavid du Colombier if (*b == '"') 25707dd7cddfSDavid du Colombier b++; 25717dd7cddfSDavid du Colombier ds(line, b); 25727dd7cddfSDavid du Colombier } 25737dd7cddfSDavid du Colombier } 25747dd7cddfSDavid du Colombier 25757dd7cddfSDavid du Colombier void 25767dd7cddfSDavid du Colombier g_as(char *line, char *e) 25777dd7cddfSDavid du Colombier { 25787dd7cddfSDavid du Colombier String *s; 25797dd7cddfSDavid du Colombier char *b; 25807dd7cddfSDavid du Colombier 25817dd7cddfSDavid du Colombier b = copyline(line, e, 1); 25827dd7cddfSDavid du Colombier if (b == line) 25837dd7cddfSDavid du Colombier return; 25847dd7cddfSDavid du Colombier copyline(b, e, 0); 25857dd7cddfSDavid du Colombier if (*b == '"') 25867dd7cddfSDavid du Colombier b++; 25877dd7cddfSDavid du Colombier for(s = strings; s != nil; s = s->next) 25887dd7cddfSDavid du Colombier if(strcmp(line, s->name) == 0) 25897dd7cddfSDavid du Colombier break; 25907dd7cddfSDavid du Colombier 25917dd7cddfSDavid du Colombier if(s == nil){ 25927dd7cddfSDavid du Colombier ds(line, b); 25937dd7cddfSDavid du Colombier return; 25947dd7cddfSDavid du Colombier } 25957dd7cddfSDavid du Colombier 25967dd7cddfSDavid du Colombier s->val = realloc(s->val, strlen(s->val) + strlen(b) + 1); 25977dd7cddfSDavid du Colombier strcat(s->val, b); 25987dd7cddfSDavid du Colombier } 25997dd7cddfSDavid du Colombier 26007dd7cddfSDavid du Colombier void 26017dd7cddfSDavid du Colombier g_BS(int argc, char **argv) 26027dd7cddfSDavid du Colombier { 26037dd7cddfSDavid du Colombier int i; 26047dd7cddfSDavid du Colombier 26057dd7cddfSDavid du Colombier if (argc > 1 && !weBref) { 26067dd7cddfSDavid du Colombier Bprint(&bout, "<a href=\"%s\"", argv[1]); 26077dd7cddfSDavid du Colombier for(i = 2; i < argc; i++) 26087dd7cddfSDavid du Colombier Bprint(&bout, " %s", argv[i]); 26097dd7cddfSDavid du Colombier Bprint(&bout, ">"); 26107dd7cddfSDavid du Colombier weBref = 1; 26117dd7cddfSDavid du Colombier } 26127dd7cddfSDavid du Colombier } 26137dd7cddfSDavid du Colombier 26147dd7cddfSDavid du Colombier void 26157dd7cddfSDavid du Colombier g_BE(int, char**) 26167dd7cddfSDavid du Colombier { 26177dd7cddfSDavid du Colombier if (weBref) { 26187dd7cddfSDavid du Colombier Bprint(&bout, "</a>"); 26197dd7cddfSDavid du Colombier weBref = 0; 26207dd7cddfSDavid du Colombier } 26217dd7cddfSDavid du Colombier } 26227dd7cddfSDavid du Colombier 26237dd7cddfSDavid du Colombier void 26247dd7cddfSDavid du Colombier g_LB(int argc, char **argv) 26257dd7cddfSDavid du Colombier { 26267dd7cddfSDavid du Colombier if (argc > 1) { 26277dd7cddfSDavid du Colombier if (weBref) 26287dd7cddfSDavid du Colombier g_BE(0,nil); 26297dd7cddfSDavid du Colombier Bprint(&bout, "<a name=\"%s\"></a>", argv[1]); 26307dd7cddfSDavid du Colombier } 26317dd7cddfSDavid du Colombier } 26327dd7cddfSDavid du Colombier 26337dd7cddfSDavid du Colombier void 26347dd7cddfSDavid du Colombier g_RT(int, char**) 26357dd7cddfSDavid du Colombier { 26367dd7cddfSDavid du Colombier g_BE(0,nil); 26377dd7cddfSDavid du Colombier dohanginghead(); 26387dd7cddfSDavid du Colombier closel(); 26397dd7cddfSDavid du Colombier closefont(); 26407dd7cddfSDavid du Colombier } 2641