annotate src/daoyu.c @ 12292:d51f2100210c draft

<kspalaiologos> `` cat <<<"asmbf && bfi output.b" > /hackenv/ibin/asmbf
author HackEso <hackeso@esolangs.org>
date Thu, 02 Jan 2020 15:38:21 +0000
parents 5aac3c341f92
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
1 /*
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
2 * This program is free software: you can redistribute it and/or modify
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
3 * it under the terms of the GNU General Public License as published by
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
4 * the Free Software Foundation, either version 3 of the License, or
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
5 * (at your option) any later version.
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
6 *
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
7 * This program is distributed in the hope that it will be useful,
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
10 * GNU General Public License for more details.
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
11 *
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
12 * You should have received a copy of the GNU General Public License
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
13 * aint with this program. If not, see <http://www.gnu.org/licenses/>.
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
14 */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
15
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
16 /*
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
17 * DaoLanguage / Daoyu Compiler and Interpreter.
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
18 * Kaynato - 2016
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
19 * See splash() for details.
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
20 */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
21
7580
c301731fdddf <Kaynato> fetch http://pastebin.com/raw/aJGM6eAB
HackBot
parents:
diff changeset
22 #include <stdio.h>
c301731fdddf <Kaynato> fetch http://pastebin.com/raw/aJGM6eAB
HackBot
parents:
diff changeset
23 #include <stdlib.h>
c301731fdddf <Kaynato> fetch http://pastebin.com/raw/aJGM6eAB
HackBot
parents:
diff changeset
24 #include <string.h>
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
25
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
26 #define BITS_IN_BYTE 8
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
27 #define BITS_IN_CELL (sizeof(unsigned int) * 8)
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
28 #define INPUT_DELIMITER '@'
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
29
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
30 typedef struct PATH
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
31 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
32 struct PATH* owner; /* OWNER PROGRAM */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
33 struct PATH* child; /* CHILD PROGRAM */
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
34 unsigned int* prg_data; /* DATA */
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
35 unsigned int prg_allocbits; /* OPEN DATA BITS*/
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
36 unsigned int prg_index; /* INSTRUCTION POINTER*/
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
37 unsigned char prg_level; /* OPERATING LEVEL */
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
38 unsigned int sel_length; /* LENGTH OF SELECTION*/
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
39 unsigned int sel_index; /* INDEX OF SELECTION*/
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
40 unsigned int prg_floor; /* FLOOR OF PATH */
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
41 unsigned int prg_start; /* START OF RUNNING */
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
42 } Pathstrx;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
43
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
44 typedef Pathstrx* Path;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
45
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
46 static void interpret(char*);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
47
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
48 static void swaps(Path), later(Path), merge(Path), sifts(Path), delev(Path), equal(Path), halve(Path);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
49 static void uplev(Path), reads(Path), dealc(Path), split(Path), polar(Path), doalc(Path), input(Path), execs(Path, Path);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
50
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
51 char getInput();
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
52 char algn(Path);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
53 char getChar(unsigned char);
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
54 char* bin(unsigned int);
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
55 char* str_dup(char *s);
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
56 char* l_to_str(unsigned int, unsigned char, unsigned char);
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
57 static void skip();
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
58 static void write_by_bit_index(Path, unsigned int, unsigned int, unsigned int);
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
59 unsigned char getNybble(char);
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
60 unsigned int read_by_bit_index(Path, unsigned int, unsigned int);
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
61 unsigned int mask(int);
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
62 unsigned int ptwo_round(unsigned int);
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
63
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
64 static unsigned char command = 0;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
65 static int doloop = 1;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
66
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
67 typedef void(*PathFunc)(Path);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
68
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
69 static PathFunc functions[16] = \
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
70 {NULL, swaps, later, merge, \
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
71 sifts, NULL , delev, equal, \
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
72 halve, uplev, reads, dealc, \
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
73 split, polar, doalc, input};
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
74
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
75 const struct PATH NEW_PATH = { NULL, NULL, NULL, 1, 0, 0, 1, 0, 0, 0 };
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
76
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
77 static Path P_RUNNING = NULL,
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
78 P_WRITTEN = NULL;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
79
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
80 static const char* symbols = ".!/)%#>=(<:S[*$;";
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
81
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
82 static char* inputptr = NULL;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
83
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
84 /* Run argv[0] as code. Input separated by '!' and once empty reads the null character. */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
85 int main(int argc, char * argv[])
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
86 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
87 char* i = argv[1];
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
88
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
89 /* No argument(s)? */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
90 if (argc < 2)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
91 return 0;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
92
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
93 /* Seek input until it either points to delimiter or NUL */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
94 while (*i && *i != INPUT_DELIMITER) i++;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
95
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
96 /* If it is the input delimiter then put the inputptr there*/
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
97 if (*i == INPUT_DELIMITER)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
98 inputptr = ++i;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
99
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
100 interpret(argv[1]);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
101 return 0;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
102 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
103
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
104 #define rc(r,c) case c: return r;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
105
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
106 unsigned char getNybble(char ch)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
107 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
108 switch (ch)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
109 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
110 rc(0x0, '.') rc(0x1, '!') rc(0x2, '/') rc(0x3, ']': case ')')
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
111 rc(0x4, '%') rc(0x5, '#') rc(0x6, '>') rc(0x7, '=')
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
112 rc(0x8, '(') rc(0x9, '<') rc(0xA, ':') rc(0xB, 'S')
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
113 rc(0xC, '[') rc(0xD, '*') rc(0xE, '$') rc(0xF, ';')
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
114 default: return 0x0;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
115 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
116 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
117
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
118 void interpret(char* input)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
119 {
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
120 unsigned int length = 0; /* How many bytes in input */
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
121
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
122 /* Initialize path */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
123 struct PATH newpath = NEW_PATH;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
124 Path dao = &newpath;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
125
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
126 /* Seek end of program input */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
127 while (input[length] && input[length] != INPUT_DELIMITER) length++;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
128
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
129 /* Terminate empty program */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
130 if (length == 0) return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
131
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
132 /* Get necessary byte number from nybbles */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
133 length = ptwo_round((length+1) / 2);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
134
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
135 /* Set bit length of path */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
136 (dao->prg_allocbits) = length * 8;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
137
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
138 /* Prevent zero-sized allocation */
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
139 if (length % sizeof(unsigned int) != 0)
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
140 length = sizeof(unsigned int);
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
141
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
142 /* Allocate bytes for data array */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
143 if (((dao->prg_data) = calloc(length, 1)) == NULL)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
144 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
145 printf("Error allocating %d bytes: ", length);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
146 perror("");
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
147 abort();
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
148 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
149
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
150 /* Copy over data */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
151 for (length = 0; input[length] && input[length] != INPUT_DELIMITER; length++)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
152 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
153 int hex = getNybble(input[length]);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
154 write_by_bit_index(dao, 4*length, 4, hex);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
155 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
156
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
157 P_RUNNING = dao; /* For the sake of levlim */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
158
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
159 /***************************************************** EXECUTE ******************************************************/
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
160 execs(dao, NULL);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
161 free((dao->prg_data));
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
162 (dao -> prg_data) = NULL;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
163 /********************************************************************************************************************/
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
164
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
165 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
166
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
167 unsigned int ptwo_round(unsigned int x)
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
168 {
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
169 unsigned int rounded = x; /* Initialize bytes_alloc with the file_size value. */
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
170 unsigned int shift = 0; /* Shift for first one of file size for rounding */
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
171
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
172 while ((rounded >> 1) != 0) /* Determine leftmost '1' bit of file size. */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
173 { /* */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
174 rounded >>= 1; /* Shift right until the next shift zeroes it. */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
175 shift++; /* Keep track of shifts. */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
176 } /* */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
177 rounded <<= shift; /* Unshift. */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
178 if (x != rounded) /* If not a power of two, round up. */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
179 rounded <<= 1;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
180
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
181 return rounded;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
182 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
183
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
184 char getInput()
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
185 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
186 /* if null return zero */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
187 if (!inputptr)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
188 return 0;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
189
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
190 /* If not zero then return-advance */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
191 if (*inputptr)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
192 return *inputptr++;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
193
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
194 inputptr = NULL;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
195 return 0;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
196 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
197
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
198 /***
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
199 * oooooooooooo ooooooooooooo .oooooo.
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
200 * `888' `8 8' 888 `8 d8P' `Y8b
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
201 * 888 888 888
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
202 * 888oooo8 888 888
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
203 * 888 " 888 888
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
204 * 888 o 888 `88b ooo
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
205 * o888ooooood8 o888o `Y8bood8P'
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
206 *
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
207 */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
208
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
209 #define roc(o,v,c) case o:c=v; return &c;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
210
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
211 char *str_dup (char *s) {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
212 char *d = malloc (strlen (s) + 1); /*Allocate memory */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
213 if (d != NULL) strcpy (d,s); /*Copy string if okay */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
214 return d; /*Return new memory */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
215 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
216
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
217 char* bin(unsigned int val) { return l_to_str(val, 32, 2); }
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
218
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
219 char getChar(unsigned char ch)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
220 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
221 if (ch > 0xF) return '?';
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
222 return symbols[ch];
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
223 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
224
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
225 char* l_to_str(unsigned int val, unsigned char len, unsigned char radix)
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
226 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
227 static char buf[32] = { '0' };
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
228 int i = 33;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
229 for (; val && i; --i, val /= radix)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
230 buf[i] = "0123456789ABCDEFGHIJKLMNOPQRSTUV"[val % radix];
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
231 for (; i; i--)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
232 buf[i] = '0';
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
233 return &buf[2 + (32 - len)];
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
234 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
235
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
236 /***
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
237 * .oooooo..o oooooo oooo ooo ooooo oooooooooo. .oooooo. ooooo .oooooo..o
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
238 * d8P' `Y8 `888. .8' `88. .888' `888' `Y8b d8P' `Y8b `888' d8P' `Y8
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
239 * Y88bo. `888. .8' 888b d'888 888 888 888 888 888 Y88bo.
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
240 * `"Y8888o. `888.8' 8 Y88. .P 888 888oooo888' 888 888 888 `"Y8888o.
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
241 * `"Y88b `888' 8 `888' 888 888 `88b 888 888 888 `"Y88b
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
242 * oo .d8P 888 8 Y 888 888 .88P `88b d88' 888 o oo .d8P
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
243 * 8""88888P' o888o o8o o888o o888bood8P' `Y8bood8P' o888ooooood8 8""88888P'
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
244 *
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
245 */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
246
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
247 #define levlim(l) if (PR_LEV >= l) return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
248 #define P_LEN (path -> sel_length)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
249 #define P_IND (path -> sel_index)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
250 #define P_ALC (path -> prg_allocbits)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
251 #define P_LEV (path -> prg_level)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
252 #define P_PIND (path -> prg_index)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
253 #define P_DATA (path -> prg_data)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
254 #define P_OWNER (path -> owner)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
255 #define P_CHILD (path -> child)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
256 #define PR_START (P_RUNNING -> prg_start)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
257 #define PR_LEV (P_RUNNING -> prg_level)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
258
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
259 static void swaps(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
260 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
261 unsigned int i = 0;
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
262 unsigned int report = 0;
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
263 levlim(1)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
264 if (P_LEN == 1) return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
265 if (P_LEN <= BITS_IN_CELL)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
266 {
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
267 unsigned int half_len = P_LEN / 2;
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
268 write_by_bit_index(path, P_IND, P_LEN, read_by_bit_index(path, P_IND, half_len) | (read_by_bit_index(path, P_IND + half_len, half_len) << half_len));
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
269 return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
270 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
271 while (i < ((P_LEN / BITS_IN_CELL) / 2))
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
272 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
273 report = P_DATA[(P_IND / BITS_IN_CELL) + i];
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
274 P_DATA[(P_IND / BITS_IN_CELL) + i] = P_DATA[(P_IND / BITS_IN_CELL) + ((P_LEN / BITS_IN_CELL) / 2) + i];
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
275 P_DATA[(P_IND / BITS_IN_CELL) + ((P_LEN / BITS_IN_CELL) / 2) + i++] = report;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
276 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
277 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
278
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
279 static void later(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
280 {
7624
c803b6d4eaee <Kaynato> mv FZQ7RLm4 daoyu.c
HackBot
parents: 7621
diff changeset
281 if (algn(path) || (PR_LEV >= 4))
c803b6d4eaee <Kaynato> mv FZQ7RLm4 daoyu.c
HackBot
parents: 7621
diff changeset
282 P_IND += P_LEN;
c803b6d4eaee <Kaynato> mv FZQ7RLm4 daoyu.c
HackBot
parents: 7621
diff changeset
283 else
c803b6d4eaee <Kaynato> mv FZQ7RLm4 daoyu.c
HackBot
parents: 7621
diff changeset
284 merge(path);
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
285 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
286
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
287 static void merge(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
288 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
289 levlim(7)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
290 if (P_LEN < P_ALC)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
291 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
292 if (!algn(path))
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
293 P_IND -= P_LEN;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
294 P_LEN <<= 1;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
295 return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
296 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
297 if (P_OWNER == NULL)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
298 return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
299 P_WRITTEN = P_OWNER;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
300 (P_WRITTEN->sel_length) = 1;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
301 (P_WRITTEN->sel_index) = 1;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
302 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
303
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
304 static void sifts(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
305 {
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
306 unsigned int write = P_IND;
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
307 unsigned int read = 0;
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
308 levlim(5)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
309 while(write<P_ALC)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
310 {
7624
c803b6d4eaee <Kaynato> mv FZQ7RLm4 daoyu.c
HackBot
parents: 7621
diff changeset
311 if (write+read<P_ALC)
c803b6d4eaee <Kaynato> mv FZQ7RLm4 daoyu.c
HackBot
parents: 7621
diff changeset
312 while(!read_by_bit_index(path, write+read, 4))
c803b6d4eaee <Kaynato> mv FZQ7RLm4 daoyu.c
HackBot
parents: 7621
diff changeset
313 read += 4;
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
314 if(read)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
315 write_by_bit_index(path, write, 4, (write+read<P_ALC)?read_by_bit_index(path, write+read, 4):0);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
316 write += 4;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
317 read += 4;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
318 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
319 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
320
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
321 static void execs(Path path, Path caller)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
322 {
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
323 unsigned int tempNum1 = 0; /* Expedite calculation */
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
324 levlim(8) /* Level operation checking */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
325 P_RUNNING = path; /* Set running */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
326
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
327 if (P_CHILD == NULL) /* If there is no child */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
328 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
329 if ((P_CHILD = (calloc(1, sizeof(struct PATH)))) == NULL) /* Allocate memory space */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
330 { /* Cover error case */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
331 printf("FATAL ERROR: Unable to allocate memory.");
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
332 return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
333 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
334 memcpy(P_CHILD, &NEW_PATH, sizeof(struct PATH)); /* Copy over initialization data */
7624
c803b6d4eaee <Kaynato> mv FZQ7RLm4 daoyu.c
HackBot
parents: 7621
diff changeset
335 path->child->owner = path; /* Set owner of this new Path */
c803b6d4eaee <Kaynato> mv FZQ7RLm4 daoyu.c
HackBot
parents: 7621
diff changeset
336 path->child->prg_floor = (path->prg_floor) + 1; /* Set floor of this new Path */
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
337 path->child->prg_data = calloc(1, sizeof(unsigned int)); /* Set data of this new Path */
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
338 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
339
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
340 P_WRITTEN = P_CHILD; /* Set this as written on */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
341 P_PIND = (P_IND / 4); /* Set program pointer. Rounds down.x */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
342 PR_START = P_PIND; /* Track start position */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
343
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
344 for (; doloop && P_PIND < (P_ALC / 4) && path != NULL && P_WRITTEN != NULL ; P_PIND++) /* Execution Loop */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
345 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
346 tempNum1 = (P_RUNNING->prg_index);
7624
c803b6d4eaee <Kaynato> mv FZQ7RLm4 daoyu.c
HackBot
parents: 7621
diff changeset
347 command = ((P_RUNNING->prg_data)[(tempNum1 * 4) / BITS_IN_CELL] >> (BITS_IN_CELL - ((tempNum1 * 4) % BITS_IN_CELL) - 4)) & mask(4); /* Calculate command */
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
348
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
349 if (command == 5)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
350 execs(P_WRITTEN, path);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
351 else if (command != 0)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
352 functions[command](P_WRITTEN);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
353 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
354 if (caller == NULL)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
355 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
356 free(P_CHILD);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
357 P_CHILD = NULL;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
358 return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
359 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
360 if (!doloop)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
361 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
362 free(P_CHILD);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
363 P_CHILD = NULL;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
364 doloop = 1;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
365 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
366 P_RUNNING = caller;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
367 P_WRITTEN = caller->child;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
368 return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
369 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
370
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
371 static void delev(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
372 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
373 if (PR_LEV > 0) PR_LEV--;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
374 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
375
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
376 static void equal(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
377 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
378 levlim(5)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
379 if (read_by_bit_index(path, P_IND, 1) ^ read_by_bit_index(path, P_IND + P_LEN - 1, 1))
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
380 skip();
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
381 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
382
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
383 static void halve(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
384 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
385 levlim(7)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
386 if (P_LEN > 1)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
387 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
388 P_LEN /= 2;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
389 return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
390 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
391 if (P_CHILD == NULL)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
392 return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
393 P_WRITTEN = P_CHILD;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
394 (P_WRITTEN->sel_length) = (P_WRITTEN->prg_allocbits);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
395 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
396
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
397 static void uplev(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
398 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
399 levlim(9)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
400 PR_LEV++;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
401 (P_RUNNING->prg_index) = PR_START - 1;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
402 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
403
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
404 static void reads(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
405 {
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
406 int pos = P_IND;
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
407 levlim(6)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
408 if (P_LEN < 8)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
409 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
410 char* out = bin(read_by_bit_index(path, pos, P_LEN));
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
411 printf("%s", &out[strlen(out) - P_LEN]);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
412 return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
413 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
414 for (; pos < (P_IND + P_LEN); pos += 8)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
415 putchar(read_by_bit_index(path, pos, 8));
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
416 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
417
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
418 static void dealc(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
419 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
420 levlim(2)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
421 if (P_ALC == 1)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
422 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
423 int report = read_by_bit_index(path, 0, 1);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
424 if ((P_RUNNING->owner) != NULL)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
425 {
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
426 unsigned int ownind = ((P_RUNNING->owner)->prg_index);
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
427 write_by_bit_index(P_RUNNING->owner, (ownind) * 4, 4, report);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
428 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
429 free(P_DATA);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
430 P_DATA = NULL;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
431 doloop = 0;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
432 return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
433 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
434 P_ALC >>= 1;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
435 if (P_ALC <= 8)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
436 realloc(P_DATA, 1);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
437 else
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
438 realloc(P_DATA, P_ALC / 8);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
439 if (P_LEN > 1)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
440 halve(path);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
441 if ((P_IND + P_LEN) > P_ALC)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
442 P_IND -= P_ALC;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
443 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
444
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
445 static void split(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
446 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
447 if (PR_LEV < 1)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
448 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
449 unsigned int len = P_LEN;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
450 if (len == 1)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
451 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
452 if (P_CHILD == NULL)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
453 return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
454 P_WRITTEN = P_CHILD;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
455 (P_WRITTEN->sel_length) = (P_WRITTEN->prg_allocbits);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
456 split(P_WRITTEN);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
457 halve(P_WRITTEN);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
458 return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
459 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
460 if (len <= BITS_IN_CELL)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
461 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
462 write_by_bit_index(path, P_IND, len >> 1, mask(len));
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
463 write_by_bit_index(path, P_IND + (len >> 1), len >> 1, ~mask(len));
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
464 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
465 else
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
466 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
467 unsigned int leftIndex = (P_IND / BITS_IN_CELL);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
468 unsigned int rightIndex = leftIndex + (len / BITS_IN_CELL) - 1;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
469 while (leftIndex < rightIndex)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
470 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
471 P_DATA[leftIndex++] = 0xFFFFFFFF;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
472 P_DATA[rightIndex--] = 0;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
473 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
474 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
475 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
476 halve(path);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
477 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
478
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
479 static void polar(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
480 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
481 levlim(3)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
482 if (!(read_by_bit_index(path, P_IND, 1) && !read_by_bit_index(path, P_IND + P_LEN - 1, 1)))
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
483 skip();
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
484 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
485
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
486 static void doalc(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
487 {
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
488 unsigned int new_cell_count = 0;
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
489 unsigned int* new_data_pointer = NULL;
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
490 levlim(1)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
491 P_ALC <<= 1;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
492
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
493 if (P_ALC <= BITS_IN_CELL)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
494 new_cell_count = BITS_IN_CELL / BITS_IN_BYTE;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
495 else
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
496 new_cell_count = P_ALC / BITS_IN_BYTE;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
497
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
498 new_cell_count /= sizeof(unsigned int);
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
499
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
500 if ((new_data_pointer = calloc(new_cell_count, sizeof(unsigned int))) == NULL)
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
501 {
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
502 printf("Error allocating %d bytes: ", new_cell_count * sizeof(unsigned int));
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
503 perror("");
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
504 abort();
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
505 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
506
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
507 if (new_cell_count > 1)
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
508 memcpy(new_data_pointer, P_DATA, new_cell_count * sizeof(unsigned int) / 2);
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
509 else
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
510 memcpy(new_data_pointer, P_DATA, sizeof(unsigned int));
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
511
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
512 P_DATA = new_data_pointer;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
513
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
514 merge(path);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
515 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
516
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
517 static void input(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
518 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
519 int i = P_IND;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
520 levlim(6)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
521 if (P_LEN < 8)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
522 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
523 write_by_bit_index(path, P_IND, P_LEN, getInput());
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
524 return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
525 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
526 for (; i < (P_IND + P_LEN); i += 8)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
527 write_by_bit_index(path, i, 8, getInput());
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
528 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
529
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
530 /***
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
531 * oooooooooooo ooooooooooooo .oooooo.
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
532 * `888' `8 8' 888 `8 d8P' `Y8b
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
533 * 888 888 888
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
534 * 888oooo8 888 888
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
535 * 888 " 888 888
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
536 * 888 o 888 `88b ooo
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
537 * o888ooooood8 o888o `Y8bood8P'
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
538 */
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
539
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
540 char algn(Path path)
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
541 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
542 return P_IND % (P_LEN << 1) == 0;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
543 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
544
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
545 unsigned int mask(int length)
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
546 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
547 if (length < BITS_IN_CELL) return ((int)1 << length) - 1;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
548 else return 0xFFFFFFFF;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
549 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
550
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
551 unsigned int read_by_bit_index(Path path, unsigned int i, unsigned int len)
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
552 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
553 return (P_DATA[i / BITS_IN_CELL] >> (BITS_IN_CELL - (i % BITS_IN_CELL) - len)) & mask(len);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
554 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
555
7625
8f18f8a9c3ba <Kaynato> ` sed -i -e \'s/long/int/g\' daoyu.c
HackBot
parents: 7624
diff changeset
556 static void write_by_bit_index(Path path, unsigned int i, unsigned int len, unsigned int write)
7618
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
557 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
558 int shift = BITS_IN_CELL - (i % BITS_IN_CELL) - len;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
559 if (len > BITS_IN_CELL) abort();
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
560 P_DATA[i / BITS_IN_CELL] &= ~(mask(len) << shift);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
561 P_DATA[i / BITS_IN_CELL] |= ((write & mask(len)) << shift);
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
562 }
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
563
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
564 static void skip()
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
565 {
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
566 if (P_RUNNING == NULL) return;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
567 (P_RUNNING->prg_index)++;
9643375f9afa <Kaynato> mv Mcd6MMB5 daoyu.c
HackBot
parents: 7614
diff changeset
568 }