## ## # # ###### ## ## ## ## ## ## ## ## ## ### ### ## ## ### ## ## ##### ##### ##### ##### #### #### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ###### #### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ###### ###### ##### #### #### ############################################################### X11-BASICVERSION 1.24 User Manual (C) 1997-2015 by Markus Hooemann (kollo@users.sourceforge.net) (see http://x11-basic.sourceforge.net/) Latest revision: August 27, 2015 __________________________________________________________________________________________________________________________ X11-Basic is a dialect of the BASIC programming language with graphics capa- bility that integrates features like shell scripting, cgi-programming and full graphical visualization into the easy to learn BASIC language on modern computers. The syn- tax is most similar to the old GFA-Basic on ATARI-ST implementation. Old GFA- programs should run with only few changes. About this document This document describes the features of X11-Basic. You will ond information about the X11-Basic interpreter (the program xbasic under Unix or xbasic.exe under Windows) and the compiler (the program xbc under UNIX or xbc.exe under Win- dows) as well as the language itself. For a more compact description you may want to read the x11basic(1) man-page or the man-page of the X11-Basic compiler xbc(1). The latest information and updates and new versions of X11-Basic can be found at http://x11-basic.sourceforge.net/. 2 1. About X11-Basic 1 X11-BasicContents 2. Usage 6 2.1. Installing X11-Basic . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.2. Using the X11-Basic Interpreter . . . . . . . . . . . . . . . . . . . 10 2.2.1. Using the X11-Basic Interpreter under UNIX, Linux . . . . 11 2.2.2. Using the WINDOWS Version of X11-Basic . . . . . . . . 12 2.2.3. The Android Version of X11-Basic . . . . . . . . . . . . . 13 2.2.4. The TomTom Version of X11-Basic . . . . . . . . . . . . . 18 2.2.5. Command line parameters . . . . . . . . . . . . . . . . . . 18 2.3. Editing X11-Basic programs . . . . . . . . . . . . . . . . . . . . . 19 2.4. The Bytecode Compiler and the Virtual Machine . . . . . . . . . . 20 2.5. Using the X11-Basic to C translator . . . . . . . . . . . . . . . . . 23 2.6. The X11-Basic compiler manager xbc . . . . . . . . . . . . . . . . 24 2.7. The ANSI-Basic to X11-Basic converter . . . . . . . . . . . . . . . 25 2.8. Using GFA-BASIC programs . . . . . . . . . . . . . . . . . . . . . 26 3. Programming in X11-Basic 27 3.1. The dialect of X11-BASIC . . . . . . . . . . . . . . . . . . . . . . 27 3.2. Getting started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.3. Your orst X11-Basic program . . . . . . . . . . . . . . . . . . . . . 28 3.4. Program structure . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.5. General Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.6. The very BASIC commands: PRINT, INPUT, IF and GOTO . . . . 32 3.7. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.7.1. The scope of a Variable . . . . . . . . . . . . . . . . . . . . 35 3.7.2. Data types . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.7.3. Variable naming . . . . . . . . . . . . . . . . . . . . . . . 36 3.7.4. Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.7.5. Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.7.6. Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.7.7. Arbitrary precision numbers . . . . . . . . . . . . . . . . . 40 3.8. Arithmetics and Calculations . . . . . . . . . . . . . . . . . . . . . 42 3.8.1. Expressions and Conditions . . . . . . . . . . . . . . . . . 42 i Contents______________________________________________________________________________________________________________________ 3.8.2. Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.8.3. String processing . . . . . . . . . . . . . . . . . . . . . . . 46 3.8.4. Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 3.9. Procedures and Functions . . . . . . . . . . . . . . . . . . . . . . . 48 3.9.1. Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . 49 3.9.2. Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.9.3. Parameters and local variables . . . . . . . . . . . . . . . . 51 3.10. Simple Input/Output . . . . . . . . . . . . . . . . . . . . . . . . . 53 3.10.1. Printing data to the console . . . . . . . . . . . . . . . . . . 53 3.10.2. Screen control . . . . . . . . . . . . . . . . . . . . . . . . 54 3.10.3. Formatting output with PRINT USING . . . . . . . . . . . 55 3.10.4. Gathering User Input . . . . . . . . . . . . . . . . . . . . . 61 3.11. Flow Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 3.11.1. Conditional and endless loops . . . . . . . . . . . . . . . . 64 3.12. Address Spaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.13. Graphics: Drawing and Painting . . . . . . . . . . . . . . . . . . . 66 3.14. Reading from and Writing to Files . . . . . . . . . . . . . . . . . . 66 3.15. Internet connections, special oles and sockets . . . . . . . . . . . . 67 3.15.1. Local inter process communication: Pipes . . . . . . . . . . 67 3.15.2. World-Wide communication: Sockets . . . . . . . . . . . . 68 3.16. Accessing USB devices . . . . . . . . . . . . . . . . . . . . . . . . 72 3.17. Data within the program . . . . . . . . . . . . . . . . . . . . . . . 72 3.18. Dynamic-link libraries . . . . . . . . . . . . . . . . . . . . . . . . 73 3.18.1. Using shared libraries and C functions . . . . . . . . . . . . 74 3.19. Memory management . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.19.1. Allocating memory . . . . . . . . . . . . . . . . . . . . . . 76 3.20. Other features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 4. Graphical User Interface 77 4.1. ALERT and FILESELECT . . . . . . . . . . . . . . . . . . . . . . 77 4.2. Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.2.1. Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.2.2. The gui ole format . . . . . . . . . . . . . . . . . . . . . . 90 4.3. Menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 5. WEB Programming 93 5.1. What is CGI? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 5.1.1. Conoguration . . . . . . . . . . . . . . . . . . . . . . . . . 93 ii _____________________________________________________________________________________________________Contents_____________ 5.2. How it works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 5.2.1. Environment Variables . . . . . . . . . . . . . . . . . . . . 95 5.2.2. CGI Standard Input . . . . . . . . . . . . . . . . . . . . . . 101 5.2.3. Which CGI Input Method to use? . . . . . . . . . . . . . . 102 5.2.4. Output from CGI Scripts . . . . . . . . . . . . . . . . . . . 102 5.2.5. CGI Headers . . . . . . . . . . . . . . . . . . . . . . . . . 102 5.2.6. Example cgi-Script envtest.cgi . . . . . . . . . . . . . . 104 6. Quick reference 105 6.1. Reserved variable names . . . . . . . . . . . . . . . . . . . . . . . 105 6.2. Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 6.3. Numbers and Constants . . . . . . . . . . . . . . . . . . . . . . . . 106 6.4. Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 6.5. Abbreviations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 6.6. Interpreter Commands . . . . . . . . . . . . . . . . . . . . . . . . 107 6.7. Flow Control Commands . . . . . . . . . . . . . . . . . . . . . . . 108 6.8. Console Input/Output Commands . . . . . . . . . . . . . . . . . . 109 6.9. File Input/Output Commands . . . . . . . . . . . . . . . . . . . . . 109 6.10. Variable Manipulation Commands . . . . . . . . . . . . . . . . . . 110 6.11. Memory Manipulation Commands . . . . . . . . . . . . . . . . . . 111 6.12. Math commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 6.13. Other Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 6.14. Graphic commands . . . . . . . . . . . . . . . . . . . . . . . . . . 113 6.14.1. Drawing and painting . . . . . . . . . . . . . . . . . . . . . 113 6.14.2. Screen/Window commands . . . . . . . . . . . . . . . . . . 114 6.14.3. GUI/User input commands . . . . . . . . . . . . . . . . . . 115 6.15. File Input/Output functions . . . . . . . . . . . . . . . . . . . . . . 115 6.16. Variable/String Manipulation functions . . . . . . . . . . . . . . . . 116 6.17. Data compression and coding functions . . . . . . . . . . . . . . . 117 6.18. Memory Manipulation functions . . . . . . . . . . . . . . . . . . . 118 6.19. Logic functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 6.20. Math functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 6.20.1. Angles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 6.20.2. Trigonometric functions . . . . . . . . . . . . . . . . . . . 121 6.20.3. Random numbers . . . . . . . . . . . . . . . . . . . . . . . 121 6.21. System functions . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 6.22. Graphic functions . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 6.23. Other functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 iii Contents______________________________________________________________________________________________________________________ 6.24. Subroutines and Functions . . . . . . . . . . . . . . . . . . . . . . 123 6.25. Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 7. Command Reference 130 7.1. Syntax templates . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 7.2. A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 7.3. B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 7.4. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 7.5. D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 7.6. E . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 7.7. F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 7.8. G . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 7.9. H . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 7.10. I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 7.11. J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 7.12. K . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 7.13. L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 7.14. M . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 7.15. N . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405 7.16. O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414 7.17. P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432 7.18. Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 7.19. R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 7.20. S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508 7.21. T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567 7.22. U . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585 7.23. V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598 7.24. W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607 7.25. X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618 8. Frequently asked Questions 625 9. Compatibility 628 9.1. General remarks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628 9.2. GFA-Basic compatibility . . . . . . . . . . . . . . . . . . . . . . . 631 9.3. Ideas for future releases of X11-Basic . . . . . . . . . . . . . . . . 638 A. GNU License 643 iv _____________________________________________________________________________________________________Contents_____________ Index 649 v Contents______________________________________________________________________________________________________________________ vi X11-Basic is a dialect of the BASIC programming language with graphics and sound which integrates features like traditional BASIC language syntax, structured pro- X11-Basic1grAboutamX11-Basicming, shell scripting, cgi programming, powerful math, and full graphical visu- alization into the easy to learn BASIC language on modern computers. The syntax of X11-Basic is most similar to GFA-Basic in its original ancient imple- mentation for the ATARI ST. Old GFA-programs should run with only a few changes. Also DOS/QBASIC programmers will feel comfortable. X11-Basic is as well suited to novices as programming wizards, and is appropri- ate for virtually all programming tasks. For science and engineering X11-Basic has already proven its capability of handling complex simulation and control problems. For system programs, X11-Basic has high level language replacements for low level programming features that are much easier to read, understand, and maintain. For all applications, X11-Basic is designed to support rapid development of compact, eOEcient, reliable, readable, portable, well structured programs. X11-Basic supports the principle 'small is beautiful'. Its aim is to use the fewest system resources and execute with the highest speed. X11-Basic meets in this, by providing very powerful built-in commands and functions, and a very fast compiler producing even faster applications. X11-Basic lets you write an application with very little eoeort, giving you full control over your application. X11-Basic doesn't use "black boxes" with an enormous overhead, but instead calls operating system functions whenever possible. In case the X11-Basic commands and functions aren't suOEcient, you can easily use the native shell to execute other programs and com- mands, or you will be able to use any shared library on the system, which can be dynamically linked. No language is perfect and X11-Basic is no exception. It has its weak and it's strong points. You won't use X11-Basic to write major applications, but it is ex- tremely well suited to develop small to medium sized programs. X11-Basic is nearly as versatile as C, it uses procedures and functions and parameter passing similar to C. X11-Basic programs are constructed in a straightforward fashion. As C, X11-Basic doesn't use object oriented structures and allows an easy start. Because it is an interpretive language each new step in your program can be tested quickly providing you with instant feedback. And when you onished your program you can use the X11-Basic compiler to create a very fast stand-alone executable. No 1 1. About_X11-Basic___________________________________________________________________________________________________________ complicated compiler options and linker switches are necessary to create a stand- alone application. Portability X11-Basic is designed to run on many platforms with extremely low resources. It has started on UNIX workstations and Linux-systems with the X-Window system (com- monly known as X11, based on its current major version being 11). In case where no X11 implementation is available, X11-Basic can be compiled with a framebuoeer- device graphics engine. The Android version e.g. uses the framebuoeer interface. Also such a version for the TomTom navigation devices has been created. Porting X11-Basic to more basic and embedded systems with a very low amount of RAM and processing speed is well possible. On UNIX and Linux systems, not only the X11 graphics engine can be used, but also the SDL library (=Simple Direct- Media Library), as well as any raw framebuoeer device or no graphics at all. The MS WINDOWS version supports only SDL (or no graphics at all). X11-Basic supports complex numbers and complex math, as well as arbitrary pre- cision numbers and calculations where needed, as well as very fast 32bit integer and 64bit AEoating point operations, very powerful string handling functions for charack- ter strings of any length and any content. Sound is not available on every system. Where available, X11-Basic implements a 16 channel sound synthesizer as well as the option to play sound samples from standard sound ole formats (line .wav and .ogg). On LINUX systems the ALSA sound engine is used. The Android port of X11-Basic uses the Android sound and speech engine. The X11-Basic environment contains a library of GEM1 GUI2 functions. This makes writing GUI programs in X11-Basic faster, easier and more portable than programming with native GUI tools. The Android version of X11-Basic contains a full featured coloured VT100/ANSI terminal emulation and support for unicode character sets (UTF-8 coded) for standard output. ___________________________________________________ 1GEM=Graphics Environment Manager, an operating environment created by Digital Research, Inc. (DRI), which was used on the ATARI ST and GFA-BASIC. 2GUI=Graphical User Interface 2 __________________________________________________________________________________________________________________________ Structured programming X11-Basic is a structured procedural programming language. Structure is a form of visual and functional encapsulation in which multiple-line sections of program look and act like single units. The beginning and end of blocks are marked by descriptive keyword delimiters. In contrast to more traditional BASIC implementations, line numbers are not used in X11-Basic. Every line holds only one instruction. Jumps with GOTO are possi- ble but not necessary. All the well-known loops are available including additional commands for discontinuation ( ! EXIT IF, BREAK). Procedures and functions with return values of any type can be deoned. This way BASIC programs can be structured in a modular way. A program can contain a main part to call subfunctions and subprocedures, which may or may not be deoned in the same source ole. Distinct sources can form a library. Whole libraries can be added with the merge command ( ! MERGE). To help porting ANSI-Basic1 programs (with line numbers) to X11-Basic, a con- verter ( ! bas2x11basic) has been written. It comes with the X11-Basic package. The third-party tool gfalist2 by Peter Backes (not included in the X11-Basic package) even allows to decode GFA-Basic .gfa oles to ASCII. Speed of X11-Basic How fast is X11-Basic? The answer depends on the way an X11-Basic program is run: It depends on if the code is interpreted, run as bytecode in a virtual machine, or being compiled to native machine language. Generally we ond: 1. X11-Basic programs run by the interpreter are slow, 2. X11-Basic programs compiled to bytecode and then run in the X11-Basic vir- tual machine (xbvm) is fast, but 3. X11-Basic bytecode compiled natively to real machine language is even faster. 4. arbitrary precision numbers and calculations are slow, but 5. 64bit AEoating point and complex number calculations as well as 32bit integers are very fast. ___________________________________________________ 1So-called ANSI-Basic has been standardized by the American National Standards Institute. ANSI-Basic uses line numbers and the syntax can be quite dioeerent from X11-Basic. 2You will ond a link to gfalist (the project name is ONS) on the X11-Basic homepage. 3 1. About_X11-Basic___________________________________________________________________________________________________________ Bytecoded programs are always interpreted faster than scripted programming lan- guages. The X11-Basic compiler can translate the X11-Basic bytecode to C, which then can be compiled to native machine language using any C-compiler (preferably gcc on UNIX systems). Obviously your programs will be slower than optimized C/C++ code but it already comes close. If you need highest possible speed you can load and link a separate DLL/shared object with the time critical part of your code written in another language (e.g. C or Assembler). A speed comparison was done with the Whetstone benchmark ( ! Whets.bas). This shows, that bytecode-programs are about 19 times faster than the interpreted code and a natively compiled program can run about 28 times faster. Optimality of code and code overhead At a minimum the X11-Basic interpreter and the bytecode interpreter (virtual ma- chine) require about 350 KB of memory and another 400 kB of ole size, which in- cludes the X11-Basic runtime-library. So this is the overhead that all your programs will have. Compared to some Windows programs, this isn't that bad. Most likely your bytecode is less than 50 kB anyway (for a moderate/large application), plus any resources and graphics you may want to include of course. In the end the code pro- duced will be reasonably small and light enough to be also used on portable devices (e.g. cell phones, e-book readers, and navigation devices) which have only a small amount of native memory (and a relatively slow processor). Copyright information Copyright (C) 1997-2015 by Markus Hooemann Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front- Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". X11-Basic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY 4 __________________________________________________________________________________________________________________________ WARRANTY; without even the implied warranty of MERCHANTABILITY or FIT- NESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. Read the ole COPYING for details. (Basically that means, free, open source, use and modify as you like, don't incor- porate it into non-free software, no warranty of any sort, don't blame me if it doesn't work.) 5 This chapter describes how to install X11-Basic on the most popular operating sys- tems and how to run the interpreter and how to compile BASIC programs. X11-Basic2ThUsagee X11-Basic interpreter is called xbasic (xbasic.exe under Windows). The compiler xbc (xbc.exe under Windows). Under Unix these executables are usu- ally installed in the /usr/bin/ (if installed via the package management system) or in /usr/local/bin (if installed manually from the source package) path. Under Windows, the oles are installed normally under the directory C:"x11basic. Under Android you will not have to care about the individual components of X11-Basic, because there the X11-Basic app comes with a little IDE (Integrated Development Environment) which handles the terminal, editor, loading running and the compile process for you. 2.1. Installing X11-Basic For the most popular operating systems, ready-made packages are available which allow an easy installation of X11-Basic without the need of compiling it from source code. For other operating systems not mentioned here, X11-Basic may or may not work. Generally no binary package might be available, so in these cases you will have to compile all X11-Basic components (manually) by your own. You may be lucky and you are not the orst trying this, so searching the internet for hints is generally a good idea. But most likely you are reading this manual because you have already got X11- Basic installed on your system, or you at least have a package ready to be installed right away. SuSE-Linux and RedHat If you have got a Redhat-Package (RPM) e.g. a ole named X11Basic-1.24-1.i386.rpm, then you can install this package (being root) with rpm -i X11Basic-1.24-1.i386.rpm . 6 ______________________________________________________________________________2.1.__Installing_X11-Basic__________________ This is a very convenient way at least for the Linux distributions Feodora, Man- driva, SuSE and RedHat (and maybe others, basically derived distributions1 ) to in- stall the interpreter, the compiler, and its documentation, the man-pages and a small collection of example programs. Following oles will be normally installed: /usr/bin/xbasic -- the X11-Basic interpreter /usr/bin/xbc -- the compiler /usr/bin/xbbc -- bytecode compiler /usr/bin/xvbm -- bytecode interpreter (virtual machine) /usr/bin/xb2c -- the bytecode to C translator /usr/bin/bas2x11basic -- the ANSI BASIC to X11-Basic translator /usr/lib/libx11basic.so -- the runtime library (shared object) /usr/lib/libx11basic.a -- the runtime library for static linking /usr/include/x11basic/x11basic.h -- the header file for library API /usr/include/x11basic/xb2csol.h -- the header file for compilation of xb2c output /usr/share/man/man1/x11basic.1 -- the man-page of X11-Basic /usr/share/man/man1/xbasic.1 -- the man-page of the X11-Basic interpreter /usr/share/man/man1/xbc.1 -- the man-page of the compiler /usr/share/man/man1/xbbc.1 -- the man-page of the bytecode compiler /usr/share/man/man1/xbvm.1 -- the man-page of the virtual machine /usr/share/man/man1/xb2c.1 -- the man-page of the X11-Basic to C translator /usr/share/man/man1/bas2x11basic.1 -- the man-page of the ANSI to X11-Basic translator After having installed the package, you can execute the interpreter with xbasic or read the man pages with man xbasic or man x11basic. The documentation should install into the /usr/share/doc/packages/X11Basic/ directory and you should ond the following oles: -rw-r--r-- 1005 ACKNOWLEGEMENTS -- acknowledgments -rw-r--r-- 46 AUTHORS -- contact addresses of the author -rw-r--r-- 17982 COPYING -- copyright information -rw-r--r-- 2960 INSTALL -- installation instructions -rw-r--r-- 1752 README -- short description -rw-r--r-- 170 RELEASE`NOTES -- release notes -rw-r--r-- 164370 X11-Basic-manual.txt -- the manual (txt version) drwxr-xr-x 1024 editors/ -- files for editors / syntax highlighting drwxr-xr-x 1024 examples/ -- few example programs Debian based distributions, Ubuntu and Knoppix If your Linux distributions does not use the RedHat package system it is very likely that it instead uses the Debian package system. The most popular Debian based Linux distributions are Knoppix and Ubuntu2 . ___________________________________________________ 1A list of RPM based Linux distributions can be found here: http://en.wikipedia.org/wiki/Category: RPM-based`Linux`distributions 2A list of Debian based Linux distributions can be found here: http://en.wikipedia.org/wiki/Category: Debian-based`distributions 7 2. Usage_____________________________________________________________________________________________________________________ X11-Basic also comes in packages called (e.g.) x11basic`1.24-1`i386.deb. Usually you can very easily install the ole from a ole browser with simply double clicking on it. Also a dpkg -i x11basic`1.24-1`i386.deb from a terminal will do. The ole system structure should be similar to what is de- scribed in the previous chapter (explaining the RedHat packages), so you should expect to ond the same oles at the same places. Please note, that you need a special debian package if you want to install it on 64 bit linux installations, usually called x11basic`1.24-1`amd64.deb. Other Linux and UNIX distributions The author currently provides only 32bit and 64bit debian binary packages for linux (speciocally Ubuntu linux). A rpm package can be made out of the debian packet with a tool called alien. For exotic linux based devices usually binary distributions come as a zip ole (like the TomTom version). In these cases they are accompanied by a README or other instructions how to install them. The package for Android comes in a ole called X11-Basic-1.24-22.apk usually provided by Google Play (formerly known as An- droid Market), which also installs it for you. If you do not like to use Google Play for some reason, you can also install X11-Basic from any ole browser taping on its .apk ole, downloaded from sourceforge.net. For all other systems you will have to get the source-package X11Basic-1.24.tar.gz and compile the sources. This should work for all Linux distributions, and probably with little modiocations also for HP-UX (Hewlett-Packard UniX), for DEC/alpha, for MAC/OSX, for SUN/SOLARIS and FreeBSD and maybe others. Also X11- Basic compiles on Cygwin, and on ARM-Linuxes like the one often used together with the Raspberry Pi. Please note that X11-Basic is designed for 32-bit operating systems. X11-Basic will also compile on 64 bit systems. But some of the functions may not work, especially pointer aritmetric (VARPTR(), etc.) will probably lead to segmentation faults when using huge amounts of memory. Compiling X11-Basic from its sources under UNIX like systems If you have a binary package of X11-Basic, you can safely skip this section. In order to compile X11-Basic, you will need the following: 8 ______________________________________________________________________________2.1.__Installing_X11-Basic__________________ # A C compiler, preferably GNU C (but other ANSI C compilers will do), # X11 libraries (for the graphics) or a framebuoeer device or the SDL library, # optionally the readline library, # optionally the LAPACK library, # optionally the GMP library, # optionally the ALSA sound library (libasound) and/or the SDL framework. These will suOEce to get you started. If one or more of these libraries are not present on your system, the configure and make scripts will try to compile a version, which does not need them (hence leaving out some of the functionality of X11-Basic.). 1. Install the development environment packages, e.g. done by the command: sudo apt-get install libx11-dev libreadline6-dev liblapack-dev libgmp-dev 2. Unpack X11Basic-1.24.tar.gz with tar xzf X11Basic-1.24.tar.gz 3. go into the X11Basic-1.24 directory and do a ./configure make sudo make install That's all you will have to do (for more detailed installation instructions read the ole INSTALL, which comes with the package.). If the `conogure' script fails, please contact me (kollo@users.sourceforge. net) and send me the output it generated (config.log). I am going to try to help you to ox the problem. Special comments on the framebuoeer version Very useful on the Raspberry pi and other low memory/low resources computers is the option not to use X or SDL libraries at all. You can have a full featured X11- basic with graphics and mouse input anyway, if you compile the framebuoeer version (make fb). This will produce the single ole xbasic.framebuffer which is the interpreter (and virtual machine) ready to be used from a console (and without X). This way you have full comtrol over the screen and mouse and keyboard. Usually everything you need to make the Raspberry pi interact with and display to the user. 9 2. Usage_____________________________________________________________________________________________________________________ Cross-compiling other Versions of X11Basic The Makeole allows you to also produce the compiler (make xbc), the bytecode compiler (make xbbc), the virtual machine (make xbvm), and the X11-Basic to C translator (make xb2c). If you need the separate libraries you can do a make x11basic.a and a make libx11basic.so. These libraries are for example needed by the com- piler xbc. If you want to make a version which uses the framebuoeer (instead of the X-Server) do a make fb. If you want a version using the SDL library, do a make sdl. The TomTom distribution can be generated with make TomTom. (The ARM-Linux cross-compiler is needed). The MS WINDOWS distribution can be generated with make windows. (The mingw cross-compiler is needed). Support If you have trouble with X11-Basic, you may send me a mail. Please understand that I need to ond time to answer your mails. On http://sourceforge.net/projects/ x11-basic/ there is a forum (bug reports, patches, request for help, feature requests) about X11-Basic. You can as well place your questions there, so that also other users of X11-Basic have a chance to help. It is also worth browsing through the topics. Maybe someone has already found a solution to your problem. It is as well ment for the users to share their experience with other X11-Basic users. If you have trouble with some X11-Basic command or program, and you think it is a bug in the X11-Basic interpreter or compiler itself, you should create a minimum sample program to reproduce the error; please keep this sample program as small as possible. Then take the program and send it to me. Add a short description of you problem, containing: # Which operating system are you using: Windows or UNIX, Linux, Android? # How does the program behave on your computer? What did you expect? # Which version of X11-Basic are you using? Please try the latest one! 2.2. Using the X11-Basic Interpreter There are several ways to start the X11-Basic interpreter depending on the operating system you are using it. 10 ______________________________________________________________2.2.__Using_the_X11-Basic_Interpreter_______________________ 2.2.1. Using the X11-Basic Interpreter under UNIX, Linux The simplest way is to just start it by the command xbasic from a terminal window or a console. Then you can use the interpreter in interactive mode. Just try to enter some X11-Basic commands. The interpreter itself also accepts several options via the command line. Please also read the man-page (man xbasic) for more details. In Ubuntu or Lubuntu you will also ond X11-Basic in the start menu. When you select X11-Basic from the start menu, the interpreter should come up in its own terminal window. X11-Basic as a shell X11-Basic programs can be executed like shell scripts. Make sure that the very orst line of your X11-Basic program starts with the characters '#!' followed by the full pathname of the X11-Basic interpreter xbasic (e.g. '#!/usr/bin/xbasic'). This she-bang line ensures, that your UNIX will invoke xbasic to execute your program. Moreover, you will need to change the permissions of your X11-Basic program, e.g. chmod 755 myprog.bas. After that your program can simply be executed from your shell and the interpreter works in the background like shells do. You need not even use the extension .bas for your scripts. Example: draftit A tool to stamp a postscript ole with "draft" on every page. #!/usr/bin/xbasic i=1 WHILE LEN(PARAM$(i)) inputfile$=PARAM$(i) INC i WEND CLR flag,count IF NOT EXIST(inputfile$) QUIT ENDIF OPEN "I",#1,inputfile$ WHILE NOT EOF(#1) LINEINPUT #1,t$ IF count=3 PRINT "%% Created by draftit X11-Basic (c) Markus Hoffmann from "+inputfile$ ENDIF IF GLOB(t$,"%%Page: *") AND NOT GLOB(t$,"%%Page: 1 1*") IF flag PRINT "grestore" 11 2. Usage_____________________________________________________________________________________________________________________ ENDIF flag=1 PRINT t$ PRINT "gsave" PRINT ".80 setgray" PRINT "/Helvetica-Bold findfont 140 scalefont setfont" PRINT "0 80 800 - 306 exch moveto" PRINT "(Draft) dup" PRINT "stringwidth pop 4 div neg 0 rmoveto 6 rotate show " for" PRINT "grestore" ELSE PRINT t$ ENDIF INC count WEND CLOSE QUIT 2.2.2. Using the WINDOWS Version of X11-Basic You should have installed the package X11-Basic-1.24-1-win.zip by extracting all oles and invoking the setup program (setup.exe). This installs X11-Basic into a folder C:""x11basic. All oles you need for using X11-Basic are located there: lib -- empty folder for future use bas.ico -- the icon for .bas files demo.bas -- one of the example programs readme.txt -- short description of X11-Basic SDL.dll -- the Simple Direct Media Library setup.exe -- Installation and uninstall program x11basic.ico -- another X11-Basic icon X11-Basic.pdf -- The X11-Basic User Manual xb2c.exe -- bytecode to C translator xbasic.exe -- The X11-Basic interpreter xbc.exe -- The X11-Basic compiler xbvm.exe -- The virtual machine X11-Basic can be invoked in the following three ways: 1. Choose "X11-Basic" from the start-menu: You can choose between COMPILER : opens the compiler Application which then asks for a .bas ole to compile into .exe, DEMO : Opens and rund the demo.bas example program, 12 ______________________________________________________________2.2.__Using_the_X11-Basic_Interpreter_______________________ DOCU : Opens the X11-Basic User Manual, X11-Basic : Opens the X11-Basic interpreter. xbasic.exe will come up with a console window and the interpreter waits for commands to be typed in right away. 2. Click with the right mouse button on your desktop. Choose "new" from the context menu that appears; this will create a new icon on your desktop. The context menu of this icon has three entries "Execute", "Edit" and "View docu" (which shows the embedded documentation, if any); a double-click executes the program. 3. Create a ole containing your X11-Basic program. This ole should have the extension ".bas". Double-click on this ole then invokes X11-Basic, to execute your program. The compiler has a rudimentary graphical user interface, which will ask for the .bas ole to be compiled and later for the name of the executable to be written to. By default, the WINDOWS or DOS console does not support ANSI/VT100 cod- ing. So PRINT AT() and line editing will probably not work. To ox this, ANSI.SYS has to be installed and switched on for the console windows. Instructions how to install ANSI.SYS can be found on the internet. (Also an alternative extension named ANSICON can be used.) The Context Menu Every icon unter WINDOWS ooeers a contect menu when you click on it with the right mouse button. Clicking on an icon of a X11-Basic program as well opens this context menu with following options: Execute will invoke the X11-Basic interpreter to execute your program. The same happens, if you doubleclick on the icon. Edit invokes notepad, allowing you to edit your program. View docu opens a window which shows the embedded documentation of your pro- gram if there is any. Embedded documentation within a .bas ole are comments, which start with a double comment character (##). 2.2.3. The Android Version of X11-Basic A version of X11-Basic ready to be installed on Android smartphones and tablets is available on the Android Market (also called Google Play). 13 2. Usage_____________________________________________________________________________________________________________________ Unlike the other versions of X11-Basic, the interpreter and virtual machine is em- bedded in a little IDE (=Integrated Development Environment) which allows the user to load, run, edit and compile the programs. The app registers itself as a viewer to .bas and .b oles on the system. So from any ole browser, basic programs can be started with a single touch. If you open the X11-Basic app itself, you can directly type in commands with the virtual keyboard. Pressing the MENU button gives you the option to load and run BASIC programs, stop and continue execution, open the keyboard (if its has vanished from the screen) and compile basic programs into bytecode. The virtual machine is integrated, so bytecode compiled code can be run. Depending on the endianess of the processor architecture of the platform, bytecode may or may not be compatible with those produced on a Linux PC or WINDOWS machine. Standard output is rendered directly into the graphics screen with a VT100 compatible terminal emulation. Not all graphics features have the same result than on a X11-Windows installation, the whole screen counts as a single fullscreen window. Finally shortcuts to X11-Basic programs can be placed on the desktop, so they can be started with one click. Also X11-Basic is registered as a method to open oles (from a ole browser). A small selection of example programs is included in the Android package. If you like to have some fun with a game, try ballerburg.bas. Usage on Android devices Android devices usually have a BACK button, a HOME button and a MENU button. # The HOME button suspends X11-Basic and returns to the Android desktop. Selecting the X11-Basic app again will resume it. If a BASIC program was running, it will continue to run in the background. # With the BACK button, a running BASIC program will be stopped. If you press the BACK button again, the X11-Basic interpreter quits. # The MENU button opens a menu with following options: About, LOAD pro- gram, RUN program, STOP/CONT program, NEW, Keyboard, Paste from clipboard, Info/Settings, Editor, Compile and Quit. About shows information about the current version of X11-Basic, news and impressum. Load ... opens a oleselector which displays all .bas and all .b programs in the directory /mnt/sdcard/bas. The selected program will be loaded into memory. A program eventually stored there before will be overwritten. You can display the sourcecode by entering LIST. 14 ______________________________________________________________2.2.__Using_the_X11-Basic_Interpreter_______________________ Run will simply start the execution of a program which has been loaded be- fore. (You can also enter RUN) STOP/CONT will interrupt the execution of the program or resume it. (you can also press the BACK button once to stop the program, and you can enter CONT to continue it). New will delete the currently loaded program from memory. Keyboard will show or hide the on-screen virtual keyboard. If you have a hardware or external USB/Bluetooth keyboard, you can also enter com- mands with that. Paste from Clipboard will paste any text you have copied to the clipboard (from any other application) before. Info/Settings will open a dialog with additional information, links, and pref- erence settings. The preferences can be set as follows: Show splash screen at X11-Basic start-up. This can be switched ooe here. Select font size. If the screen is small, but the resolution is high, you may want to change the font size to LARGE. This setting aoeects the console font (text mode) as well as the graphics/user-interface appearance. Show title This can be switched ooe here. Show status bar This can be switched ooe here. Show keyboard at start This can be switched ooe here. Editor will execute a 3rd-party text editor (e.g. Ted or Jota or 920 Text Editor if installed) to edit the program currently loaded. If no program was loaded, the default ole name will be new.bas. After having saved and closed the text editor, the modioed program will be automatically reloaded into the X11-Basic interpreter. Compile will compile the basic source code into bytecode which can be ex- ecuted about 20 times faster (but cannot be edited or merged anymore). The bytecode will be saved with .b extension in the bas/ folder. Help will open a window in which you can search the command reference. Quit will terminate the X11-Basic interpreter. Editing a program If you want to edit an existing program, do following steps (in this example, the editor used is TED, but it works similar with Jota or many other text editors.): 15 2. Usage_____________________________________________________________________________________________________________________ 1. Load an existing program with Menu ~> Load, 2. choose Menu ! Editor to edit the program, 3. onish editing (and save it in the editor). Leave the editor by choosing EXIT in the menu or by using the BACK button (do not use the HOME button). 4. The program gets automatically reloaded, 5. choose menu ! run to run it. If you want to create a new program, follow these steps (in this example, the editor used is TED): 1. Do a MENU -> New 2. Do a MENU -> Editor. The editor will be excecuted with the default ole name (new.bas). If you have more than one editors installed, you will be asked which one to use. Select TED Text Editor. 3. Inside the editor do a "Save As" and give it a dioeerent name, e.g. "my- thing.bas", make sure that it is saved into the folder "bas". 4. Press the back button (not the HOME button), so the editor returns to X11Basic. 5. X11-Basic now reloads new.bas, but this is not what you want, so 6. within X11-Basic load "mything.bas" The next time you edit it, it has the correct name, and a regular save in the editor should do as well as automatic reload in X11-Basic. If you get an error when calling the text editor, you need to install one. There are plenty around, e.g. 920 Text Editor or Ted (tiny text editor). Install them from the Android market. You can install multiple editors. Then you are asked which one you like to use every time you call the editor. LOAD ole select functions To load a program, press menu ~> load. You can now select a program ole (either .bas or .b) to load. If you touch the olename long you get another menu with advanced functions: LOAD ~ load the program. MERGE ~ merge the program to the one already loaded (works only with .bas oles). LOAD + RUN ~ load the program and immediately run it. LOAD + LIST ~ load the program an list it. LOAD + edit ~ load the program and immediately start the editor. LOAD + compile ~ load the program and compile it. 16 ______________________________________________________________2.2.__Using_the_X11-Basic_Interpreter_______________________ compile + RUN ~ compile the program and immediately run the compiled program. delete ~ delete the selected ole (you will be asked to conorm). CANCEL ~ return to the ole menu. These functions are here for convenience only. You probably want to use LOAD+RUN or compile+RUN more often. Running in the Background When a program is running and you press the home button, the program will continue to run in the background. If you select X11-Basic app again, it brings up the screen output. Also: When you rotate the screen the running program should continue to run. It needs to ond out by using GET`GEOMETRY if the screen size has changed. Desktop shortcuts You can create desktop shortcuts to your BASIC programs. You can place an ap- plication shortcut on the home screen by simply pressing anywhere (and hold for 1 second) on the background of the desktop screen (on Android 4.x devices go to Apps ! Widgets). You orst are asked to place the shortcut somewhere on the desktop. The X11-Basic launcher then asks for a .bas or .b ole and places the link on the desktop. Pressing this link will automatically load X11-Basic and the .bas program and run it. You can select any ole from the /sdcard/bas folder which then is placed in the desktop. Updates of example programs The X11-Basic app comes with a small selection of example programs. They are copied into the /mnt/sdcard/bas/ directory. The X11-Basic app will never over- write a ole in bas/ which is already there. If you want a specioc example program be updated (replaced with a potentially newer version, which has come with an up- date of the X11-Basic app), simply delete the ole. It will be restored after the next execution of X11-Basic. Troubleshooting the Android Version SCREEN REFRESH PROBLEM: (Was reported sometimes on Samsung Tabs, all Android versions) e.g. galaxy note 1, Android 4.1.2: Symptoms: Running 17 2. Usage_____________________________________________________________________________________________________________________ the X11-Basic app, the screen output is not updating or refreshing while X11- Basic runs a program. CURE: you should check the system settings: Developer settings --> deactivate Hardware overlays: ON --> force Gpu: OFF Characters typed are not visible If the whole line appears after you pressed EN- TER, but you like to see what you are typing, you need to modify the settings of the keyboard (switch ooe auto-completion and anything like that, which may make the keyboard hold text back until you press enter.) If still nothing appears after ENTER, then you probably have the Screen Refresh Problem (see above). 2.2.4. The TomTom Version of X11-Basic On http://www.opentom.org/X11-Basic you will ond a version of X11-Basic which has been specially compiled for TomTom navigation devices. They run Linux based on the ARM processor. A ready made package as well as installation instruc- tions can be found on that web-site. Currently only versions 1.14, 1.15 and 1.18 of X11-basic are available as a ready-made binary package. Since the new versions of TomTom devices do not allow to install any third party apps anymore, the support for TomTom has been given up (in 2011). 2.2.5. Command line parameters If you are using X11-Basic under Android, you can skip this section. The X11-Basic interpreter xbasic can be evoked with additional but optional com- mand line parameters. It takes the following ones: xbasic run Basic program [input.bas] -l load only, don't execute -e execute basic command ~eval evaluate numerical expression ~daemon switch ooe prompting and echoing -h ~help print a short help ~help print help on a specioc topic 18 __________________________________________________________________2.3.__Editing_X11-Basic_programs________________________ Examples: xbasic testme.bas xbasic -l dontrunme.bas xbasic -e 'ALERT 1,"Hello !",1," OK ",b' xbasic --eval 1+3-4*3 X11-Basic as daemon The command line option ~daemon forces the interpreter to run in daemon-mode (with no terminal connected). No prompt is given and the input is not echoed back. This is useful, if you want to run X11-Basic programs as a background service. 2.3. Editing X11-Basic programs X11-Basic programs (source code, .bas oles) are regular ASCII oles and therefore can be created with any text editor available. Users of UNIX like operating systems are one with every text editor. Simple ones like pico or nano will do. MS-WINDOWS user can use the simple notepad text editor. Users of X11-Basic under Android need to install a good text editor. TED (Text Editor), 920 Text Editor, or Jota will work one. Other text editors which might have been already preinstalled can be a source of frustration and trouble. So if unsure, please installe one of the mentioned editors from the Android Market. If you have installed more than one editor, this is no problem, you will be asked which one to use every time, the editor is invoked. Besides from the basic editing features I recommend to use a text editor with syntax highlighting. Currently X11-Basic syntax deonitions are available for the Nirvana Editor (nedit, available for Linux, UNIX and WINDOWS) and for the 920 Text Editor and Jota, available for Android. X11-Basic can support foreign language characters. Therefor the basic program may be coded in UTF-8 which is compatible to ASCII but has the ability to use and encode any Unicode character. Such characters can be used in X11-Basic string constants, but may not be used in variable names. Currently only the standard output (console) supports the full UTF-8 character sets.1 ___________________________________________________ 1LTEXT will accept some of the special characters (currently only german), TEXT will work with UTF-8 only on 19 2. Usage_____________________________________________________________________________________________________________________ Figure 2.1 :The Nirvana Editor with syntax high- lighting for a X11-Basic program. Using syntax highlighting with nedit NEdit, the full featured, plain text Nirvana editor1 is a GUI style text editor for work- stations with the X Window System. Also a MS Windows port is available2 . NEdit provides all of the standard menu, dialog, editing, mouse support, macro extension language, syntax highlighting, and a lot other nice features (and extensions for pro- grammers). In short, it has everything you want to develop your X11-Basic programs. Unfortunately nedit does not support UTF-8. If you like to use nedit as your favorite editor, a nedit.defs ole comes with this package. This enables syntax highlighting for X11-Basic programs in nedit (see og. 2.1). 2.4. The Bytecode Compiler and the Virtual Machine If you are using the Android version of X11-Basic, you can skip this chapter. All you need to know is that there is the option to compile X11-Basic programs (to bytecode) which makes them run much faster. Under UNIX, Linux and Windows a seperate program need to be used to compile .bas oles and make bytecode oles or standalobe .exe oles out of it. ___________________________________________________ Android devices (all latin, greek, cyrillic). 1http://nedit.org/ 2http://nedit.gmxhome.de/winport.html 20 _______________________________________2.4.__The_Bytecode_Compiler_and_the_Virtual_Machine________________________________ If you are using WINDOWS, the most convinient way to compile X11-basic pro- grams is to execute the compiler xbc.exe which has a little use interface. Also under UNIX/Linus it is very convinient to use the compiler manager xbc with appropiate command line options (watch out for the -virtualm option). Advanced users probably want to deal with the bytecode oled produced in the compiling process. For each compilation step there are separate programs which do it; namely: xbbc, xb2c and xbvm. xbbc compiles X11-Basic programs (.bas oles) to bytecode oles (.b). xb2c can translate bytecode oles to C source code. xbvm is a virtual machine (interpreter for bytecode). The idea is to increase the execution speed of X11-Basic programs a lot by com- piling it to a bytecode, this still being portable. The bytecode itself is interpreted by a bytecode interpreter (also called a virtual machine). This virtual machine needs to be present on the target computer, and then all bytecode programs can be used there. This way, the X11-Basic compiler need not deal with dioeerent target machine archi- tectures, and also the bytecode can be run much faster than the interpreted BASIC source code. The conversion to bytecode is a real compilation. The step to assembler or machine code is not far. Also a translation to C or to JAVA or any other language will be straight forward. As with JAVA, the bytecode is platform independent and can be run on any system, which has a virtual machine ported to. Also one point to mention (whether this is a feature or a disadvantage): X11-Basic bytecode can not be converted back into BASIC source code (.bas), but is rather a very abstract representation of your program. If you want to get a feeling on what this is about, open a .c source ole, which has been produced by the bytecode to C translator xb2c. Implemented with an additional macro translation step, the bytecode is in a way readable. Here is an example: ... PUSH2; /* 2 */ ZUWEIS(2); /* I= */ LBL`38: PUSHV(2); /* I */ X2I; PUSHARRAYELEM(3,1); /* F(.) */ X2I; JUMPIFZERO LBL`91; /* JEQ(0x91); */ PUSH2; /* 2 */ PUSHV(2); /* I */ EXCH; X2F; MULf; PUSHV(0); /* S */ 21 2. Usage_____________________________________________________________________________________________________________________ LESS; JUMPIFZERO LBL`81; /* JEQ(0x81); */ PUSH2; PUSHV(2); /* I */ EXCH; X2F; MULf; ZUWEIS(5); /* K */ LBL`61: PUSHV(5); /* K */ X2I; PUSHVVI(3,1); /* F */ PUSHCOMM(30,1); /* CLR */ PUSHV(5); /* K */ PUSHV(2); /* I */ ADD; DUP; ZUWEIS(5); /* K */ PUSHV(0); /* S */ GREATER; JUMPIFZERO LBL`61; /* BEQ`s(-29); */ PUSHCOMM(74,0); /* FLUSH */ LBL`81: PUSHX("I"); PUSHLEER; PUSHCOMM(147,2); /* PRINT */ PUSHVV(4); /* C */ COMM`INC; /* INC */ LBL`91: PUSHV(2); /* I */ PUSH1; ADD; DUP; ZUWEIS(2); /* I= */ PUSHV(0); /* S */ GREATER; JUMPIFZERO LBL`38; /* BEQ`s(-104); */ ... This is bytecode made out of the (X11-Basic) lines: ... FOR i=2 TO s IF f(i) IF 2*i quit and you return to the shell. Of course you can include the quit command in your hello.bas: PRINT "Hello X11-Basic!" QUIT Now the program always returns to the shell prompt when done. Now lets compile it: xbbc hello.bas -o hello.b will produce a bytecode binary hello.b. You can run this: xbvm hello.b will give you the same output "Hello X11-Basic!". Real compilation will need two more steps: xb2c hello.b -o hello.c produced a translated C-sourceole hello.c. If you have the gnu C compiler available you can compile it to an independent executable program called hello with: 29 3. Programming_in_X11-Basic__________________________________________________________________________________________________ gcc hello.c -o hello -lm -lX11 -lx11basic -lasound -lreadline There you go. Your program can now directly be started with ./hello 3.4. Program structure If you want to write more sophisticated programs than the Hello-example, you should understand the general structure of a X11-Basic program. A X11-Basic program consist of a main program block and subroutines. The main program block is the shell of the program and is the section between the orst line and the keyword END (or QUIT). The code in the main block drives the logic of your program. In a simple program this is all that is needed. In larger and more complex programs, putting all your code in the main block makes the program hard to read and understand. Subroutines let you divide your program in manageable sections, each performing its own specioc, but limited, tasks. 3.5. General Syntax The syntax of a typical X11-Basic line is COMMAND parameters parameters usually consists of a list of comma separated expressions. Another type of X11-Basic lines are variable assignments variable=expression variables typically have a name and can have dioeerent types. The result of the ex- pression will be stored under that name for further reference. Each line of X11-Basic code can contain exactly one command or one assignment (or a comment). Here is a typical piece of X11-Basic code: LOCAL l,ll,content$,g$,gg$,comp CLR comp IF EXIST(f$) OPEN "I",#1,f$ ll=LOF(#1) 30 _____________________________________________________________________________________3.5.__General_Syntax_________________ content$=INPUT$(#1,ll) CLOSE #1 ENDIF ' and so on Appending lines With many editors a limitation on the maximal line length applies (e.g. 4096 charac- ters/line1 ). In X11-Basic a single command may in very rare cases consist of more than 4096 characters (e.g. by assigning an array constant to an array). Therefor a possibility of splitting lines into two (or more) has been implemented. If the last character of a line is a '"' (it must be really the last character of the line and may not be followed by a space character!), the following line will be appended to this line by replacing the '"' and the following newline character by spaces. Example: PRINT "Hello,"; " " that's it" will be treated as: PRINT "Hello,";" that's it" Please note: The '"' character must be placed at a position within the command where a space would be allowed, too. Comments A comment can be inserted into your program code with the REM command or the abbreviation '. Also the '#' as a orst character of the program line reserves the rest of the line for a comment. Anything behind the REM will be ignored by X11-Basic. If you want to place comments at the end of a line, they have to be prefaced with '!'. ___________________________________________________ 1Note, that in X11-Basic itself there is no limitation on the line lengths. 31 3. Programming_in_X11-Basic__________________________________________________________________________________________________ Example: ' This is a demonstration of comments DO ! endless loop LOOP ! with nothing inside Note: These end of line comments can not be used after DATA (and REM). 3.6. The very BASIC commands: PRINT, INPUT, IF and GOTO The PRINT-command is used to put text on the text screen. Text screen means your terminal (under UNIX) or the console window (under Windows). PRINT is used to generate basic output, e.g. text, strings, numbers, e.g. the result of a calculation. Some basic formatting is possible. Example: PRINT "The result of 1+1 is: ";1+1 With the INPUT command you let the user input data, p.ex. numbers or text. The data can be entered on the text screen/console window. Together with PRINT this allows already to implement a very simple user interface. Example: INPUT "Please enter your name: ",name$ PRINT "Hello ";name$ The IF command let the program do dioeerent things depending on the result of a calculation. Therefor the code is grouped into a block which should only be executed if the result of the expression after IF is TRUE (this means, not zero). The block starts with the IF command and ends with an ENDIF command. If the result of the expression after IF is not TRUE, means it is FALSE (or zero), the program will be continued after the ENDIF and the lines of code between the IF and the ENDIF are not run. 32 ______________________________________________________________________________________________3.7.__Variables_____________ Example: INPUT "Please enter a number: ";a IF a=13 PRINT "Oh, you obviously like the thirteen!" ENDIF PRINT "Thank you for the ";a;"." With GOTO you can branch to a dioeerent part of your program. GOTO, despite its bad reputation ([goto considered harmful]), has still its good uses. Since no line numbers are used, you must use a label to deone lines where the GOTO command can jump to. Example: again: INPUT "Please enter a number, but not the 13: ";a IF a=13 PRINT "Oh, you obviously like the thirteen!" PRINT "But, please enter a different number." GOTO again ENDIF PRINT "Thank you for the ";a;"." Besides these four very basic commands (which exist in every BASIC dialect) X11-Basic has many more features which make life easier and your programs more user friendly. 3.7. Variables Variables in BASIC programming are analogous to variables in mathematics. Vari- able identioers (names) consist of alphanumeric strings. These identioers are used to refer to values in computer memory. In the X11-Basic program, a variable name is one way to bind a variable to a memory location; the corresponding value is stored as a data object in that location so that the object can be accessed and manipulated later via the variable's name. 33 3. Programming_in_X11-Basic__________________________________________________________________________________________________ Example: a=1 ! Assigns a 1 to a variable named a b=a+1 ! The variable a can be referred to, to make a calculation PRINT "The variable b contains now a ";b Variable names can be very long if you like and also can contain digits and an underscore, with the exception, that the orst letter of the variable name must not be a digit. Example: my`very`long`variable`name=1.23456 PRINT my`very`long`variable`name You can refer to a variable by giving its name in the place you want the value of the variable to be used. X11-Basic will automatically know where to store the data and how to deal with it. It is also important to tell X11-Basic what sort of data you want to store. You can have variables that store only numbers but also variables that deal with a character or a whole string, a line of text for example. The following line of X11-Basic code will create a variable called age for you and assign it the value of 18. age=18 But if you want to store a text, the variable needs to be capable to hold characters instead of numbers. Therefore, in that case you mark the variable with a $ to tell that it should store text, not numbers: name$="Robert" Text constants, by the way, need to be enclosed with "", to tell X11-Basic that the text should not be interpreted as program code, but just be treated as any text. The assignment is done with the '=' operator. The '=' operator is also used in expressions, e.g. after an IF command. But there it is not used as an assignment operator but instead there it is treated as a comparison operator. In X11-Basic both operators are '='. The interpreter distinguishes between them just by context. 34 ______________________________________________________________________________________________3.7.__Variables_____________ Example: x=(a=3) Here the orst = is an assignment and the second is the comparison operator. x will be assigned a -1 (TRUE) if a is 3 and a 0 (FALSE) else. The brackets are not necessary here they just help reading this expression. Confused? Well, you eventually will get used to it. Last to say, such an assignment will overwrite any old data that has been stored before in that variable. As long as you don't assign a value to a variable, it will hold a default value, 0 in most cases. 3.7.1. The scope of a Variable X11-Basic uses two scopes for variables: global (which is the default) and local. Global variables can be modioed from anywhere within the program, and any part of the program may depend on it. Unless otherwise declared with LOCAL, all X11- Basic variables are global by default and this need not be explicitly declared. But there is one downside of global variables: The use of global variables makes software harder to read and understand. Since any code anywhere in the program can change the value of the variable at any time, understanding the use of the variable may entail understanding a large portion of the program. They can lead to problems of naming because a global variable makes a name dangerous to use for any other local scope variable. Also recursive programming is nearly impossible with only global variables, last but not least, the usage of procedures and functions becomes much more clear, if you are able to encapsulate all internal variables of that function and you do not bother outside of the functions scope if you accidentally use one of these internal variables somewhere else in the code, possibly altering the functions behavior. Because of all this, X11-Basic also provides local variables, which live only within a certain function or procedure and their context. Local variables need to be declared with the command LOCAL inside the function od procedure where they belong to. Outside this specioc procedure or function they simply do not exist, or if a global variable of the same name exists, they refer to dioeerent contents. 35 3. Programming_in_X11-Basic__________________________________________________________________________________________________ 3.7.2. Data types Now, lets come back to the type of a variable. How can one see what kind of content a variable can store? How does X11-Basic know? By the way the name of the variable has been written. To distinguish between dioeerent ways of data types X11-Basic appends a special typing sign as a suOEx to the variable name to distinguish between several ways to store data in variables. The X11-Basic interpreter uses 64-bit AEoating point variables, 32-bit integer vari- ables, character strings and arrays of these variables of arbitrary dimension. A dec- laration of the variables and of their type is not necessary (except for arrays ! DIM), because the interpreter recognizes the type of the variable from the suOEx: 32bit integer variables have the suOEx %, arbitrary precision integer variables have a &, complex variables a #, character strings a $, arrays a (). Variables without suOEx are treated as real 64bit AEoating point variables. Pointers are integers, function calls are marked by @. Logical expressions are also of type integer. It is important that vari- ables with a special suOEx are dioeerent from those (even if the rest of the name is identical) without. Examples: x=10.3 ! this is a number variable (64bit floating point) x$="Hello" ! this is a different character string variable x%=5 ! this is a (32bit) integer variable, still different x&=79523612688076834923316 ! this is a big integer variable, still different x#=3+4i ! this is a complex number variable, @x ! this refers to a function or procedure called x x()=[1,2,3,4] ! This beast refers to an array. 3.7.3. Variable naming You can use all letters and numbers for your variable names. Spaces are not al- lowed but underscores inside the variable name. The variable name can be of any length. X11-Basic limits you only in the following ways: a variable may not begin with a number or an underscore, only with letters. Avoid to name your variables like X11-Basic commands. It will work but it can cause troubles. As a rule, never try to assign values to X11-Basic system variables (like TRUE, FALSE, TIMER, PC, TERMINALNAME$). The values indeed will be assigned, but you never can use the assigned values, since always the internal values will be used. 36 ______________________________________________________________________________________________3.7.__Variables_____________ Valid variable names look like the following: x, auto%, lives%, bonus1%, x`1, city`name$, debit, z# . Invalid variable names look like this and X11-Basic will complain: `blank, 1x, ?value%, 5s$, 1i, #u. Always remember: begin your variable names with a letter from A-Z and you are on the safe side! Variable names and commands are case insensitive. Each name is bound to only one kind of variable; A$ is a whole dioeerent variable(value) than A which is dioeerent from A% or A$(1,1). Space between commands will be ignored, but note that no space is allowed be- tween the name of a variable or command and the '(' of its parameter list. So, ASC("A") is good, ASC( "A" ) also, but ASC ("A") isn't. Examples: integer variables: i%=25 my`adr%=VARPTR(b$) b%=MALLOC(100000) big integer variables: i&=79523612688076834923316 a&=FACT(100) AEoat variables: a=1.2443e17 b=@f(x) complex variables: a#=1.2443e17+1.2i b#=CONJ(a#) character strings: t$="Hello everybody !" oelds and arrays: i%(),a(),t$(), [1,3,5;7,6,2] 3.7.4. Numbers X11-Basic normally uses integer numbers (32 Bit) which range from -2147483648 to 2147483647, and AEoating point numbers, which are 64Bit IEEE 754 standard values. These 64bit AEoating point numbers have a mantissa of of 52 bits and an exponent of 11 bits and a sign bit. These numbers can represent 15 to 16 signiocant digits and 37 3. Programming_in_X11-Basic__________________________________________________________________________________________________ powers of 1e-308 to 1e308. Complex numbers consist of two 64bit AEoating point values. X11-Basic currently also support inonite precision integer numbers. These num- bers are stored in a variable size portion of memory, so that an arbitrary number of digits can be stored. However, calculation with big interges is slow and only a few built-in functions can be used on them. Number (constants) can be preceded by a sign, + or -, and are written as a string of numeric digits with or without a decimal point and can also have a positive or negative exponent as a power of 10 multiplier e.g. -253 67.3 0.25 -127.42E-3 -1.3E7 1 The imaginary part of complex number constants are market with a trailling "i", e.g. -2i 1i 0.25+3i -127.42E-3i Note: A single "i" is always treated as a real variable name. If you want the imaginary unit, please always use "1i". Integer numbers, with no decimal fraction or exponent, can also be in either hex- adecimal or binary. Hexadecimal numbers should be preceded by $ (or 0x) and binary numbers preceded by %, e.g. %101010 -$FFE0 0xA0127BD -%10001001 %00011010 3.7.5. Strings String variables can contain sequences of characters (bytes) of arbitrary length. There is no length limit for a string other than the virtual memory of the machine. Strings generally contain ASCII text, but can hold arbitrary byte sequences, even characters that have the ASCII code zero. In other words a string is a collection of bytes of certain length. You can treat strings as arbitrary length of binary data if you need. Strings are automatically elastic, meaning they automatically resize to contain what- ever number of bytes are put into them. When a string resizes, its location in memory may change, as when a longer string is assigned and there is insuOEcient room after the string to store the extra bytes. String variables are distinguished by the $ suOEx. String constants are enclosed with pairs of "" (double quote). 38 ______________________________________________________________________________________________3.7.__Variables_____________ A wealth of intrinsics and functions are provided to support eOEcient string pro- cessing and manipulating. There is a way to include special characters into string constants. The usual way in BASIC is to split the string into sub strings and concatenate the parts during run time, like in the code fragment: Example: st$="This is a special string, containing a bell character at the end"+CHR$(7) By the way, the double quote character can be added with CHR$(34). 3.7.6. Arrays Arrays are memory locations that store many values of the same type at the same time. While normal variables store a single value at a time, an array variable can store many values. The values are accessed via the name of the variable and the appropriate indexes. The index or indexes follow the name of the variable between ( and ). There is no limit on the number of indexes (the dimension). You can use as many as you like. Also there is no limit on the index values other than the index values have to be positive integer and that memory may limit the array sizes. X11-Basic arrays can contain variables of any data type, including strings. All arrays, even multi-dimensional arrays, can be re-dimensioned without altering the contents. A special feature of X11-Basic is the implicit dimensioning of arrays and the existence of array constants. You may deone an array by using the DIM com- mand. You might also deone the array by an assignment like DIM b(10) a()=b() if b() already has been DIMed or by a()=[1,2,3,4;6,7,8,9] assigning an array constant. (In this example a 2 dimensional array will be created and the rows are separated by ';'.) 39 3. Programming_in_X11-Basic__________________________________________________________________________________________________ 3.7.7. Arbitrary precision numbers X11-Basic also support inonite or arbitrary precision numbers with a sprecial data type. Arbitrary-precision arithmetic, also called bignum arithmetic, multiple preci- sion arithmetic, or sometimes inonite-precision arithmetic, indicates that calculations are performed on numbers whose digits of precision are limited only by the available memory of the computer. This contrasts with the faster oxed-precision arithmetic, normally used. Inonite precision math is slow, and not all functions are available for this data type. Arbitrary precision is used in applications where the speed of arithmetic is not a limiting factor, or where precise results with very large numbers are required. The data type with the suOEx & supports (big) integers only. It is up to the user (and straight forward) to write routines for handling rational numbers (using two big interges, numerator and denominator), and corresponding routines for adding, sub- tracting, multiplication and division of thouse fractions. Multiple precision Irrational numbers using a AEoiting point representation are (currently) not supported. If some- body needs this, please let me know. Supported operators (for big integers) are + - * / = <> < > MOD DIV ABS() SQRT() NEXTPRIME() FACT() PRIMORIAL() FIB() LUCNUM() RANDOM() ADD() SUB() MUL() DIV() MOD() POWM() ROOT() GDC() LCM() INVERT() MIN() MAX(). Also STR$(), BIN$(), OCT$() and HEX$() work with big integers. The advantage is, that you can handle big integer numbers without loosing preci- sion, as it is useful for cryptography and number theory. Also rounding errors can be avoided by using inonite-precision rational number arithmetic (which is not implemented by X11-Basic itself, but which could be real- ized using pairs of big integers.) Variables of either type may be used and mixed in expressions. They will be converted to big integer or from big integer to AEoat or 32bit integers when needed. One should j ust be aware of the eventual loss of precision. Here is an example how to use big number arithmetrics in X11-Basic to factorize a big number into its prime factors: Example: ' Factorize (big) Integer numers into prime factors. ' with X11-Basic >= V.1.23 ' DIM smallprimes&(1000000) 40 ______________________________________________________________________________________________3.7.__Variables_____________ CLR anzprimes smallprimes&(0)=2 INC anzprimes INPUT "Enter a (big) number: ",a& PRINT "Calculating primes up to ";lim&;". Please wait..." lim&=SQRT(a&) ! Limit up to which the primes are searchd FOR i=1 TO DIM?(smallprimes&())-1 b&=NEXTPRIME(smallprimes&(i-1)) EXIT IF b&>lim& smallprimes&(i)=b& NEXT i anzprimes=i PRINT "calculated ";anzprimes;" primes up to: ";b& PRINT "Factorization:" PRINT a&;"="; FOR i=0 TO anzprimes-1 WHILE (a& MOD smallprimes&(i))=0 PRINT smallprimes&(i);"*"; FLUSH a&=(a& DIV smallprimes&(i)) lim&=SQRT(a&) WEND EXIT IF smallprimes&(i)>lim& NEXT i IF nextprime(a&-1)=a& or a&=1 PRINT a& ELSE ' The number is too big and we cannot be sure that this is a prime PRINT "----incomplete test -----";a& ENDIF END Note that the list of small primes could also be generated by a sieve. The method used is based on prime number tests (using the function NEXTPRIME()) and may be not optimal. 41 3. Programming_in_X11-Basic__________________________________________________________________________________________________ 3.8. Arithmetics and Calculations X11-Basic handles numbers and arithmetic: You may calculate trigonometric func- tions like SIN() or ATAN(), or logarithms (with LOG()). Bitwise operations, like AND or OR are available as well as MIN() and MAX() (calculate the minimum or maximum of its argument) or MOD or INT() (reminder of a division or integer part or a number). Many other statements give a complete set of math functions. Most of these functions can work on dioeerent input data types. E.g. you can use the SQRT() function also on complex numbers, thus returning a complex result. 3.8.1. Expressions and Conditions No dioeerence makes the dioeerence. Expressions are needed to calculate values. The simplest expression is a numerical or string constant. More complex expressions may contain constants, variables, operators, function calls and possibly parentheses. The expression format used by X11-Basic is identical with that of many other BASIC packages: The oper- ators have precedence of the usual order and you can alter the order of operator evaluation using parentheses. Here is an example numeric expression follow- ing after a PRINT statement: PRINT (x-1)*10+SIN(x) Conditions and expressions are treated the same in X11-Basic. Because X11-BASIC doesn't have separate Boolean operators for conditions and expressions, the op- erators (AND, OR, XOR, NOT) actually operate on binary values. Therefore a TRUE is -1, which means, that every bit is one. So the operators will operate on each of these bits. Such: a condition is considered TRUE if the expression is not FALSE (means the result must be a value other than zero). 3.8.2. Operators X11-Basic provides operators for numerical expressions, character strings and arrays of either type and any dimension. 42 __________________________________________________________________3.8.__Arithmetics_and_Calculations______________________ Numerical Operators Numerical operators are roughly categorized in following categories: # arithmetical operators: ^ * / + - # comparison operators: = <> < > <= >= # logical operators: NOT AND OR XOR ... X11-Basic recognizes the following operators, in order of falling precedence (the precedence of BASIC operators aoeects the order of expression evaluation): ____________________________________________________________________________ | Order | Operator | Description | |_________|_____________|__________________________________________|________ | 1 |( ) | parenthetical expression | | | | | | 2 |^ |exponent/power | | | | | | 3 | | sign (negation) | | | | | | 3 |+ | sign | | | | | | 4 |NOT | bitwise not | | | | | | 5 |= |divide | | | | | | 5 |* |multiply | | | | | | 5 |DIV | integer division | | | | | | 5 |MOD | modulus (rest of division) | | | | | | 6 |+ |add | | | | | | 6 |- |subtract | | | | | | 7 |<< | bitwise shift to the left (*) | | | | | | 7 |>> | bitwise shift to the right (*) | | | | | | 8 |= |logical "equals" | | | | | | 8 |<> | logical "not equal" | | | | | | 8 |< |logical "less than" | | | | | | 8 |> |logical "greater than" | | | | | | 8 |<= | logical "less than or equal" | | | | | | 8 |>= | logical "greater than or equal" | | | | | | 9 |AND | bitwise and | | | | | | 9 |NAND | bitwise not and | | | | | | 10 | OR | bitwise or | | | | | | 10 | NOR | bitwise not or | | | | | | 10 | XOR | bitwise exclusive or | | | | | | 10 | IMP | implies | | | | | | 10 | EQV | equivalence | | | | | | 11 | = |assignment | |___________|________________|______________________________________|_______ 43 3. Programming_in_X11-Basic__________________________________________________________________________________________________ (*) = not implemented Addition and subtraction operators are both binary and unary operators. In their unary form they are used out of the precedence orders. Unary operators are always applied orst, unless parentheses drive dioeerent calculation order. The power operator a^b calculates the b-th power of a. The actual implementation of the power operator always uses the pow() function, which always treats all operants as real numbers. Under some circumstances it might be more optimal to use a*a instead of a^2. The multiplication operator multiplies the operands. If any of the operands is an array then the result will be an array. The division operator divides the orst operand with the second. If the second operand is zero then an error will occur. The integer division operator divides the orst operand with the second. The calcu- lation is performed using integer numbers and the result is truncated towards zero. Bit-wise and logical NOT This unary operator calculates the logical negate (the com- plement) of the operand. The calculation is done on integer numbers, thus the operand is converted to an integer value. The operator inverts each bit of the operand. Logical operators (AND, OR, XOR) These operators can be used for both logical and bit-wise operations. X11-Basic does not have a separate type for logical values. The logical TRUE is represented as integer value -1 (all bits set to 1) and the logical FALSE is 0. The operators AND, OR and XOR perform the calculation on integer values. If any of the operands is not integer it is converted to integer value before the operation takes place. The operations are performed on each bit of the operands. Operators for Character Strings There are a few operations which can directly be done to character strings or string variables, using operators. plus operator, conjunction The plus '+' operator used on strings, links two strings together. 44 __________________________________________________________________3.8.__Arithmetics_and_Calculations______________________ Example: a$="X11" b$="-" c$="BASIC" d$=a$+b$+c$ results in a string "X11-BASIC". comparison operators, <, <=, =, =>, >, <> comparison functions belong to numer- ical (Boolean) functions because the result is a number, although they can be used with strings. Example: IF a$="X11" ... ENDIF result=(a$<>"Hello") code evaluation operator, & the eval operator evaluates command or expression which is given by the String. Example see below. Rules for comparison of strings: 1. Two strings are equal if all the characters inside are identical (also spaces and punctuation marks). Example: " 123 v fdh.-," = " 123 v fdh.-," 2. The comparison of strings with the greater and smaller operator works charac- ter by character until one of them is smaller or one of the strings ends orst, this is the smaller one. Examples: "X11">"X11" result: 0 "X11"<"x11" result: -1 "123"<"abc" result: -1 "123">"1234" result: 0 45 3. Programming_in_X11-Basic__________________________________________________________________________________________________ The Evaluation Operator &: The &-operator followed by a string evaluates it for program code. Example: REM generate ten times the command 'print a$' CLR i a$="print a$" label1: INC i IF i>10 b$="label2" ELSE b$="label1" ENDIF &a$ GOTO &b$ label2: END To program like this can produce a really unreadable code. 3.8.3. String processing X11-Basic has the usual functions to extract parts from a string: LEFT$(), MID$() and RIGHT$(). If you want to split a string into tokens you should use the command SPLIT or the function WORD$() . There is quite a bunch of other string-processing functions like UPPER$() (convert- ing to upper case), INSTR() (onding one string within the other), CHR$() (converting an ASCII-code into a character), GLOB() (testing a string against a pattern) and more. 3.8.4. Arrays Arrays are special variables which consist of many values (of the same type). There can be AEoating point arrays, integer arrays, string arrays, and arrays of arrays. The memory for an array need to be declared before it can be used. This can be done with the DIM statement or by direcly assigning a value to the array. 46 __________________________________________________________________3.8.__Arithmetics_and_Calculations______________________ Array constants The common way to assign data to a whole array is to put the input ogures into list into square brackets (which forms an array constant) and assign this to an array variable like: a()=[1,2,3;4,5,6] A comma is used to separate columns elements, and semicolon is used to separate rows. So [1, 2, 3] is a row vector, and [1; 2; 3] is a column vector. Now that you know how to deone a simple array, you should know how to access its elements. Accessing the content of an array is done through the operator (), with the index inside the parenthesis; the indexing of the orst element is 0: b=a(0) a(1)=5 Accessing an element outside the bounds will result in an error: "Field index too large." To access a single matrix element, you can use the (i,j) subscript, where i is the index in the row, and j in the column: b=a(1,2) a(3,4)=3 It is also possible to access blocks of matrices using the colon (:) operator. This operator is like a wildcard; it tells X11-Basic that you want all elements of a given dimension or with indexes between two given values. For example, say you want to access the entire orst row of matrix a above, but not the second row. Then you can write: b()=a(1,:) Now say you only want the orst two elements in the orst row. To do this, use the following syntax: b()=a(1,1:2) It is also possible to use arrays of any higher dimension. 47 3. Programming_in_X11-Basic__________________________________________________________________________________________________ DIM a(10,10,10,10,10) b=a(2,5,4,2,7) Array operators Arrays are not only good for storing information in tables, but one can apply oper- ations on arrays. You can for example use the classic arithmetic operations + and - on any array in X11-Basic: this results in the vector addition and subtraction as deoned in classic vector vectors spaces, which is simply the addition and subtraction elements wise. _______________________________________________________________________________________________ | Array Operator | Description | |__________________|___________________________________________________________________|_______ | + |Vector/Matrix addition element by element | | | | | - |Vector/Matrix subtraction element by element | | | | | * |Array/Matrix multiplication | | | | | : |Subarray (a block) | | | | | =,<> | comparison element by element | | | | | <,>,<=,>= | comparison using a norm | |_____________________|__________________________________________________________|_____________ Array functions and operators act on entire arrays. Some return a list, which can then either be used as a value for another array function, or assigned into an array variable. Array comparisons compare the array contents element-by-element, using the de- fault comparison function for the element data type (=,>,<). In multidimensional ar- rays the elements are visited in row-major order (last subscript varies most rapidly). If the contents of two arrays are equal but the dimensionality is dioeerent, the orst dioeerence in the dimensionality information determines the sort order. 3.9. Procedures and Functions In X11-Basic there are two types of subroutines: procedures and functions. The main dioeerence between the two is that a function returns a single value and can be used in expressions, while a procedure never returns a value. A procedure or function must appear after the main program block. Therefore, the structure of an X11-Basic program is as follows: 48 _______________________________________________________________________3.9.__Procedures_and_Functions_____________________ Main program block END Procedures and Functions Procedures are blocks of code that can be called from elsewhere in a program. These subroutines can take arguments but return no results. They can access all variables available but also may have local variables (~> LOCAL). Functions are blocks of code that can be called from elsewhere within an expression (e.g a=3*@myfunction(b)). Variables are global unless declared local. For local variables changes outside a function have no eoeect within the function except as explicitly specioed within the function. Functions arguments can be variables and arrays of any data types. Functions can return variables of any data type. By default, arguments are passed by value. 3.9.1. Procedures A procedure starts with the keyword PROCEDURE followed by the procedure name and the parameters being passed to the procedure. All procedures must end with the keyword RETURN. Procedures use the following format: PROCEDURE ProcName(parameters) LOCAL vars procedure logic RETURN The parameters of the subroutine are placed between parenthesis behind the sub- routine name and must be in the same order as the procedure call from the main program. All variables used within the subroutine should be declared local using the LOCAL statement. The rest of the procedure determines the task the subroutine must perform. A procedure can be called in two ways: by using the keyword GOSUB or @. For instance, the procedure progress(), which shows a progress bar on the text console given the total amount a and the fraction b, can be called the following ways: GOSUB progress(100,i) @progress(100,i) PROCEDURE progress(a,b) LOCAL t$ 49 3. Programming_in_X11-Basic__________________________________________________________________________________________________ IF verbose PRINT chr$(13);"[";string$(b/a*32,"-");">"; PRINT string$((1.03-b/a)*32,"-");"_ ";str$(int(b/a*100),3,3);"% ]"; FLUSH ENDIF RETURN 3.9.2. Functions A function starts with a FUNCTION header followed by a function name, and ends with the keyword ENDFUNCTION. The function is either a numeric or a string function. A numeric function defaults to the AEoating point data type and needs no postox. A string function returns a string and the function name ends with a $ postox. A function must contain at least one RETURN statement to return the function value. Functions use this format: FUNCTION FuncName[$](parameters) LOCAL vars function logic RETURN value[$] ENDFUNCTION The type of the return value must match the function type. A string function must return a string and a numeric function a numeric value. The function returns to the caller when the RETURN statement is executed. The ENDFUNCTION statement only indicates the end of the function declaration and will cause an error if the program tries to execute this statement. A function is called by preceding the function name with @. As an example, the string function Copy$() is called as follows: Right$=@Copy$("X11-Basic",4) where the function Copy$() might be deoned as: FUNCTION Copy$(a$,p) LOCAL b$ b$=MID$(a$,p) 50 _______________________________________________________________________3.9.__Procedures_and_Functions_____________________ RETURN b$ ENDFUNC Of course you are as well free to deone FUNCTION Copy$(a$,p) RETURN MID$(a$,p) ENDFUNC instead. An alternative for FUNCTION is the DEFFN statement, which deones a one line func- tion. The function Copy$() used in the example above, might be used in a DEFFN statement as well: DEFFN Copy$(a$,p)=MID$(a$,p) In contrast with procedures and functions, DEFFN functions may be placed within a procedure or function body, although it doesn't use the local variables of the sub- routine. There is another dioeerence between DEFFN and FUNCTION: The compiler will use the DEFFN expression as an inline expression and will not produce a function with a symbol name. This is a bit faster, but produces longer code. 3.9.3. Parameters and local variables Any X11-Basic variable type can be passed to a procedure or function. By default all parameters are passed "'by value"'. Though parameters can also be passed "'by reference"' by using the VAR statement. The keyword VAR precedes the list of variables that are being passed as call by reference parameters. These variables should always be listed at the end of the pa- rameter list in the procedure or function heading. The dioeerence between the two is that a call by value parameter gets a copy of the passed value and a call by reference does not. A VAR variable references the same variable that is passed to the subrou- tine. The original variable will change when a subroutine modioes the corresponding VAR variable. In fact, both variable names reference the same piece of memory that contains the variable value. Internally, X11-Basic maintains a list of all variables. Each entry in the list points to a memory location that contains the variable value. A call by reference variable points to the same location as the passed variable. Therefore, constants or expressions can not be passed to a VAR variable. 51 3. Programming_in_X11-Basic__________________________________________________________________________________________________ All though a (copy of an) Array can be passed to a subroutine by value, the func- tions cannot return arrays1 . If a function needs to return information in form of an array, the return array sould be passed as a VAR parameter in the parameter list. The return values can then be assigned to it inside the function. The following example shows a simple function, which searches a name in a given string array: idx%=@SearchName("Jack",Name$()) FUNCTION SearchName(n$,VAR n$()) LOCAL idx CLR idx WHILE idxn$ INC idx WEND RETURN idx ENDFUNC The locally used array n$() references the global array Name$(). The array n$() is only valid within the procedure, where it points to the descriptor of the Name$() array. You could as well declare the FUNCTION like FUNCTION SearchName(n$,n$()) Then a local copy of the whole array Name$() would be used inside the function, any changes to n$() would have no eoeect on the original array Name$(). But win case you wanted to make changes to the array, like in following example: idx%=@EliminateName("Jack",Name$()) FUNCTION EliminateName(n$,VAR n$()) LOCAL i FOR i=0 TO DIM?(n$()) IF n$=n$(i) n$(i)="deleted." ___________________________________________________ 1This may be possible in future versions of X11-Basic 52 ____________________________________________________________________________3.10.__Simple_Input/Output____________________ ENDIF NEXT i RETURN i ENDFUNC you need to use VAR. The LOCAL statement lists the variables only known to a procedure or function. Subroutine parameters are local variables as well. When a subroutine calls another subroutine the local variables of the calling routine are known in the called routine as if they were global variables. Several local variables separated by commas may be listed after the LOCAL state- ment. Multiple LOCAL lines are allowed. 3.10. Simple Input/Output There are many ways in X11-Basic to take data by the user and display other data. This can be done by taking data from the keyboard, the mouse, a microphone, etc. and by displaying data to the text console, the graphics window, the speaker, etc. Also reading and writing to oles and internet connections can be done. The most basic input and output from and to the user is by using the text console, the so-called standard input and standard output. This is done in X11-Basic like in all BASIC dialects with the basic commands PRINT and INPUT. 3.10.1. Printing data to the console You actually already know a X11-Basic command to write data on screen. This command is PRINT. It is very versatile and you can extend it in various ways. The syntax of PRINT is simple: PRINT where is whatever sort of data you want to print on screen. That can be variables, numbers, the result of a calculation, a string or a mix of them all. You can even add special commands and functions to your PRINT statement for screen control such as cursor positioning and formatting of the data. A few examples for the PRINT command can be found here: 53 3. Programming_in_X11-Basic__________________________________________________________________________________________________ PRINT 10+5 PRINT x% PRINT 10;20;30 PRINT 10,20,30 PRINT "Hello!" PRINT 10.123 USING "+##.###" PRINT "y= ";y PRINT "x=";x;" y=";y;" z=";z PRINT "Your name is ";nam$ PRINT AT(5,5);"AT() is one of my favorites" PRINT CHR$(27);"[2J This is a cleared console..." These are the most simple variations of the PRINT command. They can of course be more complicated and all features can be combined. Now why do you write PRINT "y =";y instead of PRINT "y =",y? Using ; will add the following data directly behind your text without altering the cursor position while the , will advance the cursor to the next vertical tabular position. You can use that to align your data in tables on screen. In short, if you want to write data directly to some sort of prompt or behind some text, use the ; notation. Put a ; as the last data on your PRINT statement to let the cursor stay on the current line. You can use this to prevent a scrolling on the last line of the screen or if you simply want to split writing of prompt and data into two lines of code. Technically speaking giving the ; last will suppress a carriage return. 3.10.2. Screen control Now that you know how to write your data on screen, you will also want to know how to handle screen output in detail. How do I leave a line of text blank might you ask? Write simply PRINT without any data behind to output a blank line on screen. Try this 3 lines program: PRINT "Hello!" PRINT PRINT "This is the first example for screen control!" As you see it prints the greeting and the other line with an empty line between. 54 ____________________________________________________________________________3.10.__Simple_Input/Output____________________ A very important thing is how to clear the screen. For obvious reasons, you'll sometimes prepare a screen layout that requires you not to have other text or old data on screen. You'll simply clear the screen with the following command. CLS A neat thing is to write on screen exactly on a position where you want and not fol- lowing the listed AEow of ordinary PRINT statements. You can use the AT() statement. This special addition for PRINT allows you to position the cursor freely on screen so you can write your data where you want. Let's try the following example program: CLS PRINT AT(1,1);"Top left" PRINT AT(5,13);"Middle line, text indented 5 chars" PRINT AT(20,25);"bottom line"; The syntax for PRINT AT(); is PRINT AT(column, row);, where row 1 is on top of the screen and column 1 on the left end. Column and row can be variables, expressions or simply a plain number. Valid PRINT AT() commands are: PRINT AT(1,5);"Hello" PRINT AT(5+x%,10);"x" PRINT AT(4+8,y%);"y = " How many character positions you have depends on the current text console screen size. You have almost always at least 24 lines of text. 80 columns are standard. If you want to exactly know the number of rows and columns of the text screen, you can use the (system) variables ROWS and COLS. > PRINT ROWS,COLS 24 80 There are more commands you can use with PRINT like SPC() and TAB(). Refer to the command reference on them. 3.10.3. Formatting output with PRINT USING X11-BASIC normally prints numbers in a form convenient for most purposes. But on occasion you may prefer a more elaborate form. For example, you may want to print 55 3. Programming_in_X11-Basic__________________________________________________________________________________________________ onancial quantities with two decimal places (for cents) and, possibly, with commas inserted every three digits to the left of the decimal point. Or, you want to print the numbers in scientioc notation. PRINT USING provides a way to print numbers in this and almost any other form1 . The generic syntax is PRINT USING "" . The result of the expression should be a number. The format string deones how you want your data to be formatted on screen. The format string may be a string variable, a quoted string, or a more general string expression. PRINT USING also allows one to print strings centered or right-justioed, as well as left justioed. The function USING$() duplicates the PRINT USING statement almost exactly2 but returns the result as a string rather than printing it on the screen. Unlike STR$(), where you can specify the length of the string, the number of sig- niocant digits of the number and a AEag, where there leading zeroes should be used, USING$() and PRINT USING use a classic and BASIC-style formatter string for for- matting numbers. The dioeerence between USING$() and PRINT USING is just, that PRINT USING immediately prints out the formatted number and USING$() convert- ers it into a string containing the formatted number, suitable for further processing. Formatting Numbers The format string can contain any letters, but some have a special meaning. All other characters are just taken as they are. The length of the format string deones the length of the output oeld. Whatever is formatted, it will exactly take as many characters as the length of the format string. The most important special character in the format string is the symbol #, which stands for a digit position to be olled with one digit from the number to be formatted. For example, compare the output resulting from two similar PRINT statements, the orst a normal PRINT statement and the second employing USING. x= _PRINT x_ PRINT x USING "###" -----+-------+-------------------- 1 _ 1 _ 1 ___________________________________________________ 1There are also other built-in commands for formatting data on output. X11-Basic ooeers e.g. STR$(). Please refer to the sections on functions for details on the syntax of STR$(). 2only numbers can be formatted, no strings. 56 ____________________________________________________________________________3.10.__Simple_Input/Output____________________ 12 _ 12 _ 12 123 _ 123 _ 123 1234 _ 1234 _ *** -12 _ -12 _ -12 Without USING, the number is printed left justioed and occupying only as much space as needed. With USING, the format string "###" specioes a oeld length of exactly three characters. The number is printed right-justioed in this oeld. If the oeld is not long enough to print the number properly, asterisks are printed instead. If all you need to do is to print integer numbers in a column but with right-justiocation, then the preceding example will suOEce. Note that a negative number will be printed with the sign occupying one of the digit oelds. With printing onancial quantities it is conventional that the decimal points are aligned. Also, you may want to print two decimal places (for the cents) even when they are zero. The following example shows how to do this. (In order to print nega- tive numbers and have the sign at a oxed position, the format string should start with a minus sign.) x= _PRINT x USING "-##.##" ------+----------------------- 1 _ 1.00 1.9 _ 1.90 -3.14 _- 3.14 1.238 _ 1.24 123 _****** 0 _ 0.00 -123 _****** Notice that in this example two decimal digits are always printed, even when they consist of zeroes. Also, the result is orst rounded to two decimals. If the number is negative, the minus sign occupies the leading digit position or the position given by a - or + in the format string. If the number is too long to be printed properly (possibly because of a minus sign), asterisks are printed instead. Financial quantities are often printed with a leading dollar sign ($), and with com- mas forming three-digit groups to the left of the decimal point. The following exam- ple shows how to do this with PRINT USING. x= _PRINT x USING "$#,###,###.##" 57 3. Programming_in_X11-Basic__________________________________________________________________________________________________ -----------+------------------------------ 0 _$ 0.00 1 _$ 1.00 1234 _$ 1,234.00 1234567.89 _$1,234,567.89 1e6 _$1,000,000.00 1e7 _10,000,000.00 1e8 _************* The dollar sign is only printed if the space is not needed for a digit. It is always in the same position (orst) in the oeld. The separating commas are printed only when needed. In case you want the dollar sign ($) to AEoat to the right, so that it appears next to the number, avoiding all those blank spaces between the dollar sign and the orst digit in the preceding example. The following example shows how to do this. x= _PRINT x USING "$$,$$$,$$#.##" -----------+---------------------------- 0 _ $0.00 1 _ $1.00 1234 _ $1,234.00 1234567.89 _$1,234,567.89 The format string can also allow leading zeroes to be printed, or to be replaced by asterisks (*). You might ond the latter useful if you are preparing a check-writing program. x= _PRINT x USING "$0,000,000.##" -----------+------------------------------ 0 _$0,000,000.00 1 _$0,000,001.00 1234 _$0,001,234.00 1234567.89 _$1,234,567.89 x= _PRINT x USING "$*,***,***.##" -----------+------------------------------ 0 _$********0.00 1 _$********1.00 58 ____________________________________________________________________________3.10.__Simple_Input/Output____________________ 1234 _$****1,234.00 1234567.89 _$1,234,567.89 x= _PRINT x USING "*$$,$$$,$$#.##" -----------+------------------------------ 0 _*********$0.00 1 _*********$1.00 1234 _*****$1,234.00 1234567.89 _*$1,234,567.89 For compatibility reasons, a % can be used instead of the 0's in the format string, with one exception: The orst character in the format string must not be a %1 . You can also format numbers using scientioc notation. Because scientioc nota- tion has two parts, the decimal-part and the exponent-part, the format string must also have two parts. The decimal-part follows the rules already illustrated. The exponent-part consists of from three to ove carets () that should immediately follow the decimal-part. The following example shows how. x= _PRINT x USING "+#.#####^^^^" ------------+----------------------------- 0 _+0.00000e+00 123.456 _+1.23456e+02 -.001324379 _-1.32438e-03 7e30 _+7.00000e+30 0.5e100 _+5.00000e+99 5e100 _************ The leading plus sign (+) in the format string guarantees that the sign of the number will be printed, even when the number is positive. Notice that the last number cannot be formatted because the exponent part would have been 100, which requires an exponent oeld of ove carets. Notice also that if there are more carets than needed for the exponent, leading zeroes are inserted. Finally, notice that trailing zeroes in the decimal part are printed. In addition to the format rules explained above, X11-Basic ooeers another but dif- ferent set of format strings. If the orst character of the format string is a % the format string is treated as a C style so-called printf-formatter. Here are some examples: ___________________________________________________ 1If the orst character is a % the format string is interpreted as a C style printf format string (see below). 59 3. Programming_in_X11-Basic__________________________________________________________________________________________________ x= _format$= _PRINT x USING format$ ------------+------------------------------------ 0 _ "%012g" _000000000000 123.456 _ "%.1g" _1e+02 -.001624 _ "%.1g" _-0.002 These formatting strings follow some standard which is normally not used in BA- SIC. The standard is well explained in Wikipedia: http://en.wikipedia.org/ wiki/Printf`format`string#Format`placeholders. Formatting Strings Strings can also be formatted through PRINT USING but not with the function USING$(), although there are fewer options for strings than for numbers. Strings can be printed in the formatted oeld either left justioed, centered, or right-justioed. As with num- bers, if the string is too long to ot, then asterisks are printed. These examples should make it clear: PRINT "_";"OK" USING "#####";"_" ! result: _ OK _ PRINT "_";"OK" USING ">####";"_" ! result: _ OK_ PRINT "_";"Hello" USING ">####";"_" ! result: _Hello_ PRINT "_";"Goodby" USING ">####";"_" ! result: _*****_ If centering cannot be exact, the extra space is placed to the right. Actually any string can be used as a format string. Only the length of the string deones the length of the output oeld. Only the orst character of the format string matters. If it is a < the string will be left justioed, if it is a > it will be right-justioed and centered in any other case. This is especially valuable for printing headers for a numeric table. The following example shows how you can format headers using the same format string we used earlier for numbers. s$= _PRINT s$ USING "$#,###,###.##" ----------------------+------------------------------- "Cash" _ Cash "Liabilities" _ Liabilities "Accounts Receivable" _ ************* 60 ____________________________________________________________________________3.10.__Simple_Input/Output____________________ 3.10.4. Gathering User Input You can make your program interactive and ask the user to enter data on runtime of your program. The command INPUT allows the user to enter one line of data with the keyboard on the text console. The data is interpreted and stored in one or more variables specioed by the INPUT statement. If you specify a string variable, you can enter text while you can only enter numeric data if you use a numeric variable. A minus sign and optional decimal point are allowed for numeric input. Also numbers can be entered in scientioc notation. Hexadecimal values are possible, too. INPUT "x= ",x INPUT "What is your name? ",your`name$ This will prompt the user to enter a value for x which will be stored into a (AEoating point) variable x. You can then use this variable in your program as normal, doing calculations with it. Please note that your program will stop until the RETURN key or the ENTER key has been pressed to terminate the input. You can read more than one variable with one INPUT statement, just list your vari- ables where you want your input to go to with separating commas. PRINT "enter 3 values, separated with commas (eq 3,4,5):" INPUT x%,y%,z% The user has then to enter commas at the appropriate places to tell which input goes to which variable. To the example above the user would respond with 5,6,7. CLS INPUT "Enter a value for x:",x PRINT "x = ";x INPUT "What is your name?",your`name$ PRINT "Your name is ";your`name$;"." PRINT "Bye, ";your`name$;"!" While entering strings you may have already noticed that X11-Basic will treat entering a comma again as a delimiter, eoeectively cutting your string at that comma. Use the command LINEINPUT instead of INPUT to read strings. 61 3. Programming_in_X11-Basic__________________________________________________________________________________________________ LINEINPUT txt$ You can now enter strings with a comma in and it will be saved to the string variable as well. You can read multiple strings with LINEINPUT as well but the user has to press the RETURN key terminating each string to be entered. 3.11. Flow Control This time you'll onally make your programs do things more then once without having to retype your code. The creation of so-called loops is essential for making complex programs work. The concept of looping and simple counting loops Before going further let me explain you the fundamental idea of looping. The idea is to make your program repeat a section of code for a deoned amount of time. You may let X11-Basic count a variable for you and you can then use the value of that variable in an ongoing calculation. Or you can let X11-Basic loop a certain part of code until a special condition has been met. Take a look at the following sample program: FOR i%=1 TO 5 PRINT i% NEXT i% This little example program loops 5 times and counts the variable i% from 1 to 5 and prints the current value to the screen. This sort of loop is called a FOR-NEXT- loop. You can use any numerical variable to count. Most often this sort of loop is used to do things a certain amount of time or to iterate over a list. The loop will repeat the code between the FOR and its corresponding NEXT. Each time X11-Basic reaches the NEXT, it will increment the count variable and will stop the loop if the maximum count has been reached. You can of course have another loop inside the current one. Just make sure not to use the same variable for counting or X11-Basic will do unpredictable things: FOR i%=1 TO 5 FOR j%=1 TO 10 PRINT i%;" * ";j%;" = ";i%*j% NEXT j% 62 ______________________________________________________________________________________3.11.__Flow_Control_________________ NEXT i% That sample program has one FOR-NEXT-loop in another and it calculates the product of the both counter variables creating some sort of multiplication table. Some rules and advice to keep in mind with FOR-NEXT-loops: 1. Always terminate an opened FOR with a corresponding NEXT. 2. Always terminate FOR-loops in the correct order. If you write FOR i%=. . . orst and FOR j%=. . . next, make sure to terminate the inner loop orst. 3. You can count downwards with the word DOWNTO instead of TO. Try FOR i%=5 DOWNTO 1. 4. You can count in steps not equal 1 with the keyword STEP: FOR i%=1 TO 10 STEP 2 That will increment i% in steps of 2 until it reaches 10. 5. X11-Basic will check for correct loop termination while entering the code into the editor. 6. You can terminate the FOR-NEXT-loop with the EXIT IF statement. Conditions A very fundamental idea in programming is to create and use conditionals. These will allow you to make decisions when certain conditions are met and let your program take an alternative code segment. Try to imagine that you count a special variable and want to do something else when the value of your counter is 5: FOR i%=1 to 10 IF i%=5 PRINT "i% is now 5" ELSE PRINT "i% is not 5" ENDIF NEXT i% This program loops 10 times and counts in the variable i%. For each iteration of the loop it checks if i% is 5 in the IF line. If that condition is true, i% is 5, then it executes the program branch until the ELSE and omits the following part. If the condition is not true, X11-Basic will only execute the part behind the ELSE. Make sure to terminate each IF conditional with an ENDIF or X11-Basic will get lost and produce an error message. You may leave out the ELSE fork. X11-Basic will then do nothing if the condition is not true. 63 3. Programming_in_X11-Basic__________________________________________________________________________________________________ 3.11.1. Conditional and endless loops Sometimes you don't know how far you need to count for a special operation. Or imagine a game. You don't want to let it run just for 10 frames but until the player sprite did collide or something like that. The orst new loop will loop until a condition is fulolled: REPEAT ... UNTIL This is a so-called REPEAT-UNTIL-loop. It loops at least once and checks for the condition after the loop contents have been executed by X11-Basic. Use it for things that need to be done at least once. You can emulate FOR-NEXT-loops with it if you want trickier counting: i%=1 REPEAT PRINT "i%=";i% i%=i%+1 UNTIL i%>5 Surely you can test the condition before entering a loop. This is useful if you want to loop only when a certain condition is already true: WHILE ... WEND This is the so-called WHILE-WEND loop. It checks the condition orst and it will not execute the loop body if the condition is not fulolled. Sometimes you want to loop endless. X11-Basic has a special loop construct for this purpose although you can create never ending loops easily with the types above if you use a condition that will never get true. The never ending loop is called DO-loop. The 3 loops in the example are all equal in functionality and will loop endless. DO PRINT "endless" LOOP 64 ______________________________________________________________________________________3.11.__Flow_Control_________________ i%=0 REPEAT PRINT "endless" UNTIL i%=1 i%=0 WHILE i%=0 PRINT "endless" WEND At this point it is important that you know you can terminate at your X11-Basic program at any point. This is useful if your program gets stuck in an endless loop which was not intended. Press CONTROL-c together and X11-Basic will stop the program. Another CONTROL-c will quit the interpreter. Sometimes you will want to terminate a running loop at another point than the oOEcial loop beginning or loop end. Use the EXIT IF statement in your loop for extra conditions. This will also terminate FOR-NEXT-loops if you wish to and it is the only way to terminate a DO-LOOP. i%=1 DO PRINT "i%=";i% EXIT IF i%=5 i%=i%+1 LOOP Please note that the EXIT IF statement has no ENDIF or the like. It just terminates the loop and continues your program behind the loop end. 65 3. Programming_in_X11-Basic__________________________________________________________________________________________________ 3.12. Address Spaces The full accessible Program memory can be accessed by PEEK/POKE, LPEEK/LPOKE, DPEEK/DPOKE. Be careful. You can manipulate all symbols of the interpreter and or dynamically linked libraries and your program. Address spaces belonging to other programs which are not shared memory blocks can not be accessed. You will get a segmentation fault on trying this. 3.13. Graphics: Drawing and Painting A graphics window will be automatically opened when the orst graphic command appears in your program. Without using any graphic commands no X11-Server is needed at all and your programs also runs under a text console or as a daemon or as CGI scripts. But if you want to draw anything with e.g. LINE, CIRCLE or BOX, control the MOUSE pointer, the keyboard or use the graphical user interface with e.g. ALERT or MENU, a graphic window will open with the default geometry 640x400. All graphic output can be done in full color which can be set with the GET`COLOR() and the COLOR statements. Moreover, there can be up to 16 dioeerent graphic windows opened at a time. Please note that all graphics is displayed after a SHOWPAGE command only. This allows fast animations. To allow for animated bitmap graphics and icons, X11-Basic ooeers the commands GET and PUT, which retrieve rectangular regions from the graphics-window into a string or put back bitmap graphics data from the string to the graphics screen or window. The ole format used with PUT is a standard .BMP bitmap, so also externally created icons can be used. Transparency and alpha channels are supported. 3.14. Reading from and Writing to Files Before you may read from or write to a ole, you need to open it; once you are done, you should close it. Each open ole is designated by a simple number, which might be stored within a variable and must be supplied to the PRINT and INPUT commands if you want to access the ole. If you need more control, you may consider reading and writing one byte at a time, using the multi-purpose commands INP() and OUT, or reading the whole ole as a binary block with BLOAD. 66 _________________________________________3.15.__Internet_connections,_special_oles_and_sockets____________________________ 3.15. Internet connections, special oles and sockets X11-Basic allows to connect a program to another Program on a dioeerent (or the same) host computer via standard internet protocols or pipes. Basically there are two methods of connections to other computers on a network: The TCP/IP Based connections via streams and the implementation of a connection- less, unreliable datagram packet service (UDP). A method of passing data between two applications on the same computer is using Pipes. Pipes are special oles which are created in the local olesystem. 3.15.1. Local inter process communication: Pipes A pipe is a unidirectional data channel that can be used for interprocess communi- cation. The UNIX kernel usually supports this mechanism. The pipe can be used to send information or data from one process to another. Here is a little example progam you can use to play with it: PIPE #1,#2 a=FORK() IF a=0 ! Child instance GPRINT "Hi, I am Child !",b DO SHOWPAGE LINEINPUT #1,t$ GPRINT t$ LOOP ' This instance never ends ... ELSE IF a=-1 PRINT "ERROR, fork() failed !" QUIT ELSE ! parent instance DO DUMP ALERT 1,"Hi, I am Parent. Child PID="+str$(a),1," OK _ Kill Child ! ",b DUMP PRINt #2,SYSTEM$("date") FLUSH #2 IF b=2 SYSTEM "kill "+str$(a) ALERT 1,"Child PID="+str$(a)+" killed !",1," OK ",b QUIT ENDIF LOOP ENDIF QUIT 67 3. Programming_in_X11-Basic__________________________________________________________________________________________________ Instad of with pipes, the interprocess communication can also be done using a shared memory segment. 3.15.2. World-Wide communication: Sockets Most inter-process communication uses the client server model. These terms refer to the two processes which will be communicating with each other. One of the two processes, the client, connects to the other process, the server, typically to make a request for information. A good analogy is a person who makes a phone call to another person. Notice that the client needs to know of the existence of and the address of the server, but the server does not need to know the address of (or even the existence of) the client prior to the connection being established. Notice also that once a connec- tion is established, both sides can send and receive information. When a socket is created, the program has to specify the address domain and the socket type. Two processes can communicate with each other only if their sockets are of the same type and in the same domain. There are two widely used address domains, the Unix domain, in which two processes which share a common ole system communicate, and the Internet domain, in which two processes running on any two hosts on the Internet communicate. Each of these has its own address format. The address of a socket in the Unix domain is a character string which is basically an entry in the ole system. The address of a socket in the Internet domain consists of the Internet address of the host machine (every computer on the Internet has a unique 32 bit address, often referred to as its IP address). In addition, each socket needs a port number on that host. Port numbers are 16 bit unsigned integers. The lower numbers are reserved in Unix for standard services. For example, the port number for the FTP server is 21. It is important that standard services be at the same port on all computers so that clients will know their addresses. However, port numbers above 2000 are generally available. Socket Types There are two widely used socket types, stream sockets, and data- gram sockets. Stream sockets treat communications as a continuous stream of char- acters, while datagram sockets have to read entire messages at once. Each uses its own communications protocol. Stream sockets use TCP (Transmission Control Pro- tocol), which is a reliable, stream oriented protocol, and datagram sockets use UDP (Unix Datagram Protocol), which is unreliable and message oriented. 68 _________________________________________3.15.__Internet_connections,_special_oles_and_sockets____________________________ TCP/IP Transmission Control Protocol (TCP) provides a reliable byte-stream trans- fer service between two endpoints on an internet. TCP depends on IP to move packets around the network on its behalf. IP is inherently unreliable, so TCP protects against data loss, data corruption, packet reordering and data duplication by adding check- sums and sequence numbers to transmitted data and, on the receiving side, sending back packets that acknowledge the receipt of data. Before sending data across the network, TCP establishes a connection with the destination via an exchange of management packets. The connection is destroyed, again via an exchange of management packets, when the application that was using TCP indicates that no more data will be transferred. TCP has a multi-stage AEow-control mechanism which continuously adjusts the sender's data rate in an attempt to achieve maximum data throughput while avoiding congestion and subsequent packet losses in the network. It also attempts to make the best use of network resources by packing as much data as possible into a single IP packet. The system calls for establishing a connection are somewhat dioeerent for the client and the server, but both involve the basic construct of a socket. A socket is one end of an inter-process communication channel. The two processes each establish their own socket. The steps involved in establishing a socket on the client side are as follows: 1. Create a socket with the OPEN command providing a port number OPEN "US",#1,"client",5000 2. Connect the socket to the address of the server using the CONNECT com- mand CONNECT #1,"ptbtime1.ptb.de",13 3. Instead of using Steps 1 and 2, you can alternatively use the combined com- mand: OPEN "UC",#2,"ptbtime1.ptb.de",13 4. Send and receive data. There are a number of ways to do this, but the simplest is to use the PRINT, SEND, WRITE, READ, RECEIVE INPUT commands. 69 3. Programming_in_X11-Basic__________________________________________________________________________________________________ PRINT #2,"GET /index.html" FLUSH #2 WHILE INP?(#2) LINEINPUT #2,t$ PRINT "got: ";t$ WEND 5. close the connection with CLOSE #1 The steps involved in establishing a socket on the server side are as follows: 1. Create a socket with the OPEN command and bind the socket to a port number on the host machine. OPEN "US",#1,"server",5000 2. Listen for connections and 3. Accept a connection with this other OPEN command, which opens a connec- tion to the connected client: OPEN "UA",#2,"",1 This call typically blocks until a client connects with the server. 4. Send and receive data on the accepted connection PRINT #2,"Welcome to X11-Basic test-server ..." FLUSH #2 DO IF INP?(#2) LINEINPUT #2,t$ PRINT "got: ";t$ ENDIF EXIT IF t$="quit" LOOP PRINT #2,"goodbye..." FLUSH #2 70 _________________________________________3.15.__Internet_connections,_special_oles_and_sockets____________________________ 5. close the established connection with CLOSE #2 and listen to the next connection (folow step 3) or 6. close the socket if not further needed. CLOSE #1 UDP User Datagram Protocol (UDP) provides an unreliable packetized data trans- fer service between endpoints on a network. First, a socket has to be crated with the OPEN command: OPEN "UU",#1,"sender",5556 When a UDP socket is created, its local and remote addresses are unspecioed. Datagrams can be sent immediately using SEND with a valid destination address and port as argument: SEND #1,"This is my message",CVL(CHR$(131)+CHR$(195)+CHR$(15)+CHR$(200)),5000 UDP uses the IPv4 address format, so a long integer has to be passed. When CONNECT is called on the socket the default destination address is set and datagrams can now be sent using SEND without specifying an destination address. It is still possible to send to other destinations by passing an address to SEND. CONNECT #1,"localhost",5555 SEND #1,"This is my message" All receive operations return only one packet. IF INP?(#1) RECEIVE #1,t$,adr PRINT "Received Message: ";t$;" from ";HEX$(adr) ENDIF INP?(#n) Returns the size of the next pending datagram in bytes, or 0 when no datagram is pending. The Socket should be closed when the connection is not goint to be used any more: 71 3. Programming_in_X11-Basic__________________________________________________________________________________________________ CLOSE #1 UDP does not guarantee to actually deliver the data to the destination, nor does it guarantee that data packets will be delivered to the destination in the order in which they were sent by the source, nor does it guarantee that only one copy of the data will be delivered to the destination. UDP does guarantee data integrity, and it does this by adding a checksum to the data before transmission. 3.16. Accessing USB devices X11-Basic has a builtin USB interface, which allows X11-Basic programs to ac- cedd USB-Devices, which are connected to the computer. The interface is on a near hardware level, so the driver for the specioc hardware connected must be written in X11-Basic. Hence, it is well possible to use dataloggers and USB-to-RS232 adapters with this methods. In pronciple every USB-Device can be accessed, if the protocol for data transfers and data interpretation is known. Please see the example program usb.bas for an example, how to readout data from a VOLTCRAFT VDTL101-T datalogger. USB support is work in progress and may not yet work on Android and WIN- DOWS. USB-Devices are opened with the OPEN command. Instead of a olename, a com- bination if PID/VID is used. Once opened, the commands CLOSE, IOCTL(), SEND and RECEIVE can be used on that device. (PRINT and INPUT currently will not work). 3.17. Data within the program You may store data within your program within DATA-statements; during execution you will probably want to READ it into variables or arrays. Also the assignment of constant to arrays may be used to store data in your program and last but not least the INLINE$() function may be used to store huge binary data segments. The orst example shows how to store conventional data (numbers and strings) within the sourcecode of a basic program: ' example how to use the DATA statement 72 _________________________________________________________________________3.18.__Dynamic-link_libraries____________________ RESTORE mydata READ name$,age,address$,code mydata: DATA "Bud Spencer",30,"Holywood Street",890754 DATA "Hannelore Isendahl",15,"Max-Planck-Allee",813775 The following example shows how to store arbitrary binary data, which can be used e.g. to store the bitmapdata for a bitmap ( ). Or also for other resources like pictograms and any other bitmap or icon. ' output of inline.bas for X11-Basic 23.04.2002 ' demo 104 Bytes. demo$="" demo$=demo$+"5*II@V%M@[4D=*9V,)5I@[4D=*9V,(IR?*IR=6Y*A:]OA*IS?F".&IAI?J"D8ZII" demo$=demo$+",*5M=;1I@V%P=;1I?F%OaJ]R=:"P,*5E?J"D>*)X,*9W,*AI>ZUE@+%X/F"R&JAV" demo$=demo$+"A;1W&HXR&DL$" a$=INLINE$(demo$) PRINT len(a$),a$ ' show a bitmap biene$="($$43$%*<(1G,=E5Z&MD%`DVW'b*%H-^,EQ6>VTL$$$$" CLEARW t$=INLINE$(biene$) COLOR GET`COLOR(65535,65535,65535) FOR i=0 TO 40 PUT`BITMAP t$,i*16,0,16,16 NEXT i For convenience, a program called inline.bas shippes with X11-Basic. It does the conversion from and compression of any binary ole to ready-to-use X11-Basic sourcecode. 3.18. Dynamic-link libraries A dynamic-link library (.so =shared object) is a collection of functions (subroutines) that can be used by programs or by other .so's. A .so function must be called, directly or indirectly, from a running application and can not be run as a separate task. Dynamic link libraries save memory space and reduce memory swapping. Memory is saved, because many applications can use a single .so simultaneously, sharing a single copy of the .so in memory. Another feature of .so's is the ability to change the functions in a .so without modifying the applications that use them, as long as the function's arguments and return values do not change. A disadvantage to using 73 3. Programming_in_X11-Basic__________________________________________________________________________________________________ .so's is that an application depends on the existence of a separate .so module. If the .so is not found, the application is terminated. All documented functions from the shared objects of other software packages can be used and invoked from within yout X11-Basic program. X11-Basic will perform no check on the number and type of the API function parameters. 3.18.1. Using shared libraries and C functions Before an application can use a function from a .so (if you want to use your own functions written in C you have to compile them to a shared object ole), it must load the .so explicitly using the LINK statement. LINK #n,"myfile.so" The process of loading a .so explicitly is called run-time linking. For instance, to use the binit() function from the trackit.so library, an appli- cation must include following lines of code (supposing, you want to use your own shared object made out of the c-code trackit.c): IF NOT EXIST("./trackit.so") SYSTEM "gcc -O3 -shared -o trackit.so trackit.c" ENDIF LINK #11,"./trackit.so" "EXEC(SYM`ADR(#11,"binit"),L:n,L:200,L:VARPTR(x(0)),L:VARPTR(bins(0))) The ole trackit.c contains: #include #include #include void binit(int n,int dn,double *x,double *data) - int i,j; int over=0,under=0; for(i=0;i=dn) over++; 74 __________________________________________________________________________3.19.__Memory_management________________________ else data[j]++; " " X11-Basic applications can load up to 99 shared object oles simultaneously, al- though the channel number space is shared with the open oles.. To do this, parameter n must specify a value between 1 an 99. X11-Basic maintains an internal table with 99 entries to store the handle of the loaded shared object mod- ules. These handles are necessary to unload the .so when the application is onished using them. The .so's are unloaded by invoking the UNLINK command: UNLINK #11 X11-Basic currently allows only a AEoat (double) type for the return value. This is currently a limitation for the use of the standard libraries. If you have written the library function yourself, you could bypass this limitation by passing pointers to variables. The following parameter types are possible: __________________________________________________________________ | L: | 32-bits integers and pointers (long) (%) | | | | | W: | 16-bits signed (short) | | | | | B: | 8-bits signed (char) | | | | | F: | 8 byte AEoat (double) | | | | | S: | 4 byte AEoat (AEoat) | |______|_____________________________________________________|____ The SYM`ADR function determines the address of the function from its name. The spelling of the function name must therefore be identical to the spelling of the func- tion in the .so. When passing the address of the string, a null byte must be added to the end of the string. 3.19. Memory management Normally, X11-Basic takes care of most of the memory management for the program- mer. When a variable, string or array is declared, X11-Basic allocates the required memory and releases it when the application is terminated. However, there may be situations when a programmer wants to allocate additional memory. 75 3. Programming_in_X11-Basic__________________________________________________________________________________________________ 3.19.1. Allocating memory If an application needs to store small amounts of memory, it should use strings. Strings are often used as a buoeer for functions. The address of the memory occu- pied by a string can be obtained by the VARPTR() function. Its length by the LEN() function. To allocate memory from the global and system-wide program user space memory pool you might use the function MALLOC(). For instance, to allocate 2000 bytes, you might use: ptr%=MALLOC(2000) A global memory block allocated with MALLOC must be freed using the FREE() function. An application should always free all memory blocks before exiting. For instance: FREE Ptr% 3.20. Other features # X11-Basic programs may start other programs with the commands SYSTEM and SYSTEM$(). # The ENV$() function allows access to environment variables. # The current time or date can be retrieved with TIME$ and DATE$. # The interpreter allows self modifying code. # It is possible to link shared library objects and use the functions provided from within the X11-Basic program 76 This chapter describes how to use the graphical user interface (GUI) built into X11- Basic. X11-Basic4 Graphical User Interface 4.1. ALERT and FILESELECT Two most often used graphic functions are implemented as a full functional graphical user interface dialog: Message boxes and a ole selector. Arbitrary dialogs can be created with the object and resource functions. Also a pull down menu function is implemented. Fig. 4.1 shows a typical messagebox. The command which produces it is: ALERT 3,"This file is write protected._You can only read or " delete it.",1,"OK_DELETE_CANCEL",sel ALERT boxes can also be used to manage simple input forms like the one you can see in og. 4.2. Here is a little example program: CLEARW i=1 name$="TEST01" posx$="N54#50'32.3" posy$="E007#50'32.3" t$="Edit waypoint:__Name: "+CHR$(27)+name$+"_" t$=t$+"Breite: "+chr$(27)+posx$+"_" t$=t$+"L#nge: "+chr$(27)+posy$+"_" t$=t$+"H#he: "+chr$(27)+str$(alt,5,5)+"_" t$=t$+"Typ: "+chr$(27)+hex$(styp,4,4)+"_" ALERT 0,t$,1,"OK_UPDATE_L#SCHEN_CANCEL",a,f$ Figure 4.1 : A message box. 77 4. Graphical_User_Interface__________________________________________________________________________________________________ Figure 4.2 : A simple input box. WHILE LEN(f$) WORT`SEP f$,CHR$(13),0,a$,f$ PRINT "Feld";i;": ",a$ INC i WEND QUIT Fig. 4.4 shows the oleselector box. The command which produces it is: FILESELECT "load program:","./*.bas","in.bas",f$ The complete path and olename of the selected ole will be returned in f$. 4.2. Resources X11-Basic resources consist of object trees, strings, and bitmaps used by a basic program. They encapsulate the user interface and make internationalization easier by placing all program strings in a single ole. The data format of X11Basic resource is downwards compatible with the Atari-ST GEM implementation. Resources are generally created using a Resource Construction Set (RCS) and saved to a .RSC ole which is loaded by RSRC`LOAD() at program initialization time. Resources may also be embedded as data structures in source code (the utility programs rsc2gui.bas and gui2bas.bas convert .RSC oles to source code). Re- sources contain pointers and coordinates which must be oxed up before being used. RSRC`LOAD() does this automatically, however if you use an embedded resource you must take care of this by yourself on each object in each object tree to convert the initial character coordinates of to screen coordinates. This allows resources designed on screens with dioeerent aspect ratios and system fonts to appear the same. Once 78 ____________________________________________________________________________________________4.2.__Resources_______________ Figure 4.3 :The oleselece- tor Figure 4.4 :A pull down menu 79 4. Graphical_User_Interface__________________________________________________________________________________________________ Figure 4.5.: Examples of forms in X11-Basic a resource is loaded use rsrc`gaddr() to obtain pointers to individual object trees which can then be manipulated directly or with the X11-Basic built-in functions. 4.2.1. Objects Objects can be boxes, buttons, text, images, and more. An object tree is an array of OBJECT structures linked to form a structured relationship to each other. The object itself is a section of data which can be held by a string in X11-Basic. The OBJECT structure is format is as follows: object$=MKI$(ob`next)+MKI$(ob`head)+MKI$(ob`tail)+ MKI$(ob`type)+MKI$(ob`flags)+MKI$(ob`state)+ MKL$(ob`spec)+MKI$(ob`x)+MKI$(ob`y)+MKI$(ob`width)+ MKI$(ob`height) An Object tree is a collection of objects: tree$=object0$+object1$+ ... +objectn$ The orst object in an OBJECT tree is called the ROOT object (OBJECT 0). It's coordinates are relative to the upper-left hand corner of the graphics window. The 80 ____________________________________________________________________________________________4.2.__Resources_______________ ROOT object can have any number of children and each child can have children of their own. In each case, the OBJECT's coordinates, ob`x, ob`y, ob`width, and ob`height are relative to that of its parent. The X11-Basic function objc`offset() can, however, be used to determine the exact screen coordinates of a child object. objc`find() is used to determine the object at a given screen coordinate. The ob`next, ob`head, and ob`tail oelds determine this relationship between parent OBJECTs and child OBJECTs. ob`next the index (counting objects from the orst object in the object tree) of the object's next sibling at the same level in the object tree array. The ROOT object should set this value to -1. The last child at any given nesting level should set this to the index of its parent. ob`head the index of the orst child of the current object. If the object has no children then this value should be -1. ob`tail the index of the last child: the tail of the list of the object's children in the object tree array If the object has no children then this value should be -1. ob`type the object type. The low byte of the ob`type oeld specioes the object type as follows: ___________________________________________________________________________________________ | ob`type Name Description | |___________________________________________________________________________________|______ | 20 G`BOX Box | | | | 21 G`TEXT Formatted Text | | | | 22 G`BOXTEXT Formatted Text in a Box | | | | 23 G`IMAGE Monochrome Image | | | | 24 G`PROGDEF Programmer-Deoned Object | | | | 25 G`IBOX Invisible Box | | | | 26 G`BUTTON Push Button w/String | | | | 27 G`BOXCHAR Character in a Box | | | | 28 G`STRING Un-formatted Text | | | | 29 G`FTEXT Editable Formatted Text | | | | 30 G`FBOXTEXT Editable Formatted Text in a Box | | | | 31 G`ICON Monochrome Icon | | | | 32 G`TITLE Menu Title | | | | 33 G`CICON Color Icon | |____________________________________________________________________________________|_____ ob`AEags The ob`AEags oeld of the object structure is a bitmask of dioeerent AEags that 81 4. Graphical_User_Interface__________________________________________________________________________________________________ can be applied to any object. You may want to apply one ore more AEags at once. Just add the values ob`AEags. __________________________________________________________________________________________________________ | ob`AEags Name Description | |_______________________________________________________________________________________________________|__ | 0 NONE No AEag | |_______________________________________________________________________________________________________|__ | 1 SELECTABLE object is selected. state may be toggled by | | | | clicking on it with the mouse. | |_______________________________________________________________________________________________________|__|| | 2 DEFAULT An EXIT object with this bit set will have | | | | a thicker outline and be triggered when the | | | | user presses return. | |_______________________________________________________________________________________________________|__|| | 4 EXIT Clicking on this OBJECT and releasing the | | | | mouse button while still over it will cause the | | | | dialog to exit. | |_______________________________________________________________________________________________________|__ | 8 EDITABLE Set for FTEXT and FBOXTEXT objects to | | | | indicate that they may receive edit focus. | |_______________________________________________________________________________________________________|__|| | 16 RBUTTON This object is one of a group of radio buttons. | | | | Clicking on it will deselect any selected ob- | | | | | | jects at the same tree level that also have the | | | | RBUTTON AEag set. Likewise, it will be des- | | | | elected automatically when any other object | | | | is selected. | |_______________________________________________________________________________________________________|__ | 32 LASTOB This AEag signals that the current OBJECT is | | | | the last in the object tree. (Required!) | |_______________________________________________________________________________________________________|__|| | 64 TOUCHEXIT Setting this AEag causes the OBJECT to return | | | | an exit state immediately after being clicked | | | | on with the mouse. | |_______________________________________________________________________________________________________|__ | 256 HIDETREE This OBJECT and all of its children will not | | | | be drawn. | |_______________________________________________________________________________________________________|__|| | 512 INDIRECT This AEag cause the ob`spec oeld to be in- | | | | terpreted as a pointer to the ob`spec value | | | | rather than the value itself. | |_______________________________________________________________________________________________________|__|| | 1024 FL3DIND Setting this AEag causes the OBJECT to be | | | | drawn as a 3D indicator. This is appropriate | | | | for radio and toggle buttons. | |_______________________________________________________________________________________________________|__|| | 2048 FL3DACT Setting this AEag causes the OBJECT to be | | | | drawn as a 3D activator. This is appropriate | | | | for EXIT buttons. | |_______________________________________________________________________________________________________|_ 82 ____________________________________________________________________________________________4.2.__Resources_______________ _________________________________________________________________________________________________________|| | 3072 FL3DBAK If these bits are set, the object is treated as an | | | | AES background object. If it is OUTLINED, | | | | | | the outlined is drawn in a 3D manner. If its | | | | color is set to WHITE and its oll pattern is | | | | set to 0 then the OBJECT will inherit the de- | | | | fault 3D background color. | |_______________________________________________________________________________________________________|__ | | | 4096 SUBMENU This bit is set on menu items which have a | | | | sub-menu attachment. This bit also indicates | | | | that the high byte of the ob`type oeld is be- | | | | ing used by the menu system. | |_______________________________________________________________________________________________________|__ ob`state The ob`state oeld determines the display state of the object as follows: ________________________________________________________________________________________________________ | ob`state Name Description | |_____________________________________________________________________________________________________|__ | 0 NORMAL Normal state | |_____________________________________________________________________________________________________|__ | | | 1 SELECTED The object is selected. An object with this | | | | bit set will be drawn in inverse video except | | | | for G`CICON which will use its 'selected' | | | | image. | |_____________________________________________________________________________________________________|__ | | | 2 CROSSED An OBJECT with this bit set will be drawn | | | | over with a white cross (this state can | | | | only usually be seen over a colored or SE- | | | | LECTED object). | |_____________________________________________________________________________________________________|__|| | 4 CHECKED An OBJECT with this bit set will be dis- | | | | played with a check mark in its upper-left | | | | corner. | |_____________________________________________________________________________________________________|__|| | 8 DISABLED An OBJECT with this bit set will ignore user | | | | input. Text objects with this bit set will draw | | | | in grey or a dithered pattern. | |_____________________________________________________________________________________________________|__ | | | 16 OUTLINED G`BOX, G`IBOX, G`BOXTEXT, | | | | G`FBOXTEXT, and G`BOXCHAR | | | | OBJECTs with this bit set will be drawn | | | | with a double border. | |_____________________________________________________________________________________________________|_ 83 4. Graphical_User_Interface__________________________________________________________________________________________________ _______________________________________________________________________________________________________|| | 32 SHADOWED G`BOX, G`IBOX, G`BOXTEXT, | | | | G`FBOXTEXT, and G`BOXCHAR | | | | OBJECTs will be drawn with a shadow. | |_____________________________________________________________________________________________________|__ ob`spec The Object-Specioc Field The ob`spec oeld contains dioeerent data depending on the object type as indi- cated in the table below: ____________________________________________________________________________________________ | | | G`BOX The low 16 bits contain a WORD containing | | | | color information for the OBJECT. Bits 23- | | | | 16 contain a signed BYTE representing the | | | | border thickness of the box. | |_________________________________________________________________________________________|__ | G`TEXT The ob`spec oeld contains a pointer to a TE- | | | | DINFO structure. | |_________________________________________________________________________________________|__ | G`BOXTEXT The ob`spec oeld contains a pointer to a TE- | | | | DINFO structure. | |_________________________________________________________________________________________|__ | G`IMAGE The ob`spec oeld points to a BITBLK struc- | | | | ture. | |_________________________________________________________________________________________|__ | G`PROGDEF The ob`spec oeld points to a APPLBLK | | | | structure. | |_________________________________________________________________________________________|__ | | | G`IBOX The low 16 bits contain a WORD containing | | | | color information for the OBJECT. Bits 23- | | | | 16 contain a signed BYTE representing the | | | | border thickness of the box. | |_________________________________________________________________________________________|__ | G`BUTTON The ob`spec oeld contains a pointer to the | | | | text to be contained in the button. | |_________________________________________________________________________________________|__|| | G`BOXCHAR The low 16 bits contain a WORD contain- | | | | ing color information for the OBJECT. Bits | | | | | | 23-16 contain a signed BYTE representing | | | | the border thickness of the box. Bits 31-24 | | | | contain the ASCII value of the character to | | | | display. | |_________________________________________________________________________________________|__ | G`STRING The ob`spec oeld contains a pointer to the | | | | text to be displayed. | |_________________________________________________________________________________________|_ 84 ____________________________________________________________________________________________4.2.__Resources_______________ ___________________________________________________________________________________________ | G`FTEXT The ob`spec oeld contains a pointer to a TE- | | | | DINFO structure. | |_________________________________________________________________________________________|__ | G`FBOXTEXT The ob`spec oeld contains a pointer to a TE- | | | | DINFO structure. | |_________________________________________________________________________________________|__ | G`ICON The ob`spec oeld contains a pointer to an | | | | ICONBLK structure. | |_________________________________________________________________________________________|__ | G`TITLE The ob`spec oeld contains a pointer to the | | | | text to be used for the title. | |_________________________________________________________________________________________|__ | G`CICON The ob`spec oeld contains a pointer to a CI- | | | | CONBLK structure. | |_________________________________________________________________________________________|__ objc`colorword Almost all objects reference a WORD containing the object color as deoned below. objc`colorword=bbbbcccctpppcccc Bits 15-12 contain the border color Bits 11-8 contain the text color Bit 7 is 1 if opaque or 0 if transparent Bits 6-4 contain the fill pattern index Bits 3-0 contain the fill color Available colors for oll patterns, text, and borders are listed below: 85 4. Graphical_User_Interface__________________________________________________________________________________________________ _________________________________________________________ | Value Name Color | |_____________________________________________________|__ | 0 WHITE White | | | | 1 BLACK Black | | | | 2 RED Red | | | | 3 GREEN Green | | | | 4 BLUE Blue | | | | 5 CYAN Cyan | | | | 6 YELLOW Yellow | | | | 7 MAGENTA Magenta | | | | 8 LWHITE Light Gray | | | | 9 LBLACK Dark Gray | | | | 10 LRED Light Red | | | | 11 LGREEN Light Green | | | | 12 LBLUE Light Blue | | | | 13 LCYAN Light Cyan | | | | 14 LYELLOW Light Yellow | | | | 15 LMAGENTA Light Magenta | |_________________________________________________|______ TEDINFO G`TEXT, G`BOXTEXT, G`FTEXT, and G`FBOXTEXT objects all reference a TEDINFO structure in their ob`spec oeld. The TEDINFO structure is deoned below: tedinfo$=MKL$(VARPTR(te`ptext$))+MKL$(VARPTR(te`ptmplt$))+ MKL$(VARPTR(te`pvalid$))+MKI$(te`font)+MKI$(te`fontid)+ MKI$(te`just)+MKI$(te`color)+MKI$(te`fontsize)+ MKI$(te`thickness)+MKI$(te`txtlen)+MKI$(te`tmplen) The three character pointer point to text strings required for G`FTEXT and G`FBOXTEXT objects. te`ptext points to the actual text to be displayed and is the only oeld used by all text objects. te`ptmplt points to the text template for editable oelds. For each character that the user can enter, the text string should contain a tilde character (ASCII 126). Other characters are displayed but cannot be overwritten by the user. te`pvalid contains validation characters for each character the user may enter. The current acceptable validation characters are: 86 ____________________________________________________________________________________________4.2.__Resources_______________ _______________________________________________________________________________________________________________________* *______ | Character Allows * * | |______________________________________________________________________________________________________________________* *__|___ | 9 Digits 0-9 * * | | * * | | A Uppercase letters A-Z plus space | | | | a Upper and lowercase letters plus space | | | | N Digits 0-9, uppercase letters A-Z and space | | | | n Digits 0-9, upper and lowercase letters A-Z and space | | | | F Valid DOS olename characters plus question mark and asterisk | | | | P Valid DOS pathname characters, backslash, colon, question mark, asterisk | | | | p Valid DOS pathname characters, backslash and colon | | | | X All characters | |______________________________________________________________________________________________________________________* *|_____ te`font may be set to any of the following values: ________________________________________________________________________________ | te`font Name Description | |_________________________________________________________________________|_____ | 3 IBM Use the standard monospaced font. | | | | 5 SMALL Use the small monospaced font. | |_________________________________________________________________|_____________ te`just sets the justiocation of the text output as follows: ______________________________________________________ | te`just Name Description | |______________________________________________|______ | 0 TE`LEFT Left Justify | | | | 1 TE`RIGHT Right Justify | | | | 2 TE`CNTR Center | |_________________________________________________|___ te`thickness sets the border thickness (positive and negative values are acceptable) of the G`BOXTEXT or G`FBOXTEXT object. te`txtlen and te`tmplen should be set to the length of the starting text and template length respectively. BITBLK G`IMAGE objects contain a pointer to a BITBLK structure in their ob`spec oeld. The BITBLK structure is deoned as follows: bitblk$=MKL$(VARPTR(bi`pdata$))+MKI$(bi`wb)+MKI$(bi`hl)+ MKI$(bi`x)+MKI$(bi`y)+MKI$(bi`color) bi`pdata should contain a monochrome bit image. bi`wb specioes the width (in bytes) of the image. All BITBLK images must be a multiple of 16 pixels wide therefore this value must be even. bi`hl specioes the height of the image in scan lines (rows). bi`x and bi`y are used as ooesets into bi`pdata. Any data occurring before these coordinates will be ignored. bi`color is a standard color WORD where the oll color specioes the color in which the image will be rendered. 87 4. Graphical_User_Interface__________________________________________________________________________________________________ ICONBLK The ob`spec oeld of G`ICON objects point to an ICONBLK struc- ture as deoned below: iconblk$=MKL$(VARPTR(ib`pmask$))+MKL$(VARPTR(ib`pdata$))+MKL$(VARPTR(ib`ptext$))+ MKI$(ib`char)+MKI$(ib`xchar)+MKI$(ib`ychar)+ MKI$(ib`xicon)+MKI$(ib`yicon)+MKI$(ib`wicon)+MKI$(ib`hicon)+ MKI$(ib`xtext)+MKI$(ib`ytext)+MKI$(ib`wtext)+MKI$(ib`htext) ib`pmask and ib`pdata contain the monochrome mask and image data respectively. ib`ptext is a string pointer to the icon text. ib`char de- ones the icon character (used for drive icons) and the icon foreground and background color as follows: _ ib`char _ _ Bits 15-12 _ Bits 11-8 _ Bits 7-0 _ _Icon Foreground Color _Icon Background Color _ASCII Character (or 0 _ _ _ _ for no character). _ ib`xchar and ib`ychar specify the location of the icon character rel- ative to ib`xicon and ib`yicon. ib`xicon and ib`yicon specify the location of the icon relative to the ob`x and ob`y of the object. ib`wicon and ib`hicon specify the width and height of the icon in pixels. As with images, icons must be a multiple of 16 pixels in width. ib`xtext and ib`ytext specify the location of the text string relative to the ob`x and ob`y of the object. ib`wtext and ib`htext specify the width and height of the icon text area. CICONBLK The G`CICON object deones its ob`spec oeld to be a pointer to a CICONBLK structure as deoned below: ciconblk$=monoblk$+MKL$(VARPTR(mainlist$)) monoblk contains a monochrome icon which is rendered if a color icon matching the display parameters cannot be found. In addition, the icon text, character, size, and positioning data from the monochrome icon are always used for the color one. mainlist contains the orst CICON struc- ture in a linked list of color icons for dioeerent resolutions. CICON is de- oned as follows: cicon$=MKI$(num`planes)+MKL$(VARPTR(col`data$))+MKL$(VARPTR(col`mask$))+ MKL$(VARPTR(sel`data$))+MKL$(VARPTR(sel`mask$))+ MKL$(VARPTR(cicon2$)) num`planes indicates the number of bit planes this color icon contains. col`data and col`mask contain the icon data and mask for the unse- lected icon respectively. Likewise, sel`data and sel`mask contain the 88 ____________________________________________________________________________________________4.2.__Resources_______________ icon data and mask for the selected icon. cicon2$ contains the next color icon deonition. Use MKL$(0) if no more are available. The GUI library searches the CICONBLK object for a color icon that has the same number of planes in the display. If none is found, the GUI library simply uses the monochrome icon. APPLBLK G`PROGDEF objects allow programmers to deone custom objects and link them transparently in the resource. The ob`spec oeld of G`PROGDEF objects contains a pointer to an APPLBLK as deoned below: applblk$=MKL$(SYM`ADR(#1,"function"))+MKL$(ap`parm) The orst is a pointer to a user-deoned routine which will draw the ob- ject. This routine must be a c-Function, which has to be linked to X11- basic with the LINK command. The routine will be passed a pointer to a PARMBLK structure containing the information it needs to render the object. The routine must be deoned with stack checking ooe and expect to be passed its parameter on the stack. ap`parm is a user-deoned value which is copied into the PARMBLK structure as deoned below: typedef struct parm`blk - OBJECT *tree; short pb`obj; short pb`prevstate; short pb`currstate; short pb`x; short pb`y; short pb`w; short pb`h; short pb`xc; short pb`yc; short pb`wc; short pb`hc; long pb`parm; " PARMBLK; tree points to the OBJECT tree of the object being drawn. The object is located at index pb`obj. The routine is passed the old ob`state of the object in pb`prevstate and the new ob`state of the object in pb`currstate. If pb`prevstate and pb`currstate is equal then the object should be drawn completely, otherwise only the drawing necessary to redraw the object from pb`prevstate to pb`currstate are necessary. pb`x, pb`y, pb`w, and pb`h give the screen coordinates of the object. pb`xc, pb`yc, pb`wc, and pb`hc give the rectangle to clip to. pb`parm 89 4. Graphical_User_Interface__________________________________________________________________________________________________ contains a copy of the ap`parm value in the APPLBLK structure. The custom routine should return a short containing any remaining ob`state bits you wish the GUI Library to draw over your custom object. Dialogs Dialog boxes are modal forms of user input. This means that no other interaction can occur between the user and applications until the requirements of the dialog have been met and it is exited. A normal dialog box consists of an object tree with a BOX as its root object and any number of other controls that accept user input. Both alert boxes and the ole selector are examples of dialog boxes. The form`do() function performs the simplest method of using a dialog box. Sim- ply construct an OBJECT tree with at least one EXIT or TOUCHEXIT object and call form`do()1 . All interaction with the dialog like editable oelds, radio buttons, and selectable objects will be maintained by the X11-Basic library until the user strikes an EXIT or TOUCHEXIT object. 4.2.2. The gui ole format The *.gui ole format, which is basically an ASCII representation of the ATARI ST resource oles (*.rsc), can be converted to X11-Basic code, which then can handle message boxes and forms. The converter gui2bas(1) does this job. For conversion of ATARI ST resource oles to *.gui Files see rsc2gui(1). The *.gui ole consists of Lines and Blocks which specify objects and their hierar- chical dependencies. The generic format of such an object is: label: TYPE(variables) - ... block ... " The label is optional and gives the object a name. Depending on TYPE of the object, one or more variables are given as a comma separated list in brackets. Each object may start a block with '-' at the end of the line. Inside this block there might be one or more objects given which then are considered as sub-objects of the one which opened the block. The block will be closed by a '"' in a single line. ___________________________________________________ 1Before you should display the dialog box using the objc`draw() function. Maybe you also want to center the dialog with form`center() and save and redraw the background with form`dial(). 90 _________________________________________________________________________________________________4.3.__Menus______________ Example: ' Little selector box (c) Markus Hoffmann 07.2003 ' convert this with gui2bas ! ' as an example for the use of the gui system ' with X11-Basic BOX(X=0,Y=0,W=74,H=14, FRAME=2, FRAMECOL=1, TEXTCOL=1, BGCOL=0, PATTERN=0, TEXTMODE=0, STATE=OUTLINED+) - BOXTEXT(X=2,Y=1,W=70,H=1, TEXT="Select option ...", FONT=3, JUST=2, COLOR=4513, BORDER=253, STATE=SHADOWED+) BOX(X=2,Y=3,W=60,H=10, FRAME=-1, FRAMECOL=1, TEXTCOL=1, BGCOL=0, PATTERN=0, TEXTMODE=0) - FTEXT(X=1,Y=1,W=30,H=1,COLOR=4513,FONT=3,BORDER=1,TEXT="Line 1", PTMP="```````````````````````````````````````",PVALID="XXXXXX* *XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", FLAGS=EDITABLE) FTEXT(X=1,Y=2,W=30,H=1,COLOR=4513,FONT=3,BORDER=1,TEXT="", PTMP="```````````````````````````````````````",PVALID="XXXXXXXXXXXX* *XXXXXXXXXXXXXXXXXXXXXXXXXXX", FLAGS=EDITABLE) FTEXT(X=1,Y=3,W=30,H=1,COLOR=4513,FONT=3,BORDER=1,TEXT="", PTMP="```````````````````````````````````````",PVALID="XXXXXXXXXXXX* *XXXXXXXXXXXXXXXXXXXXXXXXXXX", FLAGS=EDITABLE) FTEXT(X=1,Y=4,W=30,H=1,COLOR=4513,FONT=3,BORDER=1,TEXT="", PTMP="```````````````````````````````````````",PVALID="XXXXXXXXXXXX* *XXXXXXXXXXXXXXXXXXXXXXXXXXX", FLAGS=EDITABLE) BOX(X=2,Y=6,W=50,H=3, FRAME=-1, FRAMECOL=1, TEXTCOL=1, BGCOL=1, PATTERN=5, TEXTMODE=0) - BUTTON(X=2,Y=1,W=4,H=1, TEXT="ON",STATE=SELECTED, FLAGS=RADIOBUTTON+SELECTABLE,FRAME=2, FRAMECOL=1, TEXTCOL=1, BGCOL=1, PAT* *TERN=0, TEXTMODE=0) BUTTON(X=8,Y=1,W=4,H=1, TEXT="OFF",FLAGS=RADIOBUTTON+SELECTABLE,FRAME=2, FRAMECOL=1, TEXTCOL=1, BGCOL=1, PATTERN=0, TEXTMOD* *E=0) " " ok: BUTTON(X=65,Y=4,W=7,H=4, TEXT="OK", FLAGS=SELECTABLE+DEFAULT+EXIT) cancel: BUTTON(X=65,Y=9,W=7,H=4, TEXT="CANCEL", FLAGS=SELECTABLE+EXIT+LASTOB+) " 4.3. Menus Most applications use a menu bar to allow the user to navigate through program options. In addition, future versions of X11-Basic will allow pop-up menus and drop-down list boxes (a special form of a pop-up menu). Here is a simple example program, which demonstrates the handling of a drop down menu. ' Test-program for Drop-Down-Menus ' DIM field$(50) FOR i=0 TO 50 READ field$(i) EXIT IF field$(i)="***" NEXT i oh=0 field$(i)="" DATA "INFO"," Menutest" DATA "---------------" DATA "- Access.1","- Access.2","- Access.3","- Access.4","- Access.5" DATA "- Access.6","" DATA "FILE"," new"," open ..."," save"," save as ...","--------------" DATA " print","--------------"," Quit","" DATA "EDIT"," cut"," copy"," paste","----------"," help1"," helper" DATA " assist","" DATA "HELP"," online help","--------------"," edifac"," editor"," edilink" DATA " edouard","" DATA "***" grau=get`color(32000,32000,32000) color grau pbox 0,0,640,400 MENUDEF field$(),menuaction 91 4. Graphical_User_Interface__________________________________________________________________________________________________ DO pause 0.05 MENU LOOP quit PROCEDURE menuaction(k) local b IF (field$(k)=" Quit") OR (field$(k)=" exit") quit ELSE IF field$(k)=" online help" oh=not oh MENUSET k,4*abs(oh) ELSE IF field$(k)=" Menutest" "form`alert(1,"[0][---- Menutest ----__(c) Markus Hoffmann 2001_X11-Basic V.1.03][ OK ]") ELSE PRINT "MENU selected ";k;" contents: ";field$(k) b=form`alert(1,"[1][--- Menutest ---__You selected item (No. "+str$(k)+"),_ for which was no_function defined !][ OK _disable]* *") if b=2 MENUSET k,8 endif ENDIF RETURN 92 This chapter explains how you can use X11-Basic programs for WEB-interfacing. Especially via the use of so-called CGI-Scripts. X11-Basic5 WEB Programming 5.1. What is CGI? CGI stands for Common Gateway Interface ~ a term you don't really need to know. In short, CGI deones how web servers and web browsers handle information from HTML forms on web pages. This means instead of the WEB server sending static web pages to the clients, it can invoke a program, typically called a cgi-script, to generate the page on the time the request was received. These cgi-scripts take some action, and then send a results page back to the user's web browser. The results page might be dioeerent every time the program is run. And these programs can be X11-Basic programs. 5.1.1. Conoguration 1. All X11-Basic scripts must begin with the following statement, on the orst line: #!/usr/bin/xbasic Because Unix does not map ole suOExes to programs, there has to be a way to tell Unix that this ole is a X11-Basic program, and that it is to be executed by the X11-Basic interpreter xbasic. This is seen before in shell scripts, in which the orst line tells Unix to execute it with one of the shell programs. The xbasic executable, which will take this ole, parse it, and execute it, is located in the directory /usr/bin. This may be dioeerent on some systems. If you are not sure where the xbasic executable is, type which xbasic on the command line, and it will return you the path. 2. All scripts should be marked as executable by the system. Executable oles are types that contain instructions for the machine or an inter- preter, such as xbasic, to execute. To mark a ole as executable, you need to alter the ole permissions on the script ole. There are three basic permissions: read, write, and execute. There are also three levels of access: owner, group, 93 5. WEB_Programming___________________________________________________________________________________________________________ and anyone. X11-Basic oles should have their permissions changed so that you, the owner, has permission to read, write and execute your ole, while oth- ers only have permission to read and execute your ole. This is done with the following command: chmod 755 filename.bas The number 755 is the ole access mask. The orst digit is your permission; it is 7 for full access. The user and anyone settings are 5 for read and execute. 3. The very orst print statement in a X11-Basic cgi script that returns HTML should be: PRINT "Content-type: text/html"+CHR$(13) PRINT ""+CHR$(13) FLUSH When your X11-Basic script is going to return an HTML ole, you must have this as the very orst print statement in order to tell the web server that this is an HTML ole. There must be two end of line characters (CR+LF) (the additional chr$(13)) in order for this to work. The AEush statement ensures, that this state- ment is sent to the web-server. After that, you usually print "" etc. 4. End your program with quit Do not use END. Otherwise the cgi-program will remain is the servers memory as a zombie. 5. Always use the POST method with HTML forms There are 2 ways to get information from the client to the web server. The GET method takes all of the data from the forms and concatenates it onto the end of the URL. This information is then passed to the CGI program as an environment variable (QUERY`STRING). Because the GET method has the limitation of being 1024 characters long, it is best to use the POST method. This takes the data and sends it along with the request to the web server, without the user seeing the ugly strings in the URL. This information is passed to the CGI program through standard in, which the program can easily read from. To use the POST method, make sure that your HTML form tag has METHOD=POST (no quotes). 6. HTML forms must reference the cgi script to be executed. 94 ________________________________________________________________________________________5.2.__How_it_works________________ In your FORM tag, there is an ACTION attribute. This is like the HREF at- tribute for a link. It should be the URL of the CGI program you want the form data sent to. Usually this is ACTION="/cgi-bin/filename.bas" 7. X11-Basic-cgi oles usually go in the cgi-bin directory of your web server. The web server has a "root" directory. This is the highest directory your HTML oles can access. (You don't want clients to be able to snoop around your entire system, so the rest of the system is sealed ooe) in this directory, there is usually one called cgi-bin, where all the CGI programs go. Some web service providers give each user a cgi-local directory in their home directory where they can put their cgi scripts. If this is the case, use this one instead. 5.2. How it works When a user activates a link to a gateway script, input is sent to the server. The server formats this data into environment variables and checks to see whether additional data was submitted via the standard input stream. 5.2.1. Environment Variables Input to CGI scripts is usually in the form of environment variables. The environment variables passed to gateway scripts are associated with the browser requesting infor- mation from the server, the server processing the request, and the data passed in the request. Environment variables are case-sensitive and are normally used as described in this section. The standard (and platform independent) environment variables are shown in the following table: ____________________________________________________________________________________________________ | Variable | Purpose | |_____________________________|___________________________________________________________________|__ | AUTH`TYPE | Specioes the authentication method and is | | | | | | used to validate a user's access. | |___________________________|_____________________________________________________________________|__ | CONTENT`LENGTH | Used to provide a way of tracking the length | | | | | | of the data string as a numeric value. | |_______________________|_________________________________________________________________________|__ | CONTENT`TYPE | Indicates the MIME type of data. | |_________________________|_______________________________________________________________________|__ | GATEWAY`INTERFACE | Indicates which version of the CGI standard | | | | | | the server is using. | |_____________________|___________________________________________________________________________|__||| | HTTP`ACCEPT | Indicates the MIME content types the | | | | | | browser will accept, as passed to the gateway | | | | | | script via the server. | |_________________________|_______________________________________________________________________|_ 95 5. WEB_Programming___________________________________________________________________________________________________________ ___________________________________________________________________________________________________||| | HTTP`USER`AGENT | Indicates the type of browser used to send | | | | | | the request, as passed to the gateway script | | | | | | via the server. | |______________________|__________________________________________________________________________|__||| | PATH`INFO | Identioes the extra information included in | | | | | | the URL after the identiocation of the CGI | | | | | | script. | |___________________________|_____________________________________________________________________|__||| | PATH`TRANSLATED | Set by the server based on the PATH`INFO | | | | | | variable. The server translates the | | | | | | PATH`INFO variable into this variable. | |______________________|__________________________________________________________________________|__ | QUERY`STRING | Set to the query string (if the URL contains | | | | | | a query string). | |_________________________|_______________________________________________________________________|__ | REMOTE`ADDR | Identioes the Internet Protocol address of the | | | | | | remote computer making the request. | |_________________________|_______________________________________________________________________|__ | REMOTE`HOST | Identioes the name of the machine making | | | | | | the request. | |_________________________|_______________________________________________________________________|__ | REMOTE`IDENT | Identioes the machine making the request. | |_________________________|_______________________________________________________________________|__ | REMOTE`USER | Identioes the user name as authenticated by | | | | | | the user. | |_________________________|_______________________________________________________________________|__ | REQUEST`METHOD | Indicates the method by which the request | | | | | | was made. | |_______________________|_________________________________________________________________________|__ | SCRIPT`NAME | Identioes the virtual path to the script being | | | | | | executed. | |_________________________|_______________________________________________________________________|__ | SERVER`NAME | Identioes the server by its host name, alias, | | | | | | or IP address. | |_________________________|_______________________________________________________________________|__ | SERVER`PORT | Identioes the port number the server received | | | | | | the request on. | |_________________________|_______________________________________________________________________|__ | SERVER`PROTOCOL | Indicates the protocol of the request sent to | | | | | | the server. | |______________________|__________________________________________________________________________|__ | | |_________________________________|_________________________________________________________________ AUTH`TYPE The AUTH`TYPE variable provides access control to protected areas of the Web server and can be used only on servers that support user authentication. If an area of the Web site has no access control, the AUTH`TYPE variable has no value associated with it. If an area of the Web site has access control, the AUTH`TYPE variable is set to a specioc value that identioes the authentication 96 ________________________________________________________________________________________5.2.__How_it_works________________ scheme being used. Using this mechanism, the server can challenge a client's request and the client can respond. To do this, the server sets a value for the AUTH`TYPE variable and the client supplies a matching value. The next step is to authenticate the user. Using the basic authentication scheme, the user's browser must supply authentication information that uniquely identioes the user. This information includes a user ID and password. Under the current implementation of HTTP, HTTP 1.0, the basic authentication scheme is the most commonly used authentication method. To specify this method, set the AUTH`TYPE variable as follows: AUTH`TYPE = Basic CONTENT`LENGTH The CONTENT`LENGTH variable provides a way of tracking the length of the data string. This variable tells the client and server how much data to read on the standard input stream. The value of the variable corresponds to the number of characters in the data passed with the request. If no data is being passed, the variable has no value. CONTENT`TYPE The CONTENT`TYPE variable indicates the data's MIME type. This variable is set only when attached data is passed using the standard input or out- put stream. The value assigned to the variable identioes the basic MIME type and subtype as follows: _________________________________________________________________________________________ | Type | Description | |____________________|__________________________________________________________________|_ | application | Binary data that can be executed or used with | | | | | | another application | |_______________|_______________________________________________________________________|_ | audio | A sound ole that requires an output device to | | | | | | preview | |___________________|___________________________________________________________________|_ | image | A picture that requires an output device to | | | | | | preview | |___________________|___________________________________________________________________|_ | message | An encapsulated mail message | |__________________|____________________________________________________________________|_ | multipart | Data consisting of multiple parts and possi- | | | | | | bly many data types | |________________|______________________________________________________________________|_ | text | Textual data that can be represented in any | | | | | | character set or formatting language | |____________________|__________________________________________________________________|_ | video | A video ole that requires an output device to | | | | | | preview | |___________________|___________________________________________________________________|_ | x-world | Experimental data type for world oles | |__________________|____________________________________________________________________|_ 97 5. WEB_Programming___________________________________________________________________________________________________________ MIME subtypes are deoned in three categories: primary, additionally deoned, and extended. The primary subtype is the primary type of data adopted for use as a MIME content type. Additionally deoned data types are additional subtypes that have been oOEcially adopted as MIME content types. Extended data types are experimental subtypes that have not been oOEcially adopted as MIME content types. You can easily identify extended subtypes because they begin with the letter x followed by a hyphen. The following Table lists common MIME types and their descriptions. _________________________________________________________________________________________________________________ || Type/Subtype | Description | ||______________________________________|_____________________________________________________________________|__ || application/octet-stream | Binary data that can be executed or used with | || | | || | another application | ||____________________________|_______________________________________________________________________________|__ || application/pdf | ACROBAT PDF document | ||___________________________________|________________________________________________________________________|__ || application/postscript | Postscript-formatted data | ||_____________________________|______________________________________________________________________________|__ || application/x-compress | Data that has been compressed using UNIX | || | | || | compress | ||_____________________________|______________________________________________________________________________|__ || application/x-gzip | Data that has been compressed using UNIX | || | | || | gzip | ||________________________________|___________________________________________________________________________|__ || application/x-tar | Data that has been archived using UNIX tar | ||_________________________________|__________________________________________________________________________|__ || audio/x-wav | Audio in Microsoft WAV format | ||______________________________________|_____________________________________________________________________|__ || image/gif | Image in gif format | ||_______________________________________|____________________________________________________________________|__ || image/jpeg | Image in JPEG format | ||_______________________________________|____________________________________________________________________|__ || image/tiff | Image in TIFF format | ||_______________________________________|____________________________________________________________________|__ || multipart/mixed | Multipart message with data in multiple for- | || | | || | mats | ||___________________________________|________________________________________________________________________|__ || text/html | HTML-formatted text | ||_______________________________________|____________________________________________________________________|__ || text/plain | Plain text with no HTML formatting in- | || | | || | cluded | ||_______________________________________|____________________________________________________________________|__ || video/mpeg | Video in the MPEG format | ||_______________________________________|____________________________________________________________________|__ Note, that there are more than the above listed types. Some MIME content types can be used with additional parameters. These content types include text/plain, text/html, and all multi-part message data. The charset parameter, which is optional, is used with the text/plain type to identify the character set used for the data. If a charset is not specioed, the default value charset=us-ascii is assumed. Other values for charset include any character set 98 ________________________________________________________________________________________5.2.__How_it_works________________ approved by the International Standards Organization. These character sets are deoned by ISO-8859-1 to ISO-8859-9 and are specioed as follows: CONTENT`TYPE = text/plain; charset=iso-8859-1 The boundary parameter, which is required, is used with multi-part data to identify the boundary string that separates message parts. The boundary value is set to a string of 1 to 70 characters. Although the string cannot end in a space, it can contain any valid letter or number and can include spaces and a limited set of special characters. Boundary parameters are unique strings that are deoned as follows: CONTENT`TYPE = multipart/mixed; boundary=boundary`string GATEWAY`INTERFACE The GATEWAY`INTERFACE variable indicates which version of the CGI speciocation the server is using. The value assigned to the variable identioes the name and version of the speciocation used as follows: GATEWAY`INTERFACE = name/version The version of the CGI speciocation is 1.1. A server conforming to this version would set the GATEWAY`INTERFACE variable as follows: GATEWAY`INTERFACE = CGI/1.1 HTTP`ACCEPT The HTTP`ACCEPT variable deones the types of data the client will accept. The acceptable values are expressed as a type/subtype pair. Each type/subtype pair is separated by commas. HTTP`USER`AGENT The HTTP`USER`AGENT variable identioes the type of browser used to send the request. The acceptable values are expressed as software type/version or library/version. PATH`INFO The PATH`INFO variable specioes extra path information and can be used to send additional information to a gateway script. The extra path in- formation follows the URL to the gateway script referenced. Generally, this information is a virtual or relative path to a resource that the server must inter- pret. PATH`TRANSLATED Servers translate the PATH`INFO variable into the PATH`TRANSLATED variable by inserting the default Web document's directory path in front of the extra path information. QUERY`STRING The QUERY`STRING variable specioes an URL-encoded search string. You set this variable when you use the GET method to submit a oll-out form or when you use an ISINDEX query to search a document. The query string 99 5. WEB_Programming___________________________________________________________________________________________________________ is separated from the URL by a question mark. The user submits all the infor- mation following the question mark separating the URL from the query string. The following is an example: /cgi-bin/doit.cgi?string When the query string is URL-encoded, the browser encodes key parts of the string. The plus sign is a placeholder between words and acts as a substitute for spaces: /cgi-bin/doit.cgi?word1+word2+word3 Equal signs separate keys assigned by the publisher from values entered by the user. In the following example, response is the key assigned by the publisher, and never is the value entered by the user: /cgi-bin/doit.cgi?response=never Ampersand symbols separate sets of keys and values. In the following exam- ple, response is the orst key assigned by the publisher, and sometimes is the value entered by the user. The second key assigned by the publisher is reason, and the value entered by the user is I am not really sure: /cgi-bin/doit.cgi?response=sometimes&reason=I+am+not+really+sure Finally, the percent sign is used to identify escape characters. Following the percent sign is an escape code for a special character expressed as a hexadeci- mal value. Here is how the previous query string could be rewritten using the escape code for an apostrophe: /cgi-bin/doit.cgi?response=sometimes&reason=I%27m+not+really+sure REMOTE`ADDR The REMOTE`ADDR variable is set to the Internet Protocol (IP) ad- dress of the remote computer making the request. REMOTE`HOST The REMOTE`HOST variable specioes the name of the host computer making a request. This variable is set only if the server can ogure out this information using a reverse lookup procedure. REMOTE`IDENT The REMOTE`IDENT variable identioes the remote user making a request. The variable is set only if the server and the remote machine making the request support the identiocation protocol. Further, information on the remote user is not always available, so you should not rely on it even when it is available. 100 ________________________________________________________________________________________5.2.__How_it_works________________ REMOTE`USER The REMOTE`USER variable is the user name as authenticated by the user, and as such is the only variable you should rely upon to identify a user. As with other types of user authentication, this variable is set only if the server supports user authentication and if the gateway script is protected. REQUEST`METHOD The REQUEST`METHOD variable specioes the method by which the request was made. The methods could be any of GET, HEAD, POST, PUT, DELETE, LINK and UNLINK. The GET, HEAD and POST methods are the most commonly used request meth- ods. Both GET and POST are used to submit forms. SCRIPT`NAME The SCRIPT`NAME variable specioes the virtual path to the script being executed. This information is useful if the script generates an HTML document that references the script. SERVER`NAME The SERVER`NAME variable identioes the server by its host name, alias, or IP address. This variable is always set. SERVER`PORT The SERVER`PORT variable specioes the port number on which the server received the request. This information can be interpreted from the URL to the script if necessary. However, most servers use the default port of 80 for HTTP requests. SERVER`PROTOCOL The SERVER`PROTOCOL variable identioes the protocol used to send the request. The value assigned to the variable identioes the name and version of the protocol used. The format is name/version, such as HTTP/1.0. 5.2.2. CGI Standard Input Most input sent to a Web server is used to set environment variables, yet not all input ots neatly into an environment variable. When a user submits data to be processed by a gateway script, this data is received as an URL-encoded search string or through the standard input stream. The server knows how to process this data because of the method (either POST or GET in HTTP 1.0) used to submit the data. Sending data as standard input is the most direct way to send data. The server tells the gateway script how many eight-bit sets of data to read from standard input. The script opens the standard input stream and reads the specioed amount of data. Although long URL-encoded search strings may get truncated, data sent on the stan- dard input stream will not. Consequently, the standard input stream is the preferred way to pass data. 101 5. WEB_Programming___________________________________________________________________________________________________________ 5.2.3. Which CGI Input Method to use? You can identify a submission method when you create your oll-out forms. Two submission methods for forms exist. The HTTP GET method uses URL-encoded search strings. When a server receives an URL-encoded search string, the server assigns the value of the search string to the QUERY`STRING variable. The HTTP POST method uses the standard input streams. When a server receives data by the standard input stream, the server assigns the value associated with the length of the input stream to the CONTENT`LENGTH variable. 5.2.4. Output from CGI Scripts After the script onishes processing the input, the script should return output to the server. The server will then return the output to the client. Generally, this output is in the form of an HTTP response that includes a header followed by a blank line and a body. Although the CGI header output is strictly formatted, the body of the output is formatted in the manner you specify in the header. For example, the body can contain an HTML document for the client to display. 5.2.5. CGI Headers CGI headers contain directives to the server. Currently, these three server directives are valid: # Content-Type # Location # Status A single header can contain one or all of the server directives. Your CGI script outputs these directives to the server. Although the header is followed by a blank line that separates the header from the body, the output does not have to contain a body. The Content-Type oeld in a CGI header identioes the MIME type of the data you are sending back to the client. Usually the data output from a script is a fully formatted document, such as an HTML document. You could specify this output in the header as follows: Content-Type: text/html But of course, if your program outputs other data like images etc. you should specify the corresponding content type. 102 ________________________________________________________________________________________5.2.__How_it_works________________ Locations The output of your script doesn't have to be a document created within the script. You can reference any document on the Web using the Location oeld. The Location oeld references a ole by its URL. Servers process location references either directly or indirectly depending on the location of the ole. If the server can ond the ole locally, it passes the ole to the client. Otherwise, the server redirects the URL to the client and the client has to retrieve the ole. You can specify a location in a script as follows: Location: http://www.new-jokes.com/ Status The Status oeld passes a status line to the server for forwarding to the client. Status codes are expressed as a three-digit code followed by a string that generally explains what has occurred. The orst digit of a status code shows the general status as follows: 1XX Not yet allocated 2XX Success 3XX Redirection 4XX Client error 5XX Server error Although many status codes are used by servers, the status codes you pass to a client via your CGI script are usually client error codes. Suppose the script could not ond a ole and you have specioed that in such cases, instead of returning nothing, the script should output an error code. Here is a list of the client error codes you may want to use: 401 Unauthorized Authentication has failed. User is not allowed to access the file and should try again. 403 Forbidden. The request is not acceptable. User is not permitted to access file. 404 Not found. The specified resource could not be found. 405 Method not allowed. The submission method used is not allowed. 103 5. WEB_Programming___________________________________________________________________________________________________________ 5.2.6. Example cgi-Script envtest.cgi Here is a simple sample cgi-script, which simply returns all the information which it gets from the web server as a html page. #!/usr/bin/xbasic PRINT "Content-type: text/html"+CHR$(13) PRINT ""+CHR$(13) FLUSH PRINT "Test CGI" PRINT "

Commandline:

" i=0 WHILE LEN(PARAM$(i)) PRINT STR$(i)+": "+PARAM$(i)+"
" INC i WEND PRINT "

Environment:

"
FLUSH        ! flush the output before another program is executed !
SYSTEM "env"
PRINT "

Stdin:

"
length=VAL(ENV$("CONTENT`LENGTH"))
IF length
   FOR i=0 TO length-1
     t$=t$+CHR$(inp(-2))
   NEXT i
   PRINT t$
ENDIF
PRINT "
" PRINT "
" PRINT "Name:
" PRINT "Email:
" PRINT "" PRINT "
" PRINT "
(c) Markus Hoffmann cgi with X11-basic
" FLUSH QUIT 104 6.1. Reserved variable names X11-Basic6ThQuickerreferencee are some reserved variables. Some Keywords may not work as variable names as well. Although there is no checking done, parsing errors could occur. Please try the command LET in such cases. In general, as long as an ending of a variable name is dioeerent from any command or keyword, it's usable as name. Reserved and system variables are: int ANDROID? -1 on Android systems, else 0 p.144 int COLS number of columns of the text terminal p.200 int CRSCOL text cursor position: current column p.210 int CRSLIN text cursor position: current line p.210 AEt CTIMER CPU system timer (seconds) p.211 int ERR number of the last error p.259 int FALSE constant: 0 p.278 int GPS? TRUE if GPS is available, else 0 p.318 AEt GPS`ALT Altitude in m received from GPS p.319 AEt GPS`LAT latitude in degrees received from GPS p.320 AEt GPS`LON longitude in degrees received from GPS p.320 int MOUSEK mouse button state p.398 int MOUSES state of the shift, alt, ctrl, caps keys p.398 int MOUSEX x coordinate of mouse position p.398 int MOUSEY y coordinate of mouse position p.398 int PC program counter p.436 AEt PI constant: 3.14159265359... p.440 int ROWS number of rows of the text terminal p.504 int SENSOR? TRUE if sensor phalanx is available p.521 int SP internal stack pointer p.547 int STIMER integer system timer p.555 AEt TIMER Unix system timer, AEoat p.575 int TRUE constant: -1 p.583 int UNIX? TRUE if OS is UNIX like (Linux, BSD) p.589 int WIN32? TRUE if OS is MS WINDOWS 32 bit p.613 DATE$ current date p.219 105 6. Quick_reference___________________________________________________________________________________________________________ FILEEVENT$ get events about oles p.281 INKEY$ content of the keyboard-buoeer p.336 TERMINALNAME$ device name of the standard terminal p.571 TIME$ current time p.574 TRACE$ current program code line p.579 6.2. Conditions Conditions and expression are the same, FALSE is deoned as 0 and TRUE as -1. As a consequence, Boolean operators like AND, OR, XOR etc. are applied as a bitwise operation. This way they can be used in expressions as well as in conditions. 6.3. Numbers and Constants Number constants may precede 0x to represent hex values. String constants are marked with pairs of "". Array constants have following format: [ , , ; , , ; , , ]. 6.4. Operators Precedence is deoned as follows (highest orst): 0. () (brackets) 1. ^ (power) 2. * / (multiplication, division) 3. " (modulo) 4. - + () 5. MOD DIV (modulus, ...) p.394,237 6. < > = <> <= >= (comparison operators) 7. AND OR XOR NOT EQV IMP (logical operators) p.142,429, 413,257,333 106 _______________________________________________________________________________________6.5.__Abbreviations________________ 6.5. Abbreviations In direct mode in the interpreter every command can be abbreviated as long as the command parser can identify uniquely the command. So you may use q instead of QUIT. In addition there are abbreviations which are actually alternate commands like: ___________________________________________________________ | ' REM p.484 | | | | ? PRINT p.457 | | | | @ GOSUB p.314 | | | | " VOID p.605 | | | | ! comment at the end of a line | | | | & EVAL / indirect command p.262 | |_______________________________________________________|__ 6.6. Interpreter Commands CLEAR clear and remove all variables p.191 CONT continue (after STOP) p.205 DUMP lists all used variable names p.243 DUMP "@" list of functions and procedures p.243 DUMP ":" list of all labels p.243 DUMP "#" list of open oles p.243 DUMP "K" list of implemented commands p.243 DUMP "F" list of internal functions p.243 ECHO ON/OFF same as TRON * TROFF p.245 EDIT call default editor to edit program p.246 HELP prints short help on expr p.324 LIST [s,e] List program code (from line s to e) p.365 LOAD file$ load program p.367 NEW clear all variables, erase program and stop p.407 PLIST formatted listing p.444 PROGRAM options set title and compiler options p.464 QUIT quits the X11-BASIC-Interpreter p.471 REM comment remark in program p.484 RUN start program p.507 STOP stop program p.556 107 6. Quick_reference___________________________________________________________________________________________________________ SAVE [file$] writes the BASIC-program into ole p.509 TROFF Trace mode ooe p.581 TRON Trace mode on (for debugging) p.582 VERSION shows X11-Basic version number and date p.604 XLOAD select and load a program p.619 XRUN select, load and run a program p.622 6.7. Flow Control Commands AFTER n,procedure execute procedure after n seconds p.138 BREAK same as EXIT IF TRUE p.169 CASE const SELECT * CASE * DEFAULT * ENDSELECT p.180 CHAIN bas$ executes another basic program p.183 CONTINUE SELECT * CASE * CONTINUE * ENDSELECT p.205 DEFAULT SELECT * CASE * DEFAULT * ENDSELECT p.223 DEFFN deone function macro. p.225 DO * LOOP (endless) loop without condition p.238 DOWNTO FOR ... DOWNTO p.239 ELSE see IF * ELSE * ENDIF p.248 ELSE IF see IF * ELSE * ENDIF p.248 END program end, enter interactive mode p.251 ENDFUNCTION FUNCTION * ENDFUNCTION p.252 ENDIF IF * ELSE * ENDIF p.253 ENDSELECT SELECT * CASE * DEFAULT * ENDSELECT p.254 EVERY n,procedure invokes procedure every n seconds p.267 EXIT IF a exit loop if condition a is TRUE p.273 FOR * NEXT For Next loop p.290 FUNCTION * ENDFUNC deone function p.302 GOSUB proc(...) call subroutine p.314 GOTO label goto label p.315 IF * ELSE * ENDIF conditional blocks p.331 LOOP DO * LOOP p.375 NEXT FOR * NEXT p.408 ON BREAK GOSUB proc deone procedure on break p.424 ON ERROR GOSUB proc deone procedure on error p.425 108 ____________________________________________________________6.8.__Console_Input/Output_Commands___________________________ ON * GOSUB proc1,...excecute subroutine depending on value p.422 ON * GOTO label1,...branch to dioeerent labels depending on value p.423 REPEAT REPEAT * UNTIL p.486 RESUME resume program after error p.489 RETURN deone the end of a PROCEDURE p.490 SELECT expr SELECT * CASE * DEFAULT * ENDSELECT p.516 UNTIL exp REPEAT * UNTIL p.593 SPAWN procedure Spawn new thread p.549 6.8. Console Input/Output Commands BEEP Beep (on TTY/console) p.161 BELL same as BEEP p.161 CLS clear (text)screen p.197 FLUSH AEush output p.289 HOME textcursor home p.328 INPUT "text";varlistread values for variables p.340 LINEINPUT t$ read entire line from channel/ole/console p.362 LOCATE row,column Place cursor on column and row p.370 PRINT a;b$ console output p.457 PRINT AT(x,y); locate textcursor at row y and column x p.458 PRINT COLOR(x,y); change text color p.459 PRINT TAB(x); locate textcursor at column x p.?? PRINT SPC(x); move textcursor x columns p.?? PRINT a USING f$ print number with formatter p.461 PUTBACK a put back a char to console p.468 6.9. File Input/Output Commands BGET #f,a,n read n bytes from ole #f to address a p.162 BLOAD f$,a[,l] reads entire ole (given by name) to address a p.164 BPUT #f,a,n writes n bytes from address a to ole/channel f p.168 109 6. Quick_reference___________________________________________________________________________________________________________ BSAVE f$,a,l saves l bytes in memory at address a to ole f$ p.170 CHDIR path$ change current working directory p.184 CHMOD file$,m change ole permissions p.185 CLOSE [[#]n] close ole, I/O channel or link p.194 FLUSH [#n] AEush output p.289 KILL file$ delete a ole p.353 MAP maps a ole into memory p.?? UNMAP unmaps memory p.592 MKDIR path$ create a directory p.392 OPEN m$,#n,file$ open a ole or socket for input and/or output p.426 OUT #n,a out byte a to channel n p.431 PRINT #n; output to channel/ole p.457 PUTBACK [#n,]a put back a char to channel/ole/console p.468 RELSEEK #n,d Place olepointer on new relative position p.483 RENAME file$,dst$ rename and move a ole p.485 RMDIR path$ remove an empty directory p.497 SEEK #n,d place olepointer to absolute position p.515 TOUCH #n update timestamps of ole p.578 WATCH file$ monitor ole changes p.608 6.10. Variable Manipulation Commands ABSOLUTE x,adr% Assigns the address to the variable x. p.133 ARRAYCOPY dst(),src()copies array including dimensioning p.148 ARRAYFILL a(),b olls array with value p.148 CLR a,b,c(),f$ clear variables; same as a=0;b=0;c()=[];f$="" p.196 DEC var decrement variable; same as var=var-1 p.220 DIM declare and create array p.234 ERASE a()[,...] erase arrays p.258 INC a increments variable a p.334 LET a=b enforces assignment p.359 LOCAL var[,...] declare local variables in a procedure or function p.369 SORT a(),n[,b()] Sort array p.543 SWAP a,b Swap variables p.562 VAR vars declare arguments to be passed "by reference" p.601 110 ________________________________________________________6.11.__Memory_Manipulation_Commands_______________________________ 6.11. Memory Manipulation Commands ABSOLUTE x,adr% Assigns the address to the variable x. p.133 BMOVE q,z,n copies a block of n bytes from address q to z p.165 DPOKE adr,word write short int word to adr p.240 FREE adr% Frees a previously allocated memory block. p.297 LPOKE adr,long writes long int value to pointer adr p.378 MFREE adr% Frees a previously allocated memory block. p.389 MSYNC adr%,l AEushes changes map memory back to disk p.401 POKE adr,byte write byte to pointer adr p.449 SHM`DETACH adr% detaches the shared memory segment p.531 SHM`FREE adr% frees the shared memory segment p.532 6.12. Math commands ADD a,b same as a=a+b but faster p.136 DEC var same as var=var-1 but faster p.220 DIV a,b same as a=a/b but faster p.237 FFT a(),i fast fourier transformation on 1D array. p.280 FIT x(),y()[,yerr()],n,func(x,a,b,c,...) ots function to data p.284 FIT`LINEAR x(),y()[,[xerr(),]yerr()],n,a,b[,siga,sigb,chi2,q] linear regression with errors p.285 FIT`POLY x(),y(),dy(),n%,a(),m% ot a polynom to datapoints p.286 INC var same as var=var+1 but faster p.334 MUL a,b same as a=a*b but faster p.404 SORT a(),n[,b()] sorts n values of a() to incrementing order p.543 SUB a,b same as a=a-b but faster p.559 111 6. Quick_reference___________________________________________________________________________________________________________ 6.13. Other Commands CALL adr[,par,...] see EXEC p.177 CONNECT #n,t$[,i%] connect a channel p.204 DATA 1,"Hallo",... deone constants p.218 DELAY sec same as PAUSE p.231 ERROR n execute error number n p.261 EVAL t$ execute X11-Basic command contained in t$ p.262 EXEC adr[,var,...] call a C subroutine at pointer adr. p.269 GET`LOCATION ,,,,,,, returns the position of the device p.311 GPS ON/OFF turns GPS device on/ooe p.317 LINK #n,t$ load shared object ole t$ p.364 UNLINK #n unload shared object ole p.591 MERGE f$ Merges bas-ole to actual program code p.388 NOP no operation do nothing p.410 NOOP no operation do nothing p.410 PAUSE sec pauses sec seconds p.434 PIPE #l,#k links two ole channels p.441 PLAYSOUND c,s$ plays a WAV sample p.442 PLAYSOUNDFILE file$ plays a sound ole p.443 PROCEDURE proc(p1,...)PROCEDURE * RETURN p.462 RANDOMIZE [seed] Sets seed for random generator p.477 READ var reads constant from DATA statement p.479 RECEIVE #n,t$ receive a message from a socket p.482 RESTORE [label] (re)sets pointer for READ-statement to label p.488 RETURN expr return value from FUNCTION p.490 RSRC`LOAD file$ loads GEM rsc-File (ATARI ST) p.506 RSRC`FREE frees GEM rsc-File p.505 SEND #n,t$ send a message to a socket p.518 SENSOR ON/OFF turns SENSORs on/ooe p.522 SETENV t$=a$ Sets environmentvar t$ using value a$ p.523 SOUND freq Sound the internal speaker p.545 SPLIT t$,d$,mode,a$,b$splits t$ by deliminator d$ into a$ and b$ p.551 SHELL t$ execute ole as shell p.528 SPEAK t$ Text to speach p.550 SYSTEM t$ execute shell with command t$ p.565 112 ______________________________________________________________________________6.14.__Graphic_commands_____________________ UNLINK #n un-links shared object #n p.591 VOID a calculates expression a and discard result p.605 WAVE c,f, control the sound synthesizer p.609 WORT`SEP same as SPLIT p.617 6.14. Graphic commands 6.14.1. Drawing and painting BOUNDARY f switch borders on or ooe p.166 BOX x1,y1,x2,y2 draw a frame p.167 CIRCLE x,y,r,, draw a circle p.190 CLIP ,,,,, clipping function p.193 COLOR f[,b] Set foreground color (and background color) p.198 COPYAREA ,,,,, copy a rectangular screen section p.206 CURVE ,,,,,,, cubic Bezier-curve p.212 DEFFILL c,a,b set oll style and pattern p.224 DEFLINE a,b set line width and type p.226 DEFMARK c,a,g set color, size, type (POLYMARK) p.227 DEFMOUSE i set mouse cursor type p.228 DEFTEXT c,s,r,g set text properties for ltext p.229 DRAW [[x1,y1] TO] x2,y2draw line p.242 ELLIPSE x,y,a,b[,a1,a2]draw an ellipse p.247 FILL x,y AEood oll p.283 GET x,y,w,h,g$ store a portion of the screen bitmap in g$ p.308 GPRINT like PRINT, but the output goes to the graphic windowp.316 GRAPHMODE mode set graphic-mode p.321 LINE x1,y1,x2,y2 draw a line p.361 LTEXT x,y,t$ Linegraphic-Text p.379 PBOX x1,y1,x2,y2 draw olled box p.435 PCIRCLE x,y,r[,a1,a2] draw olled circle p.437 PELLIPSE x,y,a,b[,a1,a2]draw olled ellipse p.439 PLOT x,y draw point p.445 POLYLINE n,x(),y() draw polygon in (x(),y()) p.451 POLYFILL n,x(),y() draw olled polygon p.450 113 6. Quick_reference___________________________________________________________________________________________________________ POLYMARK n,x(),y() draw polygon points p.452 PRBOX x1,y1,x2,y2 draw olled rounded box p.454 PUT x,y,g$ map graphic at position p.466 PUT`BITMAP t$,i,i,i,i map bitmap p.469 RBOX x1,y1,x2,y2 draws a rounded box p.478 SCOPE a(),typ,ys,yo fast plot of data a() p.512 SCOPE y(),x(),typ,ys,yo,xs,xofast 2D plot of data p.512 SETFONT f$ set bitmap font p.524 SETMOUSE x,y set mouse cursor p.525 SGET screen$ capture graphic and store it in screen$ p.526 SPUT screen$ maps graphic to window/screen p.552 TEXT x,y,t$ draw text (bitmap font) p.573 6.14.2. Screen/Window commands CLEARW [#n] clear graphic window p.192 CLOSEW [#n] close graphic window p.195 FULLW n make window fullscreen p.301 GET`GEOMETRY ,,,, returns the size of the window or screen p.310 GET`SCREENSIZE ,,,, returns the size of the screen p.312 INFOW n,t$ set window information p.335 MOVEW n,x,y move window p.399 OPENW n open window p.428 ROOTWINDOW draw on screen background p.500 NOROOTWINDOW switch back to normal output p.412 SAVESCREEN file$ save screen bitmap into a ole p.510 SAVEWINDOW file$ save window bitmap into a ole p.511 SCREEN n select Screen mode p.514 SHOWPAGE perform pending graphic operations p.535 SIZEW n,w,h size window p.540 TITLEW n,t$ set window title p.576 TOPW n move window to front p.577 USEWINDOW #n direct graphics output to window n p.595 VSYNC same as SHOWPAGE p.606 114 ___________________________________________________________________6.15.__File_Input/Output_functions_____________________ 6.14.3. GUI/User input commands ALERT a,b$,c,d$,var[,ret$]Show Alert/Infobox and wait for user input p.140 EVENT ,,,,,,,, Waits until an event occurs p.265 FILESELECT tit$,path$,dflt$,f$display a oleselector-box p.282 HIDEM hide the mouse cursor p.327 KEYEVENT a,b Waits until key is pressed p.352 LISTSELECT tit$,list$()display a selector-box p.366 MENUDEF m$(),proc read menu titles and items from m$() p.385 MENUKILL deletes menu p.386 MENUSET n,x change menu-point #n with value x p.387 MENU STOP switch ooe the menu p.?? ONMENU execute the menu and p.?? MENU wait for menu-events p.384 MOUSE x,y,k gets position and state of mouse p.396 MOUSEEVENT ,,, wait for mouse event p.397 MOTIONEVENT ,,, wait for mouse movement p.395 OBJC`ADD t%,o%,c% add object to tree p.415 OBJC`DELETE t%,o% delete object from tree p.416 RSRC`LOAD file$ loads a GEM resource ole p.506 RSRC`FREE unloads a GEM resource p.505 SHOWM show the mouse cursor p.534 6.15. File Input/Output functions d%=DEVICE(file$) returns the device id of a ole p.233 b=EOF(#n) TRUE if ole pointer reached end of ole p.256 b=EXIST(fname$) TRUE if ole fname$ exist p.271 a=FREEFILE() Returns orst free olenumber or -1 p.298 a$=FSFIRST$(path$,,)searches for the orst ole in a olesystem p.299 a$=FSNEXT$() searches for the next ole p.300 c=INP(#n) reads a byte from channel/ole. p.338 c=INP?(#n) number of bytes which can be read p.339 a=INP&(#n) reads a word (2 Bytes) from channel/ole. p.338 115 6. Quick_reference___________________________________________________________________________________________________________ i=INP%(#n) reads a long (4 Bytes) from channel/ole. p.338 t$=INPUT$(#n,num) reads num bytes from ole/channel n p.341 ret=IOCTL(#n,d%,) performs settings on channel/ole. p.346 t$=LINEINPUT$(#n) reads a line from ole/channel n p.362 p=LOC(#n) Returns value of ole position indicator p.368 l=LOF(#n) length of ole p.371 l%=SIZE(file$) returns the size of a ole p.539 t$=TERMINALNAME$(#n)returns device name of terminal connected to #n p.571 6.16. Variable/String Manipulation functions adr%=ARRPTR(b()) pointer to array descriptors p.150 a=ASC(t$) ASCII code of orst letter of string p.151 b$=BIN$(a[,n]) convert to binary number p.163 t$=CHR$(a) convert ASCII code to string p.187 a$=DECLOSE$(t$) removes enclosing characters from string p.221 a=DIM?(a()) returns number of elements of array a() p.234 a$=ENCLOSE$(t$[,p$])encloses a string p.249 f=GLOB(a$,b$[,flags])TRUE if a$ matches pattern b$ p.313 t$=HEX$(a[,n]) a as hexadecimal number p.326 t$=INLINE$(a$) 6-bit ASCII to 8-bit binary conversion p.337 a=INSTR(s1$,s2$[,n])tests if s2$ is contained in s1$ p.342 a=TALLY(t$,s$) returns the number of occurrences of s$ in t$ p.568 b%=INT(a) convert to integer p.343 t$=LEFT$(a$[,n]) extracts n bytes from string a$ from the left p.356 t$=LEFTOF$(a$,b$) returns left part of a$ split at b$ p.357 l=LEN(t$) length of string p.358 u$=LOWER$(t$) converts t$ to lower case p.376 l=LTEXTLEN(t$) size of text p.380 m$=MID$(t$,s[,l]) extracts l bytes from string t$ from position s p.390 t$=MKA$(a()) convert a whole array into a string p.393 t$=MKI$(i) convert integer to 2-byte string p.393 t$=MKL$(i) convert integer to 4-byte string p.393 t$=MKF$(a) convert AEoat to 4 byte string p.393 t$=MKD$(a) convert AEoat to 8 byte string p.393 116 __________________________________________________6.17.__Data_compression_and_coding_functions____________________________ o$=OCT$(d,n) convert integer d to string with octal number p.420 t$=REPLACE$(a$,s$,r$)replace s$ by r$ in a$ p.487 t$=REVERSE$(a$) Return the reverses of a string p.491 t$=RIGHT$(a$[,n]) returns right n characters of a$ p.492 t$=RIGHTOF$(a$,b$) returns right part of a$ split at b$ p.493 a=RINSTR(s1$,s2$[,n])tests from right if s2$ is contained in s1$ p.494 t$=SPACE$(i) returns string consisting of i spaces p.548 t$=STR$(a[,b,c]) convert number to string p.557 t$=STRING$(i,w$) returns string consisting of i copies of w$ p.558 u$=TRIM$(t$) trim t$ p.580 u$=XTRIM$(t$) trim t$ p.623 u$=UCASE$(t$) converts t$ to upper case p.587 u$=UPPER$(t$) converts t$ to upper case p.594 u$=USING$(a,f$) formats a number p.596 a=VAL(t$) converts String/ASCII to number p.599 i=VAL?(t$) returns number of chars which are part of a number p.599 adr%=VARPTR(v) returns pointer to variable p.603 u$=WORD$(b$,n) returns n th word of b$ p.615 e=WORT`SEP(t$,d$,m,a$,b$)splits t$ into parts p.?? 6.17. Data compression and coding functions b$=ARID$(a$) order-0 adaptive arithmetic decoding p.146 b$=ARIE$(a$) order-0 adaptive arithmetic encoding p.147 b$=BWTD$(a$) inverse Burrows-Wheeler transform p.173 b$=BWTE$(a$) Burrows-Wheeler transform p.174 c$=COMPRESS$(a$) lossless compression on the string p.202 c$=UNCOMPRESS$(a$) lossless uncompression on the string p.588 c%=CRC(t$[,oc]) 32 bit checksum p.209 e$=ENCRYPT$(t$,key$)encrypts a message p.250 t$=DECRYPT$(e$,key$)decrypts a message p.222 b$=MTFD$(a$) Move To Front decoding p.402 b$=MTFE$(a$) Move To Front encoding p.403 b()=CVA(a$) returns array reconstructed from the string p.213 b%=CVI(a$) convert 2-byte string to integer p.215 117 6. Quick_reference___________________________________________________________________________________________________________ b%=CVL(a$) convert 4-byte string to integer p.215 b=CVS(a$) convert 4-byte string to AEoat p.216 b=CVF(a$) convert 4-byte string to AEoat p.214 b=CVD(a$) convert 8-byte string to double p.214 t$=INLINE$(a$) 6-bit ASCII to 8-bit binary conversion p.337 t$=REVERSE$(a$) return the reverses of a string p.491 b$=RLD$(a$) run length decoding p.495 b$=RLE$(a$) run length encoding p.496 6.18. Memory Manipulation functions adr%=ARRPTR(b()) pointer to array descriptors p.150 i%=DPEEK(adr%) read word from pointer adr p.240 b%=LPEEK(adr%) reads long (4 Bytes) from address p.377 adr%=MALLOC(n%) allocates size bytes of memory p.382 adr%=MSHRINK(adr%,n%)reduces the size of a storage area p.400 d%=PEEK(a%) reads Byte from address a p.438 adr%=REALLOC(oadr%,n%)changes the size of a storage area p.481 adr%=SHM`ATTACH(id) attaches the shared memory segment p.530 id=SHM`MALLOC(size,key)returns the identioer of the shared memory segment p.533 adr%=SYM`ADR(#n,s$) return pointer to symbol from shared object ole p.564 adr%=VARPTR(v) returns pointer to variable p.603 6.19. Logic functions c%=AND(a%,b%) same as c=(a AND b) p.142 c%=OR(a%,b%) same as c=(a OR b) p.429 c%=XOR(a%,b%) same as c=(a XOR b) p.620 c%=EQV(a%,b%) same as c=(a EQV b) p.257 c%=IMP(a%,b%) same as c=(a IMP b) p.333 b%=BCHG(x%,bit%) changes the bit of x from 0 to 1 or from 1 to 0 p.159 b%=BCLR(x%,bit%) sets the bit of x to zero. p.159 118 ____________________________________________________________________________________6.20.__Math_functions_________________ b%=BSET(x%,bit%) sets the bit of x to 1. p.171 b%=BTST(x%,bit%) returns -1 if the bit of x is 1. p.172 b%=BYTE(x%) same as b=x AND 255 p.175 b%=CARD(x%) same as b=x AND 0xoeoe p.179 b%=WORD(x%) same as b=x AND 0xoeoe p.614 b%=EVEN(d) TRUE if d is an even number p.264 b%=ODD(d) TRUE if d is an odd number p.421 b%=GRAY(a) Gray code. if a<0: inverse Gray code p.322 b%=SHL(a) Shift bits to left p.529 b%=SHR(a) Shift bits to right p.536 b%=SWAP(a) Swaps High and Low words of a p.562 6.20. Math functions The math function library contains a comprehensive set of mathematics functions, including: # trigonometric # arc-trigonometric # hyperbolic # arc-hyperbolic # logarithmic ( base e and base 10 ) # exponential ( base e and base 10 ) # miscellaneous ( square root, power, etc. ) Some math functions are deoned on Vectors and Matrices. b=ABS(a) absolute value b = jaj p.132 c=ADD(a,b) add c = a + b p __ p.136 b=CBRT(a) cube root b = 3 a p.181 a=CEIL(b) truncate number p.182 a=CINT(b) truncate number (note: dioeers from INT() !) p.189 z=COMBIN(n,k) number of combinations z = ____n!_____(n k)! k! p.201 c=DIV(a,b) divide c = a=b p.237 b()=FFT(a()[,f%]) discrete Fourier Transformation of a real array p.280 a=FIX(b) round number to integer p.287 119 6. Quick_reference___________________________________________________________________________________________________________ a=FLOOR(b) round number down to integer p.288 b=FRAC(a) fractional (non-integer) part of a p.296 y=GAMMA(x) gamma function y = (x) p.305 y=LGAMMA(x) logarithm ofpgamma_function_y = jln (x)j p.360 a=HYPOT(x,y) returns a = x2 + y2 p.329 b=INT(a) convert to integer p.343 b()=INV(a()) calculate inverse of a square matrix p.344 i=SGN(a) sign of a (-1,0,1)p__ p.527 b=SQR(a) square root b =p _a_ p.553 b=SQRT(a) square root b = a p.553 b=TRUNC(a) truncate number p.584 b=LN(a) base e logarithm (natural log) p.372 b=LOG(a) base e logarithm (natural log) p.372 b=LOG10(a) base 10 logarithm p.372 b=LOGB(x) base 2 logarithm p.373 b=LOG1P(x) b = log (1 + x) accurate near zero p.374 c=MOD(a,b) same as c=(a MOD b) p.394 c=MUL(a,b) multiply c = a b p.404 b=EXP(a) exponential function b = ex (e to the x) p.274 b=EXPM1(a) exponential function minus 1 b = ex 1 p.275 b=FACT(a) factorial b = a! p.277 a=PRED(x) returns the preceding integer of x p.455 a=SUCC(x) returns the next higher integer p.561 b()=SOLVE(a(),x()) solve linear equation system p.541 z=VARIAT(n,k) number of permutations of n elements p.602 6.20.1. Angles Angles are always radians, for both, arguments and return values. b=RAD(a) convert degrees to radians p.473 b=DEG(a) convert radians to degrees p.230 120 _________________________________________________________________________________6.21.__System_functions__________________ 6.20.2. Trigonometric functions b=SIN(a) sine p.537 b=COS(a) cosine p.207 b=TAN(a) tangent p.569 b=ASIN(a) arc-sine p.152 b=ACOS(a) arc-cosine p.134 b=ATAN(a) arc-tangent p.155 b=ATN(a) arc-tangent p.155 b=ATAN2(a,c) extended arc-tangent p.155 b=SINH(a) hyperbolic sine p.538 b=COSH(a) hyperbolic cosine p.207 b=TANH(a) hyperbolic tangent p.570 b=ASINH(a) hyperbolic arc-sine p.152 b=ACOSH(a) hyperbolic arc-cosine p.134 b=ATANH(a) hyperbolic arc-tangent p.156 6.20.3. Random numbers a=GASDEV(dummy) random number Gauss distribution p.306 a=RAND(dummy) random integer number p.475 a=RANDOM(n) random integer number between 0 and n p.476 a=RND(dummy) random number between 0 and 1 p.498 a=SRAND(seed) same as RANDOMIZE p.554 6.21. System functions ret%=CALL(adr%[,par])Calls a machine code or C subroutine p.177 t$=ENV$(n$) read value of environment variable n$ p.255 t$=ERR$(i) error message p.260 ret=EXEC(adr[,var]) see command EXEC, returns int p.269 i%=FORK() creates a child process p.291 121 6. Quick_reference___________________________________________________________________________________________________________ d$=JULDATE$(a) date$ by Julian day a p.349 a=JULIAN(date$) Julian day p.350 a$=PARAM$(i) i'th word from the commandline p.433 t$=PRG$(i) program line p.456 a=SENSOR(i) get the value from the i th sensor p.522 t$=SYSTEM$(n$) execute shell with command n$ p.565 t$=UNIXTIME$(i) give time$ from TIMER value p.590 d$=UNIXDATE$(i) give date$ from TIMER value p.590 6.22. Graphic functions c=COLOR`RGB(r,g,b[,a])allocate color by rgb(a) value p.199 a=EVENT?(mask%) returns TRUE if a graphics event is pending p.266 a=FORM`ALERT(n,t$) message box with default button n p.292 "FORM`CENTER(adr%,x,y,w,h)centers the object tree on screen p.293 a=FORM`DIAL(,,,,,,,,) complex function for screen preparation p.294 a=FORM`DO(i) do dialog p.295 c=GET`COLOR(r,g,b) allocate color by rgb value p.309 d=OBJC`DRAW(,,,,) draw object tree p.417 ob=OBJC`FIND(tree,x,y)return object number by coordinates p.418 a=OBJC`OFFSET(t%,o,x,y)calculate absolute object coordinates p.419 c=POINT(x,y) returns color of pixel of graphic in window p.448 c=PTST(x,y) returns color of pixel of graphic in window p.465 a=RSRC`GADDR(typ,nr) get pointer to object tree p.?? 6.23. Other functions a=EVAL(t$) evaluate expression contained in t$ p.262 m=MAX(a,b,c,...) returns biggest value p.383 m=MAX(f()) not implemented yet m=MIN(a,b,c,...) returns smallest value p.391 m=MIN(array()) not implemented yet 122 ____________________________________________________________________6.24.__Subroutines_and_Functions______________________ m=MIN(function()) not implemented yet 6.24. Subroutines and Functions Subroutines are blocks of code that can be called from elsewhere in the program. Subroutines can take arguments but return no results. They can access all variables available but also may have local variables (~> LOCAL). Subroutines are deoned with PROCEDURE name(argumentlist) ... many commands RETURN Functions are blocks of code that can be called from elsewhere within an expres- sion (e.g a=3*@myfunction(b)). Functions can take arguments and must return a result. Variables are global unless declared local. For local variables changes outside a function have no eoeect within the function except as explicitly specioed within the function. Functions arguments can be variables and arrays of any types. Func- tions can return variables of any type. By default, arguments are passed by value. Functions can be executed recursively. A function will be deoned by: FUNCTION name(argumentlist) .. many more calculations RETURN returnvalue ENDFUNCTION 6.25. Error Messages X11-Basic can produce a number of internal errors, which are referred to by a number (ERR) (see also ERROR). The meaning of this errors and their text expression is as follows: 0 Divide by zero 1 OverAEow 2 Value not integer -2147483648 .. 2147483647 123 6. Quick_reference___________________________________________________________________________________________________________ 3 Value not byte 0 .. 255 4 Value not short -32768 .. 32767 5 Square root: only positive numbers 6 Logarithm only for positive numbers 7 Unknown Error 8 Out of Memory 9 Function or command not implemented in this version 10 String too long 11 Argument needs to be positive 12 Program too long, buoeer size exceeded ~> NEW 13 Type mismatch in expression 14 Array () is already dimensioned 15 Array not dimensioned: () 16 Field index too large 17 Dim too large 18 Wrong number of indexes 19 Procedure not found 20 Label not found 21 Open only "I"nput "O"utput "A"ppend "U"pdate 22 File already opened 23 Wrong ole # 24 File not opened 25 Wrong input, no number 26 EOF - reached end of ole 27 Too many points for Polyline/Polyoll 28 Array must be one dimensional 29 Illegal address! 30 Merge - no ASCII ole 31 Merge - line too long - CANCEL 32 ==> Syntax error 33 Label not deoned 34 Not enough data 35 data must be numeric 36 Error in program structure 37 Disk full 38 Command not allowed in interactive mode 39 Program Error GOSUB impossible 40 CLEAR not allowed within For-Next-loops or procedures 124 ___________________________________________________________________________________6.25.__Error_Messages__________________ 41 CONT not possible here 42 Not enough parameters 43 Expression too complex 44 Function not deoned 45 Too many parameters 46 Incorrect parameter, must be number 47 Incorrect parameter, must be string 48 Open "R" - incorrect Field length 49 Too many "R"-oles (max. 31) 50 No "R"-ole 51 Parser: Syntax Error <> 52 Fields larger than oeld length 53 Wrong graphic format 54 GET/PUT wrong Field-String length 55 GET/PUT wrong number 56 Wrong number of parameters 57 Variable is not yet initialized 58 Variable has incorrect type 59 Graphic has wrong color depth 60 Sprite-String length wrong 61 Error with RESERVE 62 Menu wrong 63 Reserve wrong 64 Pointer wrong 65 Field size < 256 66 No VAR-Array 67 ASIN/ACOS wrong 68 Wrong VAR-Type 69 ENDFUNC without RETURN 70 Unknown Error 70 71 Index too large 72 Error in RSRC`LOAD 73 Error in RSRC`FREE 80 Matrix operations only allowed for one or two dimensional arrays 81 Matrices do not have the same order 82 Vector product not deoned 83 Matrix product not deoned 84 Scalar product not deoned 125 6. Quick_reference___________________________________________________________________________________________________________ 85 Transposition only for two dimensional matrices 86 Matrix must be square 87 Transposition not deoned 88 FACT/COMBIN/VARIAT not deoned 89 Array must be two dimensional 90 Error in Local 91 Error in For 92 Resume (next) not possible: Fatal, For or Local 93 Stack Error 94 Parameter must be AEoat ARRAY 95 Parameter must be ARRAY 96 ARRAY has the wrong type. Can not convert. 97 This operation is not allowed for root window 98 Illegal Window number (0-16) 99 Window does not exist 100 X11-BASIC Version 1.24 Copyright (c) 1997-2015 Markus Hooemann 101 ** 1 - Segmentation fault 102 ** 2 - Bus Error: peek/poke ? 103 ** 3 - Address error: Dpoke/Dpeek, Lpoke/Lpeek? 104 ** 4 - Illegal Instruction 105 ** 5 - Divide by Zero 106 ** 6 - CHK exception 107 ** 7 - TRAPV exception 108 ** 8 - Privilege Violation 109 ** 9 - Trace exception 110 ** 10 - Broken pipe 131 * Number of hash collisions exceeds maximum generation counter value. 132 * Wrong medium type 133 * No medium found 134 * Quota exceeded 135 * Remote I/O error 136 * Is a named type ole 137 * No XENIX semaphores available 138 * Not a XENIX named type ole 139 * Structure needs cleaning 140 * Stale NFS ole handle 141 * Operation now in progress 142 * Operation already in progress 126 ___________________________________________________________________________________6.25.__Error_Messages__________________ 143 * No route to host 144 * Host is down 145 * Connection refused 146 * Connection timed out 147 * Too many references: can not splice 148 * Can not send after transport endpoint shutdown 149 * Transport endpoint is not connected 150 * Transport endpoint is already connected 151 * No buoeer space available 152 * Connection reset by peer 153 * Software caused connection abort 154 * Network dropped connection because of reset 155 * Network is unreachable 156 * Network is down 157 * Can not assign requested address 158 * Address already in use 159 * Address family not supported by protocol 160 * Protocol family not supported 161 * Operation not supported on transport endpoint 162 * Socket type not supported 163 * Protocol not supported 164 * Protocol not available 165 * Protocol wrong type for socket 166 * Message too long 167 * Destination address required 168 * Socket operation on non-socket 169 * Too many users 170 * Streams pipe error 171 * Interrupted system call should be restarted 172 * Illegal byte sequence 173 * Can not exec a shared library directly 174 * Attempting to link in too many shared libraries 175 * .lib section in a.out corrupted 176 * Accessing a corrupted shared library 177 * Can not access a needed shared library 178 * Remote address changed 179 * File descriptor in bad state 180 * Name not unique on network 127 6. Quick_reference___________________________________________________________________________________________________________ 181 * Value too large for deoned data type 182 * Not a data message 183 * RFS specioc error 184 * Try again 185 * Too many symbolic links encountered 186 * File name too long 187 * Resource deadlock would occur 188 * Advertise error 189 * memory page error 190 * no executable 191 * Link has been severed 192 * Object is remote 193 * Math result not representable 194 * Math arg out of domain of func 195 * Cross-device link 196 * Device not a stream 197 * Mount device busy 198 * Block device required 199 * Bad address 200 * No more processes 201 * No children 202 * Exchange full 203 * Interrupted system call 204 * Invalid exchange 205 * Permission denied, you must be super-user 206 * Operation in this channel not possible (any more) 207 * no more oles 208 * Link number out of range 209 * Level 3 reset 210 * Illegal Drive identioer 211 * Level 2 not synchronized 212 * Channel number out of range 213 * Identioer removed 214 * No message of desired type 215 * Operation would block 216 * illegal page address 217 * Directory not empty 218 * Function not implemented 128 ___________________________________________________________________________________6.25.__Error_Messages__________________ 219 * Illegal Handle 220 * Access not possible 221 * Too many open oles 222 * Path not found 223 * File not found 224 * Broken pipe 225 * Too many links 226 * Read-Only File-System 227 * Illegal seek 228 * No space left on device 229 * File too large 230 * Text ole busy 231 * Not a typewriter 232 * Too many open oles 233 * File table overAEow 234 * Invalid argument 235 * Is a directory 236 * Not a directory 237 * No such device 238 * Cross-device link 239 * File exists 240 * Bad sector (verify) 241 * unknown device 242 * Disk was changed 243 * Permission denied 244 * Not enough core memory 245 * read error 246 * write error 247 * No paper 248 * Sector not found 249 * Arg list too long 250 * Seek Error 251 * Bad Request 252 * CRC Error wrong check sum 253 * No such process 254 * Timeout 255 * IO-Error 129 This chapter is a command reference for quick lookup of short explanations of all bult-in X11-Basic operators, variables, commands, and functions. X11-Basic7 Command Reference 7.1. Syntax templates This manual describes the syntax of BASIC commands and BASIC functions in a generalized form. Here is an example: PRINT [#,] [<,>_<;> [...]] Those parts of the command that must appear literally in the source code (like PRINT in the example above) are all uppercase. Descriptions in angle brackets ("<>") are not meant to appear literally in the source code but are descriptive ref- erences to the element that is supposed to be used in the source code at this place, like a variable, a numeric expression etc. Optional elements are listed inside square brackets ("[]"). They may be omitted from the command line. Mutually exclusive alternatives are separated by the "_" character. Exactly one of these alternatives must appear in the command line. Finally, repetitive syntax is indicated by three dots "...". Here are some BASIC command lines that all match the syntax template above: PRINT x PRINT #1,2*y PRINT "result = ";result 130 ________________________________________________________________________________________________________7.2.__A___________ 7.2. A 131 7. Command_Reference_________________________________________________________________________________________________________ Function: ABS() Syntax: a=ABS(b) a%=ABS(b%) a=ABS(b#) a&=ABS(b&) DESCRIPTION: Returns the absolute value of an expression. The absolute value is the value with- out regard to the sign (negative, zero or positive). The result of ABS will always be a positive number or zero. The absolute value of a complex number is a real positive number. EXAMPLE: PRINT ABS(-34.5),ABS(34) ! Result: 34.5 34 PRINT ABS(4+3i) ! Result: 5 SEE ALSO: SGN() 132 ________________________________________________________________________________________________________7.2.__A___________ Command: ABSOLUTE Syntax: ABSOLUTE var,adr% DESCRIPTION: ABSOLUTE assigns the address adr% to the variable var. EXAMPLE: a=3 b=4 ABSOLUTE a,VARPTR(b) PRINT a ! Result: 4 Variables a and b are now identical. SEE ALSO: VAR 133 7. Command_Reference_________________________________________________________________________________________________________ Function: ACOS() Syntax: a=ACOS(b) DESCRIPTION: The ACOS() is the arc cosine function, i.e. the inverse of the COS() function. It returns the angle (in radian), which, fed to the cosine function will produce the argument passed to the ACOS() function. EXAMPLE: PRINT ACOS(0.5),ACOS(COS(PI)) ! Result: 1.047197551197 3.14159265359 SEE ALSO: COS(), ASIN() ______________________________*_____________________________ Function: ACOSH() 134 ________________________________________________________________________________________________________7.2.__A___________ Syntax: a=ACOSH(b) DESCRIPTION: The ACOSH() is the inverse hyperbolic cosine function, i.e. the inverse of the COSH() function. It returns the angle (in radian), which, fed to the hyperbolic cosine function will produce the argument passed to the ACOSH() function. EXAMPLE: PRINT ACOSH(2),ACOSH(COSH(0)) ! Result: 1.316957896925 0 SEE ALSO: COSH(), ASINH() 135 7. Command_Reference_________________________________________________________________________________________________________ Command: ADD Syntax: ADD a, ADD a%, ADD a#, ADD a&, DESCRIPTION: Increase the value of variable a by the result of . EXAMPLE: a=0.5 ADD a,5 PRINT a ! Result: 5.5 SEE ALSO: SUB, MUL, DIV, ADD() ______________________________*_____________________________ Function: ADD() 136 ________________________________________________________________________________________________________7.2.__A___________ Syntax: c=ADD(a,b) c&=ADD(a&,b&) c#=ADD(a#,b#) c%=ADD(a%,b%) DESCRIPTION: The function ADD() returns the sum of its arguments. EXAMPLE: a=0.5 b=ADD(a,5) PRINT b ! Result: 5.5 SEE ALSO: SUB(), MUL(), DIV(), ADD 137 7. Command_Reference_________________________________________________________________________________________________________ Command: AFTER Syntax: AFTER , DESCRIPTION: Procedures can be called after the expiry of a set time. Time in seconds. COMMENT: The currecnt implementation uses the alarm mechanism of the kernel of the operating system. This means, only one procedure can be scheduled for trigger at the same time. Once scheduled, AFTER cannot be canceled anymore. But you can overwrite it with following AFTER commands. If you use another AFTER command before the previous one has triggered the procedure the previous will not be triggered anymore. The procedure is excecuted exactly at the given time, interrupting the currently running process, even in the middle of a command. This can lead to a mess in pro- gram stack, unpredictible crashes may be caused. Using AFTER (and EVERY) is not safe! The interrupt procedure should not do complicated things. Maybe just assign a constant to a variable. Maybe also good to know: A PAUSE command will be immediately ended, when the AFTER procedure is triggered. The procedure will still be triggered, even when the main program has already ended. EXAMPLE: PRINT "You have 10 seconds to enter your name: " AFTER 10,alarm INPUT name$ END PROCEDURE alarm 138 ________________________________________________________________________________________________________7.2.__A___________ PRINT "Time out !" QUIT RETURN SEE ALSO: EVERY 139 7. Command_Reference_________________________________________________________________________________________________________ Command: ALERT Syntax: ALERT type%,message$,defaultbutton%,button$,click%[,text$] DESCRIPTION: Creates and displays an alert box (with a message) and asks for user input. The message box can have one ore more buttons which can be clicked by the user to exit the message box. Also the user can enter text in several text input oelds if they have been specioed. The number of the button clocked is returned in click% and the entered text in text$. type% chooses type of alert symbol, 0=none, 1="!", 2="?", 3="stop" message$ Contains main text. Lines are separated by the '_' symbol. Editable oelds are started with a CHR$(27) followed by the default text to be edited (until "_"). button$ Con- tains text for the buttons (separated by '_'). defaultbutton% is the button to be high- lighted (0=none,1,2,...) to be selected by just pressing return. click% This variable is set to the number of the button selected. text$ This is a string variable which holds any text-input the user made. It holds the contents of the editable oelds separated by a CHR$(13). COMMENT: The length of the text input oelds is given by the length of the default text. If you want the user to be able to enter longer texts than the default, the default can be extended by zero bytes (CHR$(0)) which are invisible to the user. EXAMPLES: ALERT 1,"Pick a_button",1,"Left_Right",a ALERT 0,"You pressed_Button"+STR$(a),0,"OK",a 140 ________________________________________________________________________________________________________7.2.__A___________ ' Example of editable fields i=1 name$="TEST01"+STRING$(4,CHR$(0)) ! maximum length 6+4=10 posx$="N54#50'32.3" t$="Edit waypoint:__Name: "+chr$(27)+name$+"_" t$=t$+"Position: "+chr$(27)+posx$+"_" ALERT 0,t$,1,"OK_UPDATE_DELETE_CANCEL",a,f$ WHILE LEN(f$) WORT`SEP f$,CHR$(13),0,a$,f$ PRINT "Field";i;": ",a$ INC i WEND SEE ALSO: FORM"`ALERT(), WORT"`SEP, CHR"$() 141 7. Command_Reference_________________________________________________________________________________________________________ Operator: AND Syntax: AND DESCRIPTION: Used to determine if BOTH conditions are true. If both expression1 AND expres- sion2 are true (non-zero), the result is true. Returns -1 for true, 0 for false. Also used to compare bits in binary number operations. 1 AND 1 return a 1, all other combinations of 0's and 1's produce 0. EXAMPLES: Print 3=3 AND 4>2 Result: -1 (true) Print 3>3 AND 5>3 Result: 0 (false) PRINT (30>20 AND 20<30) Result: -1 (true) PRINT (4 AND 255) Result: 4 SEE ALSO: NAND, OR, NOT, XOR ______________________________*_____________________________ Function: AND() 142 ________________________________________________________________________________________________________7.2.__A___________ Syntax: =AND(,) DESCRIPTION: Returns AND EXAMPLE: PRINT AND(TIMER,0xff) ! Result: 67 SEE ALSO: OR(), AND 143 7. Command_Reference_________________________________________________________________________________________________________ Variable: ANDROID? Syntax: ANDROID? DESCRIPTION: This variable gives -1 (=TRUE) if the operating system is Android; else the vari- able has a value of 0. With testing this variable the program can ond out if it is running on an Android device. EXAMPLE: IF NOT ANDROID? MOUSEEVENT QUIT ELSE END ENDIF SEE ALSO: TRUE, FALSE, UNIX?, WIN32? 144 ________________________________________________________________________________________________________7.2.__A___________ Function: ARG() Syntax: a=ARG(z#) DESCRIPTION: Returns the argument of a complex value z#. Any complex number a# can be expressed as: a#=ABS(a#)*EXP(1i*ARG(a#)) The argument is the phase angle of the complex number. The return value is a real value in the range of [-PI,PI]. EXAMPLE: PRINT DEG(ARG(4+4i)) ! Result: 45 SEE ALSO: IMAG(), REAL(), ABS(), ATAN2(), DEG() 145 7. Command_Reference_________________________________________________________________________________________________________ Function: ARID$() Syntax: b$=ARID$(a$) DESCRIPTION: The arid$()-takes a string argument and returns the order-0 adaptive arithmetic decoding of that string. Arithmetic coding is a form of entropy encoding used in lossless data compression. EXAMPLE: t$="Hello, this is a test!!!! This shows arithmetric coding and decoding with X11-Basic." b$=arie$(t$) ! encode it print "The string was compressed to ";round(len(b$)/len(t$)*1000)/10;"%" c$=arid$(b$) ! decode it print c$ Result: The string was compressed to 88.1% Hello, this is a test!!!! This shows arithmetric coding and decoding with X11-Basic. SEE ALSO: ARIE"$() 146 ________________________________________________________________________________________________________7.2.__A___________ Function: ARIE$() Syntax: =ARIE$() DESCRIPTION: The ARIE$() takes a string argument and returns the order-0 adaptive arithmetic encoding of that string. Frequently used characters will be stored with fewer bits and not-so-frequently occurring characters will be stored with more bits, resulting in fewer bits used in total. EXAMPLE: t$="Hello, this is a test!!!! This shows arithmetric coding and decoding with X11-Basic." b$=ARIE$(t$) ! encode it print "The string was compressed to ";round(len(b$)/len(t$)*1000)/10;"%" c$=arid$(b$) ! decode it print c$ Result: The string was compressed to 88.1% Hello, this is a test!!!! This shows arithmetric coding and decoding with X11-Basic. SEE ALSO: ARID"$() 147 7. Command_Reference_________________________________________________________________________________________________________ Command: ARRAYCOPY Syntax: ARRAYCOPY d(),s() DESCRIPTION: Copies the contents of array s() to d() (including dimensions). This is the same as the statement: d()=s(). SEE ALSO: DIM ______________________________*_____________________________ Command: ARRAYFILL Syntax: ARRAYFILL x(),n ARRAYFILL x$(),t$ DESCRIPTION: Assigns the value to all elements of an array or matrix. It can be used to give all array elements a deoned value, e.g. just after dimensioning the array where the contents are yet undeoned. 148 ________________________________________________________________________________________________________7.2.__A___________ EXAMPLE: DIM a(100) ARRAYFILL a(),13 PRINT a(22) Result: 13 SEE ALSO: DIM 149 7. Command_Reference_________________________________________________________________________________________________________ Function: ARRPTR() Syntax: adr%=ARRPTR(a()) DESCRIPTION: Finds the address of the descriptor of an array. EXAMPLE: DIM a(100,4) adr%=ARRPTR(a()) PRINT "Array has dimension: ";LPEEK(adr%) PRINT "Array index list: "; FOR i%=0 TO LPEEK(adr%) PRINT LPEEK(LPEEK(adr%+4)+4*i%); IF i%=ASC() DESCRIPTION: Returns the ASCII code value (a number between 0 and 255) of the orst character in a string. ASCII stands for American Standard Code for Information Interchange. ASC returns 0 if the length of string is zero or the ASCII code of the string is zero. EXAMPLE: PRINT ASC("A"), ASC("T") ! Result: 65, 84 PRINT ASC("TEST") ! Result: 84 SEE ALSO: CHR"$(), CVI(), CVL(), CVS() 151 7. Command_Reference_________________________________________________________________________________________________________ Function: ASIN() Syntax: =ASIN() DESCRIPTION: The ASIN() is the arc sine function, i.e. the inverse of the SIN() function. Or, more elaborate: It Returns the angle (in radian, not degrees !), which, fed to the sine function will produce the argument passed to the ASIN() function. EXAMPLE: PRINT 6*ASIN(0.5) ! Result: 3.14159265359 SEE ALSO: ACOS(), SIN() ______________________________*_____________________________ Function: ASINH() 152 ________________________________________________________________________________________________________7.2.__A___________ Syntax: =ASINH() DESCRIPTION: The ASINH() function calculates the inverse hyperbolic sine of x, i.e. the inverse of the SINH() function. It returns the angle (in radian), which, fed to the hyperbolic sine function will produce the argument passed to the ASINH() function. SEE ALSO: ACOSH(), SINH() 153 7. Command_Reference_________________________________________________________________________________________________________ Keyword: AT() Syntax: PRINT AT(y,x);[...] DESCRIPTION: The AT statement takes two numeric arguments (e.g. AT(2,3)) and can be used in combination with the PRINT or GPRINT command. The two numeric arguments of the AT function may range from 1 to the width of your terminal minus 1, and from 0 to the height of your terminal minus 1; if any argument exceeds these values, it will be truncated accordingly. However, X11- Basic has no inAEuence on the size of your terminal (80x25 is a common, but not mandatory), the size of your terminal and the maximum values acceptable within the AT statement may vary. To get the size of your terminal you may use the COLS and ROWS variables. To get the actual position of the text cursor you may use the CRSCOL and CRSLIN variables. EXAMPLE: PRINT AT(3,1);" This is a Title " GPRINT AT(4,7);"Test" SEE ALSO: PRINT, GPRINT, TAB(), SPC(), COLS, ROWS, CRSLIN, CRSCOL, LOCATE 154 ________________________________________________________________________________________________________7.2.__A___________ Function: ATN(), ATAN() Syntax: =ATN() =ATAN() DESCRIPTION: ATN() and ATAN() both return the angle in radians, for the inverse tangent of the expression. EXAMPLE: PRINT 4*ATAN(1) ! Result: 3.14159265359 SEE ALSO: ACOS(), ASIN(), ATAN2() ______________________________*_____________________________ Function: ATAN2() 155 7. Command_Reference_________________________________________________________________________________________________________ Syntax: =ATAN2(,) DESCRIPTION: The ATAN() function has a second form which accepts two arguments: ATAN2(a,b) which is (mostly) equivalently to ATAN(a/b) except for the fact, that the two-argument- form returns an angle in the range -PI to PI, whereas the one-argument-form returns an angle in the range -PI/2 to PI/2. EXAMPLE: PRINT DEG(ATAN2(0,-1)) ! Result: 180 SEE ALSO: ATAN() ______________________________*_____________________________ Function: ATANH() Syntax: =ATANH() 156 ________________________________________________________________________________________________________7.2.__A___________ DESCRIPTION: The ATANH() function calculates the inverse hyperbolic tangent of x; that is the value whose hyperbolic tangent is x. If the absolute value of x is greater than 1.0, ATANH() returns not-a-number (NaN). EXAMPLE: PRINT DEG(ATANH(-0.5)) ! Result: -31.47292373095 SEE ALSO: ATAN() 157 7. Command_Reference_________________________________________________________________________________________________________ 7.3. B 158 ________________________________________________________________________________________________________7.3.__B___________ Function: BCHG() Syntax: b%=BCHG(x%,bit%) DESCRIPTION: Changes the bit% bit of x% from 0 to 1 or from 1 to 0. EXAMPLE: PRINT BCHG(1,2) ! result: 5 PRINT BCHG(5,2) ! result: 1 SEE ALSO: BSET(), BCLR() ______________________________*_____________________________ Function: BCLR() 159 7. Command_Reference_________________________________________________________________________________________________________ Syntax: b%=BCLR(x%,bit%) DESCRIPTION: BCLR sets the bit%-th bit of x% to zero. EXAMPLE: PRINT BCLR(7,1) ! result: 5 SEE ALSO: BSET(), BCHG() 160 ________________________________________________________________________________________________________7.3.__B___________ Command: BEEP, BELL Syntax: BEEP BELL DESCRIPTION: Sounds the speaker of your terminal. This command is not a sound-interface, so you can neither vary the length or the height of the sound (technically, it just prints chr$(7)). BELL is exactly the same as BEEP. SEE ALSO: SOUND 161 7. Command_Reference_________________________________________________________________________________________________________ Command: BGET Syntax: BGET #n,adr%,len% DESCRIPTION: Reads len% bytes from a data channel into an area of memory starting at address adr%. Unlike with BLOAD, several dioeerent areas of memory can be read from a ole. EXAMPLE: OPEN "I",#1,"test.rsc" header$=SPACE$(32) BGET #1,VARPTR(header$),32 CLOSE #1 SEE ALSO: BLOAD, BPUT 162 ________________________________________________________________________________________________________7.3.__B___________ Function: BIN$() Syntax: a$=BIN$([,len%]) DESCRIPTION: The bin$()-takes a numeric argument and converts it into a string of binary digits (i.e. '0' and '1'). The minimal length of the output, the minimal number of digits, can be specioed by the optional second argument. If the specioed length is bigger than needed, the string is olled with leading zeros. If you need binary representations with sign, use RADIX$() instead. EXAMPLE: PRINT BIN$(64,8),BIN$(-2000) Result: 01000000 11111111111111111111100000110000 SEE ALSO: HEX"$(), OCT"$(), RADIX"$() 163 7. Command_Reference_________________________________________________________________________________________________________ Command: BLOAD Syntax: BLOAD filename$,adr% DESCRIPTION: BLOAD reads the specioed ole into memory at address adr%. The memory adr% is pointing to should be allocated before. You should check if the ole exists prior to using this function. This command is meant to be used for loading binary data. To load a text ole, use OPEN and INPUT # to remain compatible with other BASIC implementations. EXAMPLE: IF EXIST("test.dat") adr%=MALLOC(SIZE("test.dat")) BLOAD "test.dat",adr% ENDIF SEE ALSO: MALLOC(), BGET, INPUT, INPUT"$(), BSAVE 164 ________________________________________________________________________________________________________7.3.__B___________ Command: BMOVE Syntax: BMOVE scr%,dst%,len% DESCRIPTION: Fast movement of memory blocks. scr% is the address at which the block to be moved begins. dst% is the address to which the block is to moved. len% is the length of the block in bytes. EXAMPLE: a=1 b=2 BMOVE VARPTR(a),VARPTR(b),8 ! same as b=a SEE ALSO: PEEK(), POKE, BLOAD, BSAVE 165 7. Command_Reference_________________________________________________________________________________________________________ Command: BOUNDARY Syntax: BOUNDARY flag% DESCRIPTION: Switch ooe (or on) borders on olled shapes (PBOX, PCIRCLE ..). If AEag% is zero - no border will be drawn. EXAMPLE: BOUNDARY FALSE SEE ALSO: PBOX, PCIRCLE 166 ________________________________________________________________________________________________________7.3.__B___________ Command: BOX Syntax: BOX x,y,x2,y2 DESCRIPTION: Draws a rectangle with corners at (x,y) and (x2,y2). The screen coordinates start in the upper left corner. X increases to the right and y down to the bottom of the screen or window. EXAMPLE: COLOR COLOR`RGB(1,1,0) BOX 20,20,620,380 SEE ALSO: PBOX, GET"`GEOMETRY 167 7. Command_Reference_________________________________________________________________________________________________________ Command: BPUT Syntax: BPUT #n,adr%,len% DESCRIPTION: Writes len% bytes from an area of memory starting at adr% out to a data channel #n. EXAMPLE: OPEN "O",#1,"test.dat" BPUT #1,VARPTR(t$),LEN(t$) CLOSE #1 SEE ALSO: BGET 168 ________________________________________________________________________________________________________7.3.__B___________ Command: BREAK Syntax: BREAK DESCRIPTION: BREAK transfers control immediately outside the enclosing loop or select state- ment. This is the preferred way of leaving such a statement (rather than goto). EXAMPLE: DO INC i IF i>5 PRINT "i is big enough." BREAK ENDIF LOOP SEE ALSO: EXIT IF 169 7. Command_Reference_________________________________________________________________________________________________________ Command: BSAVE Syntax: BSAVE filename$,adr%,len% DESCRIPTION: Save len% bytes in memory from address adr% to a ole named olename$. If olename does not exist, it will be created. If it does exist, the old content will be overwritten. This command is meant be be used for saving binary data obtained via BLOAD. To save text oles, use OPEN and PRINT # to remain compatible with other BASIC implementations. EXAMPLE: BSAVE "content-t.dat",VARPTR(t$),LEN(t$) SEE ALSO: BLOAD, BPUT 170 ________________________________________________________________________________________________________7.3.__B___________ Function: BSET() Syntax: b%=BSET(x%,bit%) DESCRIPTION: BSET sets the bit%-th bit of x% to 1. EXAMPLE: PRINT BSET(0,2) ! result: 4 SEE ALSO: BCHG(), BCLR(), BTST() 171 7. Command_Reference_________________________________________________________________________________________________________ Function: BTST() Syntax: =BTST(x%,bit%) DESCRIPTION: BTST results in -1 (TRUE) if bit bit% of x% is set. EXAMPLE: PRINT BTST(4,2) ! result: -1 SEE ALSO: BCHG(), BCLR(), BSET() 172 ________________________________________________________________________________________________________7.3.__B___________ Function: BWTD$() Syntax: b$=BWTD$(a$) DESCRIPTION: BWTD$() performs the inverse Burrows-Wheeler transform on the string a$. The Burrows-Wheeler transform (BWT) is an algorithm used in data compression techniques. It was invented by Michael Burrows and David Wheeler. BWTD$() can restore the original content of a string which has been coded with BWTE$() before. EXAMPLE: t$="Hello, this is the Burrows Wheeler transformation!" b$=bwte$(t$) ! encode it print b$ c$=bwtd$(b$) ! decode it print c$ Result: esss,rno ! rmhheHlstWtth eelroalifretoruwiin a Bo Hello, this is the Burrows Wheeler transformation! SEE ALSO: BWTE"$() 173 7. Command_Reference_________________________________________________________________________________________________________ Function: BWTE$() Syntax: b$=BWTE$(a$) DESCRIPTION: BWTE$() performs a Burrows-Wheeler transform on the string a$. The Burrows-Wheeler transform (BWT) is an algorithm used in data compression techniques such as bzip2. It was invented by Michael Burrows and David Wheeler. When a character string is transformed by the BWT, none of its characters change. It just rearranges the order of the characters. If the original string had several sub- strings that occurred often, then the transformed string will have several places where a single character is repeated multiple times in a row. This is useful for compression, since it tends to be easy to compress a string that has runs of repeated characters by techniques such as run-length encoding. EXAMPLE: t$="Hello, this is the Burrows Wheeler transformation!" b$=bwte$(t$) ! encode it print b$ c$=bwtd$(b$) ! decode it print c$ Result: esss,rno ! rmhheHlstWtth eelroalifretoruwiin a Bo Hello, this is the Burrows Wheeler transformation! SEE ALSO: BWTD"$() 174 ________________________________________________________________________________________________________7.3.__B___________ Function: BYTE() Syntax: =BYTE() DESCRIPTION: Returns lower 8 bits of argument. (same as a=b AND 255) EXAMPLE: PRINT BYTE(-200) ! Result: 56 SEE ALSO: CARD(), WORD(), SWAP() 175 7. Command_Reference_________________________________________________________________________________________________________ 7.4. C 176 ________________________________________________________________________________________________________7.4.__C___________ Command: CALL Syntax: CALL adr%[,] DESCRIPTION: Calls a machine code or C subroutine at address without return value. Op- tional parameters are passed on the stack. (like in C). The default parameter-type is (4-Byte) integer. If you want to specify other types, please use preoxes: D: ~ double (8-Bytes) F: ~ AEoat (4-Bytes) L: ~ long int, pointer (4-Bytes) EXAMPLE: DIM result(100) LINK #1,"simlib.so" adr%=SYM`ADR(#1,"CalcBeta") CALL adr%,D:1.2,L:0,L:VARPTR(result(0)) UNLINK #1 SEE ALSO: CALL(), EXEC ______________________________*_____________________________ Function: CALL() 177 7. Command_Reference_________________________________________________________________________________________________________ Syntax: ret%=CALL(adr%[,]) DESCRIPTION: Calls a machine code or C subroutine at address and returns an integer value ret%. Optional parameters are passed on the stack. (like in C). The default parameter-type is (4-Byte) integer. If you want to specify other types, please use preoxes: D: ~ double (8-Bytes) F: ~ AEoat (4-Bytes) L: ~ long int, pointer (4-Bytes) EXAMPLE: DIM result(100) LINK #1,"simlib.so" adr%=SYM`ADR(#1,"CalcZeta") ret%=CALL(adr%,D:1.2,L:0,L:VARPTR(result(0))) UNLINK #1 SEE ALSO: CALL, EXEC 178 ________________________________________________________________________________________________________7.4.__C___________ Function: CARD() Syntax: a%=CARD(b%) DESCRIPTION: Returns lower 16 bits of b%. (same as a%=b% AND (2^16-1)) EXAMPLE: PRINT CARD(-200) ! Result: 65336 SEE ALSO: BYTE(), WORD(), SWAP() 179 7. Command_Reference_________________________________________________________________________________________________________ Keyword: CASE Syntax: CASE [,,...] DESCRIPTION: CASE takes a list of expressions to be compared with the expression of the corre- sponding SELECT statement. EXAMPLE: i=5 SELECT i CASE 1 PRINT 1 CASE 2,3,4 PRINT "its 2,3, or 4" CASE 5 PRINT 5 DEFAULT PRINT "default" ENDSELECT SEE ALSO: SELECT, DEFAULT, ENDSELECT 180 ________________________________________________________________________________________________________7.4.__C___________ Function: CBRT() Syntax: a=CBRT(x) DESCRIPTION: The CBRT() function returns the cube root of x. This function cannot fail; every representable real value has a representable real cube root. EXAMPLE: PRINT CBRT(8) ! Result: 2 SEE ALSO: SQRT() 181 7. Command_Reference_________________________________________________________________________________________________________ Function: CEIL() Syntax: =CEIL() DESCRIPTION: Ceiling function: return smallest integral value not less than argument. EXAMPLE: PRINT CEIL(-1.5), CEIL(0.5) ! result: -1 1 SEE ALSO: INT() 182 ________________________________________________________________________________________________________7.4.__C___________ Command: CHAIN Syntax: CHAIN DESCRIPTION: CHAIN loads and runs another BASIC program. Global variables will be available with their current value to the new program, all other variables are erased. If you want to append another program to the current program (as opposed to erasing the current program and loading a new program), use the MERGE command instead. SEE ALSO: LOAD, MERGE, RUN 183 7. Command_Reference_________________________________________________________________________________________________________ Command: CHDIR Syntax: CHDIR DESCRIPTION: CHDIR changes the current working directory to the directory specioed in path- name. EXAMPLE: CHDIR "/tmp" SEE ALSO: MKDIR, RMDIR, DIR"$() 184 ________________________________________________________________________________________________________7.4.__C___________ Command: CHMOD Syntax: CHMOD , DESCRIPTION: CHMOD changes the permissions of a ole. The new ole permissions are specioed in mode, which is a bit mask created by ORing (or adding) together zero or more of the following: - 1 execute/search by others ("search" applies for directories, and means that entries within the directory can be accessed) - 2 write by others - 4 read by others - 8 execute/search by group - 0x010 write by group - 0x020 read by group - 0x040 execute/search by owner - 0x080 write by owner - 0x100 read by owner - 0x200 sticky bit - 0x400 set-group-ID - 0x800 set-user-ID 185 7. Command_Reference_________________________________________________________________________________________________________ EXAMPLE: CHMOD "/tmp/file",0x1e8 SEE ALSO: OPEN 186 ________________________________________________________________________________________________________7.4.__C___________ Function: CHR$() Syntax: = CHR$() DESCRIPTION: CHR$() returns the character associated with a given ASCII code. If the argument is in the range of 0-255 it produces exactly one byte. Character table 032 048 0 064 @ 080 P 096 ` 112 p 033 ! 049 1 065 A 081 Q 097 a 113 q 034 " 050 2 066 B 082 R 098 b 114 r 035 "# 051 3 067 C 083 S 099 c 115 s 036 "$ 052 4 068 D 084 T 100 d 116 t 037 "% 053 5 069 E 085 U 101 e 117 u 038 "& 054 6 070 F 086 V 102 f 118 v 039 ' 055 7 071 G 087 W 103 g 119 w 040 ( 056 8 072 H 088 X 104 h 120 x 041 ) 057 9 073 I 089 Y 105 i 121 y 042 * 058 : 074 J 090 Z 106 j 122 z 043 + 059 ; 075 K 091 $[$ 107 k 123 - 044 , 060 < 076 L 092 " 108 l 124 _ 045 - 061 = 077 M 093 $]$ 109 m 125 " 046 . 062 > 078 N 094 "verb_^_ 110 n 126 " 047 / 063 ? 079 O 095 "` 111 o 127 Control codes 00 NUL 08 BS -- Backspace 16 DLE 187 7. Command_Reference_________________________________________________________________________________________________________ 01 SOH 09 HT -- horizontal TAB 17 DC1 -- XON 02 STX 10 LF -- Newline 18 DC2 03 ETX 11 VT 19 DC3 -- XOFF 04 EOT 12 FF -- Form feed 20 DC4 05 ENQ 13 CR -- Carriage Return 21 NAK 06 ACK 14 SO 22 SYN 07 BEL -- Bell 15 SI 23 ETB 24 CAN 32 SP -- Space 25 EM 127 DEL -- Delete 26 SUB 27 ESC28 FS 29 GS 30 RT 31 US COMMENT: You should avoid to pass an argument outside of the range 0-255 for compatibility reasons. Currently only the lowest 8 bits are taken, but in future the function could be extended to also produce unicode charackters (up to three bytes) taking the unicode values (0-0xoeoe). EXAMPLE: PRINT CHR$(34);"Hello World !";CHR$(34) Result: "Hello World !" SEE ALSO: ASC() 188 ________________________________________________________________________________________________________7.4.__C___________ Function: CINT() Syntax: =CINT() DESCRIPTION: CINT() returns the rounded absolute value of its argument preoxed with the sign of its argument. EXAMPLE: PRINT CINT(1.4), CINT(-1.7) Result: 2, -2 SEE ALSO: INT(), FRAC(), TRUNC(), ROUND() 189 7. Command_Reference_________________________________________________________________________________________________________ Command: CIRCLE Syntax: CIRCLE ,,[,,] DESCRIPTION: Draw a circle with actual color (and ollpattern). The x- and y-coordinates of the center and the radius of the circle are given in screen coordinates and pixels. Op- tionally a starting angle and stop angle can be passed to draw a circular arc. EXAMPLE: CIRCLE 100,100,50 SEE ALSO: ELLIPSE, COLOR, DEFFILL, PCIRCLE 190 ________________________________________________________________________________________________________7.4.__C___________ Command: CLEAR Syntax: CLEAR DESCRIPTION: Clear all variables and arrays as if they were never used before. SEE ALSO: NEW 191 7. Command_Reference_________________________________________________________________________________________________________ Command: CLEARW Syntax: CLEARW [] DESCRIPTION: Clear graphic window. If a number is given, clear window with the number given. The Window is olled with the background color, which can be specioed by COLOR. EXAMPLE: foreground=COLOR`RGB(1,1,1) ! white background=COLOR`RGB(0,0,1) ! blue COLOR foreground,background CLEARW SHOWPAGE SEE ALSO: CLOSEW, COLOR 192 ________________________________________________________________________________________________________7.4.__C___________ Command: CLIP Syntax: CLIP x,y,w,h[,ox,oy] DESCRIPTION: This command provide the 'Clipping' function, ie. the limiting of graphic display within a specioed rectangular screen area. The command CLIP deones the clipping rectangle starting at the upper left coordinates x,y and extends w pixels wide and h high. The optional additional command parameters ox,oy make it possible to redeone the origin of the graphic display. COMMENT: This command is still buggy. Do not use it. EXAMPLE: CLIP 0,0,100,100,50,50 CIRCLE 0,0,55 SHOWPAGE SEE ALSO: 193 7. Command_Reference_________________________________________________________________________________________________________ Command: CLOSE Syntax: CLOSE [[#]n[,[#],...]] DESCRIPTION: This statement is used to CLOSE one or more OPEN oles or other devices. The parameter expression indicates a device number or ole number. If no ole or device numbers are declared all OPEN devices will be closed. COMMENT: All oles should be closed before leaving a program to insure that data will not be lost or destroyed. If a program exit is through END or QUIT, all oles will be closed. If a program is stopped with the STOP command, all open oles remain open. EXAMPLE: CLOSE #1,#2 CLOSE SEE ALSO: OPEN, LINK 194 ________________________________________________________________________________________________________7.4.__C___________ Command: CLOSEW Syntax: CLOSEW [] DESCRIPTION: Close graphic window (make it disappear from the screen). If a number is given, closes window with the number given. The Window will again be opened, when the next graphic command is executed. This command has no eoeect on Android. SEE ALSO: CLEARW 195 7. Command_Reference_________________________________________________________________________________________________________ Command: CLR Syntax: CLR [,,...] DESCRIPTION: Clear the variables given in the list. Sets specioed variables or arrays to 0 or "". EXAMPLE: CLR a,t$,i%,b() SEE ALSO: ARRAYFILL 196 ________________________________________________________________________________________________________7.4.__C___________ Command: CLS Syntax: CLS DESCRIPTION: Clear text screen and move cursor home (upper left corner). EXAMPLE: CLS PRINT "This is now a title line on an empty text screen." SEE ALSO: PRINT 197 7. Command_Reference_________________________________________________________________________________________________________ Command: COLOR Syntax: COLOR [,] DESCRIPTION: COLOR sets the foreground color (and optionally the background color) for graphic output into the graphic window. The color values are dependent of the color depth of the Screen. Usually the COLOR statement is used together with the COLOR`RGB() function, so arbitrary colors may be used. EXAMPLE: yellow=COLOR`RGB(1,1,0) blue=COLOR`RGB(0,0,1) COLOR yellow,blue SEE ALSO: COLOR"`RGB(), LINE 198 ________________________________________________________________________________________________________7.4.__C___________ Function: COLOR`RGB() Syntax: c%=COLOR`RGB(r,g,b[,a]) DESCRIPTION: COLOR`GRB() returns a color number for the specioed color. The rgb-values range from 0 (dark) to 1.0 (bright). The returned number depends on the screen depth of the bitmap used. For 8 bit a color cell is allocated or if there is no free cell, a color is chosen which is most similar to the specioed. The optional parameter a is the alpha value (0...1), which will be used if it is supported by the graphics system. The color numbers may be passed to the COLOR command. EXAMPLE: yellow=COLOR`RGB(1,1,0) COLOR yellow SEE ALSO: COLOR 199 7. Command_Reference_________________________________________________________________________________________________________ Variable: COLS Syntax: n%=COLS DESCRIPTION: Returns the number of colums of the text terminal (console). EXAMPLE: PRINT COLS, ROWS ! Result: 80 24 SEE ALSO: ROWS, PRINT AT(), CRSCOL, CRSLIN 200 ________________________________________________________________________________________________________7.4.__C___________ Function: COMBIN() Syntax: =COMBIN(,) DESCRIPTION: Calculates the number of combinations of elements to the th class without repetitions. Deoned as z=n!/((n-k)!*k!). EXAMPLE: PRINT COMBIN(49,6) ! result: 13983816 SEE ALSO: FACT(), VARIAT() 201 7. Command_Reference_________________________________________________________________________________________________________ Function: COMPRESS$() Syntax: c$=COMPRESS$(a$) DESCRIPTION: Performs a lossless compression on the string a$. The algorithm uses run length encoding in combination with the Burrows-Wheeler transform. The result is a bet- ter compression than p.ex. the algorithm used by gzip. At the moment the COM- PRESS$() function is identical to following combination: b$=ARIE$(RLE$(MTFE$(BWTE$(RLE$(a$))))) SEE ALSO: UNCOMPRESS"$(), BWTE"$(), RLE"$(), MTFE"$() 202 ________________________________________________________________________________________________________7.4.__C___________ Function: CONJ() Syntax: x#=CONJ(z#) DESCRIPTION: Returns the complex conjugate value of z#. That is the value obtained by changing the sign of the imaginary part. EXAMPLE: PRINT CONJ(1-2i) Result: (1+2i) SEE ALSO: IMAG(), REAL() 203 7. Command_Reference_________________________________________________________________________________________________________ Command: CONNECT Syntax: CONNECT #n,server$,port% DESCRIPTION: Initiate a connection on a socket. The ole number #n must refer to a socket. If the socket is of type "U" then the server$ address is the address to which packets are sent by default, and the only address from which packets are received. If the socket is of type "S","A","C", this call attempts to make a connection to another socket. The other socket is specioed by server$, which is an address in the communications space of the socket. Generally, connection-based protocol sockets may successfully connect only once; connectionless protocol sockets may use connect multiple times to change their as- sociation. SEE ALSO: OPEN, CLOSE, SEND, RECEIVE 204 ________________________________________________________________________________________________________7.4.__C___________ Command: CONTINUE Syntax: CONT CONTINUE DESCRIPTION: This command has two dioeerent use cases. If used in direct mode, it continues the execution of a program after interruption (e.g. with STOP). If used inside a SELECT/ENDSELECT block, it branches to the line following the next CASE or DEFAULT directive. If no CASE or DEFAULT statement is found, it branches to ENDSELECT. EXAMPLE: INPUT a SELECT a CASE 1 PRINT 1 CONTINUE CASE 2 PRINT "1 or 2" CASE 3 PRINT 3 DEFAULT PRINT "default" ENDSELECT SEE ALSO: STOP, SELECT, CASE, DEFAULT, BREAK 205 7. Command_Reference_________________________________________________________________________________________________________ Command: COPYAREA Syntax: COPYAREA x,y,w,h,xd,yd DESCRIPTION: Copies a rectangular screen sections given by x,y,w,h to a destination at xd,yd. x,y top left corner of source rectangle w,h width & height " " " xd,yd destination x and y coordinates This command is very fast compared to the GET and PUT commands because the whole data transfer takes place on the X-client (this means on the screen directly without datatransfer to the program). SEE ALSO: GET, PUT, GRAPHMODE 206 ________________________________________________________________________________________________________7.4.__C___________ Function: COS() Syntax: b=COS(x) z#=COS(x#) DESCRIPTION: Returns the Cosine of the expression in radians. Also returns the complex cosine of a complex expression. The complex cosine function is deoned as: cos#(z) := (exp#(1i*z#)+exp#(-1i*z#))/2 EXAMPLE: PRINT COS(0) ! Result: 1 PRINT COS#(0+1i) ! Result: 1.543080634815+0i SEE ALSO: SIN(), ASIN() ______________________________*_____________________________ Function: COSH() 207 7. Command_Reference_________________________________________________________________________________________________________ Syntax: b=COSH(x) z#=COSH(x#) DESCRIPTION: The cosh() function returns the hyperbolic cosine of x, which is deoned mathemat- ically as (exp(x)+exp(-x))/2 Also returns the complex hyperbolic cosine of a complex number or expression. SEE ALSO: COS(), ACOSH(), EXP() 208 ________________________________________________________________________________________________________7.4.__C___________ Function: CRC() Syntax: =CRC(t$[,oc]) DESCRIPTION: Calculates a 32 bit checksum on the given string. Optionally another checksum can be passed as oc. If oc is passed, the checksum will be updated with the given string. SEE ALSO: LEN() 209 7. Command_Reference_________________________________________________________________________________________________________ Variable: CRSCOL, CRSLIN Syntax: CRSCOL CRSLIN DESCRIPTION: Returns current cursor line and column. SEE ALSO: PRINT AT() 210 ________________________________________________________________________________________________________7.4.__C___________ Variable: CTIMER Syntax: CTIMER DESCRIPTION: Returns CPU-Clock in seconds. This timer returns the amount of time this appli- cation was running. It is most useful for benchmark applications on multi-tasking environments. COMMENT: The UNIX standard allows for arbitrary values at the start of the program; subtract the value returned from a CTIMER at the start of the program to get maximum portability. It is also not guaranteed, that the values will not repeat itself. On a 32-bit system this function will return the same value approximately every 72 minutes. EXAMPLE: t=CTIMER FOR i=0 TO 100000 NOOP NEXT i ref=(CTIMER-t)/100000 print "Ref=",str$(ref*1000,5,5);" ms" SEE ALSO: TIMER, STIMER 211 7. Command_Reference_________________________________________________________________________________________________________ Command: CURVE Syntax: CURVE x0,y0,x1,y1,x2,y2,x3,y3 DESCRIPTION: The CURVE command draws a cubic Bezier-curve. The Bezier-curve starts at x0,y0 and ends at x3,y3. The curve at x0,y0 is at a tangent with a line from x0,y0 to x1,y1; and at x3,y3 is at a tangent with a line between x3,y3 and x2,y2. SEE ALSO: LINE, POLYLINE 212 ________________________________________________________________________________________________________7.4.__C___________ Function: CVA() Syntax: =CVA() DESCRIPTION: Returns array reconstructed from the string. This function is the complement of MKA$(). EXAMPLE: a()=CVA(t$) SEE ALSO: ASC(), CVF(), CVL(), MKA"$() 213 7. Command_Reference_________________________________________________________________________________________________________ Function: CVD() Syntax: =CVD() DESCRIPTION: Returns the binary double value of the orst 8 characters of string. This function is the complement of MKD$(). SEE ALSO: ASC(), CVF(), CVL(), MKD"$() ______________________________*_____________________________ Function: CVF() Syntax: =CVF() DESCRIPTION: Returns the binary AEoat value of the orst 4 characters of a string. This function is the complement of MKF$(). 214 ________________________________________________________________________________________________________7.4.__C___________ SEE ALSO: ASC(), CVD(), CVL(), MKF"$() ______________________________*_____________________________ Function: CVI() Syntax: =CVI() DESCRIPTION: Returns the binary integer value of the orst 2 characters of a string. This function is the complement of MKI$(). Null string returns 0, For strings with only one byte length the ASCII value of that charackter will be returned. SEE ALSO: ASC(), CVF(), CVL(), MKI"$() ______________________________*_____________________________ Function: CVL() Syntax: =CVL() 215 7. Command_Reference_________________________________________________________________________________________________________ DESCRIPTION: Returns the binary long integer value of the orst 4 characters of a string. This function is the complement of MKL$(). Null string returns 0. SEE ALSO: ASC(), CVF(), CVI(), MKL"$() ______________________________*_____________________________ Function: CVS() Syntax: =CVS() DESCRIPTION: Returns the binary AEoat value of the orst 4 characters of a string. This function is the complement of MKS$(). SEE ALSO: CVF(), MKS"$() 216 ________________________________________________________________________________________________________7.5.__D___________ 7.5. D 217 7. Command_Reference_________________________________________________________________________________________________________ Command: DATA Syntax: DATA [[,, ...]] DESCRIPTION: The DATA statement is used to hold information that may be read into variables using the READ statement. DATA items are a list of string or numeric constants sep- arated by commas and may appear anywhere in a program. No comment statement may follow the DATA statement on the same line. Items are read in the order they appear in a program. RESTORE will set the pointer back to the beginning of the orst DATA statement. Alphanumeric string information in a DATA statement need not be enclosed in quotes if the orst character is not a number, math sign or decimal point. Leading spaces will be ignored (unless in quotes). DATA statements can be included any- where within a program and will be read in order. Strings not in quotes will be capitalzed. SEE ALSO: READ, RESTORE 218 ________________________________________________________________________________________________________7.5.__D___________ Variable: DATE$ Syntax: d$=DATE$ DESCRIPTION: Returns the system date. The format is DD.MM.YYYY. EXAMPLE: PRINT TIME$,DATE$ ! 14:49:44 11.03.2014 SEE ALSO: TIME"$ 219 7. Command_Reference_________________________________________________________________________________________________________ Command: DEC Syntax: DEC DESCRIPTION: Decrement Variable a. The result is a=a-1. SEE ALSO: INC 220 ________________________________________________________________________________________________________7.5.__D___________ Function: DECLOSE$() Syntax: a$=DECLOSE$(t$) DESCRIPTION: Removes enclosing characters from string t$. De-closing a string, following pairs are recognized: "" , j , <> , () , , [], ` If the string was not enclosed with one of these pairs of characters, the string will be returned unmodioed. SEE ALSO: ENCLOSE"$() 221 7. Command_Reference_________________________________________________________________________________________________________ Function: DECRYPT$() Syntax: t$=DECRYPT$(message$,key$[,typ%]) DESCRIPTION: Decrypts a message, which has been encrypted with ENCRYPT$() before. COMMENT: This function is only available if libgcrypt was compiled in. SEE ALSO: ENCRYPT"$() 222 ________________________________________________________________________________________________________7.5.__D___________ Keyword: DEFAULT Syntax: SELECT ... DEFAULT ... ENDSELECT DESCRIPTION: See SELECT. SEE ALSO: SELECT 223 7. Command_Reference_________________________________________________________________________________________________________ Command: DEFFILL Syntax: DEFFILL ,