picoc/README.md

169 lines
3.9 KiB
Markdown
Raw Normal View History

2015-06-10 16:48:44 -04: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.
2015-06-10 16:48:44 -04:00
Originally forked from https://github.com/zsaleeba/picoc
2015-06-10 16:48:44 -04:00
# 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".
2015-06-10 16:48:44 -04:00
# 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.
2015-06-10 16:48:44 -04:00
# Copyright
2015-06-10 16:48:44 -04:00
picoc is published under the "New BSD License", see the LICENSE file.