A very small C interpreter (Note: Originally a fork of https://github.com/RTSYork/picoc)
Go to file
2015-06-10 15:48:44 -05:00
cstdlib remove endian macros 2015-06-10 14:49:34 -05:00
msvc/picoc wrap unistd.h with compile switch 2015-06-07 23:24:34 -05:00
platform use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00
tests use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00
.gitignore don't explicitly set EnableDebugger=TRUE when calling PicocParse, state is now set via NO_DEBUGGER compile switch, add ignore items' 2015-06-07 19:37:21 -05:00
clibrary.c remove endian macros 2015-06-10 14:49:34 -05:00
debug.c use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00
expression.c use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00
heap.c use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00
include.c use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00
interpreter.h minor cleanup 2015-06-10 14:37:21 -05:00
lex.c use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00
LICENSE add license file, update copyright holders 2015-06-10 15:29:12 -05:00
Makefile PRINT_SOURCE_POS macro refactors 2015-06-10 12:33:16 -05:00
parse.c use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00
picoc.c use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00
picoc.h use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00
platform.c use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00
platform.h remove endian macros 2015-06-10 14:49:34 -05:00
README readme additions 2015-06-10 15:48:44 -05:00
table.c use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00
type.c use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00
variable.c use stdbool.h and convert TRUE/FALSE to true/false 2015-06-10 14:24:53 -05:00

# Description

PicoC is a very small C interpreter for scripting. It was originally written
as a script language for a UAV's on-board flight system. It's also very
suitable for other robotic, embedded and non-embedded applications.

The core C source code is around 3500 lines of code. It's not intended to be
a complete implementation of ISO C but it has all the essentials. When
compiled it only takes a few k of code space and is also very sparing of
data space. This means it can work well in small embedded devices. It's also
a fun example of how to create a very small language implementation while
still keeping the code readable.

It's been tested on x86-32, x86-64, powerpc, arm, ultrasparc, HP-PA and blackfin
processors and is easy to port to new targets.

Originally forked from https://github.com/zsaleeba/picoc


# Running files from the command line

You can run standard C programs straight from the command line:

```
$ picoc myprogram.c
```

If your program is split into multiple files you can list them all on the command line.

```
$ picoc myprog1.c myprog2.c myprog3.c
```

If your program takes arguments you add them after a '-' character.

```
$ picoc myprogram.c - arg1 arg2
```


# Running script files

Scripts are slightly simpler than standard C programs - all the system headers
are included automatically for you so you don't need to include them yourself.
Also, scripts don't have a main() function - they just have statements which
are run directly.

```
$ picoc -s myprogram.c
```

Here's an example script:

```
printf("Starting my script\n");

int total = 0;
int i;
for (i = 0; i < 10; i++)
{
    printf("i = %d\n", i);
    total += i;
}

printf("The total is %d\n", total);
```

Here's the output from this script:

```
$ ./picoc -s myscript.c
Starting my script
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
The total is 45
```


# Interactive mode

```
> picoc -i
```

Here's an example session:

```
$ ./picoc -i
starting picoc v2.1
picoc> char inbuf[80];
picoc> gets(inbuf);
hello!
picoc> printf("I got: %s\n", inbuf);
I got: hello!
```

Deleting variables and functions.

Sometimes in interactive mode you want to change a function or redeclare a
variable. You can do this using the "delete" statement:

```
$ ./picoc -i
starting picoc v2.1
picoc> int fred = 1234;
picoc> printf("fred = %d\n", fred);
fred = 1234
picoc> delete fred;
picoc> char *fred = "hello";
picoc> printf("fred = '%s'\n", fred);
fred = 'hello'
```

Note, you can quit picoc's interactive mode using control-D.


# Environment variables
In some cases you may want to change the picoc stack space. The default stack
size is 128KB which should be large enough for most programs.

To change the stack size you can set the STACKSIZE environment variable to a
different value. The value is in bytes.


# Compiling picoc

picoc can be compiled for a UNIX/Linux/POSIX host by typing "make".

The test suite can be run by typing "make test".


# Porting picoc

platform.h is where you select your platform type and specify the includes
etc. for your platform.

platform_XXX.c contains support functions so the compiler can work on
your platform, such as how to write characters to the console etc..

platform_library.c contains your library of functions you want to make
available to user programs.

There's also a clibrary.c which contains user library functions like
printf() which are platform-independent.

Porting the system will involve setting up suitable includes and defines
in platform.h, writing some I/O routines in platform_XXX.c, putting
whatever user functions you want in platform_library.c and then changing
the main program in picoc.c to whatever you need to do to get programs
into the system.

platform.h is set to UNIX_HOST by default so tests can be easily run on
a UNIX system. You'll need to specify your own host setup dependent on
your target platform.


# Copyright

picoc is published under the "New BSD License", see the LICENSE file.