annotate src/daoyu.c @ 7945:34fac2ce839a

<moon__> mkx bin/hfs//erro \'You have discovered an eerie cavern. The air aboe the dar kstone floor is alive ith vortices of purple light and dark, boiling clouds. Seemingly bottemless pits mark the surface. "$1" stand below\'
author HackBot
date Sat, 07 May 2016 18:36:03 +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 }