2015-06-10 16:48:44 -04:00
|
|
|
# Description
|
2010-03-02 15:12:37 -05:00
|
|
|
|
2015-06-10 16:29:12 -04:00
|
|
|
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
|
2011-01-06 14:55:21 -05:00
|
|
|
suitable for other robotic, embedded and non-embedded applications.
|
2010-03-02 15:12:37 -05:00
|
|
|
|
2015-06-10 16:29:12 -04:00
|
|
|
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
|
2010-03-02 15:14:54 -05:00
|
|
|
still keeping the code readable.
|
2010-03-02 15:12:37 -05:00
|
|
|
|
2015-06-10 16:29:12 -04:00
|
|
|
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.
|
2010-03-02 15:12:37 -05:00
|
|
|
|
2015-06-10 16:48:44 -04:00
|
|
|
Originally forked from https://github.com/zsaleeba/picoc
|
2010-03-02 15:12:37 -05:00
|
|
|
|
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
|
2010-03-02 15:12:37 -05:00
|
|
|
|
|
|
|
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
|
2010-03-02 15:12:37 -05:00
|
|
|
|
2015-06-10 16:29:12 -04:00
|
|
|
platform.h is where you select your platform type and specify the includes
|
2010-03-02 15:12:37 -05:00
|
|
|
etc. for your platform.
|
|
|
|
|
2015-06-10 16:29:12 -04:00
|
|
|
platform_XXX.c contains support functions so the compiler can work on
|
2010-03-02 15:12:37 -05:00
|
|
|
your platform, such as how to write characters to the console etc..
|
|
|
|
|
2015-06-10 16:29:12 -04:00
|
|
|
platform_library.c contains your library of functions you want to make
|
2010-03-02 15:12:37 -05:00
|
|
|
available to user programs.
|
|
|
|
|
2015-06-10 16:29:12 -04:00
|
|
|
There's also a clibrary.c which contains user library functions like
|
2010-03-02 15:12:37 -05:00
|
|
|
printf() which are platform-independent.
|
|
|
|
|
2015-06-10 16:29:12 -04:00
|
|
|
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
|
2010-03-02 15:12:37 -05:00
|
|
|
into the system.
|
|
|
|
|
|
|
|
platform.h is set to UNIX_HOST by default so tests can be easily run on
|
2015-06-10 16:29:12 -04:00
|
|
|
a UNIX system. You'll need to specify your own host setup dependent on
|
2010-03-02 15:12:37 -05:00
|
|
|
your target platform.
|
|
|
|
|
|
|
|
|
2015-06-10 16:48:44 -04:00
|
|
|
# Copyright
|
2010-03-02 15:12:37 -05:00
|
|
|
|
2015-06-10 16:48:44 -04:00
|
|
|
picoc is published under the "New BSD License", see the LICENSE file.
|
2010-03-02 15:12:37 -05:00
|
|
|
|