mirror and brackets
This commit is contained in:
parent
193254fb1f
commit
2e9cd20761
@ -11,12 +11,12 @@ int main(int argc, char **argv){
|
|||||||
void (*op)(struct State *);
|
void (*op)(struct State *);
|
||||||
|
|
||||||
s.chart = *(argv+1);
|
s.chart = *(argv+1);
|
||||||
s.counter = 0;
|
s.counter = s.chart;
|
||||||
|
|
||||||
for(s.counter = 0; ; ++s.counter){
|
for(s.counter = s.chart; ; ++s.counter){
|
||||||
if(s.chart == (char *)0)
|
if(s.chart == (char *)0)
|
||||||
return (int)s.hand;
|
return (int)s.hand;
|
||||||
if((op = Ops_lookup(s.chart[s.counter])) == NULL)
|
if((op = Ops_lookup(*s.counter)) == NULL)
|
||||||
return 127;
|
return 127;
|
||||||
else
|
else
|
||||||
op(&s);
|
op(&s);
|
||||||
|
@ -5,15 +5,13 @@
|
|||||||
* Adjust to architecture/system/environment/etc. */
|
* Adjust to architecture/system/environment/etc. */
|
||||||
typedef uint64_t hand_t;
|
typedef uint64_t hand_t;
|
||||||
|
|
||||||
/* Just has to be fairly big. (TODO specify) */
|
|
||||||
typedef uint64_t counter_t;
|
|
||||||
|
|
||||||
/* Holds *argv; will not change between environments. */
|
/* Holds *argv; will not change between environments. */
|
||||||
typedef char * chart_t;
|
typedef char * chart_t;
|
||||||
|
|
||||||
struct State{
|
struct State{
|
||||||
chart_t chart;
|
chart_t chart;
|
||||||
counter_t counter;
|
chart_t point;
|
||||||
|
chart_t counter;
|
||||||
hand_t hand;
|
hand_t hand;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
36
src/ops.c
36
src/ops.c
@ -18,7 +18,7 @@ void Ops_carat(struct State *s){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Ops_ampersand(struct State *s){
|
void Ops_ampersand(struct State *s){
|
||||||
s->hand = (char)s->chart;
|
s->hand = (uint64_t)s->chart;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ops_splat(struct State *s){
|
void Ops_splat(struct State *s){
|
||||||
@ -33,42 +33,62 @@ void Ops_dash(struct State *s){
|
|||||||
--(s->hand);
|
--(s->hand);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Ops_lbrack(struct State *s){
|
||||||
|
s->point = s->counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ops_rbrack(struct State *s){
|
||||||
|
s->counter = s->point;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ops_left(struct State *s){
|
||||||
|
s->hand = *++s->counter;
|
||||||
|
}
|
||||||
|
|
||||||
void Ops_right(struct State *s){
|
void Ops_right(struct State *s){
|
||||||
putc((char)s->hand, stdout);
|
putc((char)s->hand, stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ops_left(struct State *s){
|
void Ops_what(struct State *s){
|
||||||
s->hand = getc(stdin);
|
if(!s->hand)
|
||||||
|
++(s->counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ops_semi(struct State *s){
|
void Ops_semi(struct State *s){
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
while(
|
while(strchr("!\n", *++s->counter) == NULL);
|
||||||
(c = getc(stdin)) != EOF
|
}
|
||||||
&& strchr("!\n", c) == NULL
|
|
||||||
);
|
void Ops_mirror(struct State *s){
|
||||||
|
s->hand = !s->hand;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ops_cross(struct State *s){
|
void Ops_cross(struct State *s){
|
||||||
char *i;
|
char *i;
|
||||||
i = s->chart;
|
i = s->chart;
|
||||||
s->chart = (char *)s->hand;
|
s->chart = (char *)s->hand;
|
||||||
s->hand = (unsigned char)i;
|
s->hand = (uint64_t)i;
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct {
|
const struct {
|
||||||
unsigned char name;
|
unsigned char name;
|
||||||
void (*f)(struct State *);
|
void (*f)(struct State *);
|
||||||
} OPS[] = {
|
} OPS[] = {
|
||||||
|
{ '#', Ops_semi },
|
||||||
{ '%', Ops_percent },
|
{ '%', Ops_percent },
|
||||||
{ '^', Ops_carat },
|
{ '^', Ops_carat },
|
||||||
{ '&', Ops_ampersand },
|
{ '&', Ops_ampersand },
|
||||||
{ '*', Ops_splat },
|
{ '*', Ops_splat },
|
||||||
{ '+', Ops_plus },
|
{ '+', Ops_plus },
|
||||||
{ '-', Ops_dash },
|
{ '-', Ops_dash },
|
||||||
|
{ '{', Ops_lbrack },
|
||||||
|
{ '}', Ops_rbrack },
|
||||||
|
{ ';', Ops_semi },
|
||||||
{ '>', Ops_right },
|
{ '>', Ops_right },
|
||||||
{ '<', Ops_left },
|
{ '<', Ops_left },
|
||||||
|
{ '?', Ops_what },
|
||||||
|
{ 'v', Ops_mirror },
|
||||||
{ 'x', Ops_cross },
|
{ 'x', Ops_cross },
|
||||||
|
|
||||||
/* no-ops */
|
/* no-ops */
|
||||||
|
Loading…
Reference in New Issue
Block a user