// mips-linux-gnu-gcc -static -o soaps soaps.c -I ../new-parser/imps ../new-parser/imps/perms.c -lm #include <perms.h> extern FILE *OUTFILE; #undef Spaces #undef Space #undef Rem unsigned char *Source = NULL; static const short Main[1+ 217 /*1:217*/] = {0, 1, 5, 14, 20, 26, 38, 43, 48, 54, 61, 68, 74, 79, 82, 84, 89, 96, 102, 108, 115, 122, 126, 0, 129, 133, 137, 142, 145, 152, 156, 161, 164, 168, 0, 171, 0, 178, 184, 185, 189, 190, 193, 196, 199, 0, 202, 205, 206, 208, 0, 211, 213, 215, 216, 219, 222, 225, 0, 228, 231, 236, 241, 244, 249, 0, 253, 259, 260, 264, 266, 267, 270, 271, 274, 277, 279, 280, 283, 286, 289, 292, 295, 298, 302, 305, 308, 311, 314, 317, 320, 324, 328, 332, 336, 340, 344, 348, 352, 355, 358, 0, 361, 363, 365, 373, 0, 381, 0, 385, 392, 393, 396, 397, 400, 403, 405, 406, 410, 0, 413, 418, 425, 432, 0, 435, 437, 0, 440, 445, 446, 450, 453, 456, 0, 459, 462, 463, 0, 469, 472, 473, 475, 0, 477, 489, 499, 506, 0, 509, 511, 512, 517, 0, 520, 0, 530, 534, 535, 538, 539, 0, 543, 546, 547, 0, 558, 565, 566, 571, 572, 576, 579, 0, 585, 587, 588, 591, 0, 594, 597, 0, 600, 602, 603, 608, 609, 614, 615, 618, 0, 620, 622, 623, 627, 628, 631, 634, 637, 0, 640, 646, 0, 651, 656, 657, 660, 661, 665, 0, 667, 0, 670, 674, 675, 678, 681, 683}; static const short Sub[2+ 683 /*2:684*/] = {0,0, 4119, 4288, -8192, 0, 4149, 4168, 4197, 4166, 4286, 4119, 4230, -8192, 0, 1, 8200, 24576, 4230, -8192, 0, 8, 8221, 24576, 16384, -8192, 0, 15, 8204, 20480, 16384, 4202, 21, 8244, 4168, 4197, 4166, -8192, 0, 4154, 4246, -20480, -8192, 0, 4290, 4154, 4295, -20480, 0, 23, 8223, 4255, -8192, -20480, 0, 4208, 4271, 4212, -4096, 4261, -8192, 0, 30, 8197, -4096, 4261, -8192, -20480, 0, 35, 8196, 20480, -8192, -16384, 0, 41, 8198, 4215, -8192, 0, 4130, 4096, 0, 4225, 0, 45, 8199, -8192, -20480, 0, 4309, 50, 8201, 4239, -8192, -20480, 0, 57, -20480, 8202, 12288, -8192, 0, 65, 8203, 4232, -8192, -20480, 0, 71, 77, 8193, 8205, -8192, -20480, 0, 85, 93, 8206, 8207, -8192, -20480, 0, 101, 8257, -32768, 0, -12288, -8192, 0, 4202, 4134, 4141, 0, 103, 8246, 4143, 0, 106, 8208, 12288, 4141, 0, 116, 8209, 0, 123, 8210, 4136, 4168, 4197, 4166, 0, 130, 8211, 20480, 0, 15, 8204, 20480, 16384, 0, 136, 8212, 0, 141, 8213, 4146, 0, 149, 8214, 0, 8292, 4220, 154, 8245, 8192, 4132, 0, 8292, 4220, 154, 8245, 8192, 4132, 0, 4136, 4168, 4197, 4166, 0, 156, 8247, 0, 21, 8244, 0, 159, 8248, 0, 103, 8246, 0, 162, 8215, 4119, 0, 12288, 0, -4096, 4204, 0, 12288, 0, 136, 8212, 0, 166, 8216, 0, 169, 8218, 0, 175, 8217, 0, 182, 8219, 0, 188, 8220, 0, 196, 188, 8194, 8220, 0, 71, 188, 8193, 8220, 0, 201, 8222, 0, 206, 201, 8195, 8222, 0, 211, 8224, 4161, 0, 218, 8249, 12288, 220, 8250, 8271, 0, 222, 8225, 8226, 0, 232, 8226, 0, 4172, 4197, 4166, 0, 237, 8251, 0, 239, 8252, 0, 241, 8253, 0, 237, 8251, 0, 103, 8246, 0, 239, 8252, 0, 243, 8254, 0, 245, 8255, 0, 248, 8256, 0, 250, 8257, 8257, 0, 101, 8257, 0, 253, 8258, 0, 256, 8259, 0, 258, 8260, 0, 260, 8261, 0, 263, 8262, 0, 21, 8244, 4168, 0, 266, 8263, 4168, 0, 269, 8264, 4168, 0, 271, 8267, 4168, 0, 273, 8265, 4168, 0, 276, 8266, 4168, 0, 278, 8268, 4168, 0, 281, 8272, 4168, 0, 162, 8215, 0, 283, 8227, 0, 154, 8245, 0, 12288, 0, 4202, 0, 218, 8249, 4168, 4197, 4166, 220, 8250, 0, 248, 8256, 4168, 4197, 4166, 248, 8256, 0, -4096, 4204, 4206, 0, 218, 8249, 4168, 4197, 4166, 220, 8250, 0, 286, 8270, 4202, 0, 288, 8231, 0, 297, 8232, 0, 304, 8233, 0, 30, 8197, -20480, 0, 20480, -16384, 0, 312, 8234, 8199, -20480, 0, 319, 8234, 8207, 28672, 24576, 20480, 0, 329, 8234, 8235, 28672, 24576, 20480, 0, 24576, 28672, 0, 12288, 0, -4096, 4223, 0, 218, 8249, 12288, 220, 8250, 0, 248, -8191, -28672, 0, 336, -24576, 0, 248, -28672, 0, 339, -28672, 0, 347, 8237, 4119, 0, 12288, 103, 8246, 4236, 4234, 0, 281, 8269, 4232, 0, 12288, 0, -4096, 0, 352, 8238, -4096, 218, 8249, 4283, 4246, 4279, 4281, 220, 8250, 0, 30, 8197, -4096, 4253, 218, 8249, -4096, 220, 8250, 0, 4246, 218, 8249, -4096, 220, 8250, 0, 232, 8226, 0, 352, 8238, 0, 359, 8225, 4244, 4249, 0, 4163, 4305, 0, 4305, 218, 8249, 4168, 4197, 4166, 220, 8250, 4251, 0, 281, 8269, 4249, 4251, 0, 286, 8270, -4096, 0, 4305, 4259, 4257, 0, 281, 8269, 4255, 0, 218, 8249, 4168, 12288, 154, 8245, 4168, 12288, 220, 8250, 0, 218, 8249, 4265, 4305, 4263, 220, 8250, 0, 281, 8269, 4265, 4305, 4263, 0, 4271, 232, 8226, 0, 4154, 4163, 0, 50, 8201, 4269, 232, 8226, 0, 359, 8225, 0, 77, 8205, 0, 4154, 4274, 0, 365, 8239, 0, 368, 8240, 0, 281, 8269, 0, 218, 8249, -4096, 220, 8250, 0, 4277, 4283, 4246, 4279, 4281, 0, 50, 8201, 0, 4154, 0, 372, 8241, 0, 4149, 4168, 4197, 4166, 0, 377, 8228, 0, 381, 8229, 0, 387, 8230, 0, 288, 8231, 0, 359, 8225, -4096, 4259, 4302, 0, 4305, 4300, 4298, -8192, 0, 281, 8269, 4305, 4300, 4298, 0, 21, 8244, 12288, 0, 21, 8244, -32768, 0, -8192, 0, -4096, 4307, 0, 281, 8269, -4096, 4307, 0, 377, 8228, 0, 288, 8231, 0, 387, 8230, 0}; static const unsigned char Literal[1+ 396 /*1:396*/] = {0, 6, 102, 105, 110, 105, 115, 104, 6, 114, 101, 112, 101, 97, 116, 5, 99, 121, 99, 108, 101, 1, 61, 6, 115, 119, 105, 116, 99, 104, 4, 115, 112, 101, 99, 5, 98, 101, 103, 105, 110, 3, 101, 110, 100, 4, 108, 105, 115, 116, 6, 114, 101, 99, 111, 114, 100, 7, 99, 111, 110, 116, 114, 111, 108, 5, 102, 97, 117, 108, 116, 5, 115, 104, 111, 114, 116, 7, 114, 111, 117, 116, 105, 110, 101, 7, 116, 114, 117, 115, 116, 101, 100, 7, 112, 114, 111, 103, 114, 97, 109, 1, 42, 2, 45, 62, 9, 112, 114, 105, 110, 116, 116, 101, 120, 116, 6, 114, 101, 116, 117, 114, 110, 6, 114, 101, 115, 117, 108, 116, 5, 115, 116, 97, 114, 116, 4, 115, 116, 111, 112, 7, 109, 111, 110, 105, 116, 111, 114, 4, 101, 120, 105, 116, 1, 58, 2, 61, 61, 2, 60, 45, 3, 97, 110, 100, 2, 105, 102, 5, 119, 104, 105, 108, 101, 6, 117, 110, 108, 101, 115, 115, 5, 117, 110, 116, 105, 108, 7, 105, 110, 116, 101, 103, 101, 114, 4, 98, 121, 116, 101, 4, 114, 101, 97, 108, 4, 108, 111, 110, 103, 6, 115, 116, 114, 105, 110, 103, 1, 40, 1, 41, 9, 97, 114, 114, 97, 121, 110, 97, 109, 101, 4, 110, 97, 109, 101, 1, 43, 1, 45, 1, 92, 1, 38, 2, 33, 33, 1, 33, 2, 42, 42, 2, 47, 47, 1, 47, 1, 46, 2, 60, 60, 2, 62, 62, 2, 60, 61, 1, 60, 1, 35, 2, 62, 61, 1, 62, 2, 92, 61, 1, 44, 2, 111, 114, 1, 95, 8, 101, 120, 116, 101, 114, 110, 97, 108, 6, 115, 121, 115, 116, 101, 109, 7, 100, 121, 110, 97, 109, 105, 99, 6, 111, 102, 108, 105, 115, 116, 9, 111, 102, 112, 114, 111, 103, 114, 97, 109, 6, 111, 102, 102, 105, 108, 101, 2, 33, 42, 7, 99, 111, 109, 109, 101, 110, 116, 4, 101, 108, 115, 101, 6, 102, 111, 114, 109, 97, 116, 5, 97, 114, 114, 97, 121, 2, 102, 110, 3, 109, 97, 112, 4, 116, 104, 101, 110, 3, 111, 119, 110, 5, 99, 111, 110, 115, 116, 9, 101, 120, 116, 114, 105, 110, 115, 105, 99}; static const unsigned char Sflags[1+ 80 /*1:80*/] = {0, 3, 3, 3, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 1, 1, 4, 0, 4, 0, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static unsigned char Keysyms[1+ 381 /*1:381*/] = {0, 5, 83, 72, 79, 82, 84, 4, 66, 89, 84, 69, 4, 76, 79, 78, 71, 5, 66, 69, 71, 73, 78, 4, 83, 80, 69, 67, 3, 69, 78, 68, 4, 76, 73, 83, 84, 6, 70, 73, 78, 73, 83, 72, 6, 82, 69, 67, 79, 82, 68, 7, 67, 79, 78, 84, 82, 79, 76, 5, 70, 65, 85, 76, 84, 5, 67, 89, 67, 76, 69, 7, 82, 79, 85, 84, 73, 78, 69, 7, 84, 82, 85, 83, 84, 69, 68, 7, 80, 82, 79, 71, 82, 65, 77, 9, 80, 82, 73, 78, 84, 84, 69, 88, 84, 6, 82, 69, 84, 85, 82, 78, 6, 82, 69, 83, 85, 76, 84, 5, 83, 84, 65, 82, 84, 4, 83, 84, 79, 80, 7, 77, 79, 78, 73, 84, 79, 82, 4, 69, 88, 73, 84, 3, 65, 78, 68, 2, 73, 70, 6, 85, 78, 76, 69, 83, 83, 5, 87, 72, 73, 76, 69, 5, 85, 78, 84, 73, 76, 7, 73, 78, 84, 69, 71, 69, 82, 6, 82, 69, 80, 69, 65, 84, 4, 82, 69, 65, 76, 6, 83, 87, 73, 84, 67, 72, 6, 83, 84, 82, 73, 78, 71, 5, 65, 82, 82, 65, 89, 4, 78, 65, 77, 69, 2, 79, 82, 3, 79, 87, 78, 5, 67, 79, 78, 83, 84, 9, 69, 88, 84, 82, 73, 78, 83, 73, 67, 8, 69, 88, 84, 69, 82, 78, 65, 76, 6, 83, 89, 83, 84, 69, 77, 7, 68, 89, 78, 65, 77, 73, 67, 2, 79, 70, 4, 70, 73, 76, 69, 7, 67, 79, 77, 77, 69, 78, 84, 4, 69, 76, 83, 69, 6, 70, 79, 82, 77, 65, 84, 2, 70, 78, 3, 77, 65, 80, 4, 84, 72, 69, 78, 5, 82, 69, 65, 76, 83, 6, 78, 79, 82, 77, 65, 76, 1, 61, 1, 58, 2, 45, 62, 2, 61, 61, 2, 60, 45, 1, 40, 1, 41, 1, 43, 1, 45, 1, 92, 1, 38, 2, 33, 33, 1, 33, 1, 42, 2, 47, 47, 1, 47, 1, 46, 2, 60, 60, 2, 62, 62, 2, 60, 61, 1, 60, 2, 62, 61, 1, 62, 1, 35, 2, 92, 61, 1, 44, 1, 95, 1, 32, 1, 44}; static const short Keyword[1+ 80 /*1:80*/] = {0, 0, 6, 11, 16, 22, 27, 31, 36, 43, 50, 58, 64, 70, 78, 86, 94, 104, 111, 118, 124, 129, 137, 142, 146, 149, 156, 162, 168, 176, 183, 188, 195, 202, 208, 213, 216, 220, 226, 236, 245, 252, 260, 263, 268, 276, 281, 288, 291, 295, 300, 306, 313, 315, 317, 320, 323, 326, 328, 330, 332, 334, 336, 338, 341, 343, 345, 348, 350, 352, 355, 358, 361, 363, 366, 368, 370, 373, 375, 377, 379}; static const unsigned char Kflags[1+ 80 /*1:80*/] = {0, 144, 144, 144, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 144, 128, 128, 128, 128, 128, 128, 144, 128, 160, 130, 130, 130, 130, 128, 128, 128, 128, 128, 145, 129, 128, 144, 144, 144, 144, 144, 144, 145, 128, 128, 162, 129, 129, 129, 160, 144, 128, 8, 8, 8, 8, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 64, 0, 0, 0}; static unsigned char Isolatebrackets = 0; static unsigned char Leaveblanks = 0; static unsigned char Sepblocks = 1; static unsigned char Indentblocks = 1; static unsigned char Splitkeywords = 0; static unsigned char Packnames = 0; static unsigned char Splitstats = 0; static unsigned char Commentsnormal = 0; static unsigned char Breakcomments = 1; static unsigned char Leavestars = 1; static unsigned char Justifyall = 0; static unsigned char Labelsrelative = 0; static unsigned char Splitconds = 1; static unsigned char Decsrelative = 1; static unsigned char Spacelists = 1; static unsigned char Spaceequals = 1; static unsigned char Isolateloops = 1; static unsigned char Extramargin = 0; static unsigned char Leaveowns = 0; static unsigned char Commentsrelative = 1; static unsigned char Extendcomments = 1; static unsigned char Mi = 3; static unsigned char Ll = 72; static unsigned char Ct = 40; static unsigned char Ml = 40; static unsigned char Commentextension = 5; static unsigned char Extnum = 2; static unsigned char Initialmargin = 7; static unsigned char Secondarymargin = 3; static unsigned char Commentlimit = 20; static unsigned char Commentline = 120; static short Safetyfactor = 5; static int Deltamargin = 3; static int Linelength = 70; static int Commenttab = 40; static int Level = 1; static int Mlimit = 0; static int Secmargin = 3; static unsigned char Commentflag; static unsigned char Cmode; static unsigned char Loopflag; static int Linesize; static int Cs; static int Disp; static int D; static int Rmargin; static int Firstdisp; static int Size; static int Cstart; static int Linebase; static int Fullline; //void Prompt(_imp_string S); //void Send(_imp_string S); //void List(_imp_string S); //void Destroy(_imp_string S); //void Rename(_imp_string S); static int Parse(int Ep); static _imp_string Input; static _imp_string Output; static _imp_string Optionfile; static _imp_string St; static _imp_string Oplist; static int Spt; static int Sad; static int S; static unsigned char Spaces; static unsigned char Mode; static unsigned char Ok; static unsigned char Thissep; static const int Lasttext = 51; //static int Header; //static int Segs; static int Strings[1+ 100 /*1:100*/]; static int Commentlength; static short Rem[1+ 4 /*1:4*/]; static unsigned char Symfile[301 /*0:300*/]; static unsigned char Tlength[1+ 100 /*1:100*/]; static int Rec[1+ 100 /*1:100*/]; static unsigned char Status; static unsigned char Options; static unsigned char Lastsep; static unsigned char Flag; static unsigned char Pmode; static unsigned char Quotes = 0; static unsigned char Ownflag = ';'; static int Nval; static int Currin; static int Outstart, Currout; static int Slength; static int Limit; static int Margin; static int Inbase; static int Statsize; static int Stat; static int Keybase; static int Textbase; static int J; static int Sn; static int Rp; static int Rplim; static int Rpinc; static int Maxmargin; static int Endoffile; static const int Ccc = 0x2025430A; static const int Connektep = 1; static const int Createep = 162; static const int Readep = 7; static const int Infoep = 5; static const int Changeep = 6; static void Setupfiles(_imp_string *S); static void Closefiles(void); static void Setoptions(void); //extern void Cherish(_imp_string S); static void Continue(void) { auto void Adjust(void); int Hold[1+ 4 /*1:4*/]; int J; int K; int L; int M; int N; int Z; int Lim; int Xes; //%BYTEINTEGERARRAYFORMAT NFM(1 : 4) unsigned char *Nest; unsigned char S; unsigned char Cflag; Nest = ((unsigned char *)&Nval)-1; // NEST == ARRAY(ADDR(NVAL),NFM) Thissep = '\n'; Lim = Margin + Safetyfactor + Secmargin; Z = Slength + Currout; if (Z < Limit || (Z - Safetyfactor - Limit < -4 && Rec[Rp + 1] == 0)) return; Xes = Z - Limit; for (J = 1; J <= 4; J++) Hold[J] = Nest[J] + Currout - Linebase; if (Lastsep == ';') { N = Currout; Quotes = 0; do { N--; S = *Byteinteger(N); if (S == '\'') Quotes = Quotes ^ 1; } while (S != ';' || Quotes != 0); *Byteinteger(N) = '\n'; Limit = N + Linelength; Linebase = N; K = Currout + 80; M = K; for (L = N + 3; L <= Currout; L++) { K++; *Byteinteger(K) = *Byteinteger(L); } for (L = 1; L <= Margin; L++) { N++; *Byteinteger(N) = ' '; } for (L = M + 1; L <= K; L++) { N++; *Byteinteger(N) = *Byteinteger(L); } Currout = N; Lastsep = '\n'; Adjust(); if (Currout + Slength < Limit) return; } if (Nest[4] != 0 && Rec[Rem[4] - 1] >= 4) Nest[3] = 0; Cflag = 0; for (J = 1; J <= 4; J++) { N = Nest[J]; if (N > Lim) { N += Linebase; if (N < Currout) { Cflag = 1; break; } } } if (Cflag) { if (Nest[J] - Margin - Secmargin - Safetyfactor < Xes) { K = J; while (K < 4) { K++; if (Nest[K]) { Cflag = 0; break; } } if (!Cflag) { L = Nest[K] + Linebase; if (Nest[K] > Lim && L < Currout) { J = K; N = L; } } } if (J == 4 && Rem[3] == Rem[4] - 1) { J = 3; N = Nest[3] + Linebase; } Lim = Nest[J] + Safetyfactor + Secmargin; K = Currout + 80; M = K; for (L = N + 1; L <= Currout; L++) { K++; *Byteinteger(K) = *Byteinteger(L); } #ifdef USE_MCODE //*L_1,N //*MVC_1(4,1),CCC //*LA_1,4(1) //*ST_1,CURROUT //*ST_1,LINEBASE #else #endif for (J = 1; J <= Margin + Secmargin; J++) { Currout++; *Byteinteger(Currout) = ' '; } if (*Byteinteger(M + 1) == ' ') M++; if (*Byteinteger(M + 1) != '%') { Currout++; *Byteinteger(Currout) = '%'; } for (L = M + 1; L <= K; L++) { Currout++; *Byteinteger(Currout) = *Byteinteger(L); } } else { Lim = Currout - Linebase + Safetyfactor; #ifdef USE_MCODE //*L_1,CURROUT //*MVC_1(4,1),CCC //*LA_1,4(1) //*ST_1,CURROUT //*ST_1,LINE BASE #else #endif for (J = 1; J <= Margin + Secmargin; J++) { Currout++; *Byteinteger(Currout) = ' '; } Pmode = 128; } Limit = Linebase + Linelength; Statsize = Statsize - Linelength + Margin; if (Statsize + Margin >= Linelength) Rplim += Rpinc; Nval = 0; void Adjust(void) { for (J = 1; J <= 4; J++) if (Nest[J] <= Lim) Nest[J] = 0; else Nest[J] = Hold[J] - Currout + Linebase; } } static void Break(void) { if (*Byteinteger(Currout) != ';') Currout -= 2; *Byteinteger(Currout) = '\n'; Size = 0; Linebase = Currout; Limit = Linebase + Linesize; Nval = 0; } void Soap(_imp_string Files) { static int Movex = 0xD2002001; static int Movey = 0x10010000; auto void Percent(void); auto void Space(void); int *Midmargin; int N; int P; int K; int M; int Z; //%BYTEINTEGERARRAYFORMAT NFM(1 : 4) unsigned char *Nest; Printstring(_imp_str_literal("SOAP")); Newline(); Nest = ((unsigned char *)&Nval)-1; //NEST == ARRAY(ADDR(NVAL),NFM) Setupfiles(&Files); if (!Ok) return; Setoptions(); if (!Ok) return; Midmargin = &Margin; if (!Commentsrelative) Midmargin = &Rmargin; Top:; for (;;) { Nval = 0; Loopflag = 0; Rp = 0; Spt = 0; Mode = 0; Status = 0; Sad = Textbase; if (Lastsep != ';') Limit = Currout + Linelength; Inbase = Currin; if (Parse(0)) { Owns: J = Currin; Quotes = 0; K = 0; do { K++; J++; S = *Byteinteger(J); if (S == '\'') Quotes = Quotes ^ 1; } while ((S != '\n' && S != ';') || (Quotes != 0 && K <= 300)); Slength = J - Currin; if (Currout + Slength > Limit && Lastsep == ';') { Break(); Stat = Currout + Margin; for (J = 1; J <= Margin; J++) { Currout++; *Byteinteger(Currout) = ' '; } } if (!Ownflag) { Ownflag = ';'; if (Currout + Slength + Safetyfactor > Limit) { #ifdef USE_MCODE //*L_1,CURROUT //*MVC_1(4,1),CCC; ! PUSH IN CONTINUATION //*LA_1,4(1) //*ST_1,CURROUT //*ST_1,LINE BASE #else #endif } } for (J = 1; J <= Slength; J++) { Currin++; Currout++; *Byteinteger(Currout) = *Byteinteger(Currin); } Lastsep = *Byteinteger(Currin); if (Lastsep == ';') { *Byteinteger(Currout + 1) = ' '; *Byteinteger(Currout + 2) = ' '; Currout += 2; } else Linebase = Currout; } else { Pmode = 128; Statsize = Currin - Inbase; if (Statsize + Margin > Linelength) { Rpinc = Rp / (Statsize / (Linelength - Margin)); Rplim = Rpinc; } else Rplim = Rp; if ((Status & 11) != 0 && Lastsep == ';') { Lastsep = '\n'; Break(); } if (Status & 136) { if ((Leaveblanks != 0 && Thissep != ';') || ((Status & 128) != 0 && Sepblocks != 0)) { Null:; Currout++; *Byteinteger(Currout) = '\n'; Linebase = Currout; } if ((Status & 8) != 0 && Rp <= 1) goto Top; } Rp = 0; if (Loopflag != 0 && (Status & 1) != 0 && *Byteinteger(Currout - 1) != '\n') { Currout++; *Byteinteger(Currout) = '\n'; Linebase = Currout; Limit++; } if (Status & 2) { if (Extramargin != 0 && (Status & 4) != 0) Status = Status | 64; Level = (unsigned)Level >> 1; if (!Level) Level = 1; if (!(Mlimit & 1)) Margin -= Deltamargin; Mlimit = (unsigned)Mlimit >> 1; if (Margin < 0) Margin = 0; } if (Lastsep != ';') Stat = Currout + Margin; while (Rec[Rp + 1] == 100) { Rp++; if (Lastsep == ';' || Lastsep == ':') { N = -2; if (Lastsep == ':') N = 1; Currout += N; *Byteinteger(Currout) = '\n'; Linebase = Currout; Limit = Currout + Linelength; Stat = Currout + Margin; Lastsep = '\n'; } if (Labelsrelative != 0 && Lastsep != ':') { N = Level; M = Margin; if (Extramargin != 0 && Level == 1) M += Firstdisp; for (;;) { M -= Deltamargin; if (N & 1) break; N = (unsigned)N >> 1; } while (M > 0) { M--; Currout++; *Byteinteger(Currout) = ' '; } } for (;;) { Rp++; N = Rec[Rp]; if (!N) break; if (N < 0) Sn = Strings[-N]; else Sn = Keyword[N] + Keybase; for (J = Sn + 1; J <= Sn + *Byteinteger(Sn); J++) { Currout++; *Byteinteger(Currout) = *Byteinteger(J); } } if (Currout > Stat && (Status & 16) == 0) { Currout++; *Byteinteger(Currout) = '\n'; Linebase = Currout; Limit = Currout + Linelength; Stat = Currout + Margin; } Lastsep = ':'; } if (Status & 8) { Rp = 0; goto Null; } if (Status & 16) { Rp++; Disp = Rec[Rp]; D = 0; Cmode = 0; J = Currin; while (*Byteinteger(J) != '\n' && *Byteinteger(J) != ';') J++; Cs = J - Currin; if (!Commentflag) Cstart = Commenttab; else if (Commentsnormal) { Cmode = 1; Cstart = Margin; } else if (Lastsep == ';') Cstart = Commenttab; else if (!Disp) Cstart = 0; else if (Disp <= *Midmargin && (Status & 32) == 0) Cstart = Margin; else Cstart = Commenttab; if ((Status & 32) != 0 && Leavestars != 0) Cstart = 0; Size = Currout - Linebase; if (Lastsep == ';') { if (*Byteinteger(Currout) == '\n') { Loopflag = 1; do Linebase--; while (*Byteinteger(Linebase) != '\n'); Size = Currout - Linebase; } Currout -= 2; Size -= 2; if (Extendcomments != 0 && Cstart < Size) { P = Cstart; N = Extnum; for (;;) { if (N <= 0) break; Cstart += Commentextension; if (Cstart >= Size) break; N--; } if (N <= 0 || Cs + Cstart > Commentline) Cstart = P; } if (Cstart < Size) if (Cmode) Cstart = 0; else Break(); else { D = Commentline - Cstart - Cs; if (D < 0 && Breakcomments == 0) { Cstart = Linesize - Cs; Break(); D = 0; } } } else { D = Commentline - Cstart - Cs; if (D < 0 && Breakcomments == 0) { Cstart = Commentline - Cs; D = 0; } } for (;;) { N = Cstart - Size; while (N > 0) { N--; Currout++; *Byteinteger(Currout) = ' '; } Currout++; *Byteinteger(Currout) = '!'; if (Status & 32) { Currout++; *Byteinteger(Currout) = '*'; } P = J; if (D < 0) { P = J + D; while (*Byteinteger(P) != ' ' && *Byteinteger(P) != ',' && *Byteinteger(P) != '.' && P > Currin) P--; P--; if (P == Currin) P = J + D; } for (K = Currin + 1; K <= P; K++) { Currout++; *Byteinteger(Currout) = *Byteinteger(K); } Currin = P; if (D >= 0) break; Currout++; *Byteinteger(Currout) = '\n'; Size = 0; D += Linelength - Margin; } *Byteinteger(Currout) = '\n'; if (Loopflag) { Loopflag = 0; Currout++; *Byteinteger(Currout) = '\n'; } Size = 0; Linebase = Currout; Lastsep = '\n'; } else { N = 0; if (Status & 64) { N = Deltamargin; if (Extramargin) N = Margin; } Stat -= N; while (Currout < Stat) { Currout++; *Byteinteger(Currout) = ' '; } if (Lastsep != ';') Limit = Currout + Linelength - Margin + N; for (;;) { Rp++; N = Rec[Rp]; if (!N) break; if (N > 0) { Sn = Keyword[N] + Keybase; Flag = Kflags[N]; Z = Sflags[N]; Slength = *Byteinteger(Sn); } else { Sn = Strings[-N]; Flag = 0; Z = 0; Slength = Tlength[-N]; } if (Rp >= Rplim || (Slength + Currout > Limit && N <= Lasttext)) Continue(); if (Z) { Nest[Z] = Currout - Linebase; Rem[Z] = Rp; } if ((Flag & Options & 15) != 0 || ((Pmode ^ Flag) & 128) == 0) Space(); if (Flag & Pmode) Percent(); #ifdef USE_MCODE //*L_1,SN //*L_2,CURROUT //*SLR_3,3 //*IC_3,0(1) //*EX_3,MOVEX //*AR_2,3 //*ST_2,CURROUT #else for (J = Sn + 1; J <= Sn + *Byteinteger(Sn); J++) { Currout++; *Byteinteger(Currout) = *Byteinteger(J); } #endif if (Flag & Options & 120) Space(); if (0 >= N || N > Lasttext) Pmode = 128; } if (!Ownflag) goto Owns; Currout++; *Byteinteger(Currout) = Thissep; Lastsep = Thissep; if (Loopflag != 0 && (Status & 2) != 0) { Currout++; *Byteinteger(Currout) = '\n'; } if (Status & 1) { Level = Level << 1; if (Status & 128) Level = Level | 1; Mlimit = Mlimit << 1; if (Margin >= Maxmargin || (Indentblocks == 0 && (Status & 128) != 0)) Mlimit = Mlimit | 1; if (Margin == 0 && Extramargin != 0) Margin = Initialmargin; else if (!(Mlimit & 1)) Margin += Deltamargin; } if (Lastsep == ';') { *Byteinteger(Currout + 1) = ' '; Currout += 2; *Byteinteger(Currout) = ' '; } else Linebase = Currout; if (Currin >= Endoffile || (Status & 7) == 7) break; } } } Closefiles(); return; void Space(void) { if (' ' != *Byteinteger(Currout) && *Byteinteger(Currout) != '\n' && *Byteinteger(Currout) != '(') { Currout++; *Byteinteger(Currout) = ' '; Pmode = 128; } } void Percent(void) { if (Pmode) { if (' ' != *Byteinteger(Currout) && *Byteinteger(Currout) != '\n' && *Byteinteger(Currout) != '(') { Currout++; *Byteinteger(Currout) = ' '; } Currout++; *Byteinteger(Currout) = '%'; Pmode = 0; } } } static void Connekt(_imp_string File, int *Mode, int *Flag) { int J; J = 0; //FDP(CONNEKTEP,FILE,MODE,ADDR(J),FLAG) *Mode = J; if (*Flag == 5) *Flag = 0; } static int Parse(int Entry) { int Ss; int Sp; int Trp; int Tpt; int L; unsigned char Modes; int Put(void) { Spt--; Rp++; Rec[Rp] = Spt; Tlength[-Spt] = Slength; Strings[-Spt] = Sad; *String(Sad) = St; Sad = Sad + 1 + *Byteinteger(Addr(St)); return (Spt); } void Sym(void) { for (;;) { Currin++; S = *Byteinteger(Currin); if ('A' > S || S > 'Z') Mode = 0; if (S == '%') Mode = 32; else { if (S != ' ') { S += Mode; if (S != 'C' + 32 || *Byteinteger(Currin + 1) != '\n') return; Currin++; Mode = 0; } Spaces = Packnames; } } } int Constant(void) { int T; int Lim; int Cs; Slength = 0; St = _imp_str_literal(""); Sym(); while ('0' <= S && S <= '9' || S == '.' || S == '@') { Cs = Currin; St = _imp_join(St, Tostring(S)); Sym(); } if (_imp_strcmp(St, _imp_str_literal("")) != 0) { Currin = Cs; return (Put()); } if (S == 'M' || S == 'X' || S == 'B') { St = Tostring(S); T = Currin; Sym(); if (S != '\'') { Currin = T; return (0); } } Lim = Currin + 255; while (S == '\'') { do { if (S == '\n' && Slength == 0) Slength = *Byteinteger(Addr(St)); St = _imp_join(St, Tostring(S)); Currin++; S = *Byteinteger(Currin); } while (S != '\'' && Currin <= Lim); St = _imp_join(St, _imp_str_literal("'")); Cs = Currin; Sym(); } if (!Slength) Slength = *Byteinteger(Addr(St)); if (_imp_strcmp(St, _imp_str_literal("")) != 0) { Currin = Cs; return (Put()); } return (0); } int Name(void) { int Z; Sym(); if ('A' > S || S > 'Z') return (0); St = _imp_str_literal(""); for (;;) { Spaces = 1; St = _imp_join(St, Tostring(S)); Z = Currin; Sym(); if (('A' > S || S > 'Z') && ('0' > S || S > '9')) { Slength = *Byteinteger(Addr(St)); Currin = Z; return (Put()); } if (!Spaces) St = _imp_join(St, _imp_str_literal(" ")); } } static int Bip_sw; static void *Bip[16 /*0:15*/] = { &&Bip_0, &&Bip_1, &&Bip_2, &&Bip_3, &&Bip_4, &&Bip_5, &&Bip_6, &&Bip_7, &&Bip_8, &&Bip_9, &&Bip_10, &&Bip_11, &&Bip_12, &&Bip_13, &&Bip_14, &&Bip_15, }; Trp = Rp; Tpt = Currin; Modes = Mode; Failure:; Rp = Trp; Currin = Tpt; Mode = Modes; Entry++; Sp = Main[Entry]; if (!Sp) return (1); Success:; Sp++; Ss = Sub[Sp]; if (!Ss) return (0); goto *Bip[Bip_sw = (unsigned)Ss >> 12 & 15]; Bip_1:; if (!Parse(Ss & 0xFFF)) goto Success; goto Failure; Bip_0:; Ss = Ss & 0xFFF; L = Literal[Ss]; { int P; for (P = Ss + 1; Ss <= Ss + L; Ss++) { Sym(); if (S != Literal[P]) goto Failure; } } goto Success; Bip_15:; if (Name()) goto Success; goto Failure; Bip_3:; if (Constant()) goto Success; goto Failure; Bip_4:; if (Isolateloops) Loopflag = 1; goto Success; Bip_5:; Status = Status | 1; goto Success; Bip_6:; Status = Status | 2; goto Success; Bip_7:; Status = Status | 4; goto Success; Bip_8:; if (Leaveowns != 0 && *Byteinteger(Currin) != '*') goto Failure; Ownflag = 0; Rp++; Rec[Rp] = 0; Thissep = '\n'; goto Success; Bip_10:; Inbase++; Status = Status | 32; Bip_9:; Status = Status | 16; Rp++; Rec[Rp] = Currin - Inbase - 1; goto Success; Bip_11:; if (Decsrelative) Status = Status | 64; goto Success; Bip_12:; if (Extramargin) Status = Status | 64; Status = Status | 128; goto Success; Bip_13:; Status = Status | 8; goto Success; Bip_14:; Sym(); if (S != '\n' && S != ';') goto Failure; Thissep = S; if (Splitstats) Thissep = '\n'; Rp++; Rec[Rp] = 0; goto Success; Bip_2:; Rp++; Rec[Rp] = Ss & 0xFFF; goto Success; } static void Create(_imp_string File, int *Size, int *Flag) { *Size = 3; //FDP(CREATEEP,FILE,SIZE,0,FLAG) if (*Flag == 0 || *Flag == 3) Connekt(File, Size, Flag); } static void Compress(_imp_string File) { //%INTEGER P, F, S, W, X, Y, Z //FDP(READEP,FILE,0,ADDR(P),F) //%IF F # 0 %THEN %RETURN //FDP(INFOEP,FILE,ADDR(W),0,F) //S = INTEGER(P); ! SIZE OF FILE //S = (S+4095)>>12 //FDP(CHANGEEP,FILE,S-X,ADDR(S),F) } static int Filesize(_imp_string Fname) { int Ch; int Size = -1; if (_imp_on_event(9)) goto Done; Openinput(1, Fname); Selectinput(1); Size = 0; for (;;) { Readsymbol(&Ch); if (Ch == -1) break; Size++; } Done:; Closeinput(); Selectinput(0); return (Size); } static void Setupfiles(_imp_string *S) { _imp_string infile = *S; int Flag; int Size; Ok = 0; Input = infile; // _imp_str_literal(""); Output = _imp_str_literal(""); Optionfile = _imp_str_literal(""); //if (!_imp_resolve(*S, &Input, _imp_str_literal("/"), &Output)) Input = *S; //if (!_imp_resolve(Input, &Input, _imp_str_literal(","), &Optionfile)) // Optionfile = _imp_str_literal(""); //if (_imp_strcmp(Output, _imp_str_literal(""))==0) Output = Input; Size = Filesize(infile); fprintf(stderr, "File size is %d bytes\n", Size); Source = malloc(Size + 1); Openinput(1, infile); Selectinput(1); Size = 0; if (_imp_on_event(9)) goto Done; for (;;) { int Ch; Readsymbol(&Ch); if (Ch == -1) break; Source[Size] = Ch; Size++; } Done:; Source[Size] = '\0'; Closeinput(); Selectinput(0); Flag=0;//FDP(7, INPUT, 0, ADDR(SIZE), FLAG) Currin = (int)&Source; // won't work on 64-bit addressing systems if (Flag) { Printstring(_imp_join(_imp_str_literal("CANNOT CONNECT "), Input)); Printstring(_imp_str_literal(": ")); Write(Flag, 1); Newline(); return; } Endoffile = Currin + Size; while (*Byteinteger(Endoffile) != '\n') Endoffile--; Printstring(infile); fprintf(OUTFILE, ": %08x to %08x\n", Currin, Endoffile); //Currout = (unsigned)((Size * 6) + 4095) >> 12; //Segs = (unsigned)(Currout + 15) >> 4; //Create(_imp_str_literal("SP#WORK"), &Currout, &Flag); //if (Flag) { // Printstring(_imp_str_literal("CANNOT CREATE WORK FILE")); // Write(Flag, 1); // Newline(); // return; //} Outstart = Currout = (int)malloc(Size*6 + 4096); // again 32-bit only *Byteinteger(Currout) = '\n'; Ok = 1; } static void Closefiles(void) { } static void Setoptions(void) { _imp_string S; _imp_string T; int J; unsigned char Optflag; void Line(_imp_string * S) { int J; if (!Optflag) return; *S = _imp_str_literal(""); do { for (;;) { do Readsymbol(&J); while (J == ' '); if (J == '\n') break; *S = _imp_join(*S, Tostring(J)); } } while (_imp_strcmp(*S, _imp_str_literal(""))==0); } void Set(_imp_string * S) { _imp_string N; _imp_string Opt; int V; int K; int C; int Num; unsigned char Not; static const _imp_string Param[1+ 31 /*1:31*/] = {_imp_str_literal(""), _imp_str_literal("IB"), _imp_str_literal("LB"), _imp_str_literal("SB"), _imp_str_literal("TB"), _imp_str_literal("SK"), _imp_str_literal("PN"), _imp_str_literal("SS"), _imp_str_literal("CN"), _imp_str_literal("BC"), _imp_str_literal("LS"), _imp_str_literal("JA"), _imp_str_literal("LR"), _imp_str_literal("SC"), _imp_str_literal("DR"), _imp_str_literal("SL"), _imp_str_literal("SE"), _imp_str_literal("IL"), _imp_str_literal("EM"), _imp_str_literal("LO"), _imp_str_literal("CR"), _imp_str_literal("EC"), _imp_str_literal("MI"), _imp_str_literal("LL"), _imp_str_literal("CT"), _imp_str_literal("ML"), _imp_str_literal("CE"), _imp_str_literal("XN"), _imp_str_literal("IM"), _imp_str_literal("SM"), _imp_str_literal("CL"), _imp_str_literal("LC")}; static int Params = 31; static int Bools = 21; Opt = *S; Not = 1; Num = 0; if (_imp_resolve(*S, S, _imp_str_literal("="), &N)) { Num = -1; V = 0; J = Addr(N); {int J_Lim = J + *Length(N); for (J = J + 1; J <= J_Lim; J++) { C = *Byteinteger(J) - '0'; if (0 > C || C > 9) { Printstring(_imp_join(N, _imp_str_literal(" ?\n"))); return; } V = V * 10 + C; }} if (V > 255) { Printstring(_imp_join(N, _imp_str_literal(" ?\n"))); return; } } if (Num == 0 && _imp_resolve(*S, NULL, _imp_str_literal("\\"), S)) Not = 0; for (J = 1; J <= Params; J++) if (_imp_strcmp(Param[J], *S)==0) { if (((Bools - J) ^ Num) < 0) { Printstring(_imp_join(*S, _imp_str_literal("= ?\n"))); return; } K = Not; if (Num < 0) K = V; switch (J) { case 1: Isolatebrackets = K; break; case 2: Leaveblanks = K; break; case 3: Sepblocks = K; break; case 4: Indentblocks = K; break; case 5: Splitkeywords = K; break; case 6: Packnames = K; break; case 7: Splitstats = K; break; case 8: Commentsnormal = K; break; case 9: Breakcomments = K; break; case 10: Leavestars = K; break; case 11: Justifyall = K; break; case 12: Labelsrelative = K; break; case 13: Splitconds = K; break; case 14: Decsrelative = K; break; case 15: Spacelists = K; break; case 16: Spaceequals = K; break; case 17: Isolateloops = K; break; case 18: Extramargin = K; break; case 19: Leaveowns = K; break; case 20: Commentsrelative = K; break; case 21: Extendcomments = K; break; case 22: Mi = K; break; case 23: Ll = K; break; case 24: Ct = K; break; case 25: Ml = K; break; case 26: Commentextension = K; break; case 27: Extnum = K; break; case 28: Initialmargin = K; break; case 29: Secondarymargin = K; break; case 30: Commentlimit = K; break; case 31: Commentline = K; break; } Oplist = _imp_join(Oplist, _imp_join(_imp_str_literal(" "), Opt)); return; } Printstring(_imp_join(*S, _imp_str_literal(" ?\n"))); } Oplist = _imp_str_literal("\n!! OPTIONS:"); Ok = 1; #ifdef NEVER // not using an options file yet... if (_imp_strcmp(Optionfile, _imp_str_literal(""))!=0) { fprintf(OUTFILE, "Option file is \""); Printstring(Optionfile); Printsymbol('"'); Newline(); Ok = 0; Optflag = 0; if (_imp_resolve(Optionfile, NULL, _imp_str_literal("["), &S)) { if (_imp_resolve(S, &S, _imp_str_literal("]"), NULL)) Optflag = 0; S = _imp_join(S, _imp_str_literal(",*")); } else { Optflag = 1; Prompt(_imp_str_literal("OPTIONS:")); Openinput(2, Optionfile); Selectinput(2); } for (;;) { Line(&S); while (_imp_resolve(S, &T, _imp_str_literal(","), &S)) Set(&T); if (_imp_strcmp(S, _imp_str_literal("*"))==0) break; Set(&S); } if (*Charno(Output, 1) == '.') { *String(Currout) = _imp_join(Oplist, _imp_str_literal("\n\n")); *Byteinteger(Currout) = '\n'; Currout = Currout + *Length(Oplist) + 2; } Closeinput(); Selectinput(0); } #endif Deltamargin = Mi; Linelength = Ll; Commenttab = Ct; Maxmargin = Ml; Secmargin = Secondarymargin; if (40 >= Linelength || Linelength >= 133) { Printstring(_imp_str_literal("INVALID LINE LENGTH\n")); return; } if (0 >= Commenttab || Commenttab >= Linelength - 20) { Printstring(_imp_str_literal("INVALID COMMENT MARGIN\n")); return; } if (Maxmargin >= Linelength - 20) { Printstring(_imp_str_literal("INVALID MAX MARGIN\n")); return; } if (Deltamargin > Maxmargin << 1) { Printstring(_imp_str_literal("INVALID MARGIN INCREMENT\n")); return; } if (Secmargin > (Deltamargin << 1) + Safetyfactor) { Printstring(_imp_str_literal("INVALID SECONDARY MARGIN\n")); return; } if (Initialmargin > 30) { Printstring(_imp_str_literal("INVALID INITIAL MARGIN\n")); return; } if (Deltamargin == 0 && Secmargin == 0 && Initialmargin == 0) Margin = 1; if (Extramargin) Margin = Initialmargin; if (Splitkeywords) Splitconds = 1; Commentlength = Linelength - Commenttab; Textbase = Addr(Symfile[0]); Keybase = Addr(Keysyms[1]); Rmargin = Commentlimit; Fullline = Linelength; Linelength -= Safetyfactor; Options = 17 * Splitkeywords + 34 * Splitconds + (Spacelists << 6) + (Isolatebrackets << 2) + (Spaceequals << 3) + 128; Linebase = Currout; Size = 0; Commentflag = Justifyall << 1 | Commentsnormal; Commentflag = Commentflag ^ 0b010; Firstdisp = Deltamargin - Initialmargin; if (!Commentline) Commentline = Fullline; Ok = 1; } int _imp_mainep(int _imp_argc, char **_imp_argv) { static int ENDIAN_TEST = 0x01234567; if (* (char *)&ENDIAN_TEST == 0x01) { // Should be OK... } else if (* (char *)&ENDIAN_TEST == 0x67) { fprintf(stderr, "Looks like you're running on a little-endian processor. Recompile for big-endian!\n"); exit(1); } else { fprintf(stderr, "What the heck sort of processor are you running on?\n"); exit(1); } if (_imp_argc != 2) { fprintf(stderr, "syntax: soap file.imp\n\n"); exit(1); } Soap(_imp_c2istr(_imp_argv[1])); while (Outstart < Currout) Printsymbol(*Byteinteger(Outstart++)); exit(0); return (1); }