Compare commits
No commits in common. "2e9cd207614e40f94539d503d7334f13aa8ba4f5" and "add3346ce9ee7c958bb47adfa91f78d03f1da899" have entirely different histories.
2e9cd20761
...
add3346ce9
5
.gitignore
vendored
5
.gitignore
vendored
@ -1,3 +1,2 @@
|
||||
bin/blang
|
||||
build
|
||||
build/*
|
||||
bin
|
||||
bin/*
|
||||
|
4
Makefile
4
Makefile
@ -7,6 +7,8 @@ all: $(TARGETS)
|
||||
clean:
|
||||
$(RM) $(TARGETS)
|
||||
|
||||
bin:
|
||||
mkdir -p bin
|
||||
build:
|
||||
mkdir -p build
|
||||
|
||||
@ -16,7 +18,7 @@ build/blang.o: build src/blang.c src/blang.h
|
||||
build/ops.o: build src/blang.h src/ops.c src/ops.h
|
||||
$(CC) -c -o $@ src/ops.c
|
||||
|
||||
bin/blang: build/blang.o build/ops.o
|
||||
bin/blang: bin build/blang.o build/ops.o
|
||||
$(CC) $(CFLAGS) -o $@ build/*.o
|
||||
|
||||
.PHONY: all clean
|
||||
|
14
README.md
14
README.md
@ -12,22 +12,20 @@ the bang language
|
||||
|
||||
Public domain. 2022 DTB.
|
||||
|
||||
## Examples
|
||||
# Examples
|
||||
|
||||
### true(1)
|
||||
## true(1)
|
||||
```
|
||||
; initialize hand to 0
|
||||
^
|
||||
|
||||
^ ; initialize hand to 0
|
||||
; set the chart pointer to 0 - this destroys the chart
|
||||
; and the program exits with the value of the hand
|
||||
*
|
||||
```
|
||||
|
||||
### Hello world:
|
||||
## Hello world:
|
||||
```
|
||||
; the <.> construct uses '<' to literally 'palm' the next value
|
||||
; (store into hand), does so, and uses '>' to 'toss' (output hand's value)
|
||||
; the <.> construct uses '<' to store the next value literally into state,
|
||||
; does so, and uses '>' to output state literally
|
||||
<H><e><l><l><o><,>< ><w><o><r><l><d><!><
|
||||
>^*
|
||||
```
|
||||
|
@ -1,3 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
blang "$(cat "$@")"
|
@ -1,2 +0,0 @@
|
||||
<H><e><l><l><o><,>< ><w><o><r><l><d><!><
|
||||
>^*
|
@ -1,2 +0,0 @@
|
||||
#!/usr/bin/env blangfile
|
||||
^*
|
@ -11,12 +11,12 @@ int main(int argc, char **argv){
|
||||
void (*op)(struct State *);
|
||||
|
||||
s.chart = *(argv+1);
|
||||
s.counter = s.chart;
|
||||
s.counter = 0;
|
||||
|
||||
for(s.counter = s.chart; ; ++s.counter){
|
||||
for(s.counter = 0; ; ++s.counter){
|
||||
if(s.chart == (char *)0)
|
||||
return (int)s.hand;
|
||||
if((op = Ops_lookup(*s.counter)) == NULL)
|
||||
if((op = Ops_lookup(s.chart[s.counter])) == NULL)
|
||||
return 127;
|
||||
else
|
||||
op(&s);
|
||||
|
@ -5,13 +5,15 @@
|
||||
* Adjust to architecture/system/environment/etc. */
|
||||
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. */
|
||||
typedef char * chart_t;
|
||||
|
||||
struct State{
|
||||
chart_t chart;
|
||||
chart_t point;
|
||||
chart_t counter;
|
||||
counter_t counter;
|
||||
hand_t hand;
|
||||
};
|
||||
#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){
|
||||
s->hand = (uint64_t)s->chart;
|
||||
s->hand = (char)s->chart;
|
||||
}
|
||||
|
||||
void Ops_splat(struct State *s){
|
||||
@ -33,62 +33,42 @@ void Ops_dash(struct State *s){
|
||||
--(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){
|
||||
putc((char)s->hand, stdout);
|
||||
}
|
||||
|
||||
void Ops_what(struct State *s){
|
||||
if(!s->hand)
|
||||
++(s->counter);
|
||||
void Ops_left(struct State *s){
|
||||
s->hand = getc(stdin);
|
||||
}
|
||||
|
||||
void Ops_semi(struct State *s){
|
||||
int c;
|
||||
|
||||
while(strchr("!\n", *++s->counter) == NULL);
|
||||
}
|
||||
|
||||
void Ops_mirror(struct State *s){
|
||||
s->hand = !s->hand;
|
||||
while(
|
||||
(c = getc(stdin)) != EOF
|
||||
&& strchr("!\n", c) == NULL
|
||||
);
|
||||
}
|
||||
|
||||
void Ops_cross(struct State *s){
|
||||
char *i;
|
||||
i = s->chart;
|
||||
s->chart = (char *)s->hand;
|
||||
s->hand = (uint64_t)i;
|
||||
s->hand = (unsigned char)i;
|
||||
}
|
||||
|
||||
const struct {
|
||||
unsigned char name;
|
||||
void (*f)(struct State *);
|
||||
} OPS[] = {
|
||||
{ '#', Ops_semi },
|
||||
{ '%', Ops_percent },
|
||||
{ '^', Ops_carat },
|
||||
{ '&', Ops_ampersand },
|
||||
{ '*', Ops_splat },
|
||||
{ '+', Ops_plus },
|
||||
{ '-', Ops_dash },
|
||||
{ '{', Ops_lbrack },
|
||||
{ '}', Ops_rbrack },
|
||||
{ ';', Ops_semi },
|
||||
{ '>', Ops_right },
|
||||
{ '<', Ops_left },
|
||||
{ '?', Ops_what },
|
||||
{ 'v', Ops_mirror },
|
||||
{ 'x', Ops_cross },
|
||||
|
||||
/* no-ops */
|
||||
|
Loading…
Reference in New Issue
Block a user