annotate daoyu.c @ 7618:9643375f9afa

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