annotate src/fueue.c @ 12292:d51f2100210c draft

<kspalaiologos> `` cat <<<"asmbf && bfi output.b" > /hackenv/ibin/asmbf
author HackEso <hackeso@esolangs.org>
date Thu, 02 Jan 2020 15:38:21 +0000
parents bd08a41fcbe2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2138
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
1 #include <stdio.h>
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
2 #include <stdlib.h>
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
3 #include <string.h>
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
4 #define TRUE 1
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
5 #define FALSE 0
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
6
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
7 /*
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
8 * Fueue Interpreter in language C
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
9 * the esoteric programming language Fueue was designed in 2012 by Taneb.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
10 *
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
11 * The following program was written by Stephan Kunne on august 29 2012.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
12 * It is public domain; you are free to use it, copy it, distribute it,
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
13 * or do whatever you'd like with it.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
14 * Credit and feedback are always appreciated ; you can email me at
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
15 * firstname dot name at gmail dot com with all your questions or remarks.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
16 *
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
17 * Examples:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
18 *
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
19 * ./fueuec '72 101 108 108 111 44 32 119 111 114 108 100 33 10 H'
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
20 * Hello, world!
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
21 *
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
22 * ./fueuec --print '):[):]'
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
23 * ):[):]
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
24 * :[):])
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
25 * )[):][):]
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
26 * [):]):
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
27 * ):[):]
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
28 * (...and so on)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
29 */
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
30
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
31 enum Typet
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
32 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
33 NUM, FUN, BLOCK
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
34 };
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
35
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
36 typedef struct Queue Queue;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
37 struct Queue
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
38 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
39 int size;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
40 struct Token *top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
41 struct Token *bottom;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
42 };
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
43
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
44 union value
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
45 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
46 int num;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
47 char fun;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
48 Queue block;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
49 };
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
50
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
51 struct Token
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
52 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
53 enum Typet what;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
54 union value val;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
55 struct Token *next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
56 };
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
57
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
58
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
59 int is_empty(const Queue *q); // bool
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
60 void initQueue(Queue *q); // make it an empty queue
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
61 void push(struct Token *x, Queue *q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
62 struct Token* copyToken(const struct Token *x);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
63 Queue copyQueue(const Queue *q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
64 void initToken(struct Token *x);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
65 void pushnum(int num, Queue* q); // create NUM token and pushes it
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
66 void pushfun(char f, Queue* q); // create FUN token and pushes it
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
67 void pushblock(Queue newq, Queue* q); // create BLOCK token and pushes it
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
68 void deletetop(Queue* q); // suppose q not empty
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
69 void deleteQueue(Queue *q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
70 void sendback(Queue* q); // suppose q not empty, pop then push
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
71 struct Token* pop(Queue* q); // suppose q not empty
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
72 void append(Queue *q, const Queue *r);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
73 int matchwhat(const Queue* q, const char s[]); // bool peek at first 2 "nn" "n" "." ".." "n." "b." "b"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
74 void processFueue(Queue* q, int printmode); // the recursive function that does everything
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
75 Queue strtoqueue(const char s[], int *k); // transforms a string program into a queue program
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
76 void print_queue(const Queue *q); // prints a queue program
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
77 void error_empty(const char s[]); // raised by functions that "suppose q not empty" when q is empty
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
78
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
79
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
80 void processFueue(Queue* q, int printmode)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
81 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
82 int time = 0; // catching input
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
83 int i = 0; // to be used for input
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
84 int a = 0, b = 0; // to be used for some FUN
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
85 struct Token* p = NULL; // even more FUN
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
86 Queue newq; // having FUN with BLOCKs (specifically '(')
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
87 initQueue(&newq); // this is done at every iteration where newq is used, though
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
88
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
89 while (TRUE) // stops thanks to a return; when 'H' is met
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
90 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
91
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
92 if (printmode)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
93 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
94 print_queue(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
95 printf("\n");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
96 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
97
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
98 if (time == q->size) // if time == q->size then input char and push ascii/unicode value
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
99 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
100 fflush(stdout);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
101 i = getchar();
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
102 pushnum(i, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
103 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
104 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
105
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
106 if (q->top->what == NUM) // q not empty because of the time != q->size requirement
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
107 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
108 // print char with ascii/unicode value q->top->val.num
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
109 printf("%c", (char) q->top->val.num);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
110 fflush(stdout);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
111 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
112 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
113 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
114 else if (q->top->what == FUN)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
115 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
116 char op = q->top->val.fun;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
117 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
118 switch (op)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
119 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
120 case '+':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
121 case '*':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
122 case '/':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
123 if (matchwhat(q, "nn"))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
124 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
125 a = q->top->val.num;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
126 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
127 b = q->top->val.num;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
128 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
129 if (op == '+')
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
130 { pushnum(a+b, q); }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
131 else if (op == '*')
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
132 { pushnum(a*b, q); }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
133 else // op == '/'
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
134 { pushnum(a/b, q); }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
135 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
136 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
137 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
138 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
139 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
140 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
141 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
142 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
143 case '-':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
144 case '%':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
145 if (matchwhat(q, "n"))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
146 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
147 a = q->top->val.num;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
148 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
149 pushnum( ((op == '-')?(-a):(!a)) , q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
150 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
151 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
152 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
153 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
154 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
155 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
156 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
157 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
158 case ':':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
159 if (!is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
160 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
161 push(copyToken(q->top), q); // push copy
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
162 sendback(q); // push original
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
163 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
164 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
165 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
166 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
167 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
168 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
169 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
170 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
171 case '~':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
172 if (matchwhat(q, "..")) // if q has at least two items
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
173 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
174 p = pop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
175 sendback(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
176 push(p, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
177 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
178 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
179 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
180 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
181 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
182 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
183 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
184 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
185 case '!':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
186 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
187 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
188 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
189 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
190 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
191 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
192 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
193 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
194 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
195 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
196 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
197 case '$':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
198 if (matchwhat(q, "n."))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
199 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
200 a = q->top->val.num;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
201 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
202 for (; a > 0; a--)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
203 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
204 push(copyToken(q->top), q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
205 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
206
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
207 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
208
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
209 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
210 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
211 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
212 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
213 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
214 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
215 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
216 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
217 case '(':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
218 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
219 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
220 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
221 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
222 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
223 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
224 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
225 initQueue(&newq);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
226 push(pop(q), &newq);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
227 pushblock(newq, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
228 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
229 // newq is the queue inside the block
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
230 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
231 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
232 case '<':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
233 if (matchwhat(q, "b."))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
234 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
235 sendback(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
236 push(pop(q), &(q->bottom->val.block));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
237 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
238 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
239 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
240 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
241 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
242 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
243 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
244 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
245 case ')':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
246 if (matchwhat(q, "b"))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
247 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
248 append(q, &(q->top->val.block));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
249 initQueue(&(q->top->val.block)); // mandatory since
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
250 deletetop(q); // deletetop does destroy the block it contains
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
251 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
252 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
253 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
254 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
255 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
256 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
257 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
258 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
259 case 'H':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
260 // don't forget to delete the remaining of the queue here, will you?
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
261 return;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
262 default:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
263 // raise an error
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
264 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
265 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
266 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
267 else // if q->top->what == BLOCK
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
268 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
269 sendback(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
270 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
271 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
272 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
273 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
274
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
275
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
276
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
277 int main(int argc, char *argv[])
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
278 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
279 Queue q;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
280 initQueue(&q); // q is empty now
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
281 char s[10000] = "72 101 108 108 111 44 32 119 111 114 108 100 33 10 H";
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
282 int printmode = FALSE; // a debug mode that will print the fueue program at each step
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
283 int k = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
284
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
285 switch (argc)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
286 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
287 case 1:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
288 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
289 case 2:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
290 if (strcmp(argv[1], "--print") == 0)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
291 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
292 printmode = TRUE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
293 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
294 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
295 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
296 strncpy(s, argv[1], 10000);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
297 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
298 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
299 case 3:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
300 strncpy(s, argv[2], 10000);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
301 printmode = (strcmp(argv[1], "--print") == 0);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
302 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
303 default:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
304 fprintf(stderr, "Error: %s received too many arguments. The Hello world program\n", argv[0]);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
305 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
306 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
307
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
308 q = strtoqueue(s, &k);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
309
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
310 processFueue(&q, printmode);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
311 return 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
312 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
313
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
314
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
315 Queue strtoqueue(const char s[], int *k) // takes a fueue program as a string, and gives a queue
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
316 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
317 // *k is loop counter
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
318 Queue q; // the queue to be returned
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
319 initQueue(&q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
320 int n = 0; // decimals (usually n * 10 + 0-9)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
321 int intmode = FALSE; // bool "we're reading a number right now"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
322
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
323 if (*k == -1)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
324 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
325 printf("FUEUE: UNMATCHED OPENING SQUARE BRACKET PROBABLY FORGOT A CLOSING SQUARE BRACKET\n");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
326 return q;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
327 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
328
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
329 while (s[*k] != '\0' && s[*k] != ']')
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
330 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
331 if (intmode && (s[*k] > '9' || s[*k] < '0')) // if intmode ends
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
332 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
333 pushnum(n, &q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
334 n = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
335 intmode = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
336 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
337
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
338 switch (s[*k])
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
339 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
340 case '+':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
341 case '-':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
342 case '*':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
343 case '/':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
344 case '%':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
345 case ':':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
346 case '~':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
347 case '!':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
348 case '$':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
349 case '(':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
350 case '<':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
351 case ')':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
352 case 'H':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
353 pushfun(s[*k], &q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
354 (*k)++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
355 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
356 case '0':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
357 case '1':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
358 case '2':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
359 case '3':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
360 case '4':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
361 case '5':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
362 case '6':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
363 case '7':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
364 case '8':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
365 case '9':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
366 n = n * 10 + (int) (s[*k] - '0');
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
367 intmode = TRUE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
368 (*k)++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
369 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
370 case '\n':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
371 case '\t':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
372 case ' ': // whitespace
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
373 (*k)++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
374 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
375 case '[':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
376 (*k)++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
377 pushblock(strtoqueue(s, k), &q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
378 (*k)++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
379 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
380 default:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
381 printf("FUEUE: UNKNOWN %c OP\n", s[*k]);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
382 (*k)++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
383 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
384 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
385 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
386 if (intmode)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
387 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
388 pushnum(n, &q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
389 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
390
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
391 if (s[*k] == '\0')
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
392 *k = -1;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
393 return q;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
394 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
395
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
396 void print_queue(const Queue *q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
397 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
398 struct Token *ptmp = q->top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
399 while (ptmp != NULL)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
400 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
401 if (ptmp->what == NUM)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
402 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
403 printf(" %d", ptmp->val.num);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
404 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
405 else if (ptmp->what == FUN)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
406 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
407 printf("%c", ptmp->val.fun);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
408 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
409 else if (ptmp->what == BLOCK)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
410 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
411 printf("[");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
412 print_queue(&(ptmp->val.block));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
413 printf("]");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
414 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
415 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
416 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
417 printf("That's impossible...Neither num nor fun nor block...\n");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
418 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
419 ptmp = ptmp->next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
420 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
421 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
422
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
423
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
424
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
425
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
426 int is_empty(const Queue *q) // bool
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
427 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
428 if (q->top == NULL)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
429 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
430 if (q->bottom == NULL && q->size == 0)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
431 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
432 return TRUE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
433 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
434 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
435 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
436 error_empty("is_empty");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
437 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
438 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
439 return FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
440 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
441
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
442 void initQueue(Queue *q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
443 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
444 q->size = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
445 q->top = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
446 q->bottom = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
447 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
448
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
449 void push(struct Token *x, Queue *q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
450 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
451 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
452 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
453 q->top = x;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
454 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
455 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
456 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
457 q->bottom->next = x;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
458 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
459 q->bottom = x;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
460 q->size++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
461 x->next = NULL; // just in case
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
462 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
463
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
464 Queue copyQueue(const Queue *q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
465 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
466 Queue c;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
467 struct Token* ptmp = q->top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
468 initQueue(&c);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
469
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
470 while (ptmp != NULL)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
471 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
472 push(copyToken(ptmp), &c);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
473 ptmp = ptmp->next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
474 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
475
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
476 return c;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
477 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
478
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
479 void initToken(struct Token *x)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
480 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
481 x->what = NUM;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
482 x->val.num = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
483 x->val.fun = '\0';
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
484 initQueue(&(x->val.block));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
485 x->next = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
486 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
487
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
488 struct Token* copyToken(const struct Token *x)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
489 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
490 struct Token *c = malloc(sizeof(struct Token));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
491 c->what = x->what;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
492
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
493 switch (x->what)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
494 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
495 case NUM:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
496 case FUN:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
497 c->val = x->val;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
498 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
499 case BLOCK:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
500 c->val.block = copyQueue(&(x->val.block));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
501 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
502 default:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
503 fprintf(stderr, "Error: found a %d in my soup\n", x->what);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
504 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
505 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
506
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
507 c->next = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
508 return c;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
509 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
510
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
511 void pushnum(int num, Queue* q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
512 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
513 struct Token *t = malloc(sizeof(struct Token));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
514 initToken(t);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
515 t->what = NUM;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
516 t->val.num = num;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
517
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
518 push(t, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
519 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
520
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
521 void pushfun(char f, Queue* q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
522 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
523 struct Token *t = malloc(sizeof(struct Token));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
524 initToken(t);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
525 t->what = FUN;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
526 t->val.fun = f;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
527 push(t, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
528 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
529
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
530 void pushblock(Queue newq, Queue* q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
531 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
532 struct Token *t = malloc(sizeof(struct Token));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
533 initToken(t);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
534 t->what = BLOCK;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
535 t->val.block = newq;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
536 push(t, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
537 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
538
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
539 void deletetop(Queue* q) // suppose q not empty
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
540 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
541 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
542 error_empty("deletetop");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
543
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
544 struct Token *todelete = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
545
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
546 if (q->top->what == BLOCK) // has to free the Queue inside
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
547 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
548 deleteQueue(&(q->top->val.block));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
549 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
550
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
551 if (q->top->next == NULL)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
552 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
553 free(q->top);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
554 q->top = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
555 q->bottom = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
556 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
557 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
558 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
559 todelete = q->top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
560 q->top = q->top->next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
561 free(todelete);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
562 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
563 q->size--;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
564 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
565
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
566 void deleteQueue(Queue *q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
567 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
568 while (!is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
569 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
570 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
571 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
572 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
573
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
574 void sendback(Queue* q) // suppose q not empty, pop then push
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
575 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
576 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
577 error_empty("sendback");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
578
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
579 q->bottom->next = q->top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
580 q->top = q->top->next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
581 q->bottom = q->bottom->next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
582 q->bottom->next = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
583 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
584
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
585 struct Token* pop(Queue* q) // suppose q not empty
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
586 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
587 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
588 error_empty("sendback");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
589
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
590 struct Token* t = q->top; // note that t->next is equal to q->top->next now
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
591 q->top = q->top->next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
592 q->size--;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
593
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
594 return t;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
595 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
596
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
597 void append(Queue *q, const Queue *r)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
598 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
599 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
600 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
601 q->top = r->top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
602 q->bottom = r->bottom;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
603 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
604 else if (!is_empty(r))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
605 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
606 q->bottom->next = r->top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
607 q->bottom = r->bottom;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
608 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
609 q->size += r->size;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
610 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
611
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
612 int matchwhat(const Queue* q, const char s[]) // bool "nn" "n" "." ".." "n." "b." "b"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
613 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
614 int itsok = TRUE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
615 if ((s[0] != '\0') && !(is_empty(q))) // if neither s nor q is empty
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
616 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
617 if (s[0] == 'n' && q->top->what != NUM) // if top should be num
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
618 itsok = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
619 if (s[0] == 'b' && q->top->what != BLOCK) // if top should be block
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
620 itsok = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
621 if (s[1] != '\0' && q->top->next == NULL) // if should have second element
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
622 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
623 itsok = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
624 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
625 else // so it indeed has a second element, or it doesn't need to have one
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
626 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
627 if (s[1] == 'n' && q->top->next->what != NUM) // second should be num
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
628 itsok = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
629 if (s[1] == 'b' && q->top->next->what != BLOCK) // second should be block
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
630 itsok = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
631 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
632 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
633 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
634 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
635 if (s[0] != '\0') // if s is not empty but q is
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
636 itsok = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
637 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
638
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
639 // printf("matchwhat: %s\n", (itsok?"TRUE":"FALSE"));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
640 return itsok;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
641 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
642
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
643 void error_empty(const char s[])
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
644 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
645 fprintf(stderr, "Error: queue was empty in %s\n", s);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
646 exit(EXIT_FAILURE);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
647 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
648
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
649
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
650