summaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-01-05 16:36:56 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-01-05 16:36:56 +0000
commit4887a05481e143bfc4796230605d0a9ff7f2cb5a (patch)
tree495dce9e5a774e6826fa09f2651ae3c8c546822d /misc
parent9684605c30d1f7f2f7120d8c1b5645e7ca4eb54f (diff)
downloadpx4-nuttx-4887a05481e143bfc4796230605d0a9ff7f2cb5a.tar.gz
px4-nuttx-4887a05481e143bfc4796230605d0a9ff7f2cb5a.tar.bz2
px4-nuttx-4887a05481e143bfc4796230605d0a9ff7f2cb5a.zip
Pascal Tests
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@504 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'misc')
-rwxr-xr-xmisc/pascal/tests/501-uses.sh84
-rwxr-xr-xmisc/pascal/tests/debug.sh104
-rwxr-xr-xmisc/pascal/tests/list.sh73
-rw-r--r--misc/pascal/tests/src/001-beginend.pas11
-rw-r--r--misc/pascal/tests/src/002-writeln.pas17
-rw-r--r--misc/pascal/tests/src/003-for.inp2
-rw-r--r--misc/pascal/tests/src/003-for.pas16
-rw-r--r--misc/pascal/tests/src/004-repeat.inp2
-rw-r--r--misc/pascal/tests/src/004-repeat.pas18
-rw-r--r--misc/pascal/tests/src/005-while.inp2
-rw-r--r--misc/pascal/tests/src/005-while.pas19
-rw-r--r--misc/pascal/tests/src/006-optconst.pas43
-rw-r--r--misc/pascal/tests/src/007-function.pas16
-rw-r--r--misc/pascal/tests/src/101-cosine.inp2
-rw-r--r--misc/pascal/tests/src/101-cosine.pas29
-rw-r--r--misc/pascal/tests/src/102-cen2fahr.pas22
-rw-r--r--misc/pascal/tests/src/103-sumharm.inp2
-rw-r--r--misc/pascal/tests/src/103-sumharm.pas46
-rw-r--r--misc/pascal/tests/src/104-primes.pas43
-rw-r--r--misc/pascal/tests/src/105-inflation.pas27
-rw-r--r--misc/pascal/tests/src/201-strcat.pas36
-rw-r--r--misc/pascal/tests/src/202-strcmp.pas47
-rw-r--r--misc/pascal/tests/src/501-unit-cosine.pas36
-rw-r--r--misc/pascal/tests/src/501-unit-data.pas21
-rw-r--r--misc/pascal/tests/src/501-unit-sine.pas24
-rw-r--r--misc/pascal/tests/src/501-uses.inp1
-rw-r--r--misc/pascal/tests/src/501-uses.pas20
-rw-r--r--misc/pascal/tests/src/801-cgihello.pas20
-rw-r--r--misc/pascal/tests/src/802-cgiinfo.pas67
-rw-r--r--misc/pascal/tests/src/803-redirect.pas137
-rw-r--r--misc/pascal/tests/src/804-cgiform.pas322
-rw-r--r--misc/pascal/tests/src/805-cgimail.pas553
-rw-r--r--misc/pascal/tests/src/806-cgicook.pas771
-rw-r--r--misc/pascal/tests/src/901-pageutils.pas5651
-rw-r--r--misc/pascal/tests/src/README9
-rwxr-xr-xmisc/pascal/tests/testall.sh124
-rwxr-xr-xmisc/pascal/tests/testone.sh166
37 files changed, 8583 insertions, 0 deletions
diff --git a/misc/pascal/tests/501-uses.sh b/misc/pascal/tests/501-uses.sh
new file mode 100755
index 000000000..819ffc248
--- /dev/null
+++ b/misc/pascal/tests/501-uses.sh
@@ -0,0 +1,84 @@
+#!/bin/sh
+############################################################################
+# tests/501-uses.sh
+#
+# Copyright (C) 2008 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# 3. Neither the name NuttX nor the names of its contributors may be
+# used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+############################################################################
+#set -x
+
+source ../.config
+
+if [ "${CONFIG_INSN16}" == "y" ]; then
+ BINDIR=bin16
+fi
+if [ "${CONFIG_INSN32}" == "y" ]; then
+ BINDIR=bin32
+fi
+
+PASCAL=../${BINDIR}/pascal
+POPT=../${BINDIR}/popt
+PLINK=../${BINDIR}/plink
+PRUN=../${BINDIR}/prun
+
+PASOPTS=-Isrc
+PRUNOPTS="-t 1024"
+
+FILE1=src/501-unit-cosine
+FILE2=src/501-unit-sine
+FILE3=src/501-unit-data
+FILE4=src/501-uses
+
+FILES="${FILE1}.pas ${FILE2}.pas ${FILE3}.pas ${FILE4}.pas"
+PROG=src/501-uses.pex
+
+for file in ${FILES}; do
+ echo "########${file}########";
+ basefile=`basename ${file} .pas`
+ ${PASCAL} ${PASOPTS} ${file} 2>&1 || rm -f src/${basefile}.o1
+ if [ -f src/${basefile}.o1 ] ; then
+ ${POPT} src/${basefile}.o1 2>&1 || rm -f src/${basefile}.o*
+ fi
+ cat src/${basefile}.err | grep Line
+done
+
+if [ -f ${FILE1}.o ] ; then
+ if [ -f ${FILE2}.o ] ; then
+ if [ -f ${FILE3}.o ] ; then
+ if [ -f ${FILE4}.o ] ; then
+ echo "########${PROG}########";
+ ${PLINK} ${FILE1}.o ${FILE2}.o ${FILE3}.o ${FILE4}.o ${PROG} 2>&1
+ ${PRUN} ${PRUNOPTS} ${PROG} 2>&1 <src/501-uses.inp
+ fi
+ fi
+ fi
+fi
+exit
diff --git a/misc/pascal/tests/debug.sh b/misc/pascal/tests/debug.sh
new file mode 100755
index 000000000..855ede28d
--- /dev/null
+++ b/misc/pascal/tests/debug.sh
@@ -0,0 +1,104 @@
+#!/bin/sh
+############################################################################
+# debug.sh
+#
+# Copyright (C) 2008 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# 3. Neither the name NuttX nor the names of its contributors may be
+# used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+############################################################################
+#set -x
+
+source ../.config
+
+if [ "${CONFIG_INSN16}" == "y" ]; then
+ BINDIR=bin16
+fi
+if [ "${CONFIG_INSN32}" == "y" ]; then
+ BINDIR=bin32
+fi
+
+# Tell them how they are supposed to use this script
+function show_usage ()
+{
+ echo "USAGE:"
+ echo " ${0} [OPTION] <pex-file-basename>"
+ echo "OPTIONS:"
+ echo " -t <strstksz>: Select string stack size"
+ echo " -h: Show this text"
+ exit 1
+}
+
+STRSTKSZ=1024
+PEXFILENAME=
+
+# Parse command line
+while [ -n "$1" ]; do
+ case "$1" in
+ -t )
+ STRSTKSZ=$2
+ shift
+ ;;
+ -h )
+ show_usage
+ ;;
+ * )
+ PEXFILENAME=$1
+ ;;
+ esac
+ shift
+done
+
+echo "Using string stack size = ${STRSTKSZ}"
+PRUN=../${BINDIR}/prun
+PRUNOPTS="-d -t ${STRSTKSZ}"
+
+if [ -z "${PEXFILENAME}" ]; then
+ echo "ERROR: No file name provided"
+ exit 1
+fi
+
+PEXBASENAME=`basename ${PEXFILENAME} .pas`
+PEXDIRNAME=`dirname ${PEXFILENAME}`
+if [ "${PEXDIRNAME}" == "." ]; then
+ PEXDIRNAME=src
+fi
+
+PEXFILENAME=${PEXDIRNAME}/${PEXBASENAME}.pex
+if [ ! -f "${PEXFILENAME}" ]; then
+ echo "ERROR: ${PEXFILENAME} does not exist"
+ exit 1
+fi
+
+if [ -f ${PEXDIRNAME}/${PEXBASENAME}.inp ] ; then
+ echo "Test command line arguments:"
+ echo " \"`cat ${PEXDIRNAME}/${PEXBASENAME}.inp`\""
+fi
+
+${PRUN} ${PRUNOPTS} src/${PEXBASENAME}.pex 2>&1
diff --git a/misc/pascal/tests/list.sh b/misc/pascal/tests/list.sh
new file mode 100755
index 000000000..2e50ab876
--- /dev/null
+++ b/misc/pascal/tests/list.sh
@@ -0,0 +1,73 @@
+#!/bin/sh
+############################################################################
+# list.sh
+#
+# Copyright (C) 2008 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# 3. Neither the name NuttX nor the names of its contributors may be
+# used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+############################################################################
+#set -x
+
+source ../.config
+
+if [ "${CONFIG_INSN16}" == "y" ]; then
+ BINDIR=bin16
+fi
+if [ "${CONFIG_INSN32}" == "y" ]; then
+ BINDIR=bin32
+fi
+
+PLIST=../${BINDIR}/plist
+PLISTOPTS="-d"
+
+PEXFILENAME=${1}
+if [ -z "${PEXFILENAME}" ]; then
+ echo "ERROR: No file name provided"
+ exit 1
+fi
+
+PEXBASENAME=`basename ${PEXFILENAME} .pas`
+PEXDIRNAME=`dirname ${PEXFILENAME}`
+if [ "${PEXDIRNAME}" == "." ]; then
+ PEXDIRNAME=src
+fi
+
+PEXFILENAME=${PEXDIRNAME}/${PEXBASENAME}.pex
+if [ ! -f "${PEXFILENAME}" ]; then
+ echo "ERROR: ${PEXFILENAME} does not exist"
+ exit 1
+fi
+
+if [ -f ${PEXDIRNAME}/${PEXBASENAME}.inp ] ; then
+ echo "Test command line arguments:"
+ echo " \"`cat ${PEXDIRNAME}/${PEXBASENAME}.inp`\""
+fi
+
+${PLIST} ${PLISTOPTS} src/${PEXBASENAME}.pex 2>&1
diff --git a/misc/pascal/tests/src/001-beginend.pas b/misc/pascal/tests/src/001-beginend.pas
new file mode 100644
index 000000000..6f7a97958
--- /dev/null
+++ b/misc/pascal/tests/src/001-beginend.pas
@@ -0,0 +1,11 @@
+{ the compound statement }
+
+program beginend(output);
+
+var
+ sum : integer;
+
+begin
+ sum := 3 + 5;
+ writeln('sum=', sum, ' -sum=', -sum);
+end.
diff --git a/misc/pascal/tests/src/002-writeln.pas b/misc/pascal/tests/src/002-writeln.pas
new file mode 100644
index 000000000..ccdc249fc
--- /dev/null
+++ b/misc/pascal/tests/src/002-writeln.pas
@@ -0,0 +1,17 @@
+{ writeln with a variety of arguments }
+
+program check_writeln(output);
+
+const
+ floater = 1.8;
+ low = 37;
+ high = 492;
+ range_string = ' range=';
+
+var
+ range : low..high;
+
+begin
+ range := (low + high) div 2;
+ writeln('A', range_string, range, ' B floater=', floater);
+end.
diff --git a/misc/pascal/tests/src/003-for.inp b/misc/pascal/tests/src/003-for.inp
new file mode 100644
index 000000000..51d7b8d16
--- /dev/null
+++ b/misc/pascal/tests/src/003-for.inp
@@ -0,0 +1,2 @@
+5
+
diff --git a/misc/pascal/tests/src/003-for.pas b/misc/pascal/tests/src/003-for.pas
new file mode 100644
index 000000000..531437e0a
--- /dev/null
+++ b/misc/pascal/tests/src/003-for.pas
@@ -0,0 +1,16 @@
+{ compute h(n) = 1 + 1/2 + 1/3 +...+ 1/n }
+
+program egfor(input, output);
+
+var
+ i, n : integer;
+ h : real;
+
+begin
+ read(n);
+ writeln(n);
+ h := 0;
+ for i:= n downto 1 do
+ h := h + 1/i;
+ writeln(h);
+end.
diff --git a/misc/pascal/tests/src/004-repeat.inp b/misc/pascal/tests/src/004-repeat.inp
new file mode 100644
index 000000000..51d7b8d16
--- /dev/null
+++ b/misc/pascal/tests/src/004-repeat.inp
@@ -0,0 +1,2 @@
+5
+
diff --git a/misc/pascal/tests/src/004-repeat.pas b/misc/pascal/tests/src/004-repeat.pas
new file mode 100644
index 000000000..10e909fea
--- /dev/null
+++ b/misc/pascal/tests/src/004-repeat.pas
@@ -0,0 +1,18 @@
+{ compute h(n) = 1 + 1/2 + 1/3 +...+ 1/n }
+
+program egrepeat(input, output);
+
+var
+ n : integer;
+ h : real;
+
+begin
+ read(n);
+ writeln(n);
+ h := 0;
+ repeat
+ h := h + 1/n;
+ n := n - 1;
+ until n=0;
+ writeln(h);
+end.
diff --git a/misc/pascal/tests/src/005-while.inp b/misc/pascal/tests/src/005-while.inp
new file mode 100644
index 000000000..51d7b8d16
--- /dev/null
+++ b/misc/pascal/tests/src/005-while.inp
@@ -0,0 +1,2 @@
+5
+
diff --git a/misc/pascal/tests/src/005-while.pas b/misc/pascal/tests/src/005-while.pas
new file mode 100644
index 000000000..aceb5f4fa
--- /dev/null
+++ b/misc/pascal/tests/src/005-while.pas
@@ -0,0 +1,19 @@
+{ compute h(n) = 1 + 1/2 + 1/3 +...+ 1/n }
+
+program egwhile(input, output);
+
+var
+ n : integer;
+ h : real;
+
+begin
+ read(n);
+ writeln(n);
+ h := 0;
+ while n>0 do
+ begin
+ h := h + 1/n;
+ n := n - 1;
+ end;
+ writeln(h);
+end.
diff --git a/misc/pascal/tests/src/006-optconst.pas b/misc/pascal/tests/src/006-optconst.pas
new file mode 100644
index 000000000..511d807eb
--- /dev/null
+++ b/misc/pascal/tests/src/006-optconst.pas
@@ -0,0 +1,43 @@
+{ A test of constant optimiztion }
+
+program constopt;
+var
+ i1, i2, i3 : integer;
+ b1 : boolean
+begin
+ { integer operations:
+ 1. =, <>, <, <=, >, >=
+ 2. +, -, OR
+ 3. *, DIV, AND, SHL, SHR
+ 4. -, NOT
+ }
+
+ i1 := -2; { -2 }
+ i1 := 3 * 2; { 6 }
+ i1 := 3 * (-2); { -6 }
+ i1 := 3 div 2; { 1 }
+ i1 := 3 div (-2); { -1 }
+ i1 := 4 * 3 div (-2); { -6 }
+ i1 := 4 * (3 div (-2)); { -4 }
+ i1 := (4 * 3) div (-2); { -6 }
+
+ i1 := 3 + 2; { 5 }
+ i1 := 3 - 2; { 1 }
+ i1 := 3 + (-2); { 1 }
+ i1 := 4 + 3 - 2; { 5 }
+ i1 := 4 + (3 - 2); { 5 }
+ i1 := (4 + 3) - 2; { 5 }
+
+ b1 := -2 = 3 + 2; { -2 = 5 0 }
+ b1 := 3 * 2 <> 3 - 2; { 6 <> 1 -1 }
+ b1 := 3 * (-2) < 3 + (-2); { -6 < 1 -1 }
+ b1 := 3 div 2 <= 4 + 3 - 2; { 1 <= 5 -1 }
+ b1 := 3 div (-2) > 4 + (3 - 2); { -1 > 5 0 }
+ b1 := 4 * 3 div (-2) >= (4 + 3) - 2; { -6 >= 5 0 }
+
+ { floating point operations }
+ { to be provided }
+
+ { string operations }
+ { to be provided }
+end.
diff --git a/misc/pascal/tests/src/007-function.pas b/misc/pascal/tests/src/007-function.pas
new file mode 100644
index 000000000..0738db989
--- /dev/null
+++ b/misc/pascal/tests/src/007-function.pas
@@ -0,0 +1,16 @@
+{ a simple nested function }
+
+program simplefunc(output);
+
+function addmul(term1a, term1b, term2a, term2b: integer ) : integer;
+ function factor(terma, termb: integer ) : integer;
+ begin
+ factor := terma + termb;
+ end;
+begin
+ addmul := factor(term1a, term1b) + factor(term2a, term2b);
+end;
+
+begin
+ writeln('(1 + 2) * (3 + 4) =', addmul(1, 2, 3, 4));
+end.
diff --git a/misc/pascal/tests/src/101-cosine.inp b/misc/pascal/tests/src/101-cosine.inp
new file mode 100644
index 000000000..db2a68721
--- /dev/null
+++ b/misc/pascal/tests/src/101-cosine.inp
@@ -0,0 +1,2 @@
+1
+0.78539815
diff --git a/misc/pascal/tests/src/101-cosine.pas b/misc/pascal/tests/src/101-cosine.pas
new file mode 100644
index 000000000..b2797fcb9
--- /dev/null
+++ b/misc/pascal/tests/src/101-cosine.pas
@@ -0,0 +1,29 @@
+{ compute the cosine using the expansion:
+ cos(x) = 1 - x**2/(2*1) + x**4/(4*3*2*1) - ... }
+
+program cosine(input, output);
+
+const
+ eps = 1e-14;
+
+var
+ x, sx, s, t : real;
+ i, k, n : integer;
+
+begin
+ write('Number of cosines: ');
+ read(n);
+ for i:=1 to n do
+ begin
+ write(n, '. Enter radians: ');
+ read(x);
+ t := 1; k := 0; s := 1; sx := sqr(x);
+ while abs(t) > eps*abs(s) do
+ begin
+ k := k+2;
+ t := -t*sx/(k*(k-1));
+ s := s+t;
+ writeln(' cos(', x, ')=', s, ' interation=', k div 2)
+ end
+ end
+end.
diff --git a/misc/pascal/tests/src/102-cen2fahr.pas b/misc/pascal/tests/src/102-cen2fahr.pas
new file mode 100644
index 000000000..c53c5fb0e
--- /dev/null
+++ b/misc/pascal/tests/src/102-cen2fahr.pas
@@ -0,0 +1,22 @@
+{ example of constant definition part }
+
+program convert(output);
+
+const
+ addin = 32;
+ mulby = 1.8;
+ low = 0;
+ high = 39;
+ seperator = '------------';
+
+var
+ degree : low..high;
+
+begin
+ writeln(seperator);
+ for degree := low to high do
+ begin
+ writeln(degree, 'c', round(degree * mulby + addin), 'f');
+ end;
+ writeln(seperator)
+end.
diff --git a/misc/pascal/tests/src/103-sumharm.inp b/misc/pascal/tests/src/103-sumharm.inp
new file mode 100644
index 000000000..51d7b8d16
--- /dev/null
+++ b/misc/pascal/tests/src/103-sumharm.inp
@@ -0,0 +1,2 @@
+5
+
diff --git a/misc/pascal/tests/src/103-sumharm.pas b/misc/pascal/tests/src/103-sumharm.pas
new file mode 100644
index 000000000..5031ab7bb
--- /dev/null
+++ b/misc/pascal/tests/src/103-sumharm.pas
@@ -0,0 +1,46 @@
+PROGRAM sumharmonics (input, output);
+ CONST
+ firstterm = 2;
+ VAR
+ numerator, denominator,
+ lastterm, termcount : integer;
+
+ PROCEDURE lowterm (VAR num, den : integer);
+ VAR
+ numcopy, dencopy, remainder : integer;
+ BEGIN
+ numcopy := num;
+ dencopy := den;
+ WHILE dencopy <> 0 DO
+ BEGIN
+ remainder := numcopy MOD dencopy;
+ numcopy := dencopy;
+ dencopy := remainder;
+ END; { while }
+ IF numcopy > 1
+ THEN
+ BEGIN
+ num := num DIV numcopy;
+ den := den DIV numcopy;
+ END
+ END; { lowterm }
+
+ PROCEDURE addrationals (VAR num1, den1 : integer;
+ num2, den2 : integer);
+ BEGIN
+ num1 := num1 * den2 + num2 * den1;
+ den1 := den1 * den2;
+ END; { addrationals }
+
+ BEGIN { sumharmonics }
+ numerator := 1;
+ denominator := 1;
+ READ (lastterm);
+ FOR termcount := firstterm TO lastterm DO
+ BEGIN
+ addrationals (numerator, denominator, 1, termcount);
+ lowterm (numerator, denominator);
+ WRITELN (numerator, '/', denominator)
+ END; { for }
+ END. {sumharmonics}
+
diff --git a/misc/pascal/tests/src/104-primes.pas b/misc/pascal/tests/src/104-primes.pas
new file mode 100644
index 000000000..15adaabf3
--- /dev/null
+++ b/misc/pascal/tests/src/104-primes.pas
@@ -0,0 +1,43 @@
+{ generate the primes between 3..10000 using a
+ sieve containing odd integers in this range. }
+
+program primes(output);
+
+const
+ wdlength = 59; {implementation dependent}
+ maxbit = 58;
+ w = 84; {w=n div wdlength div 2}
+
+var
+ sieve, primes : array[0..w] of set of 0..maxbit;
+ next : record word,bit : integer
+ end;
+ j,k,t,c : integer; empty:boolean;
+
+begin {initialize}
+ for t:=0 to w do
+ begin sieve[t] := [0..maxbit]; primes[t] := [] end;
+ sieve[0] := sieve[0]-[0]; next.word := 0;
+ next.bit := 1; empty := false;
+
+ with next do
+ repeat {find next prime}
+ while not(bit in sieve[word]) do bit := succ(bit);
+ primes[word] := primes[word] + [bit];
+ c := 2*bit + 1;
+ j := bit; k := word;
+ while k<=w do {eliminate}
+ begin sieve[k] := sieve[k] - [j];
+ k := k + word*2; j := j + c;
+ while j>maxbit do
+ begin k := k+1; j := j - wdlength
+ end
+ end;
+ if sieve[word]=[] then
+ begin empty := true; bit := 0
+ end;
+ while empty and (word<w) do
+ begin word := word+1; empty := sieve[word]=[]
+ end
+ until empty; {ends with}
+end.
diff --git a/misc/pascal/tests/src/105-inflation.pas b/misc/pascal/tests/src/105-inflation.pas
new file mode 100644
index 000000000..479f0651a
--- /dev/null
+++ b/misc/pascal/tests/src/105-inflation.pas
@@ -0,0 +1,27 @@
+{ assuming annual inflation rates of 7, 8, and 10 per cent,
+ find the factor by which the frank, dollar, pound
+ sterlinh, mark, or guilder will have been devalued in
+ 1, 2, ... n years.}
+
+program inflation(output);
+
+const
+ n = 10;
+var
+ i : integer;
+ w1, w2, w3 : real;
+
+begin
+ i := 0;
+ w1 := 1.0;
+ w2 := 1.0;
+ w3 := 1.0;
+
+ repeat
+ i := i + 1;
+ w1 := w1 * 1.07;
+ w2 := w2 * 1.08;
+ w3 := w3 * 1.10;
+ writeln(i, '. ', w1, ', ', w2, ', ', w3);
+ until i=n
+end.
diff --git a/misc/pascal/tests/src/201-strcat.pas b/misc/pascal/tests/src/201-strcat.pas
new file mode 100644
index 000000000..fd7a67684
--- /dev/null
+++ b/misc/pascal/tests/src/201-strcat.pas
@@ -0,0 +1,36 @@
+PROGRAM stringcat;
+VAR
+ string1, string2 : string
+
+FUNCTION inquote(instring : string) : string;
+BEGIN
+ inquote := '"' + instring + '"'
+END;
+
+BEGIN
+ WRITELN(string1);
+
+ string1 := 'Now ';
+ WRITELN(inquote(string1));
+
+ string2 := 'is the time ';
+ WRITELN(inquote(string2));
+
+ string1 := string1 + string2 + 'for all good men ';
+ WRITELN(inquote(string1));
+
+ string2 := 'to come ' + 'to ';
+ WRITELN(inquote(string2));
+
+ string1 := string1 + string2;
+ WRITELN(inquote(string1));
+
+ string2 := 'of their party';
+ WRITELN(inquote(string2));
+
+ string2 := 'the aid ' + string2;
+ WRITELN(inquote(string2));
+
+ string1 := string1 + string2 + '.';
+ WRITELN(inquote(string1));
+END.
diff --git a/misc/pascal/tests/src/202-strcmp.pas b/misc/pascal/tests/src/202-strcmp.pas
new file mode 100644
index 000000000..cff214403
--- /dev/null
+++ b/misc/pascal/tests/src/202-strcmp.pas
@@ -0,0 +1,47 @@
+PROGRAM stringops;
+CONST
+ lexbig = 'zzzLexically Great';
+ lexmiddle1 = 'ZZZLexically Middle+';
+ lexmiddle = 'ZZZLexically Middle';
+ lexmiddle2 = 'ZZZLexically Middl';
+ lexsmall = 'AAALexically Small';
+ lexnothing = ''
+VAR
+ string1, string2 : string;
+BEGIN
+ IF (lexbig <= lexmiddle) THEN
+ writeln('ERROR: ', lexbig, ' <= ', lexmiddle)
+ else
+ writeln('OKAY: ', lexbig, ' > ', lexmiddle);
+
+ IF (lexmiddle > lexmiddle1) THEN
+ writeln('ERROR: ', lexmiddle, ' > ', lexmiddle1)
+ else
+ writeln('OKAY: ', lexmiddle, ' <= ', lexmiddle1);
+
+ IF (lexmiddle <> lexmiddle) THEN
+ writeln('ERROR: ', lexmiddle, ' <> ', lexmiddle)
+ else
+ writeln('OKAY: ', lexmiddle, ' = ', lexmiddle);
+
+ IF (lexmiddle = lexnothing) THEN
+ writeln('ERROR: ', lexmiddle, ' = ', lexnothing)
+ else
+ writeln('OKAY: ', lexmiddle, ' <> ', lexnothing);
+
+ IF (lexnothing <> lexnothing) THEN
+ writeln('ERROR: ', lexnothing, ' <> ', lexnothing)
+ else
+ writeln('OKAY: ', lexnothing, ' = ', lexnothing);
+
+ IF (lexmiddle < lexmiddle2) THEN
+ writeln('ERROR: ', lexmiddle, ' < ', lexmiddle2)
+ else
+ writeln('OKAY: ', lexmiddle, ' >= ', lexmiddle2);
+
+ IF (lexsmall >= lexmiddle) THEN
+ writeln('ERROR: ', lexsmall, ' >= ', lexmiddle)
+ else
+ writeln('OKAY: ', lexsmall, ' < ', lexmiddle)
+
+END.
diff --git a/misc/pascal/tests/src/501-unit-cosine.pas b/misc/pascal/tests/src/501-unit-cosine.pas
new file mode 100644
index 000000000..5f79be4a2
--- /dev/null
+++ b/misc/pascal/tests/src/501-unit-cosine.pas
@@ -0,0 +1,36 @@
+{ Compute the cosine using the expansion:
+ cos(x) = 1 - x**2/(2*1) + x**4/(4*3*2*1) - ...
+ This file verifies a simple unit that exports one function.
+}
+
+unit MyCosineUnit;
+
+interface
+
+function mycosine(x : real) : real;
+
+implementation
+
+function mycosine(x : real) : real;
+const
+ eps = 1e-14;
+
+var
+ sx, s, t : real;
+ i, k : integer;
+
+begin
+ t := 1;
+ k := 0;
+ s := 1;
+ sx := sqr(x);
+ while abs(t) > eps*abs(s) do
+ begin
+ k := k + 2;
+ t := -t * sx / (k * (k - 1));
+ s := s + t;
+ end;
+ mycosine := s
+end; { mycosine }
+end.
+
diff --git a/misc/pascal/tests/src/501-unit-data.pas b/misc/pascal/tests/src/501-unit-data.pas
new file mode 100644
index 000000000..23ffeb494
--- /dev/null
+++ b/misc/pascal/tests/src/501-unit-data.pas
@@ -0,0 +1,21 @@
+{ This file tests only that data can be shared correctly between units }
+
+unit MyDataUnit;
+
+interface
+
+var
+ mycosx : real;
+ mysinx : real;
+ myone : real;
+
+procedure checkvars;
+
+implementation
+
+procedure checkvars;
+begin
+ myone := sqr(mycosx) + sqr(mysinx)
+end; { checkvars }
+end.
+
diff --git a/misc/pascal/tests/src/501-unit-sine.pas b/misc/pascal/tests/src/501-unit-sine.pas
new file mode 100644
index 000000000..944e70774
--- /dev/null
+++ b/misc/pascal/tests/src/501-unit-sine.pas
@@ -0,0 +1,24 @@
+{ Compute the sine using: sqrt(1 - cosine**2)
+ This file verifies a unit that uses another unit
+}
+
+unit MySineUnit;
+
+interface
+
+function mysine(x : real) : real;
+
+implementation
+
+uses
+ MyCosineUnit in '501-unit-cosine.pas';
+
+function mysine(x : real) : real;
+var
+ mycos : real
+begin
+ mycos := mycosine(x);
+ mysine := sqrt(1.0 - sqr(mycos))
+end; { mysine }
+end.
+
diff --git a/misc/pascal/tests/src/501-uses.inp b/misc/pascal/tests/src/501-uses.inp
new file mode 100644
index 000000000..f912cec5c
--- /dev/null
+++ b/misc/pascal/tests/src/501-uses.inp
@@ -0,0 +1 @@
+0.78539815
diff --git a/misc/pascal/tests/src/501-uses.pas b/misc/pascal/tests/src/501-uses.pas
new file mode 100644
index 000000000..49c3cdaac
--- /dev/null
+++ b/misc/pascal/tests/src/501-uses.pas
@@ -0,0 +1,20 @@
+program MyProgram;
+
+uses
+ MyCosineUnit in '501-unit-cosine.pas';
+ MySineUnit in '501-unit-sine.pas';
+ MyDataUnit in '501-unit-data.pas';
+
+var
+ x : real;
+
+begin
+ write('Enter radians : ');
+ read(x);
+ mycosx := mycosine(x);
+ writeln('cos(', x, ')=', mycosx);
+ mysinx := mysine(x);
+ writeln('sin(', x, ')=', mysinx);
+ checkvars;
+ writeln('sin(', x, ')**2 + cos(', x, ')**2=', myone)
+end.
diff --git a/misc/pascal/tests/src/801-cgihello.pas b/misc/pascal/tests/src/801-cgihello.pas
new file mode 100644
index 000000000..54170e34e
--- /dev/null
+++ b/misc/pascal/tests/src/801-cgihello.pas
@@ -0,0 +1,20 @@
+program hello(output);
+
+ procedure WriteResponseHeader;
+ begin
+ writeln('content-type: text/html');
+ writeln
+ end;
+
+begin
+ WriteResponseHeader;
+ writeln('<HTML>');
+ writeln('<HEAD>');
+ writeln('<TITLE>IriePascal Hello World Program</TITLE>');
+ writeln('</HEAD>');
+ writeln('<BODY>');
+ writeln('<BIG> Hello world!!! </BIG>');
+ writeln('</BODY>');
+ writeln('</HTML>')
+end.
+
diff --git a/misc/pascal/tests/src/802-cgiinfo.pas b/misc/pascal/tests/src/802-cgiinfo.pas
new file mode 100644
index 000000000..ba5cfdffa
--- /dev/null
+++ b/misc/pascal/tests/src/802-cgiinfo.pas
@@ -0,0 +1,67 @@
+program info(output);
+
+procedure WriteHeader;
+begin
+writeln('Content-type: text/html');
+writeln;
+writeln('<html>');
+writeln('<head>');
+writeln('<title>Irie Pascal sample CGI application</title>');
+writeln('<h1>CGI environment variables.</h1>');
+writeln('</head>')
+end;
+
+procedure WriteBody;
+
+procedure DisplayEnvVar(name : string);
+var
+value : string;
+begin
+value := getenv(name);
+writeln(name, ' = ', value, '<br>')
+end;
+
+begin
+writeln('<body>');
+DisplayEnvVar('HTTP_ACCEPT');
+DisplayEnvVar('HTTP_ACCEPT_ENCODING');
+DisplayEnvVar('HTTP_ACCEPT_LANGUAGE');
+DisplayEnvVar('HTTP_AUTHORIZATION');
+DisplayEnvVar('HTTP_CHARGE_TO');
+DisplayEnvVar('HTTP_FROM');
+DisplayEnvVar('HTTP_IF_MODIFIED_SINCE');
+DisplayEnvVar('HTTP_PRAGMA');
+DisplayEnvVar('HTTP_REFERER');
+DisplayEnvVar('HTTP_USER_AGENT');
+writeln('<hr>');
+DisplayEnvVar('AUTH_TYPE');
+DisplayEnvVar('CONTENT_LENGTH');
+DisplayEnvVar('CONTENT_TYPE');
+DisplayEnvVar('GATEWAY_INTERFACE');
+DisplayEnvVar('PATH_INFO');
+DisplayEnvVar('PATH_TRANSLATED');
+DisplayEnvVar('QUERY_STRING');
+DisplayEnvVar('REMOTE_ADDR');
+DisplayEnvVar('REMOTE_HOST');
+DisplayEnvVar('REMOTE_IDENT');
+DisplayEnvVar('REMOTE_USER');
+DisplayEnvVar('REQUEST_METHOD');
+DisplayEnvVar('SCRIPT_NAME');
+DisplayEnvVar('SERVER_NAME');
+DisplayEnvVar('SERVER_PORT');
+DisplayEnvVar('SERVER_PROTOCOL');
+DisplayEnvVar('SERVER_SOFTWARE');
+writeln('</body>')
+end;
+
+procedure WriteFooter;
+begin
+writeln('</html>')
+end;
+
+begin
+WriteHeader;
+WriteBody;
+WriteFooter
+end.
+
diff --git a/misc/pascal/tests/src/803-redirect.pas b/misc/pascal/tests/src/803-redirect.pas
new file mode 100644
index 000000000..d53acc1e1
--- /dev/null
+++ b/misc/pascal/tests/src/803-redirect.pas
@@ -0,0 +1,137 @@
+program prices(input, output);
+const
+ MaxBuffer = 256;
+ BASE = 'http://www.irietools.com/';
+var
+ buffer : string[MaxBuffer];
+ NewLocation : string;
+
+ procedure Init;
+ begin
+ NewLocation := BASE
+ end;
+
+ procedure GenerateHTTPHeader;
+ begin
+ writeln('Content-type: text/html');
+ writeln;
+ end;
+
+ procedure GetCGIData;
+ var
+ RequestMethod : string;
+
+ procedure GetRequest;
+ begin (* GetRequest *)
+ buffer := getenv('QUERY_STRING')
+ end; (* GetRequest *)
+
+ procedure PostRequest;
+ var
+ len, i : 0..maxint;
+ err : integer;
+ ContentLength : string;
+ c : char;
+ begin (* PostRequest *)
+ buffer := '';
+ ContentLength := getenv('CONTENT_LENGTH');
+ if ContentLength <> '' then
+ val(ContentLength, len, err)
+ else
+ len := 0;
+ if len <= MaxBuffer then
+ for i := 1 to len do
+ begin
+ read(c);
+ buffer := buffer + c
+ end
+ end; (* PostRequest *)
+
+ begin (* GetCGIData *)
+ RequestMethod := getenv('REQUEST_METHOD');
+ if RequestMethod = 'GET' then
+ GetRequest
+ else
+ PostRequest
+ end; (* GetCGIData *)
+
+ procedure ProcessCGIData;
+ var
+ i, num, p : integer;
+ EncodedVariable, DecodedVariable, name, value : string;
+
+ procedure ProcessNameValuePair(var name, value : string);
+ begin
+ if (name = 'lstnavigation') or (name = 'navigation') or (name = 'goto') then
+ begin
+ if value <> '[none]' then
+ if lowercase(copy(value, 1, 5)) = 'http:' then
+ NewLocation := value
+ else
+ NewLocation := BASE + value
+ end
+ else
+ ; (* do nothing we have an undefined form element *)
+ end;
+
+ begin (* ProcessCGIData *)
+ num := CountWords(buffer, '&');
+ for i := 1 to num do
+ begin
+ EncodedVariable := CopyWord(buffer, i, '&');
+ DecodedVariable := URLDecode(EncodedVariable);
+ p := pos('=', DecodedVariable);
+ if p > 0 then
+ begin
+ name := lowercase(trim(copy(DecodedVariable, 1, p-1)));
+ value := lowercase(trim(copy(DecodedVariable, p+1)));
+ ProcessNameValuePair(name, value);
+ end
+ end
+ end; (* ProcessCGIData *)
+
+ procedure GenerateResponse;
+
+ procedure GenerateHTMLHeader;
+ begin
+ writeln('<html>');
+ writeln('<head>');
+ writeln('<meta name="Description" content="Redirect New Location">');
+
+ writeln('<meta http-equiv="Refresh" content="0;URL=', NewLocation, '">');
+
+ writeln('<title>Redirect to New Location</title>');
+ writeln('</head>');
+ end;
+
+ procedure GenerateHTMLFooter;
+ begin
+ writeln('<hr>');
+ writeln('<p>');
+ writeln('Redirect 1.0 Copyright &copy; 1999-2001, Stuart King<br>');
+ writeln('Home page <a href="http://www.irietools.com/">www.irietools.com</a>');
+ writeln('</p>');
+ writeln('</body>');
+ writeln('</html>');
+ end;
+
+ begin (* GenerateResponse *)
+ GenerateHTMLHeader;
+ writeln('<body bgcolor="#FFE8E8">');
+ writeln('<p>You should be automatically taken to the next page.</p>');
+ writeln('<p>However if your browser does not support redirection ');
+ writeln('click <a href="', NewLocation, '">here</a></p>');
+ GenerateHTMLFooter;
+ end; (* GenerateResponse *)
+
+begin
+ GenerateHTTPHeader;
+
+ Init;
+
+ GetCGIData;
+
+ ProcessCGIData;
+
+ GenerateResponse;
+end.
diff --git a/misc/pascal/tests/src/804-cgiform.pas b/misc/pascal/tests/src/804-cgiform.pas
new file mode 100644
index 000000000..e3043f548
--- /dev/null
+++ b/misc/pascal/tests/src/804-cgiform.pas
@@ -0,0 +1,322 @@
+(********************************************************************************************
+** PROGRAM : cgiform
+** VERSION : 1.0.0
+** DESCRIPTION : Demonstrates how to process HTML forms in CGI programs.
+** AUTHOR : Stuart King
+** COPYRIGHT : Copyright (c) Irie Tools, 2002. All Rights Reserved.
+** NOTES :
+** This sample program is distributed with Irie Pascal, and was written to illustrate
+** how to process HTML forms. To make best use of this sample you should have a basic
+** understanding of Pascal as well as a basic understanding of the Common Gateway Interface
+** (CGI).
+**
+** HTML forms provide a way for websites to receive input from visitors, and to process
+** this input in some way. HTML forms contain different kinds of input elements in order
+** to conveniently receive different kinds of visitor input. The most common kinds of
+** input elements are:
+** 1. One line text entry boxes
+** 2. Multi-line text entry boxes
+** 3. Checkboxes
+** 4. Radio buttons
+** 5. Hidden fields
+** 6. Selection lists (Drop-down menus and List boxes).
+** 7. Reset button
+** 8. Submit button
+**
+** HTML forms have action attributes that indicate what should happen when the submit
+** button is clicked. It is very common for the action attribute to point at the URL of
+** a CGI program. In this case when the submit button is pressed the CGI program is executed
+** and the form's input is passed to the program for processing. Each input element in the
+** form has a name and the form's input is sent to the CGI program in the form of name/value
+** pairs, where the values are the input received by the input elements.
+**
+** What this program actually does is retrieve any form input passed to it. If it receives
+** form input then this program just displays the name/value pairs, along with a link that
+** can be used to execute the program again. If the program does not receive any form input
+** then it displays a form with a variaty of input elements. The form's action element points
+** back to the program, so that the program will receive the input from the form when the
+** submit button is pressed.
+**********************************************************************************************)
+program cgiform;
+const
+ MAX_BUFFER = 8000;
+ MAX_NAME = 20;
+ MAX_VALUE = 400;
+type
+ positive = 0..maxint;
+ BufferType = string[MAX_BUFFER];
+ NameValuePair = record
+ Name : string[MAX_NAME];
+ Value : string[MAX_VALUE]
+ end;
+var
+ buffer : BufferType;
+ NameValuePairs : list of NameValuePair;
+ ScriptName : filename;
+
+ function EscapeCharacters(s : string) : string; forward;
+
+ //PURPOSE: Initializes the program
+ //NOTES:
+ // Initializes the list that will be used to store the name/value pairs
+ //passed to the program. The program also retrieves it's name so that it can
+ //refer to itself in the generated response.
+ procedure Initialize;
+ begin (* Initialize *)
+ new(NameValuePairs);
+ ScriptName := getenv('SCRIPT_NAME');
+ end; (* Initialize *)
+
+ //PURPOSE: Retrieves the information passed to the CGI applications.
+ //GLOBAL(s) - buffer - Used to store the GET or POST information passed to the CGI program
+ procedure GetCGIData;
+ var
+ RequestMethod : string;
+
+ //PURPOSE: Retrieves information sent to by a GET request (i.e. in the QUERY_STRING
+ // environment variable).
+ procedure GetRequest;
+ begin (* GetRequest *)
+ buffer := getenv('QUERY_STRING')
+ end; (* GetRequest *)
+
+ //PURPOSE: Retrieves information sent to by a POST request (i.e. through the standard
+ // input stream, with the length of the data in the environment variable
+ // CONTENT_LENGTH).
+ procedure PostRequest;
+ var
+ len, i : positive;
+ err : integer;
+ ContentLength : string;
+ c : char;
+ begin (* PostRequest *)
+ buffer := '';
+ ContentLength := getenv('CONTENT_LENGTH');
+ if ContentLength <> '' then
+ val(ContentLength, len, err)
+ else
+ len := 0;
+ if len <= MAX_BUFFER then
+ for i := 1 to len do
+ begin
+ read(c);
+ buffer := buffer + c
+ end
+ end; (* PostRequest *)
+
+ begin (* GetCGIData *)
+ RequestMethod := getenv('REQUEST_METHOD');
+ if RequestMethod = 'GET' then
+ GetRequest
+ else
+ PostRequest
+ end; (* GetCGIData *)
+
+ //PURPOSE: Process the data passed to the program.
+ //NOTES: This is the main part of the program. After retreiving
+ // the information passed to the program this procedure is
+ // called to perform the required processing.
+ procedure ProcessCGIData;
+ var
+ i, num, p : integer;
+ EncodedVariable, DecodedVariable, name, value : string;
+
+ //PURPOSE: Processes the named value pairs sent with the GET or POST request.
+ // Which in this case is the information entered by the user about the
+ // cookie to add or delete.
+ //ARGUMENT(s): name - name part of the name/value pair
+ // value - value part of name/value pair
+ //NOTES:
+ // The information entered by the user is sent as name/value pairs (i.e. name-value)
+ //with the name part being the name of the form element holding the information and
+ //the value part being the actual information held by the form element.
+ procedure ProcessNameValuePair(var name, value : string);
+ var
+ pair : NameValuePair;
+ begin (* ProcessNameValuePair *)
+ pair.name := name;
+ pair.value := value;
+ insert(pair, NameValuePairs);
+ end; (* ProcessNameValuePair *)
+
+ begin (* ProcessCGIData *)
+ //Retrieve each name/value pair from the form and processes them.
+ num := CountWords(buffer, '&');
+ for i := 1 to num do
+ begin
+ EncodedVariable := CopyWord(buffer, i, '&');
+ DecodedVariable := URLDecode(EncodedVariable);
+ p := pos('=', DecodedVariable);
+ if p > 0 then
+ begin
+ name := lowercase(trim(copy(DecodedVariable, 1, p-1)));
+ value := trim(copy(DecodedVariable, p+1));
+ ProcessNameValuePair(name, value);
+ end
+ end;
+ end; (* ProcessCGIData *)
+
+ //PURPOSE: Generates the response to send back to the browser.
+ procedure GenerateResponse;
+
+ procedure GenerateHeader;
+ begin (* GenerateHeader *)
+ //Generate the response headers (including the blank line at the end).
+ writeln('content-type: text/html');
+ writeln;
+
+ writeln('<html>');
+ writeln('<head>');
+ writeln('<title>Irie Pascal sample CGI application</title>');
+ writeln('<h1>CGIFORM</h1>');
+ writeln('<h2>This program displays the data entered into a form.</h2>');
+ writeln('</head>');
+ writeln(' <hr>');
+ end; (* GenerateHeader *)
+
+ procedure GenerateBody;
+
+ procedure WriteForm;
+ begin (* WriteForm *)
+ writeln('<form method="POST" action="', ScriptName, '">');
+ writeln(' <h2>One Line Text Box:</h2>');
+ writeln(' <p>OneLine <input type="text" name="OneLine" size="20"></p>');
+ writeln(' <hr>');
+ writeln(' <h2>Scrolling Text Box:</h2>');
+ writeln(' <p>Scrolling <textarea rows="2" name="Scrolling" cols="20"></textarea></p>');
+ writeln(' <hr>');
+ writeln(' <h2>Check Boxes</h2>');
+ writeln(' <p>Box1 <input type="checkbox" name="Box1" value="1">');
+ writeln(' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Box2 <input type="checkbox" name="Box2"');
+ writeln(' value="1"></p>');
+ writeln(' <p>Box3 <input type="checkbox" name="Box3" value="1">');
+ writeln(' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Box4 <input type="checkbox" name="Box4"');
+ writeln(' value="1"></p>');
+ writeln(' <hr>');
+ writeln(' <h2>Radio Buttons</h2>');
+ writeln(' <p>Radio1 <input type="radio" value="1" checked name="Radio1">');
+ writeln(' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Radio2 <input type="radio" name="Radio2"');
+ writeln(' value="2"></p>');
+ writeln(' <p>Radio3 <input type="radio" name="Radio3" value="3">');
+ writeln(' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Radio4 <input type="radio" name="Radio4"');
+ writeln(' value="4"></p>');
+ writeln(' <hr>');
+ writeln(' <h2>Drop-Down Menu</h2>');
+ writeln(' <p>DropDown <select name="DropDown" size="1">');
+ writeln(' <option value="Choice1">Choice1</option>');
+ writeln(' <option value="Choice2">Choice2</option>');
+ writeln(' <option value="Choice3">Choice3</option>');
+ writeln(' <option value="Choice4">Choice4</option>');
+ writeln(' <option value="Choice5">Choice5</option>');
+ writeln(' <option value="Choice6">Choice6</option>');
+ writeln(' </select></p>');
+ writeln(' <hr>');
+ writeln(' <p><input type="submit" value="Submit" name="Submit"><input type="reset" value="Reset"');
+ writeln(' name="Reset"></p>');
+ writeln('</form>');
+ end; (* WriteForm *)
+
+ procedure WriteFormData;
+ var
+ pair : NameValuePair;
+ i : positive;
+ begin (* WriteFormData *)
+ writeln('<h1>Form Data</h1>');
+ for i := 1 to length(NameValuePairs) do
+ begin
+ pair := NameValuePairs[i];
+ writeln('<h3>', EscapeCharacters(pair.name), ' = ', EscapeCharacters(pair.value), '</h3>');
+ end;
+ writeln('<hr>');
+ writeln('<p>Click <a href="', ScriptName, '">here</a> to go back to the form.</p>');
+ end; (* WriteFormData *)
+
+ begin (* GenerateBody *)
+ writeln('<body>');
+
+ if length(NameValuePairs) = 0 then
+ begin
+ //Generate the HTML for the form
+ WriteForm;
+ end
+ else
+ begin
+ //Generate the HTML that displays the form data
+ WriteFormData;
+ end;
+
+ writeln('</body>');
+ end; (* GenerateBody *)
+
+ procedure GenerateFooter;
+ begin (* GenerateFooter *)
+ writeln('</html>');
+ end; (* GenerateFooter *)
+
+ begin (* GenerateResponse *)
+ GenerateHeader;
+ GenerateBody;
+ GenerateFooter;
+ end; (* GenerateResponse *)
+
+ procedure Shutdown;
+ begin (* Shutdown *)
+ dispose(NameValuePairs);
+ end; (* Shutdown *)
+
+ //*************************************************************************
+ //PURPOSE: This function converts certain characters that have a
+ // special meaning in HTML documents to their HTML representation.
+ //ARGUMENT(s): s - The string to be escaped.
+ //RETURNS: The string with all special characters escaped.
+ //NOTES: The characters converted are < > "
+ function EscapeCharacters;
+ const
+ LessThanChar = '<';
+ GreaterThanChar = '>';
+ QuoteChar = '"';
+ HTMLLessThan = '&lt;';
+ HTMLGreaterThan = '&gt;';
+ HTMLQuote = '&quot;';
+ var
+ i : positive;
+
+ procedure ReplaceChar(var strBuffer : string; strReplace : string; i : positive);
+ begin (* ReplaceChar *)
+ delete(strBuffer, i, 1);
+ insert(strReplace, strBuffer, i)
+ end; (* ReplaceChar *)
+
+ begin (* EscapeCharacters *)
+ repeat
+ i := pos(LessThanChar, s, 1);
+ if i > 0 then
+ ReplaceChar(s, HTMLLessThan, i)
+ until i = 0;
+
+ repeat
+ i := pos(GreaterThanChar, s, 1);
+ if i > 0 then
+ ReplaceChar(s, HTMLGreaterThan, i)
+ until i = 0;
+
+ repeat
+ i := pos(QuoteChar, s, 1);
+ if i > 0 then
+ ReplaceChar(s, HTMLQuote, i)
+ until i = 0;
+
+ EscapeCharacters := s;
+ end; (* EscapeCharacters *)
+
+begin
+ Initialize;
+
+ GetCGIData;
+
+ ProcessCGIData;
+
+ GenerateResponse;
+
+ Shutdown;
+end.
diff --git a/misc/pascal/tests/src/805-cgimail.pas b/misc/pascal/tests/src/805-cgimail.pas
new file mode 100644
index 000000000..5b16f8d52
--- /dev/null
+++ b/misc/pascal/tests/src/805-cgimail.pas
@@ -0,0 +1,553 @@
+//***********************************************************************
+//CGIMAIL Version 1.0
+//Copyright (c) 2001, Stuart King. All rights reserved.
+//PURPOSE: This program is a Common Gateway Interface (CGI) application
+// that sends email messages.
+//***********************************************************************
+program cgimail(input, output);
+const
+ MaxBuffer = 2400; //Size of the buffer used to store the data from GET and POST requests
+ DEFAULT_SENDMAIL = '/usr/lib/sendmail'; //Default fullpathname to the sendmail program
+ DEFAULT_SUCCESS_MESSAGE = '<p>Thank you. Your email message has been sent successfully.</p>';
+ CONFIG_FILENAME = 'cgimail.cfg'; //name of the configuration file
+type
+ Buffer = string[MaxBuffer];
+var
+ strCGIData : Buffer; //Stores the data from the GET or POST request
+ strFrom, strTo, strSubject, strBody : Buffer;
+ strErrorLink, strSuccessLink : filename;
+ strSuccessMessage : Buffer;
+ SendMail : filename;
+
+ procedure DisplayError(strMsg : string);
+ begin //DisplayError
+ writeln('ERROR: ', strMsg);
+ halt
+ end; //DisplayError
+
+ //*************************************************************
+ //PURPOSE: Returns the directory containing the application
+ //NOTES: Used in this particular program to help locate the
+ // configuration file.
+ //*************************************************************
+ function AppDir : filename;
+ var
+ fdir : filename;
+ begin
+ fsplit(paramstr(0), fdir,,);
+ AppDir := fdir
+ end;
+
+ //*****************************************************************
+ //PURPOSE: Returns an output string (strOut) that is generated
+ // from an input string (strIn), by replacing all
+ // occurrences of one string (strOld) with another
+ // string (strNew).
+ //NOTE: No error checking is done so it is up to the caller to
+ // ensure that the replacing string does not contain the
+ // string being replaced.
+ //*****************************************************************
+ function Replace(strIn : Buffer; strOld, strNew : string) : Buffer;
+ var
+ strOut : Buffer;
+ i : 0..MaxBuffer;
+ begin
+ strOut := strIn;
+ i := 1;
+ repeat
+ i := pos(strOld, strOut, i);
+ if i > 0 then
+ begin
+ delete(strOut, i, length(strOld));
+ insert(strNew, strOut, i);
+ end
+ until i = 0;
+ Replace := strOut
+ end;
+
+ (***************************************************************
+ ** PURPOSE: This procedure converts certain characters that
+ ** have a special meaning in HTML documents to
+ ** their HTML representation.
+ ** The characters converted are < > "
+ *)
+ function EscapeCharacters(str : Buffer) : Buffer;
+ const
+ LessThanChar = '<';
+ GreaterThanChar = '>';
+ QuoteChar = '"';
+ HTMLLessThan = '&lt;';
+ HTMLGreaterThan = '&gt;';
+ HTMLQuote = '&quot;';
+
+ begin
+ str := Replace(str, LessThanChar, HTMLLessThan);
+ str := Replace(str, GreaterThanChar, HTMLGreaterThan);
+ str := Replace(str, QuoteChar, HTMLQuote);
+ EscapeCharacters := str
+ end;
+
+ procedure Initialize;
+ begin //Initialize
+ strFrom := '';
+ strTo := '';
+ strSubject := '';
+ strBody := '';
+ SendMail := DEFAULT_SENDMAIL;
+ strSuccessMessage := DEFAULT_SUCCESS_MESSAGE;
+ strErrorLink := '';
+ strSuccessLink := '';
+ end; //Initialize
+
+ //****************************************************************
+ //PURPOSE: Looks for the configuration file in the application
+ // directory, and if found prcesses the commands inside.
+ //****************************************************************
+ procedure ReadConfigFile;
+ var
+ ConfigFile : filename;
+ f : text;
+ line : string;
+
+ //**********************************************************
+ //PURPOSE: Processes a line in the configuration file
+ //NOTE: The line is assumed to look like
+ // command=value
+ // where "command" is a valid configuration command
+ // and "value" is a valid configuration value
+ // for example
+ //
+ // sendmail=/usr/lib/sendmail
+ //
+ //**********************************************************
+ procedure ProcessConfigLine(line : string);
+ const
+ SENDMAIL_COMMAND = 'sendmail';
+ TO_COMMAND = 'to';
+ SUBJECT_COMMAND = 'subject';
+ FROM_COMMAND = 'from';
+ BODY_COMMAND = 'body';
+ ERROR_LINK_COMMAND = 'error_link';
+ SUCCESS_LINK_COMMAND = 'success_link';
+ SUCCESS_MESSAGE_COMMAND = 'success_message';
+ var
+ command, value : string;
+ begin //ProcessConfigLine
+ if CountWords(line, '=') = 2 then
+ begin
+ command := lowercase(trim(CopyWord(line, 1, '=')));
+ value := trim(CopyWord(line, 2, '='));
+ if command = SENDMAIL_COMMAND then
+ SendMail := value
+ else if command = TO_COMMAND then
+ strTo := value
+ else if command = SUBJECT_COMMAND then
+ strSubject := value
+ else if command = FROM_COMMAND then
+ strFrom := value
+ else if command = BODY_COMMAND then
+ strBody := value
+ else if command = ERROR_LINK_COMMAND then
+ strErrorLink := value
+ else if command = SUCCESS_LINK_COMMAND then
+ strSuccessLink := value
+ else if command = SUCCESS_MESSAGE_COMMAND then
+ strSuccessMessage := value
+ end;
+ end; //ProcessConfigLine
+
+ begin //ReadConfigFile
+ ConfigFile := AppDir; //Look for configuration file in the Application directory
+ if ConfigFile <> '' then
+ begin
+ //Ensure that the Application directory ends with a directory seperator
+ if ConfigFile[length(ConfigFile)] <> dirsep then
+ ConfigFile := ConfigFile + dirsep;
+ //Append the name of the configuration file to the application directory
+ ConfigFile := ConfigFile + CONFIG_FILENAME;
+ end
+ else //this shouldn't happen but just in case look for configuration file in current directory.
+ ConfigFile := CONFIG_FILENAME;
+
+ traperrors(false); //Turn off error trapping
+ reset(f, ConfigFile); //Attempt to open configuaration file
+ traperrors(true); //Turn on error trapping
+ if getlasterror = 0 then //if the configuration file was successfully opened read it and process it
+ begin
+ while not eof(f) do
+ begin
+ readln(f, line);
+ ProcessConfigLine(line);
+ end;
+ close(f);
+ end;
+ end; //ReadConfigFile
+
+ //***************************************************************
+ //PURPOSE: Checks whether the input string (strAddress) is a
+ // valid email address.
+ //NOTE: This function does not perform a bullet-proof check
+ // for the validity of the email address. It just ensures
+ // that the address has at least one '@' and the first '@' is
+ // not at the beginning of the address. This function also
+ // checks to make sure that a '.' follows somewhere after the '@'.
+ //***************************************************************
+ function IsValidEmailAddress(strAddress : Buffer) : boolean;
+ var
+ i : integer;
+ begin //IsValidEmailAddress
+ i := pos('@', strAddress);
+ if (i > 1) and (pos('.', strAddress, i+1) > 0) then
+ IsValidEmailAddress := true
+ else
+ IsValidEmailAddress := false;
+ end; //IsValidEmailAddress
+
+ //*********************************************************************
+ //PURPOSE: Sends an email message using "sendmail" or the CDONTS object
+ //*********************************************************************
+ procedure SendEmail(strFrom, strTo, strSubject, strBody : Buffer);
+
+ //********************************************************
+ //PURPOSE: Sends and email message using "sendmail"
+ //NOTE:
+ //The built-in procedure "popen" is used to execute "sendmail" and
+ // open a pipe to the "sendmail" process. The email message is then
+ // written to this pipe and the "sendmail" process reads the email
+ // message and sends it to the recipients.
+ //The "-t" option is passed to "sendmail" to cause it to examine the
+ // email message for To:, Cc:, and Bcc: headers which it will then
+ // use to find out who are the intended recipients of the message.
+ //The configuration file (cgimail.cfg) can be used to specify where
+ // "sendmail" is located or even that another program be used
+ // instead of "sendmail". See the constant DEFAULT_SENDMAIL at the
+ // top of this program for the default location of "sendmail".
+ //If "sendmail" is not in the default location then use a command like
+ //
+ // sendmail=pathname
+ //
+ // in the configuration file to specify the correct location.
+ //You can also use the "sendmail" command in the configuration file
+ // to specify that a program other than "sendmail" be used
+ // to send email (under Unix-like operating systems), as long
+ // as the substitute email program has a similar interface to
+ // "sendmail", (i.e. it can take the -t option, and it will examine
+ // the email message for (at minimum) a To: header).
+ //The configuration file (cgimail.cfg) should be placed in the same
+ // directory as this program.
+ //********************************************************
+ procedure SendEmailWithSendMail;
+ const
+ SENDMAIL_OPTIONS = '-t'; //Make sendmail examine To:, Cc:, and Bcc: in message
+ var
+ pipe : text;
+ begin //SendEmailWithSendMail
+ popen(pipe, SendMail + ' ' + SENDMAIL_OPTIONS, writemode);
+ writeln(pipe, 'To: ', strTo);
+ if strFrom <> '' then
+ writeln(pipe, 'From: ', strFrom);
+ if strSubject <> '' then
+ writeln(pipe, 'Subject: ', strSubject);
+ writeln(pipe);
+ if strBody <> '' then
+ writeln(pipe, strBody);
+ writeln(pipe, '.');
+ close(pipe);
+ end; //SendEmailWithSendMail
+
+ //***************************************************************
+ //PURPOSE: Sends and email message using the CDONTS components
+ //NOTE: The CDONTS components were created by Microsoft to
+ // simplify the process of sending email. These components
+ // are distributed with IIS so if IIS is your webserver
+ // you can probably use these components.
+ //***************************************************************
+ procedure SendEmailWithCDONTS;
+ const
+ NORMAL = 1;
+ //LOW = 0;
+ //HIGH = 2;
+ var
+ objMail : object;
+ iLastError : integer;
+ strError : string;
+ begin //SendEmailWithCDONTS
+ traperrors(false);
+ objMail := CreateObject('CDONTS.NewMail');
+ traperrors(true);
+ iLastError := getlasterror;
+ if iLastError <> 0 then
+ begin
+ str(iLastError:1, strError);
+ strError := strError+' ' + errors[1].description;
+ DisplayError('#'+strError);
+ end;
+ objMail.Send(strFrom , strTo, strSubject, strBody, NORMAL);
+ dispose(objMail);
+ end; //SendEmailWithCDONTS
+
+ begin //SendEmail
+ //If this application is running under a Unix-Like platform then
+ // use sendmail to send email message
+ //If not use the CDONTS object
+ if UnixPlatform then
+ SendEmailWithSendMail
+ else
+ SendEmailWithCDONTS
+ end; //SendEmail
+
+ //********************************************************************
+ //PURPOSE: Reads the CGI request information and stores it in a buffer
+ //NOTE: The environment variable "REQUEST_METHOD" is used to determine
+ // whether a GET or POST request was made, and calls the
+ // appropriate procedure to read the data.
+ //This procedure is generic and can probably be used in almost any
+ //CGI application. The only thing likely to change is the size of the
+ // buffer used to store the CGI request information.
+ //********************************************************************
+ procedure GetCGIData(var strData : Buffer);
+ var
+ RequestMethod : string;
+
+ procedure GetRequest(var strData : Buffer);
+ begin // GetRequest
+ strData := getenv('QUERY_STRING')
+ end; // GetRequest
+
+ procedure PostRequest(var strData : Buffer);
+ var
+ len, i : 0..maxint;
+ err : integer;
+ ContentLength : string;
+ c : char;
+ begin // PostRequest
+ strData := '';
+ ContentLength := getenv('CONTENT_LENGTH');
+ if ContentLength <> '' then
+ val(ContentLength, len, err)
+ else
+ len := 0;
+ if err > 0 then
+ len := 0;
+ if len <= MaxBuffer then
+ for i := 1 to len do
+ begin
+ read(c);
+ strData := strData + c
+ end
+ end; // PostRequest
+
+ begin // GetCGIData
+ RequestMethod := getenv('REQUEST_METHOD');
+ if RequestMethod = 'GET' then
+ GetRequest(strData)
+ else
+ PostRequest(strData);
+ end; // GetCGIData
+
+ //********************************************************************
+ //PURPOSE: Processes the CGI request information that was earlier
+ // stored in the buffer. This involves seperating the information
+ // in the buffer into name/value pairs and then decoding them.
+ // CGI request information is passed to applications in the following
+ // form:
+ // name=value
+ // called name/value pairs. Each name/value pair is encoded, and then
+ // joined together in one big block of data seperated by '&'.
+ // So to process the name/value pairs the process is reversed.
+ // The individual name/value pairs are seperated from the block and
+ // then decoded, then the "name" part is seperated from the "value"
+ // part, and finally the procedure ProcessNameValuePair is called to
+ // do something with the the name/value pair.
+ //Most of this procedure is generic and can be used in almost any
+ // CGI application, the only part of this procedure that is
+ // specific to this application is what goes on inside
+ // "ProcessNameValuePair". In this case some values get assigned to
+ // some global variables.
+ //********************************************************************
+ procedure ProcessCGIData(var strData : Buffer);
+ var
+ i, num, p : integer;
+ EncodedVariable, DecodedVariable, name, value : Buffer;
+
+ procedure ProcessNameValuePair;
+ begin //ProcessNameValuePair
+ if name = 'to' then
+ strTo := value
+ else if name = 'subject' then
+ strSubject := value
+ else if name = 'from' then
+ strFrom := value
+ else if name = 'body' then
+ strBody := value
+ else if name = 'error_link' then
+ strErrorLink := value
+ else if name = 'success_link' then
+ strSuccessLink := value
+ else if name = 'success_message' then
+ strSuccessMessage := value
+ end; //ProcessNameValuePair
+
+ begin // ProcessCGIData
+ num := CountWords(strData, '&');
+ for i := 1 to num do
+ begin
+ EncodedVariable := CopyWord(strData, i, '&');
+ DecodedVariable := URLDecode(EncodedVariable);
+ p := pos('=', DecodedVariable);
+ if p > 0 then
+ begin
+ name := lowercase(trim(copy(DecodedVariable, 1, p-1)));
+ value := trim(copy(DecodedVariable, p+1));
+ ProcessNameValuePair;
+ end
+ end
+ end; // ProcessCGIData
+
+ //*******************************************************
+ //PURPOSE: Writes the HTTP response header
+ //*******************************************************
+ procedure WriteResponseHeader;
+ begin //WriteResponseHeader
+ writeln('Content-type: text/html');
+ writeln;
+ end; //WriteResponseHeader
+
+ //**************************************************************
+ //PURPOSE: Generates the HTML response and possibly send
+ // the email message.
+ //**************************************************************
+ procedure GenerateResponse;
+ var
+ i : integer;
+ InvalidTo : boolean;
+
+ procedure GenerateHTMLHeader;
+ begin
+ writeln('<html>');
+ writeln('<head>');
+ writeln('<title>CGIMail 1.0</title>');
+ writeln('<meta name="GENERATOR" content="CGIMail 1.0">');
+ writeln('<meta name="COPYRIGHT" content="Copyright (c) 2001, Stuart King.">');
+ writeln('</head>');
+ end;
+
+ procedure GenerateHTMLFooter;
+ begin
+ writeln('<hr>');
+ writeln('<p>');
+ writeln('CGIMail 1.0 Copyright &copy; 2001, Stuart King<br>');
+ writeln('Home page <a href="http://www.irietools.com/">www.irietools.com</a>');
+ writeln('</p>');
+ writeln('</body>');
+ writeln('</html>');
+ end;
+
+ //*******************************************************************
+ //PURPOSE: Generates the response when the email recipient (in strTo)
+ // is not specified.
+ //*******************************************************************
+ procedure GenerateNoTo;
+ begin
+ GenerateHTMLHeader;
+ writeln('<body>');
+ writeln('<h1>');
+ writeln('Email Address (Recipient) Required');
+ writeln('</h1>');
+ writeln('<p>The address of the email recipient was not specified.</p>');
+ if strErrorLink <> '' then
+ writeln('<p>Please click <a href="', EscapeCharacters(strErrorLink), '">here</a> to continue.</p>');
+ GenerateHTMLFooter;
+ end;
+
+ //*******************************************************************
+ //PURPOSE: Generates the response when the email recipient (in strTo)
+ // is invalid.
+ //*******************************************************************
+ procedure GenerateInvalidTo(strTo : string);
+ begin
+ GenerateHTMLHeader;
+ writeln('<body>');
+ writeln('<h1>');
+ writeln('Invalid Email Address (Recipient)');
+ writeln('</h1>');
+ writeln('<p>The following email address (', EscapeCharacters(strTo), ') is invalid.</p>');
+ if strErrorLink <> '' then
+ writeln('<p>Please click <a href="', EscapeCharacters(strErrorLink), '">here</a> to continue.</p>');
+ GenerateHTMLFooter;
+ end;
+
+ //*******************************************************************
+ //PURPOSE: Generates the response when the email sender (in strFrom)
+ // is invalid.
+ //*******************************************************************
+ procedure GenerateInvalidFrom;
+ begin
+ GenerateHTMLHeader;
+ writeln('<body>');
+ writeln('<h1>');
+ writeln('Invalid Email Address (Sender)');
+ writeln('</h1>');
+ writeln('<p>The following email address (', EscapeCharacters(strFrom), ') is invalid.</p>');
+ if strErrorLink <> '' then
+ writeln('<p>Please click <a href="', EscapeCharacters(strErrorLink), '">here</a> to continue.</p>');
+ GenerateHTMLFooter;
+ end;
+
+ //*******************************************************************
+ //PURPOSE: Generates the response when everything is OK and the email
+ // message has been sent.
+ //*******************************************************************
+ procedure GenerateEmailSent;
+ begin
+ GenerateHTMLHeader;
+ writeln('<body>');
+ writeln(strSuccessMessage);
+ if strSuccessLink <> '' then
+ writeln('<p>Please click <a href="', EscapeCharacters(strSuccessLink), '">here</a> to continue.</p>');
+ GenerateHTMLFooter;
+ end;
+
+ begin // GenerateResponse
+ if strTo = '' then
+ GenerateNoTo
+ else
+ begin
+ InvalidTo := false;
+ //Check each recipient address, if an invalid recipient is found
+ // generate the invalid recipient reponse and set the InValidTo
+ // flag so that no other responses get generated.
+ for i := 1 to CountWords(strTo, ',') do
+ if (not InvalidTo) and (not IsValidEmailAddress(CopyWord(strTo, i, ','))) then
+ begin
+ GenerateInvalidTo(CopyWord(strTo, i, ','));
+ InvalidTo := true
+ end;
+ //If thr InvalidTo flag has not been set then check the
+ // sender's email address if it was specified.
+ if not InvalidTo then
+ if (strFrom <> '') and (not IsValidEmailAddress(strFrom)) then
+ GenerateInvalidFrom
+ else
+ begin
+ //Everything is OK so send the email and generate
+ //the email send response.
+ SendEmail(strFrom, strTo, strSubject, strBody);
+ GenerateEmailSent
+ end
+ end;
+ end; // GenerateResponse
+
+begin
+ WriteResponseHeader;
+
+ Initialize;
+
+ ReadConfigFile;
+
+ GetCGIData(strCGIData);
+
+ ProcessCGIData(strCGIData);
+
+ GenerateResponse;
+end.
diff --git a/misc/pascal/tests/src/806-cgicook.pas b/misc/pascal/tests/src/806-cgicook.pas
new file mode 100644
index 000000000..7da5ecffd
--- /dev/null
+++ b/misc/pascal/tests/src/806-cgicook.pas
@@ -0,0 +1,771 @@
+(********************************************************************************************
+** PROGRAM : cgicook
+** VERSION : 1.0.0
+** DESCRIPTION : Demonstrates how to use cookies in CGI programs.
+** AUTHOR : Stuart King
+** COPYRIGHT : Copyright (c) Irie Tools, 2002. All Rights Reserved.
+** NOTES :
+** This sample program is distributed with Irie Pascal, and was written to illustrate
+** how to use cookies (i.e. how to read, write, and delete cookies). To make best use of
+** this sample you should have a basic understanding of Pascal as well as a basic
+** understanding of the Common Gateway Interface (CGI).
+**
+** Before describing how to use cookies, here is a very brief description of what
+** cookies are and what they are used for. Cookies are named pieces of information that a
+** website can ask a client (usually a browser) to store on its behalf. This information
+** can be sent back to the website (and any other website in the cookies domain) whenever
+** the browser sends a request to the website. Cookies are usually stored on the client's
+** hard drive and can persist for weeks, months, or even years. This makes cookies very
+** useful for 'remembering' information about website visitors.
+** IMPORTANT: The cookies sent between the client and the website are sent in text format
+** and are visible to any snooper, so sensitive information should either be encrypted
+** or sent only over a secure connection.
+**
+** Cookies are written by sending a "Set-Cookie" response header back to the client. The
+** syntax for the "Set-Cookie" header is given below:
+**
+** Set-Cookie: name=value; domain=.domain.com; path=/path;
+** expires=Day, dd-Mon-yyyy hh:mm:ss GMT; secure
+** Where
+** "name" is the name of the cookie.
+** "value" is the information stored by the cookie and must be specified. If you want
+** to delete a cookie then specify an expiry date that has already passed.
+** "domain" restricts the domains that will receive the cookie. The client should only send
+** the cookie to matching domains. Domains are matched from right to left. So
+** "domain=.irietools.com" matches "www.irietools.com" and "info.irietools.com".
+** If "domain" is specified it must match the domain of the website setting the
+** cookie. "domain" can't specify a top-level domain like ".com" or ".edu.jm".
+** If "domain" is not specified then the domain name of the website setting
+** the cookie is used.
+** "path" restricts the URLs within a domain that will receive the cookie. Paths are
+** matched from left to right and trailing /'s are ignored. If "path" is not
+** specified then the full path of the request is used.
+** "expires" specifies when the cookie should expire. The format of the expiry info
+** must be exactly as shown above:
+** "Day" is the three letter day of the week (Mon, Tue, Wed, Thu, Fri, Sat, or Sun).
+** "dd" is the two digit day of the month (01-31).
+** "Mon" is the three letter abbreviated month name
+** (Jan, Feb, Mar, Apr, Jun, Jul, Aug, Sep, Oct, Nov, Dec).
+** For example: "Mon, 16-Sep-2002 17:03:48 GMT".
+** If "expire" is not specified then the cookie is stored memory until the client
+** exits.
+** "secure" indicates that the cookie should only be sent over a secure connection.
+**
+** The browser sends cookies back to the website in the form of Cookie headers. The
+** format for Cookie headers is given below:
+**
+** Cookie: Cookie1; ...; CookieN
+** Where
+** each Cookiue is given as: name=value
+**
+** Only the "name" and the "value" of the cookies is returned, the other information
+** such as the "domain" is not returned. CGI programs can't read the Cookie headers
+** directly, so the webserver will make the Cookie header information available to the
+** CGI program in the HTTP_COOKIE environment variable.
+**********************************************************************************************)
+program cookies;
+const
+ MAX_BUFFER = 4096;
+ MAX_COOKIE_DATA = 200;
+ //SCRIPT_NAME = '/irietools/cgibin/cookies.exe';
+type
+ positive = 0..maxint;
+ BufferType = string[MAX_BUFFER];
+ CookieDataType = string[MAX_COOKIE_DATA];
+ DayOfWeek = 1..7;
+ Days = 1..31;
+ Months = 1..12;
+ date = record
+ day : Days;
+ month : Months;
+ year : integer;
+ dow : DayOfWeek
+ end;
+ Cookie = record
+ name : string;
+ value : CookieDataType
+ end;
+ CookieList = list of Cookie;
+var
+ buffer : BufferType;
+ strSetCookie : BufferType;
+ DaysInMonth : array[Months] of Days;
+ DaysElapsed : array[Months] of integer;
+ DayOfWeekShortNames : array[DayOfWeek] of string[3];
+ MonthShortNames : array[Months] of string[3];
+ Cookies : CookieList;
+
+ procedure DateToInt(dt : date; var iDays : integer); forward;
+ procedure IntToDate(iDays : integer; var dt : date); forward;
+ procedure CalculateDayOfWeek(var dt : date); forward;
+ function urlencode(strIn : string) : string; forward;
+ function EscapeCharacters(s : string) : string; forward;
+
+ //PURPOSE: Performs program initialization
+ procedure Initialize;
+ var
+ m : months;
+ begin (* Initialize *)
+ DaysInMonth[1] := 31;
+ DaysInMonth[2] := 28;
+ DaysInMonth[3] := 31;
+ DaysInMonth[4] := 30;
+ DaysInMonth[5] := 31;
+ DaysInMonth[6] := 30;
+ DaysInMonth[7] := 31;
+ DaysInMonth[8] := 31;
+ DaysInMonth[9] := 30;
+ DaysInMonth[10] := 31;
+ DaysInMonth[11] := 30;
+ DaysInMonth[12] := 31;
+
+ DaysElapsed[1] := 0;
+ for m := 2 to 12 do
+ DaysElapsed[m] := DaysElapsed[m-1]+DaysInMonth[m-1];
+
+ DayOfWeekShortNames[1] := 'Sun';
+ DayOfWeekShortNames[2] := 'Mon';
+ DayOfWeekShortNames[3] := 'Tue';
+ DayOfWeekShortNames[4] := 'Wed';
+ DayOfWeekShortNames[5] := 'Thu';
+ DayOfWeekShortNames[6] := 'Fri';
+ DayOfWeekShortNames[7] := 'Sat';
+
+ MonthShortNames[1] := 'Jan';
+ MonthShortNames[2] := 'Feb';
+ MonthShortNames[3] := 'Mar';
+ MonthShortNames[4] := 'Apr';
+ MonthShortNames[5] := 'May';
+ MonthShortNames[6] := 'Jun';
+ MonthShortNames[7] := 'Jul';
+ MonthShortNames[8] := 'Aug';
+ MonthShortNames[9] := 'Sep';
+ MonthShortNames[10] := 'Oct';
+ MonthShortNames[11] := 'Nov';
+ MonthShortNames[12] := 'Dec';
+
+ new(Cookies); //initialize the list of cookies
+ end; (* Initialize *)
+
+ //PURPOSE: Retrieves the information passed to the CGI applications.
+ //PARAMETER(s): cl - Used to store all the cookies that were passed to the CGI program
+ //GLOBAL(s) - buffer - Used to store the GET or POST information passed to the CGI program
+ procedure GetCGIData(var cl : CookieList);
+ var
+ RequestMethod : string;
+
+ //PURPOSE: Retrieves the cookies passed to the CGI program and puts then in the list.
+ //PARAMETER(s): cl - Used to store all the cookies that were passed to the CGI program
+ procedure GetCookieInfo(var cl : CookieList);
+ var
+ data : BufferType;
+ iNumCookies, iCurrCookie : positive;
+ iPos, iLen : positive;
+ strCurrCookie : CookieDataType;
+ c : Cookie;
+ begin (* GetCookieInfo *)
+ //The cookies are stored in the environment variable HTTP_COOKIE as space
+ // deliminated words with trailing semi-colons after each word (except the last word).
+ //Each word being a single cookie.
+ //Retrieve the cookies
+ data := getenv('HTTP_COOKIE');
+
+ //Retrieve the number words/cookies.
+ iNumCookies := countwords(data);
+
+ //Retrieve each cookie and use the "=" to seperate the name from the value
+ //then insert the cookie into the list.
+ for iCurrCookie := 1 to iNumCookies do
+ begin
+ strCurrCookie := copyword(data, iCurrCookie);
+ iPos := pos('=', strCurrCookie);
+ if iPos <> 0 then
+ begin
+ c.name := trim(copy(strCurrCookie, 1, iPos-1));
+ c.value := trim(copy(strCurrCookie, iPos+1));
+ iLen := length(c.value);
+ if (iLen<>0) and (c.value[iLen]=';') then
+ c.value := copy(c.value, 1, iLen-1);
+ insert(c, cl);
+ end;
+ end;
+ end; (* GetCookieInfo *)
+
+ //PURPOSE: Retrieves information sent to by a GET request (i.e. in the QUERY_STRING
+ // environment variable).
+ procedure GetRequest;
+ begin (* GetRequest *)
+ buffer := getenv('QUERY_STRING')
+ end; (* GetRequest *)
+
+ //PURPOSE: Retrieves information sent to by a POST request (i.e. through the standard
+ // input stream, with the length of the data in the environment variable
+ // CONTENT_LENGTH).
+ procedure PostRequest;
+ var
+ len, i : positive;
+ err : integer;
+ ContentLength : string;
+ c : char;
+ begin (* PostRequest *)
+ buffer := '';
+ ContentLength := getenv('CONTENT_LENGTH');
+ if ContentLength <> '' then
+ val(ContentLength, len, err)
+ else
+ len := 0;
+ if len <= MAX_BUFFER then
+ for i := 1 to len do
+ begin
+ read(c);
+ buffer := buffer + c
+ end
+ end; (* PostRequest *)
+
+ begin (* GetCGIData *)
+ GetCookieInfo(cl);
+ RequestMethod := getenv('REQUEST_METHOD');
+ if RequestMethod = 'GET' then
+ GetRequest
+ else
+ PostRequest
+ end; (* GetCGIData *)
+
+ //PURPOSE: Process the data passed to the program.
+ //NOTES: This is the main part of the program. After retreiving
+ // the information passed to the program this procedure is
+ // called to perform the required processing. This program receives to kinds
+ // of information:
+ // 1. Cookies sent back by the brower. These have already been retrieved by the
+ // the procedure "GetCGIData" and do not require further processing here.
+ // The procedure 'GenerateResponse' will display the retrieved cookies.
+ // 2. Information entered by the user about a cookie to add or delete. This
+ // information needs to formated and put in the global 'strSetCookie', so that
+ // it can be included in the response by the procedure 'GenerateResponse'.
+ procedure ProcessCGIData;
+ var
+ i, num, p : integer;
+ EncodedVariable, DecodedVariable, name, value : string;
+ strName : string;
+ strValue : string;
+ strExpiry : string;
+ blnDelete : boolean;
+
+ //PURPOSE: Converts a expiry date into a string in the format required
+ // by the Set-Cookie header (i.e. Day, dd-Mon-yyyy hh:mm:ss GMT
+ //ARGUMENT(s): dt - Expire date to convert.
+ //RETURNS: The expiry date/time in Set-Cookie format
+ //NOTES:
+ // This function just hard-codes the last second in the day "23:59:59"
+ // instead of using the current time or allowing the expiry time to be specified.
+ //This is done because
+ // 1. It is easier and this is just a sample program
+ // 2. Usually cookie will be set to expire either when the browser closes
+ // or after many days have passed, so the exact time is not important.
+ function FormatCookieExpiryString(dt : date) : string;
+ var
+ s : string;
+
+ //PURPOSE: Converts an integer into a zero-padded string
+ //ARGUMENT(s):
+ // 1. i - The integer to convert
+ // 2. len - The length of the string to return
+ //RETURNS:
+ // The zero padded string
+ function Int2String(i : integer; len : integer) : string;
+ var
+ S : string;
+ begin (* Int2String *)
+ str(i:1, s);
+ while length(s) < len do
+ s := '0' + s;
+ Int2String := s
+ end; (* Int2String *)
+
+ begin (* FormatCookieExpiryString *)
+ CalculateDayOfWeek(dt);
+ s := DayOfWeekShortNames[dt.dow]+', ';
+ s := s + Int2String(dt.day, 2)+'-'+MonthShortNames[dt.month]+'-'+Int2String(dt.year, 4)+' ';
+ s := s + '23:59:59 GMT';
+ FormatCookieExpiryString := s;
+ end; (* FormatCookieExpiryString *)
+
+ //PURPOSE: Processes the named value pairs sent with the GET or POST request.
+ // Which in this case is the information entered by the user about the
+ // cookie to add or delete.
+ //ARGUMENT(s): name - name part of the name/value pair
+ // value - value part of name/value pair
+ //NOTES:
+ // The information entered by the user is sent as name/value pairs (i.e. name-value)
+ //with the name part being the name of the form element holding the information and
+ //the value part being the actual information held by the form element.
+ procedure ProcessNameValuePair(var name, value : string);
+ var
+ dt : date;
+ dow : integer;
+ iDays, iErr : integer;
+ iDate : integer;
+ begin
+ //If the name is 'txtname' then this is the name of the cookie.
+ //The name is urlencoded in case it contains special characters
+ if name='txtname' then
+ strName := urlencode(value)
+ //If the name is 'txtvalue' then this is the value of the cookie.
+ //The value is urlencoded in case it contains special characters
+ else if name='txtvalue' then
+ strValue := urlencode(value)
+ //If the name is 'txtdays' then this is the number of days before the cookie
+ //expires. The value is converted to an integer and if the conversion is
+ //successful the value is added to the current date to get the expiry date
+ //and this date is formatted for use in a Set-Cookie header.
+ else if name='txtdays' then
+ begin
+ val(value, iDays, iErr);
+ if iErr=0 then
+ begin
+ getdate(dt.year, dt.month, dt.day, dow);//Get current date
+ DateToInt(dt, iDate); //Convert current date to number of days since Jan 1, 0001 AD
+ iDate := iDate + iDays; //Add in the number of days to expire
+ IntToDate(iDate, dt); //Convert the result back into a date
+ strExpiry := FormatCookieExpiryString(dt); //Format date
+ end;
+ end
+ //If the name is 'cmddelete' then the cookie should be deleted not added.
+ //The cookie is deleted by setting an expiry date that has already passed.
+ else if name='cmddelete' then
+ begin
+ getdate(dt.year, dt.month, dt.day, dow);
+ DateToInt(dt, iDate);
+ iDate := iDate - 2;
+ IntToDate(iDate, dt);
+ strExpiry := FormatCookieExpiryString(dt);
+ blnDelete := true
+ end
+ else
+ ;
+ end;
+
+ begin (* ProcessCGIData *)
+ strSetCookie := '';
+ strName := '';
+ strValue := '';
+ strExpiry := '';
+ blnDelete := false;
+
+ //Retrieve each name/value pair from the form and processes them.
+ num := CountWords(buffer, '&');
+ for i := 1 to num do
+ begin
+ EncodedVariable := CopyWord(buffer, i, '&');
+ DecodedVariable := URLDecode(EncodedVariable);
+ p := pos('=', DecodedVariable);
+ if p > 0 then
+ begin
+ name := lowercase(trim(copy(DecodedVariable, 1, p-1)));
+ value := trim(copy(DecodedVariable, p+1));
+ ProcessNameValuePair(name, value);
+ end
+ end;
+
+ //If after processing each name/value pair we have enough data for a
+ //"Set-Cookie" header then generate a "Set-Cookie" header in the global
+ //"strSetCookie".
+ //if (strName<>'') and ((strValue<>'') or blnDelete) and (strExpiry<>'') then
+ if (strName<>'') and ((strValue='') or (strExpiry<>'')) then
+ begin
+ //Set-Cookie: name=value; domain=.irietools.com; path=/cgibin;
+ // expires=Tue, 03-Sep-2002 20:42:19 GMT; secure
+ strSetCookie := 'Set-Cookie: ' + strName + '=' + strValue + ';';
+ if strExpiry<>'' then
+ strSetCookie := strSetCookie + ' expires=' + strExpiry;
+ end;
+ end; (* ProcessCGIData *)
+
+ //PURPOSE: Generates the response to send back to the browser.
+ //NOTES:
+ // Most of the HTML generated by this procedure actually comes from a template file.
+ //The HTML from the template file is common to almost all the pages on this website.
+ //The HTML specific to this program (i.e. the form that accepts the cookie information
+ //from the user), is generated by the local procedure 'GenerateBodyData'. So this procedure
+ //basically reads the template file and sends most of it to the webserver except for
+ //a small section which it repalces with the output of the procedure 'GenerateBodyData'.
+ //The template file is divided into sections using HTML comments. The start of a section
+ //is marked by the following
+ //
+ // <!--section SectionName-->
+ //
+ //Where "SectionName" is the name of the section.
+ //
+ //The end of a section is marked by
+ //
+ // <!--/section-->
+ //
+ //What this procedure actually does is read the template file and write the contents
+ //of all the sections except one to the webserver. The section not written to the webserver
+ //is called "bodydata". Instead of writing the contents of the section "bodydata" to the
+ //webserver the ouput of the procedure "GenerateBodyData" is sent to the webserver.
+ //This is done because it is much easier to work with HTML using an HTML editor rather
+ //than using embedded writeln's inside a CGI program. So an HTML editor is used to
+ //create and update the template file and the portion of the generated output that
+ //is specific to this program is generated by "GenerateBodyData". You will notice
+ //when you run this program that the page generated looks alot like the other pages
+ //on the website because most of it comes from the template file.
+ procedure GenerateResponse;
+ const
+ TEMPLATE_FILE = 'template.html';
+ START_SECTION = '<!--section';
+ END_SECTION = '<!--/section-->';
+ SECTION_NAME = 'bodydata';
+ var
+ f : text;
+ line : BufferType;
+ blnSkipping : boolean;
+
+ //PURPOSE: Generates the portion of the response page that is specific to this
+ // program (the rest of the response page comes from the template file).
+ //NOTES:
+ // Tables are used to organise the layout of the generated pages on this website.
+ //The portion of the response page generated by this procedure is a single row of
+ //a table. Unless you are an HTML expert the easiest way to understand the HTML
+ //generated by this procedure is probably to run this program and view the
+ //response pages generated.
+ procedure GenerateBodyData;
+ var
+ iNumCookies, iCurrCookie : positive;
+ c : Cookie;
+ begin (* GenerateBodyData *)
+ writeln('<tr>');
+ writeln('<td width="100%">');
+
+ //Generate the HTML to display the cookies returned by the browser.
+ writeln('<h1>Current Cookies</h1>');
+ iNumCookies := length(Cookies); //Number of cookies returned by the browser
+ if iNumCookies=0 then
+ writeln('<p>None</p>')
+ else
+ //For each cookie returned write it's name and value
+ //NOTE: The name and value are escaped in case they contain
+ //special characters.
+ for iCurrCookie := 1 to iNumCookies do
+ begin
+ c := Cookies[iCurrCookie];
+ writeln('<p>', EscapeCharacters(urldecode(c.name)), '=', EscapeCharacters(urldecode(c.value)),'</p>');
+ end;
+ writeln('<hr>');
+ writeln('<p>', getenv('SCRIPT_NAME'), '</p>');
+ writeln('<hr>');
+
+ //Generate the HTML for the form
+ writeln('<form method="POST" action="', getenv('SCRIPT_NAME'), '">');
+ writeln('<p><big><strong>Name:</strong></big> <input type="text" name="txtName" size="25"></p>');
+ writeln('<p><big><strong>Value:</strong></big> <input type="text" name="txtValue" size="56"></p>');
+ writeln('<p><big><strong>Expiries in:</strong></big> <input type="text" name="txtDays" size="5"> <big><strong>Days</strong></big></p>');
+ writeln('<p><input type="submit" value=" Add Cookie " name="cmdAdd">');
+ writeln('<input type="submit" value=" Delete Cookie " name="cmdDelete">');
+ writeln('<input type="reset" value=" Reset " name="cmdReset"></p>');
+ writeln('</form>');
+
+ writeln('</td>');
+ writeln('</tr>');
+ end; (* GenerateBodyData *)
+
+ begin (* GenerateResponse *)
+ //Generate the response headers (including the blank line at the end).
+ writeln('content-type: text/html');
+ if strSetCookie <> '' then
+ writeln(strSetCookie);
+ writeln;
+
+ blnSkipping := false;
+ reset(f, TEMPLATE_FILE);
+
+ //Read each line in the template file and search for section markers
+ //If a target section marker is found then call 'GenerateBodyData' to
+ //generate the HTML for that section and set 'blnSkipping' to true so
+ //that the contents of that section, from the template file, will be skipped.
+ while not eof(f) do
+ begin
+ readln(f, line);
+ line := trim(line);
+ if pos(START_SECTION, line) > 0 then
+ begin
+ if pos(SECTION_NAME, line) > 0 then
+ begin
+ GenerateBodyData;
+ blnSkipping := true;
+ end
+ end
+ else if line=END_SECTION then
+ blnSkipping := false
+ else if not blnSkipping then
+ writeln(line);
+ end;
+ close(f);
+ end; (* GenerateResponse *)
+
+ procedure Shutdown;
+ begin (* Shutdown *)
+ dispose(Cookies);
+ end; (* Shutdown *)
+
+ //PUPOSE: Determines if a year was a leap year.
+ function IsLeapYear(year : integer) : boolean;
+ begin (* IsLeapYear *)
+ IsLeapYear :=
+ ((year mod 4)=0)
+ and
+ (
+ ((year mod 100)<>0)
+ or
+ ((year mod 400)=0)
+ );
+ end; (* IsLeapYear *)
+
+ //PURPOSE: Converts a date into an integer. The integer represents the
+ // number of days since 'Jan 1, 0001 AD'. Negative values present
+ // the number of days before 'Jan 1, 0001 AD' (i.e. BC dates).
+ //ARGUMENT(s): dt - The date to convert to an integer
+ // iDays - The converted date as an integer.
+ procedure DateToInt;
+ var
+ i, year : integer;
+
+ //PURPOSE: Used to help adjust for the leap years when calulating the number
+ // of days that have already elapsed since the year began.
+ //RETURNS: +1 if the date is a leap year and the month of february
+ // has already passed.
+ // or
+ // 0 otherwise
+ function LeapYearAdjustment(dt : date) : integer;
+ var
+ iAdjustment : integer;
+
+ begin (* LeapYearAdjustment *)
+ iAdjustment := 0;
+
+ if (IsLeapYear(dt.year)) and (dt.month >= 3) then
+ iAdjustment := 1;
+
+ LeapYearAdjustment := iAdjustment;
+ end; (* LeapYearAdjustment *)
+
+ begin (* DateToInt *)
+ if dt.year < 0 then
+ year := dt.year+1 //Adjust for the fact that there was no year 0.
+ else
+ year := dt.year;
+ //Calculate days since Jan 1, 0001 AD ignoring leap years.
+ i := (year-1)*365 + DaysElapsed[dt.month] + (dt.day-1);
+
+ //Adjust for leap years except the final year
+ i := i + ((year-1) div 4) - ((year-1) div 100) + ((year-1) div 400);
+
+ //Add 1 if the final year is a leap year and february has passed.
+ iDays := i + LeapYearAdjustment(dt);
+ end; (* DateToInt *)
+
+ //PURPOSE: Coverts an integer, representing the number of days since Jan 1, 0001 AD
+ // to a date.
+ //ARGUMENT(s): iDays - The integer to convert to a date.
+ // dt - The converted date.
+ //NOTE: There are 365.2425 days in the year adjusting for leap years.
+ procedure IntToDate;
+ var
+ m : Months;
+ d : integer;
+ iError, iTemp : integer;
+ begin
+ //First calculate an approximation of the correct answer
+ if iDays >= 0 then
+ begin
+ dt.year := trunc(idays / 365.2425)+1;
+ iTemp := iDays - trunc((dt.year-1)*365.2425);
+ end
+ else
+ begin
+ dt.year := -(trunc(abs(idays) / 365.2425)+1);
+ iTemp := abs(abs(iDays) - trunc((abs(dt.year)-1)*365.2425));
+ end;
+
+ dt.month := 12;
+ for m := 1 to 12 do
+ if iTemp >= DaysElapsed[m] then
+ dt.month := m;
+
+ iTemp := iTemp - DaysElapsed[dt.month];
+
+ d := iTemp+1;
+ if d > DaysInMonth[dt.month] then
+ dt.day := DaysInMonth[dt.month]
+ else
+ dt.day := d;
+
+ //Now to keep adjusting our approximation until it is exact
+ DateToInt(dt, iTemp);
+ while iTemp<>iDays do
+ begin
+ //Number of days that need to be added to the approximation to make it correct.
+ iError := iDays-iTemp;
+
+ //If adding the days would make the day of the month negative then
+ // then move the approximation to the beginning of the previous month.
+ // Adjusting the year if necessary (i.e. it is the first month of the year).
+ if (dt.day + iError) < 1 then
+ begin
+ if dt.month=1 then
+ begin
+ dt.month := 12;
+ dt.year := dt.year - 1;
+ if dt.year = 0 then
+ dt.year := -1;
+ end
+ else
+ dt.month := dt.month - 1;
+ dt.day := 1;
+ end
+ //If adding the days might take the date into the next month then
+ // check if adding the days actually takes the date to Feb 29 on a leap year
+ // if so then adjust the date to Feb 29
+ //otherwise move the date to the beginning of the next month.
+ else if (dt.day + iError) > DaysInMonth[dt.month] then
+ begin
+ if (dt.month=2) and (IsLeapYear(dt.year)) and (dt.day+iError=DaysInMonth[dt.month]+1) then
+ dt.day := DaysInMonth[dt.month]+1
+ else
+ begin
+ if dt.month=12 then
+ begin
+ dt.month := 1;
+ dt.year := dt.year + 1;
+ if dt.year = 0 then
+ dt.year := 1;
+ end
+ else
+ dt.month := dt.month + 1;
+ dt.day := 1
+ end
+ end
+ //else adding the days results in a valid day of the month then
+ // just add the days.
+ else
+ dt.day := dt.day + iError;
+
+ DateToInt(dt, iTemp);
+ end;
+ end;
+
+ //PURPOSE: Calculates the day of the week of a given date
+ //ARGUMENT(s): dt - The date to calculate the day of the week of.
+ //NOTES:
+ // First the date is converted into the number of days since (Jan 1, 0001 AD)
+ //Next this value is adjusted with the day of the week of Jan 1, 0001 AD.
+ //Next mod 7 is used to give a value in the range 0..6 that repeats every
+ //seven days (like the days of the week).
+ //Finally the value is incremented by 1 to give a value in the range 1..7
+ //
+ //The most interesting part of this algorithm is probably the adjustment for the
+ //first day of the week. Suppose this adjustment was not made then of the date
+ //was Jan 1, 0001 AD then 'DateToInt' would calculate the number of days as 0.
+ //Then (0 mod 7) + 1 would give the value 1 or Sunday. But Jan 1, 0001 AD was a
+ //Monday, so we need to add a 1 to adjust for this fact. How do I know that
+ //Jan 1, 0001 AD was a Monday? I don't, but I do know that day of the week of
+ //today. So what I did was calculate the day of the week for today without the
+ //adjustment and then added an adjustment that resulted in the correct value.
+ procedure CalculateDayOfWeek;
+ const
+ ADJUST_FOR_FIRST_DAY = 1; //Apparently Jan 1, 0001 AD was a Monday
+ var
+ iDays : integer;
+ begin (* CalculateDayOfWeek *)
+ DateToInt(dt, iDays);
+ dt.dow := ((iDays+ADJUST_FOR_FIRST_DAY) mod 7) + 1;
+ end; (* CalculateDayOfWeek *)
+
+ //PURPOSE: Returns the URL encoded version of a string.
+ //ARGUMENT(s): strIn - The string to be encoded.
+ //NOTES:
+ // Spaces are converted to '-' and non-alphanumeric characters are converted
+ //to %NN, where NN is the hexidecimal value of the chacters ordinal value. This
+ //is the reverse of the built-in function 'urldecode'.
+ function urlencode;
+ var
+ strOut : string;
+ i : positive;
+ c : char;
+ sTemp : string[3];
+ begin (* urlencode *)
+ strOut := '';
+ for i := 1 to length(strIn) do
+ begin
+ c := strIn[i];
+ if c = ' ' then
+ strOut := strOut + '+'
+ else if isalphanum(c) then
+ strOut := strOut + c
+ else
+ begin
+ sTemp := hex(ord(c));
+ if length(sTemp)=1 then
+ sTemp := '0' + sTemp;
+ strOut := strOut + '%' + sTemp
+ end;
+ end;
+ urlencode := strOut;
+ end; (* urlencode *)
+
+ //*************************************************************************
+ //PURPOSE: This function converts certain characters that have a
+ // special meaning in HTML documents to their HTML representation.
+ //ARGUMENT(s): s - The string to be escaped.
+ //RETURNS: The string with all special characters escaped.
+ //NOTES: The characters converted are < > "
+ function EscapeCharacters;
+ const
+ LessThanChar = '<';
+ GreaterThanChar = '>';
+ QuoteChar = '"';
+ HTMLLessThan = '&lt;';
+ HTMLGreaterThan = '&gt;';
+ HTMLQuote = '&quot;';
+ var
+ i : positive;
+
+ procedure ReplaceChar(var strBuffer : string; strReplace : string; i : positive);
+ begin
+ delete(strBuffer, i, 1);
+ insert(strReplace, strBuffer, i)
+ end;
+
+ begin (* EscapeCharacters *)
+ repeat
+ i := pos(LessThanChar, s, 1);
+ if i > 0 then
+ ReplaceChar(s, HTMLLessThan, i)
+ until i = 0;
+
+ repeat
+ i := pos(GreaterThanChar, s, 1);
+ if i > 0 then
+ ReplaceChar(s, HTMLGreaterThan, i)
+ until i = 0;
+
+ repeat
+ i := pos(QuoteChar, s, 1);
+ if i > 0 then
+ ReplaceChar(s, HTMLQuote, i)
+ until i = 0;
+
+ EscapeCharacters := s;
+ end; (* EscapeCharacters *)
+
+begin
+ Initialize;
+
+ GetCGIData(Cookies);
+
+ ProcessCGIData;
+
+ GenerateResponse;
+
+ Shutdown;
+end.
diff --git a/misc/pascal/tests/src/901-pageutils.pas b/misc/pascal/tests/src/901-pageutils.pas
new file mode 100644
index 000000000..855620b1c
--- /dev/null
+++ b/misc/pascal/tests/src/901-pageutils.pas
@@ -0,0 +1,5651 @@
+UNIT pageutls;
+
+INTERFACE
+
+CONST
+emp_logonid = '$own$';
+flag_on = 'y';
+flag_off = 'n';
+pcs_phys_termtype = 'PCS';
+min_integer = -2100000000;
+max_integer = 2100000000;
+invalid_integer = 2147483647;
+invalid_timestamp = invalid_integer;
+invalid_saldo = invalid_integer;
+invalid_short = 32767;
+invalid_duration = invalid_short;
+undefined_sreal = -32767;
+invalid_taris_time = -9999;
+no_time = -9998;
+no_allowance = no_time;
+min_year = 25;
+no_year_high = 2100;
+only_valid_blockid = 6309;
+sign_offset = 128;
+seconds_per_day = 86400;
+max_allowance = 2880;
+empty_integer = -2147483647;
+empty_short = -32767;
+no_variable = empty_integer;
+keydata_len = 60;
+break_add_on = 64;
+first_search_char = 32;
+last_search_char = 255;
+type_char = 256;
+type_unsigned_byte = 257;
+type_short = 512;
+type_mod = 513;
+type_duration = 514;
+type_dduration = 515;
+type_allowance = 516;
+type_long = 768;
+type_saldo = 769;
+type_dsaldo = 770;
+type_balance = 771;
+type_date = 1024;
+type_time = 1025;
+type_emplno = -32512;
+type_deptno = -32511;
+type_costid = -32510;
+tyoe_employcat = -32509;
+type_commtype = -32508;
+emplno_len = 10;
+deptno_len = 10;
+employcat_len = 4;
+adjustcat_len = 4;
+firstname_len = 20;
+surname_len = 30;
+badgeno_len = 10;
+long_badgeno_len = 20;
+objectid_len = 8;
+logonid_len = 8;
+chapter_len = 10;
+objecttype_len = 8;
+phys_filename_len = 32;
+processname_len = 32;
+code_len = 4;
+long_record_len = 32000;
+exit_code_len = 6;
+error_text_len = 60;
+perror_text_len = 80;
+part_of_error_text_len = 57;
+vos_modulename_len = 32;
+time_zone_len = 3;
+tmon_command_line_len = 300;
+input_line_len = 1024;
+comm_buffer_len = 4096;
+double_comm_buffer_len = 8192;
+cci_header_len = 4;
+long_text_len = 30;
+time_array_len = 5;
+rpoolid_len = 12;
+max_no_of_attributes = 8;
+attribid_len = 12;
+parproid_len = 12;
+projectid_len = 12;
+taskid_len = 12;
+versionid_len = 4;
+export_data_len = 249;
+pcs_request_len = 200;
+costid_type_len = 20;
+costid_ext_type_len = 22;
+search_set_len = 20;
+cust_conv_table_common_type_len = 16001;
+tstat_tab_len = 36;
+max_repvar_len = 16;
+userid_len = 16;
+recid_len = 8;
+fieldid_len = 16;
+queryid_len = 8;
+maxaccesses = 400;
+maxallowances = 5;
+maxalt_wpats = 8;
+maxbreaks = 6;
+maxdaytypes = 10;
+maxdiffs_from_plan = 12;
+maxseverity_codes = 8;
+maxshifts_per_cycle = 64;
+maxacmasks = 96;
+maxaccodes = 48;
+maxtermcats = 4;
+max_menue_lines = 12;
+max_select_options = 16;
+maxacsel = 48;
+maxclients = 5;
+maxmethods = 26;
+maxdaysloaded = 5;
+max_search_sets_in_list = 24;
+max_prcon2_printers = 20;
+max_costno_grupps = 178;
+maxtp = 50;
+maxtimepairs = 16;
+maxtimepairs_per_record = 4;
+maxtimepair_records = 4;
+maxtimes_booked = 32;
+max_daily_inc_corrections = 40;
+maxtimes = 64;
+maxcodes = 32;
+maxrecords = 8;
+maxcorr_incomes = 10;
+maxvacations = 4;
+maxzones = 64;
+max_no_of_balances = 24;
+max_no_of_oem_balances = 8;
+max_no_of_inc_groups = 8;
+max_inc_per_group = 5;
+first_no_basic_bal_ids = 33;
+max_no_basic_bal_ids = 48;
+max_sel_inc_per_group = 10;
+max_no_sel_inc_bal_ids = 98;
+max_empl_corr_values = 4;
+max_comp_balances = 40;
+adjust_rule_tab_len = 72;
+mcconf_rule_tab_len = 5;
+first_memory = 224;
+last_memory = 233;
+rule_applies = 'y';
+rule_applies_not = 'n';
+rule_applies_possibly = ' ';
+max_query_records = 15;
+query_def_len = 200;
+queryt_def_len = 3000;
+max_fields_per_record = 234;
+max_selected_fields = 500;
+selection_line_len = 2000;
+max_winc_incomes = 36;
+max_winc_codeids = 70;
+max_winc2_codeids = 109;
+max_winc_dayincs = 10;
+max_standard_cols = 10;
+no_value = chr (3);
+total_value = chr (4);
+planned_days_value = chr (5);
+current_value = chr (6);
+target_value = chr (7);
+created_until_value = chr (8);
+vl_max_cols = 32;
+vl_dinfo_string_len = 30;
+vl_output_line_len = 78;
+vl_index_output_line_len = 75;
+vl_filler_var_len = 3000;
+dslang_key_len = 64;
+dslang_year_offset = 2000;
+dbg_option_default = 0;
+dbg_append = 1;
+dbg_timestamp = 2;
+dbg_header = 4;
+dbg_force_flush = 8;
+dbg_indent = 16;
+dbg_lineheader = 32;
+dbg_max_sessions = 100;
+dbg_max_levels = 10;
+dbg_max_progs = 100;
+dbg_default = 1;
+dbg_debug = 2;
+dbg_dump = 3;
+dbg_deep_dump = 4;
+dbg_special = 5;
+maxprogs = 250;
+awtime_max_projects_per_day = 69;
+select_emplno = 'e';
+select_deptno = 'd';
+select_employcat = 'E';
+select_name = 'n';
+select_factory = 'f';
+select_costid = 'c';
+select_no_sort = 'q';
+select_mach_job = 'm';
+max_installations = 32;
+max_zones = 200;
+tps_per_access_range = 3;
+startup_string_len = 512;
+parm_tab_len = 24;
+parm_tab_line_len = 60;
+no_export = 'n';
+pids = 'y';
+siport = 's';
+siport_badgeno_len = 14;
+CreateTimeZone = 'c';
+DeleteTimeZone = 'd';
+CreatePers = 'p';
+DeletePers = 'l';
+SetPersInfo = 'i';
+SetDayType = 's';
+AccessPers = 'a';
+RefreshAllTimeZones = 'r';
+RefreshAllDayType = 't';
+RefreshAllPers = 'f';
+NoAction = ' ';
+maxdefault_time_incomes = 4;
+maxcostbookings = 32;
+maxcostbookingst = 64;
+center = 'c';
+right = 'r';
+left = 'l';
+justify_center = 'c';
+justify_right = 'r';
+justify_left = 'l';
+prt_messages = 'p';
+prt_errors = 'q';
+ret_errors = 'r';
+lm_normal = 'n';
+lm_change = 'c';
+lm_update = 'u';
+lm_insert = 'i';
+lm_old = ' ';
+lm_lsg = 'd';
+orderno_len = 16;
+fault_reasonid_len = 4;
+prod_operationid_len = 4;
+piece_work_type_len = 4;
+fkey_maxpages = 3;
+fkey_maxlines = 6;
+fkey_maxcols = 4;
+fkey_max_per_page = 8;
+unused_return_value = 0;
+request_ok = 1;
+request_error = 2;
+invalid_badgeno = 3;
+invalid_costid = 4;
+booking_in_core_time = 5;
+last_going_automatic = 6;
+invalid_pin_code = 7;
+invalid_terminal = 8;
+unsufficient_allowance = 9;
+invalid_emplno = 10;
+rc_dummy5 = 11;
+rc_dummy6 = 12;
+rc_dummy7 = 13;
+rc_dummy8 = 14;
+rc_dummy9 = 15;
+rc_dummy10 = 16;
+unknown_error = 17;
+not_valid_input = 18;
+not_valid_master_data = 19;
+no_sfc_error = 20;
+more_employees_than_planned = 21;
+more_prod_steps_than_planned = 22;
+no_next_pstep_found = 23;
+not_in_tolerances = 24;
+unexpected_machine = 25;
+booking_forced = 26;
+less_employees_than_planned = 27;
+prod_step_overlap = 28;
+cost_booking_failed = 29;
+employee_already_registrated = 30;
+not_all_employees_have_completed = 31;
+not_interrupted = 32;
+no_timestamp_found = 33;
+prod_step_not_active = 34;
+prod_step_already_registrated = 35;
+prod_step_already_completed = 36;
+prod_step_not_registrated = 37;
+sequence_error = 38;
+tolerance_exceeded = 39;
+employee_has_already_completed = 40;
+too_many_prod_steps = 41;
+too_many_employees = 42;
+employee_not_on_prod_step = 43;
+unknown_machine = 44;
+unknown_message_type = 45;
+unknown_request_type = 46;
+wrong_machine = 47;
+unknown_sfc_badgeno = 48;
+unknown_prod_step = 49;
+unknown_order = 50;
+too_less_employees = 51;
+prod_status_is_hold = 52;
+sfc_queue_error = 53;
+employee_not_registrated = 54;
+sfc_file_error = 55;
+already_interrupted = 56;
+already_resumed = 57;
+sfc_booking_ignored = 58;
+unknown_fault_reason = 59;
+too_many_messages_per_second = 60;
+undefined_sfc_code = 61;
+employee_on_too_many_machines = 62;
+no_sfc_permission = 63;
+created_employee_completion = 64;
+auto_empl_completion_failed = 65;
+machine_overlap = 66;
+sfc_booking_while_absent = 67;
+employee_on_too_many_psteps = 68;
+special_interruption = 69;
+no_sfc_info_error = 70;
+inherit_quantity_active = 71;
+predecessors_not_completed = 72;
+predecessors_completed = 73;
+unknown_machine_order = 74;
+undefined_parallelity = 75;
+quantity_changed = 76;
+no_space_for_splitting = 77;
+msg_type_not_allowed = 78;
+employee_not_valid = 79;
+auto_empl_registration_failed = 80;
+employee_not_startup_registrated = 81;
+employee_already_startup_registrated = 82;
+quantity_change_failed = 83;
+quantity_too_small = 84;
+more_costtypes = 85;
+other_msg_type_expected = 86;
+offline_booking = 87;
+no_answer_from_terminal = 88;
+responsibility_change_request = 89;
+responsibility_change_successful = 90;
+responsibility_table_error = 91;
+sfc_custom_error = 100;
+check_balance_base = 2140000000;
+ts_req_msgno = 1;
+ts_rpl_msgno = 2;
+read_reqno = 1;
+more_reqno = 2;
+change_reqno = 3;
+print_reqno = 4;
+demp_download_reqno = 5;
+delete_reqno = 6;
+get_codeid_reqno = 10;
+get_wpatid_reqno = 11;
+get_special_service_reqno = 12;
+load_abbr_list_reqno = 13;
+get_vemp_reqno = 14;
+get_mach_job_reqno = 15;
+get_cycleid_reqno = 16;
+fill_timepair_info_reqno = 17;
+update_dscalen_tab_reqno = 18;
+read_abilities_reqno = 19;
+read_requirements_reqno = 20;
+load_empl_data_reqno = 21;
+load_external_empl_reqno = 22;
+load_empl_list_reqno = 23;
+load_reassigned_empls_reqno = 24;
+write_schedule_reqno = 25;
+get_accesses_reqno = 26;
+load_staff_list_reqno = 27;
+get_wpatid_from_cycle_reqno = 28;
+load_empl_djob_data_reqno = 29;
+write_djob_tab_reqno = 30;
+load_squal_list_reqno = 31;
+nvvlist_reqno = 32;
+get_caschid_reqno = 33;
+write_staff_tab_reqno = 34;
+save_cascw_tab_reqno = 35;
+save_cascj_tab_reqno = 36;
+get_cascjid_reqno = 37;
+get_cascwid_reqno = 38;
+get_dscols_reqno = 39;
+get_ruleid_reqno = 40;
+get_casceid_reqno = 41;
+read_dscalen_reqno = 42;
+read_dssgnoff_reqno = 43;
+write_dssgnoff_reqno = 44;
+update_comms_reqno = 46;
+dkeys_abbr_tab_len = 500;
+function_code_len = 1;
+change_insert = 'i';
+change_update = 'u';
+change_delete = 'd';
+change_copy = 'c';
+change_rename = 'r';
+change_copy_new = 'n';
+change_insert_new = 'w';
+variants_current = 'c';
+variants_newest = 'n';
+variants_future = 'f';
+variants_all = 'a';
+variants_oneday = 'h';
+variants_onlyone = 'o';
+acalen_msg_ct = 80;
+acalen_max_lines = 160;
+accemp_rpl_ct = 30;
+anlbal_rpl_ct = 221;
+atcomp_rpl_ct = 39;
+awtime_rpl_ct = 31;
+awtime_comment_rpl_ct = 44;
+awtime_task_rpl_ct = 78;
+bookmsg_rpl_ct = 16;
+bmsg_rpl_ct = bookmsg_rpl_ct;
+ccomp_rpl_ct = 45;
+comm_rpl_ct = 36;
+comm_update_ct = 50;
+corder_rpl_ct = 11;
+cols_rpl_ct = 18;
+cplan_rpl_ct = 27;
+cplane_rpl_ct = cplan_rpl_ct;
+cplanm_rpl_ct = cplan_rpl_ct;
+cplanp_rpl_ct = 28;
+cusers_rpl_ct = 11;
+dabsemp_rpl_ct = 14;
+dabsgrp_rpl_ct = 12;
+dacce_rpl_ct = 100;
+daccv_rpl_ct = 30;
+daccz_rpl_ct = 49;
+dcbal_rpl_ct = 22;
+dcost_rpl_ct = 45;
+demp_rpl_ct = 18;
+demp_download_ct = 225;
+derrors_rpl_ct = 16;
+dfrsn_rpl_ct = 49;
+dkeys_rpl_ct = 20;
+dmonth_rpl_ct = 40;
+dmsg_rpl_ct = 26;
+dorder_rpl_ct = 44;
+dperror_rpl_ct = 39;
+dpres_rpl_ct = 19;
+dprint_rpl_ct = 12;
+dprint2_rpl_ct = 3540;
+dpsopn_rpl_ct = 60;
+dpstep_rpl_ct = 66;
+dpwarn_rpl_ct = 22;
+dscom_rpl_ct = 50;
+dscom_update_ct = 50;
+dsplan_rpl_ct = 28;
+dstatus_rpl_ct = 58;
+dswarn_rpl_ct = 12;
+dvisit_rpl_ct = 34;
+dwarn_rpl_ct = 12;
+dzone_rpl_ct = 45;
+empvar_rpl_ct = 59;
+emplac_rpl_ct = 60;
+lmsg_rpl_ct = bookmsg_rpl_ct;
+lpstep_rpl_ct = 48;
+ltime_rpl_ct = 17;
+ltime_update_ct = 60;
+mcbal_rpl_ct = 15;
+menue_rpl_ct = 40;
+monov_rpl_ct = 40;
+msg_rpl_ct = 8;
+order_rpl_ct = 50;
+pbar_rpl_ct = 30;
+plan_rpl_ct = 13;
+plan_tab_max = 27;
+pconf_rpl_ct = 12;
+pconf_update_ct = 24;
+pnet_rpl_ct = pbar_rpl_ct;
+ppbook_line_ct = 130;
+ppbook2_line_ct = 59;
+ppord_rpl_ct = 64;
+prstat_rpl_ct = 17;
+prstat_dsp_rpl_ct = 3660;
+pscap_rpl_ct = 80;
+psprod_rpl_ct = 80;
+pstruc_rpl_ct = 23;
+pwbal_rpl_ct = 12;
+query_rpl_ct = 25;
+queryd_rpl_ct = 36;
+dscost_rpl_ct = 18;
+tstat_rpl_ct = 36;
+upstep_rpl_ct = 50;
+vds_rpl_ct = 49;
+recobh_rpl_ct = 58;
+smsg_rpl_ct = 75;
+time_rpl_ct = 1;
+ttline_rpl_ct = 13;
+wcycst_rpl_ct = 30;
+chlog_rpl_ct = 70;
+rcalen_rpl_ct = 12;
+mplace_rpl_ct = 2;
+comm_text_buffer_len = 1080;
+max_fields_per_mask = 200;
+term_ct = 10;
+job_rpl_ct = 20;
+pemploy_rpl_ct = 10;
+reass_rpl_ct = 24;
+reass_rpl3_ct = 10;
+reass_upd_ct = 15;
+reass_cqg_ct = 199;
+aemploy_rpl_ct = 10;
+avemp_rpl_ct = 60;
+res_rpl_ct = 57;
+profil_rpl_ct = 59;
+max_pmreq_tab_len = 68;
+statusid_len = 8;
+schedu_rpl_ct = 2;
+opspla_rpl_ct = 2;
+emsche_rpl_ct = 10;
+ts_schedu_load_abbr_list_ct = 25;
+ts_schedu_read_able_ct = 40;
+ts_schedu_read_reqs_ct = 10;
+ts_schedu_load_empl_list_ct = 8;
+ts_schedu_load_emplno_list_ct = 200;
+ts_schedu_max_empls_ct = 250;
+ts_schedu_max_jobs_ct = 64;
+ts_schedu_load_reass_empls_ct = 7;
+ts_schedu_load_empl_data_ct = 20;
+ts_schedu_write_schedule_ct = 10;
+schedu_max_conflicts = 20;
+ts_schedu_max_staff_ct = 10;
+schedu_sums_tab_len = 403;
+ts_schedu_load_djob_ct = 140;
+ts_scheds_max = 96;
+max_comms_for_opspla = 18;
+casch_rpl_ct = 50;
+wasc_rpl_ct = 19;
+wasc_page_length = 50;
+cascj_tab_len = 200;
+cascw_tab_len = 300;
+NUMBERBALANCE = 8;
+numbalance = 8;
+numb_breaks = 3;
+MAX_ADP_VALUE = 1000;
+ADP_ERROR_BASIC_VALUE = 600;
+ADP_MESSAGE_BASIC_VALUE = 600;
+ADP_WARNING_BASIC_VALUE = 69;
+MAX_CHAR_REASON_OF_ABSENCE = 2;
+djob_rpl_ct = 0;
+ts_schedu_write_djob_tab_ct = 100;
+squal_rpl_ct = 10;
+nvvlist_rpl_ct = 128;
+nvvlist_req_ct = 875;
+mode_dkeys = 'k';
+mode_prog = 'p';
+action_getinfo = 'g';
+action_dinfo = '0';
+action_new = '1';
+action_unselect = 'u';
+action_dkeys = 'k';
+action_saved = 'a';
+action_quit = 'v';
+action_select = 's';
+action_update = '2';
+action_copy = '3';
+action_delete = '4';
+action_info = '5';
+action_print = '6';
+action_rename = '7';
+action_modify = '8';
+action_mpdata = 'm';
+action_change_all = '9';
+action_plan = 'p';
+action_cancel = 'q';
+action_smach = 'S';
+action_restore = 'r';
+action_copy_order = 'z';
+action_booktime = 't';
+action_msg = 'i';
+action_dpstep = 'd';
+action_add_pstep = 'e';
+action_remove_pstep = 'f';
+action_start = 'w';
+action_ppbook = 'P';
+action_startterm = 'b';
+action_stopterm = 'c';
+action_download = 'h';
+action_balload = 'j';
+action_starttrace = 'l';
+action_stoptrace = 'n';
+action_timesync = 'o';
+action_dmsg = 'D';
+action_line_len = 76;
+attribute_normal = 'n';
+attribute_hide = 'h';
+attribute_grey = 'g';
+attribute_selected = 's';
+attribute_gridlines = 'q';
+attribute_colored = 'c';
+attribute_noedit = 'e';
+invert_flag = 'i';
+cit_yesterday = 0;
+cit_today = 1;
+modify_deleted = 0;
+modify_original = 1;
+modify_inserted = 2;
+modify_by_empl = 3;
+modify_changed = 4;
+modify_by_job = 10;
+modify_by_timepairs = 11;
+deptno_error_index = 32766;
+employcat_error_index = 32765;
+costid_error_index = 32764;
+select_options_error_index = 32763;
+short_table_len = 64000;
+index_table_len = 4000;
+dscode_key_primary = 'p';
+dscode_key_scodeid_holiday = 'h';
+dscode_key_scodeid_day_off = 'd';
+dscode_key_scodeid_workday = 'w';
+dscode_key_holiday_keys = 'H';
+dscode_key_day_off_keys = 'D';
+dscode_key_workday_keys = 'W';
+dscode_key_all_keys = 'A';
+max_cwrp_days = 400;
+cusers_name_len = 30;
+max_cols = 4096;
+max_bytes_per_table = 5000;
+clientno_tab_len = 256;
+language_tab_len = 32;
+codepage_tab_len = 256;
+local_printername = 'LPT';
+ul_block_len = 4096;
+ul_read_first = 1;
+ul_read_last = 2;
+ul_read_next = 3;
+ul_read_prev = 4;
+ul_read_new_pos = 5;
+ul_append = 6;
+ul_delete_first = 7;
+ul_delete_last = 8;
+ul_change = 9;
+ul_change_new_pos = 10;
+ul_create = 11;
+ul_destroy = 12;
+ix_keys_in_block = 10;
+ix_hashtab_mod = 11;
+ix_hashtab_max = 10;
+ix_position = 1;
+ix_read_next = 2;
+ix_insert = 3;
+ix_create = 4;
+ix_destroy = 5;
+ix_delete = 6;
+open_file_dc = 01;
+close_file_dc = 02;
+seq_read_dc = 10;
+seq_write_dc = 11;
+seq_position_dc = 12;
+seq_delete_dc = 13;
+keyed_read_dc = 20;
+keyed_write_dc = 21;
+keyed_position_dc = 22;
+keyed_delete_dc = 23;
+keyed_rewrite_dc = 24;
+maxfiles = 200;
+minkey_short = -9999;
+input = 1;
+output = 2;
+value_undefined_char = 128;
+taris_time_array_len = 8;
+no_year_low = 1900;
+no_month_low = 1;
+no_day_low = 1;
+root_year = 1980;
+seconds_per_year = 31536000;
+seconds_per_hour = 3600;
+sysname_len = 10;
+min_chars_for_move = 0;
+eend_of_file = 1025;
+erecord_too_long = 1026;
+eobject_not_found = 1032;
+einvalid_io_operation = 1040;
+eusage_given = 1044;
+einvalid_io_type = 1070;
+etimeout = 1081;
+einvalid_duplicate_key = 1111;
+erecord_not_found = 1112;
+ealready_locked = 1206;
+ecaller_must_wait = 1277;
+einvalid_arg = 1371;
+eform_aborted = 1453;
+ebeginning_of_file = 1773;
+erecord_in_use = 2408;
+DiskReadError = 100;
+DiskWriteError = 101;
+FileNotAssignedError = 102;
+FileNotOpenError = 103;
+FileNotOpenForInputError = 104;
+FileNotOpenForOutputError = 105;
+InvalidNumericFormatError = 106;
+tm_CopyLine = 101;
+tm_AppendWin = 102;
+tm_RemoveWin = 103;
+tm_DKeysReturn = 104;
+tm_DeleteRecord = 105;
+tm_ReReadList = 106;
+tm_Keyboard = 107;
+tm_Escape = 108;
+tm_Arrows = 109;
+tm_GetCurEmplno = 110;
+tm_GetPrevEmplno = 111;
+tm_GetNextEmplno = 112;
+tm_Read = 113;
+tm_setFocus = 114;
+tm_FkeyPressed = 115;
+tm_UpdateData = 116;
+tm_SetWinProgno = 117;
+tm_WindowsOpen = 118;
+tm_MultipleSel = 119;
+tm_UpdateMask = 120;
+tm_UnselectList = 121;
+tm_NewLogon = 122;
+tm_SqualReturn = 123;
+tm_GetPrognoHandle = 124;
+tm_WriteStatic = 125;
+tm_SetColor = 126;
+tm_GetColor = 127;
+tm_OtherKeys = 128;
+tm_GetProgno = 129;
+tm_ReadStatic = 130;
+tm_CloseDemp = 131;
+tm_CallDemp = 132;
+tm_MsgCustLeitz = 133;
+tm_PingPong = 199;
+OkId = 101;
+MoreId = 102;
+CancelId = 103;
+LessId = 104;
+ExecuteId = 104;
+DuplicateId = 105;
+SkipId = 105;
+DeleteId = 106;
+SelectId = 107;
+NewId = 108;
+UpdateId = 109;
+AuswahlId = 110;
+FarbId = 111;
+AktualisierenId = 112;
+ReadId = 113;
+PrinterId = 114;
+AllOkId = 115;
+AllSkipId = 116;
+tarisAllok = 101;
+tarisAllSkip = 102;
+PrevEmplnoId = 801;
+CurEmplnoId = 802;
+NextEmplnoId = 803;
+error_text_fname = 'errtxt.dat';
+error_index_fname = 'errtxt.ind';
+max_message_code = 21999;
+index_step = 10;
+MCTEntriesPerTable = 21000;
+MaxMCTEntries = 80000;
+user_opts_versionno = 2;
+user_opts_filename = 'Useropt.dat';
+bt_alpha = 'a';
+bt_short = 'n';
+bt_mod_type = 't';
+bt_duration = 'p';
+bt_dduration = 'v';
+bt_long = 'N';
+bt_saldo = 's';
+bt_dsaldo = 'V';
+bt_date = 'd';
+bt_time = 'u';
+bt_costid = 'c';
+bt_flag_type = 'f';
+bt_cycle = 'F';
+bt_allowance = 'w';
+bt_char = 'C';
+bt_unsigned_byte = 'b';
+bt_balance = 'B';
+bt_mptime = 'm';
+bt_dbalance = 'D';
+bt_sreal = 'S';
+bt_ireal = 'I';
+bt_prod_stepno = 'P';
+bt_timearray = '[';
+bt_ogpdraw = ']';
+bt_dcbal = 'l';
+bt_owndraw = 'o';
+bt_color = 'r';
+bt_percentage = 'G';
+bt_emplcorrvalue = 'H';
+bt_specialsaldo = 'J';
+bt_effort = 'K';
+bt_pduration = 'L';
+max_intervals = 80;
+nii = -10001;
+LptDev = 1;
+ScreenDev = 2;
+FileDev = 3;
+NoDongle = 1000;
+time_apply = 240;
+first_allowance_apply = 241;
+last_allowance_apply = 245;
+max_gacce_emplnos = 240;
+matchcode_table_size = 4;
+matchcode_table_text_len = 100;
+max_no_of_bal_rec = 13;
+tree_plus = '+';
+tree_minus = '-';
+tree_blank = ' ';
+indentation_const = 12;
+benz_did_len = 200;
+general_base_module = 1;
+taris_base_module = 2;
+tse_base_module = 3;
+general_income_module = 11;
+taris_income_module = 12;
+tse_income_module = 13;
+general_access_module = 21;
+taris_access_module = 22;
+tse_access_module = 23;
+general_pop_module = 31;
+taris_pop_module = 32;
+tse_pop_module = 33;
+general_cost_module = 41;
+taris_cost_module = 42;
+tse_cost_module = 43;
+general_ttbal_module = 51;
+taris_ttbal_module = 52;
+tse_ttbal_module = 53;
+general_statistik_module = 61;
+taris_statistik_module = 62;
+tse_statistik_module = 63;
+general_bde1_module = 71;
+taris_bde1_module = 72;
+tse_bde1_module = 73;
+general_bde2_module = 81;
+taris_bde2_module = 82;
+tse_bde2_module = 83;
+general_canteen_module = 91;
+taris_canteen_module = 92;
+tse_canteen_module = 93;
+general_bde3_module = 101;
+taris_bde3_module = 102;
+tse_bde3_module = 103;
+general_win_module = 111;
+taris_win_module = 112;
+tse_win_module = 113;
+general_time_acc_module = 121;
+taris_time_acc_module = 122;
+tse_time_acc_module = 123;
+general_screen_module = 131;
+taris_screen_module = 132;
+tse_screen_module = 133;
+general_online_module = 141;
+taris_online_module = 142;
+tse_online_module = 143;
+general_web_module = 151;
+taris_web_module = 152;
+tse_web_module = 153;
+general_telefon_module = 161;
+taris_telefon_module = 162;
+tse_telefon_module = 163;
+general_time_acc2_module = 171;
+taris_time_acc2_module = 172;
+tse_time_acc2_module = 173;
+general_planner_module = 181;
+taris_planner_module = 182;
+tse_planner_module = 183;
+general_analysis_module = 191;
+taris_analysis_module = 192;
+tse_analysis_module = 193;
+general_mobile_module = 201;
+taris_mobile_module = 202;
+tse_mobile_module = 203;
+general_aeneis_module = 211;
+taris_aeneis_module = 212;
+tse_aeneis_module = 213;
+tse_multi_clients_addon = 223;
+tse_cycle_addon = 233;
+tse_income_addon = 243;
+tse_adjust_addon = 253;
+tse_apply_and_grant_addon = 263;
+taris_installation = 271;
+ase_installation = 272;
+test_installation = 273;
+oem_installation = 274;
+botime_installation = 280;
+botime_standard_installation = 281;
+botime_extended_installation = 282;
+botime_enterprise_installation = 283;
+palmOk = 0;
+palmGeneralError = -1;
+palmNoSequence = -2;
+palmWrongSequence = -3;
+palmNotConnected = -4;
+palmUnknownCommand = -5;
+palmNoCommand = -6;
+palmLoginWithoutUser = -7;
+palmLoginConnectionFailed = -8;
+palmLogoutDisconnectFailed = -9;
+palmBookingFailed = -10;
+palmWrongAnswerFromServer = -11;
+palmTimeout = -12;
+palmFatalError = -13;
+palmUnknownEntity = -14;
+palm_str_array_len = 16;
+palm_act_array_len = 8;
+palm_id_array_len = 1024;
+palm_flag_del = 1;
+palm_flag_sync = 2;
+palm_flag_mode = 4;
+palm_flag_bearb = 8;
+module_table_len = 30;
+moduleid_text_len = 40;
+start_moduleid_taris231 = 1;
+end_moduleid_taris231 = 25;
+start_moduleid_ase231 = 32;
+end_moduleid_ase231 = 50;
+pin_flag_on = 'l';
+pin_flag_off = 'a';
+NO_SAP = 'n';
+KK1 = 'y';
+HR_PDC = 'h';
+SAP_BC = HR_PDC;
+UNKNOWN_DB = 0;
+AIX_DB2 = 1;
+AIX_ORACLE = 2;
+AS400_DB2 = 10;
+AS400_DB2_ESQL = 11;
+LINUX_DB2 = 20;
+LINUX_ORACLE = 21;
+NT_DB2 = 30;
+NT_ORACLE = 31;
+NT_SQLSERVER = 32;
+participant_array_len = 32;
+dsmdlptp_code_len = 1;
+dsmdsum_code_len = 17;
+hex_block_len = 16;
+byte_block_len = 8;
+minutes_per_day = 1440;
+tslicence_read_dsmdsum = 1;
+tslicence_read_key = 2;
+tslicence_read_timer = 3;
+tslicence_get_debug = 4;
+tslicence_set_debug = 5;
+tslicence_kill_server = 6;
+tslicence_for_javaproxy = 7;
+no_of_readers = 24;
+benz_readers = 16;
+max_conv_tab_value = 16364;
+
+max_conv_tab_value_short = 8182;
+maxctcustbuffersize = 32000;
+
+
+TYPE
+
+{pspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspsp}
+ {short.inc}
+short = -32768..32767;
+ulong = longword;
+
+{pspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspsp}
+ {types.inc}
+long_text_type = ARRAY [1..long_text_len] OF char;
+very_long_text_type = ARRAY [1..60] OF char;
+objectid_type = ARRAY [1..objectid_len] OF char;
+objecttype_type = ARRAY [1..objecttype_len] OF char;
+flag_type = char;
+indexname_type = ARRAY [1..32] OF char;
+sqlstate_type = ARRAY [1..6] OF char;
+error_text_type = ARRAY [1..error_text_len] OF char;
+perror_text_type = ARRAY [1..perror_text_len] OF char;
+repvar_type = ARRAY [1..max_repvar_len] OF char;
+timer_text_type = ARRAY [1..80] OF char;
+languageid_type = ARRAY [1..2] OF char;
+packed_1_type = ARRAY [1..1] OF char;
+packed_2_type = ARRAY [1..2] OF char;
+packed_3_type = ARRAY [1..3] OF char;
+packed_4_type = ARRAY [1..4] OF char;
+packed_5_type = ARRAY [1..5] OF char;
+packed_6_type = ARRAY [1..6] OF char;
+packed_7_type = ARRAY [1..7] OF char;
+packed_8_type = ARRAY [1..8] OF char;
+packed_9_type = ARRAY [1..9] OF char;
+packed_10_type = ARRAY [1..10] OF char;
+packed_11_type = ARRAY [1..11] OF char;
+packed_12_type = ARRAY [1..12] OF char;
+packed_13_type = ARRAY [1..13] OF char;
+packed_14_type = ARRAY [1..14] OF char;
+packed_15_type = ARRAY [1..15] OF char;
+packed_16_type = ARRAY [1..16] OF char;
+packed_20_type = ARRAY [1..20] OF char;
+packed_21_type = ARRAY [1..21] OF char;
+packed_22_type = ARRAY [1..22] OF char;
+packed_23_type = ARRAY [1..23] OF char;
+packed_24_type = ARRAY [1..24] OF char;
+packed_25_type = ARRAY [1..25] OF char;
+packed_26_type = ARRAY [1..26] OF char;
+packed_27_type = ARRAY [1..27] OF char;
+packed_28_type = ARRAY [1..28] OF char;
+packed_29_type = ARRAY [1..29] OF char;
+packed_30_type = ARRAY [1..30] OF char;
+packed_32_type = ARRAY [1..32] OF char;
+packed_40_type = ARRAY [1..40] OF char;
+packed_42_type = ARRAY [1..42] OF char;
+packed_48_type = ARRAY [1..48] OF char;
+packed_50_type = ARRAY [1..50] OF char;
+packed_52_type = ARRAY [1..52] OF char;
+packed_60_type = ARRAY [1..60] OF char;
+packed_64_type = ARRAY [1..64] OF char;
+packed_75_type = ARRAY [1..75] OF char;
+packed_80_type = ARRAY [1..80] OF char;
+packed_120_type = ARRAY [1..120] OF char;
+packed_252_type = ARRAY [1..252] OF char;
+packed_256_type = ARRAY [1..256] OF char;
+packed_32000_type = ARRAY [1..32000] OF char;
+pc_date_time_type = ARRAY [1..17] OF char;
+a_char = char;
+wpatid_type = ARRAY [1..4] OF char;
+codeid_type = packed_2_type;
+long = LongInt;
+SYSNAME = ARRAY [1..sysname_len] OF char;
+dummy_type = short;
+fkey_mask_type = ARRAY [1..32] OF char;
+message_type = ARRAY [1..80] OF char;
+dcindexname_type = indexname_type;
+function_type = RECORD
+{ 1} operation_id: short;
+{ 3} position_id: short;
+{ 5} read_type: char
+{= 5} END;
+qcode_type = ARRAY [1..2] OF char;
+status_type = ARRAY [1..76] OF char;
+index_array = ARRAY [0..2199] OF RECORD
+{ 1} first: short;
+{ 3} pos: short
+{=8800} END;
+PCopyLineRec = ^TCopyLineRec;
+TCopyLineRec = RECORD
+{ 1} Id: short;
+{ 3} FormatNo: short;
+{ 5} RecAddr: long
+{= 8} END;
+mct_pt = ^mct_type;
+mct_entry = RECORD
+{ 1} n: short;
+{ 3} t: char
+{= 3} END;
+mct_type = ARRAY [1..MCTEntriesPerTable] OF mct_entry;
+ccb_type = RECORD
+{ 1} timeout_used: long;
+{ 5} rc: short;
+{ 7} time_array: ARRAY [1..8] OF char;
+{ 15} alignment1: ARRAY [1..2] OF char;
+{ 17} timeout_planned: long;
+{ 21} portid: short;
+{ 23} event_flag: flag_type;
+{ 24} commtype: char;
+{ 25} used_protocol: char;
+{ 26} charset_conv_flag: flag_type;
+{ 27} buflen: short;
+{ 29} hostname: ARRAY [1..32] OF char;
+{ 61} programname: ARRAY [1..32] OF char;
+{ 93} conversationid: long;
+{ 97} rc1: long;
+{ 101} rc2: long;
+{ 105} timeout_std: long;
+{ 109} {event_handle: hWnd;}
+{ 110} cci_status: char;
+{ 111} use_cci_header_flag: flag_type;
+{ 112} clientname: ARRAY [1..32] OF char;
+{ 144}{ svc_stop_evt: THandle;}
+{ 145}{ cci_stop_evt: THandle;}
+{ 146}{ cci_write_evt: THandle;}
+{ 147}{ cci_read_pending_evt: THandle;}
+{ 148}{ read_thread: THandle;}
+{ 149} cci_id: long
+{= 152} END;
+user_opts_type = RECORD
+{ 1} version: short;
+{ 3} debug_flag: flag_type;
+{ 4} mask_names_flag: flag_type;
+{ 5} old_menu_flag: flag_type;
+{ 6} alignment1: char;
+{ 7} debug_level: short
+{= 8} END;
+objectid_s_type = string;
+objecttype_s_type = string;
+long_text_s_type = string;
+indexname_s_type = string;
+repvar_s_type = string;
+error_text_s_type = string;
+wpatid_s_type = string;
+codeid_s_type = string;
+frsn_index_type = STRING [20];
+search_set_type = STRING [search_set_len];
+pcb_type = RECORD
+{ 1} line_cnt: long;
+{ 5} page_cnt: long;
+{ 9} page_len: short;
+{ 11} after: short;
+{ 13} f: file
+{= 13} END;
+order_by_type = ARRAY [1..256] OF char;
+interval_range = INTEGER;
+interval_type = ARRAY [1..2] OF interval_range;
+TIntervalData = ARRAY [0..max_intervals] OF interval_type;
+TColorData = ARRAY [1..max_intervals] OF long;
+processid_type = ulong;
+buffer_type = ARRAY [1..2] OF char;
+timestamp = long;
+rec_header_type = RECORD
+{ 1} byte: buffer_type;
+{ 3} reference_count: short;
+{ 5} last_modified: timestamp
+{= 8} END;
+fcb_type = RECORD
+{ 1} accessno: short;
+{ 3} last_error: short;
+{ 5} last_msgid: long;
+{ 9} io_type: short;
+{ 11} filename: objectid_type;
+{ 19} filler: short
+{= 20} END;
+schedu_abbr_type = ARRAY [1..2] OF char;
+vl_cols_dinfo_tab_type = RECORD
+{ 1} pos: short;
+{ 3} len: short;
+{ 5} col_dist: short;
+{ 7} dinfo: short
+{= 8} END;
+vl_cols_dinfo_type = RECORD
+{ 1} tab: ARRAY [1..vl_max_cols] OF vl_cols_dinfo_tab_type;
+{ 257} no_cols: short
+{= 258} END;
+vl_output_line_type = ARRAY [1..vl_output_line_len] OF char;
+vl_index_output_line_type = ARRAY [1..vl_index_output_line_len] OF char;
+vl_rec_type_tab_record_type = RECORD
+{ 1} rec_type: char;
+{ 2} justification: char
+{= 2} END;
+vl_rec_type_tab_type = ARRAY [1..vl_max_cols] OF vl_rec_type_tab_record_type;
+vl_filler_var = ARRAY [1..vl_filler_var_len] OF char;
+vl_colsusage_type = ARRAY [1..vl_max_cols] OF boolean;
+unsigned_byte = char;
+signed_byte = char;
+filler_type = unsigned_byte;
+color_type = long;
+color_attr_type = RECORD
+{ 1} color: color_type;
+{ 5} attr: unsigned_byte;
+{ 6} filler_ca: ARRAY [1..3] OF filler_type
+{= 8} END;
+one_masks_colors_type = ARRAY [1..10] OF color_attr_type;
+special_colors_type = ARRAY [1..16] OF color_attr_type;
+emplcorrvalue_type = long;
+specialsaldo_type = short;
+percentage_type = short;
+phoneno_type = ARRAY [1..24] OF char;
+url_type = ARRAY [1..254] OF char;
+alias_type = ARRAY [1..15] OF char;
+commtype_type = ARRAY [1..4] OF char;
+firstname_type = ARRAY [1..firstname_len] OF char;
+surname_type = ARRAY [1..surname_len] OF char;
+email_address_type = ARRAY [1..32] OF char;
+m_timestamp = long;
+mod_type = short;
+duration_type = short;
+dduration_type = short;
+dbalance_type = duration_type;
+allowance_type = duration_type;
+saldo_type = long;
+dsaldo_type = long;
+balance_type = saldo_type;
+chapter_type = ARRAY [1..chapter_len] OF char;
+phys_filename_type = ARRAY [1..phys_filename_len] OF char;
+print_queue_name_type = ARRAY [1..32] OF char;
+expanded_filename_type = ARRAY [1..256] OF char;
+processname_type = ARRAY [1..processname_len] OF char;
+code_type = ARRAY [1..code_len] OF char;
+exit_code_type = ARRAY [1..exit_code_len] OF char;
+vos_modulename_type = ARRAY [1..vos_modulename_len] OF char;
+userid_type = ARRAY [1..userid_len] OF char;
+time_zone_type = ARRAY [1..time_zone_len] OF char;
+fkey_mask_array = ARRAY [1..32] OF char;
+fkey_set_type = SET OF 1..32;
+fkey_subst_type = ARRAY [1..32] OF short;
+fkey_tab_type = ARRAY [-1..32] OF short;
+char_set_type = SET OF char;
+operator_type = (add, subtract);
+encode_decode_type = (encode, decode);
+return_value_type = (undefined, good_value, bad_value);
+pcs_request_type = ARRAY [1..pcs_request_len] OF char;
+codetype_type = char;
+termcat_type = packed_8_type;
+logonid_type = ARRAY [1..logonid_len] OF char;
+username_type = ARRAY [1..32] OF char;
+menue_title_type = ARRAY [1..46] OF char;
+menue_line_type = ARRAY [1..50] OF char;
+menue_info_type = ARRAY [1..10] OF char;
+operationid_type = ARRAY [1..8] OF char;
+deptno_type = ARRAY [1..deptno_len] OF char;
+emplno_type = ARRAY [1..emplno_len] OF char;
+badgeno_type = ARRAY [1..badgeno_len] OF char;
+long_badgeno_type = ARRAY [1..long_badgeno_len] OF char;
+select_options_type = ARRAY [1..max_select_options] OF char;
+input_line_type = ARRAY [1..input_line_len] OF char;
+startup_type = ARRAY [1..startup_string_len] OF char;
+cb_state_type = (cb_uninitialized, cb_initialized, cb_open, cb_connected);
+object_state_type = short;
+object_enum_type = short;
+conv_table_type_pointer = ^conv_table_type;
+conv_table_type = RECORD
+{ 1} int_len: short;
+{ 3} ext_len: short;
+{ 5} no_of_values: short;
+{ 7} cust_start_pos: short;
+{ 9} CASE dummy: short OF
+{+ 2} 0: (value_tab: ARRAY [1..max_conv_tab_value] OF char);
+{+ 2} 1: (short_tab: ARRAY [1..max_conv_tab_value_short] OF short);
+{=16374} END;
+conv_table_common_type = RECORD
+{ 1} no_of_tables: short;
+{ 3} CASE max_no_of_tables: short OF
+{+ 2} 0: (index_table: ARRAY [1..index_table_len] OF RECORD
+{+ 2} table_name: long_text_type;
+{+ 32} filler: short;
+{+ 34} start_pos: long
+{=14400} END;);
+{+ 2} 1: (short_table: ARRAY [1..short_table_len] OF short);
+{=14400} END;
+half_conv_table_common_type = RECORD
+{ 1} info: ARRAY [1..16000] OF short;
+{32001} conv_key: short
+{=32002} END;
+whole_conv_table_common_type = RECORD
+{ 1} CASE dummy: long OF
+{+ 4} 0: (split: ARRAY [1..2] OF half_conv_table_common_type);
+{+ 4} 1: (normal: conv_table_common_type);
+{=14400} END;
+cust_conv_table_common_type = ARRAY [1..cust_conv_table_common_type_len] OF short;
+cust_conv_table_type = RECORD
+{ 1} no_of_cust_values: short;
+{ 3} CASE switch: short OF
+{+ 2} 0: (value_tab: ARRAY [1..max_conv_tab_value] OF char);
+{+ 2} 1: (short_tab: ARRAY [1..max_conv_tab_value_short] OF short);
+{=16368} END;
+short_pointer = ^short;
+convert_pointer_type = RECORD
+{ 1} CASE useless: short OF
+{+ 2} 0: (p1: short_pointer);
+{+ 2} 1: (p2: conv_table_type_pointer);
+{= 8} END;
+cust_conv_table_type_ptr = ^cust_conv_table_type;
+cust_convert_pointer_type = RECORD
+{ 1} CASE useless: short OF
+{+ 2} 0: (p1: short_pointer);
+{+ 2} 1: (p2: cust_conv_table_type_ptr);
+{= 8} END;
+video_attributes_type = RECORD
+{ 1} mask_title_color: ARRAY [1..1] OF char;
+{ 2} title_color: ARRAY [1..1] OF char;
+{ 3} input_color: ARRAY [1..1] OF char;
+{ 4} help_text_color: ARRAY [1..1] OF char;
+{ 5} background_color: ARRAY [1..1] OF char;
+{ 6} mask_title_inv_flag: flag_type;
+{ 7} mask_title_ul_flag: flag_type;
+{ 8} title_ul_flag: flag_type;
+{ 9} input_high_flag: flag_type;
+{ 10} error_inv_flag: flag_type;
+{ 11} filler: ARRAY [1..6] OF char
+{= 16} END;
+codes_table_record_type = RECORD
+{ 1} color: long;
+{ 5} codeid: codeid_type;
+{ 7} attr: unsigned_byte;
+{ 8} filler: char
+{= 8} END;
+codes_table_type = ARRAY [1..31] OF codes_table_record_type;
+acccatid_type = ARRAY [1..4] OF char;
+accpatid_type = ARRAY [1..4] OF char;
+jobid_type = objectid_type;
+qualificationid_type = objectid_type;
+mach_job_type = RECORD
+{ 1} machineid: objectid_type;
+{ 9} jobid: objectid_type
+{= 16} END;
+abbr_type = ARRAY [1..2] OF char;
+abbr_key_type = RECORD
+{ 1} deptno: deptno_type;
+{ 11} abbr: abbr_type
+{= 12} END;
+importance_type = ARRAY [1..1] OF char;
+costid_type = ARRAY [1..costid_type_len] OF char;
+costid_ext_type = ARRAY [1..costid_ext_type_len] OF char;
+cost_bookings_record_type = RECORD
+{ 1} switch_time: mod_type;
+{ 3} costid: costid_type
+{= 22} END;
+cost_bookings_type = ARRAY [1..maxcostbookings] OF cost_bookings_record_type;
+cycleid_type = ARRAY [1..4] OF char;
+shiftid_type = ARRAY [1..4] OF char;
+ruleid_type = ARRAY [1..2] OF char;
+employcat_type = ARRAY [1..employcat_len] OF char;
+rcalenid_type = ARRAY [1..4] OF char;
+event_type = ARRAY [1..2] OF char;
+tariffarea_type = ARRAY [1..4] OF char;
+costno_type = ARRAY [1..10] OF char;
+adjustcat_type = ARRAY [1..adjustcat_len] OF char;
+chain_balance_tab_type = ARRAY [1..max_no_of_balances] OF short;
+continued_pay_len_type = short;
+msg_header_type = RECORD
+{ 1} byte: buffer_type;
+{ 3} reqno: short;
+{ 5} error_code: code_type;
+{ 9} vos_error: short;
+{ 11} queue_name: ARRAY [1..10] OF char;
+{ 21} callerno: short;
+{ 23} notify_flag: flag_type;
+{ 24} filler1: char;
+{ 25} queue_timestamp: timestamp;
+{ 29} reserved: short
+{= 30} END;
+switch_msg = RECORD
+{ 1} taskid: short;
+{ 3} objectid: objectid_type;
+{ 11} objecttype: objecttype_type
+{= 18} END;
+long_msg_header_type = RECORD
+{ 1} byte: buffer_type;
+{ 3} reqno: short;
+{ 5} error_code: code_type;
+{ 9} vos_error: short;
+{ 11} reserved: ARRAY [1..10] OF short;
+{ 31} msgtype: short;
+{ 33} switchmsg: switch_msg
+{= 50} END;
+file_param_type = RECORD
+{ 1} phys_filename: phys_filename_type;
+{ 33} organization: short;
+{ 35} maxreclen: short;
+{ 37} logging_flag: flag_type;
+{ 38} logging_align: char;
+{ 39} length_in_pages: short;
+{ 41} starting_recordno: short;
+{ 43} time_limit: long
+{= 46} END;
+open_param_type = RECORD
+{ 1} io_type: short;
+{ 3} locking_mode: short;
+{ 5} access_mode: short
+{= 6} END;
+string_date_type = ARRAY [1..8] OF char;
+string_time_type = ARRAY [1..5] OF char;
+date_type = RECORD
+{ 1} yy: short;
+{ 3} mo: short;
+{ 5} dd: short
+{= 6} END;
+time_type = RECORD
+{ 1} hh: short;
+{ 3} mi: short;
+{ 5} ss: short
+{= 6} END;
+date_and_time_type = RECORD
+{ 1} date: date_type;
+{ 7} time: time_type
+{= 12} END;
+task_context_type = RECORD
+{ 1} byte: ARRAY [1..100] OF char
+{= 100} END;
+income_type = ARRAY [1..4] OF char;
+wrk_code_type = RECORD
+{ 1} codeid: codeid_type;
+{ 3} codetype: codetype_type
+{= 3} END;
+error_log_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} date_and_time: date_and_time_type;
+{ 21} millisec: short;
+{ 23} error_code: code_type;
+{ 27} severity_code: char;
+{ 28} filler1: ARRAY [1..1] OF filler_type;
+{ 29} userid: userid_type;
+{ 45} processname: processname_type;
+{ 77} versionno: short;
+{ 79} vos_error: short;
+{ 81} fileid: objectid_type;
+{ 89} error_text: error_text_type;
+{ 149} exit_code: exit_code_type;
+{ 155} filler: ARRAY [1..2] OF filler_type;
+{ 157} counter: long;
+{ 161} emplno: emplno_type;
+{ 171} filler2: ARRAY [1..20] OF filler_type
+{= 190} END;
+error_text_rec = RECORD
+{ 1} error_code: code_type;
+{ 5} severity_code: char;
+{ 6} error_text: error_text_type
+{= 65} END;
+recid_type = ARRAY [1..recid_len] OF char;
+fieldid_type = ARRAY [1..fieldid_len] OF char;
+fieldtype_type = short;
+queryid_type = ARRAY [1..queryid_len] OF char;
+selection_line_type = ARRAY [1..selection_line_len] OF char;
+selected_fields_type = ARRAY [1..max_selected_fields] OF fieldid_type;
+month_unsigned_byte_type = ARRAY [1..31] OF unsigned_byte;
+month_char_type = ARRAY [1..31] OF char;
+month_codes_type = ARRAY [1..31] OF codeid_type;
+month_short_type = ARRAY [1..31] OF short;
+abs_table_pointer = ^abs_table_type;
+abs_table_type = RECORD
+{ 1} tab_start: date_type;
+{ 7} tab_months: short;
+{ 9} offduty_reasons: ARRAY [1..24] OF month_codes_type;
+{ 1497} ondutytypes: ARRAY [1..24] OF month_char_type
+{=2240} END;
+ccbal_rule_display_type = RECORD
+{ 1} d_method: unsigned_byte;
+{ 2} d_corr_value_1: packed_8_type;
+{ 10} d_transbalanceid_1: unsigned_byte;
+{ 11} d_corr_value_2: packed_8_type;
+{ 19} d_transbalanceid_2: unsigned_byte
+{= 19} END;
+adjust_date_tab_type = ARRAY [1..adjust_rule_tab_len] OF date_type;
+chain_step_tab_type = ARRAY [1..max_no_of_balances] OF short;
+memory_tab_type = ARRAY [1..10] OF balance_type;
+balance_index_tab_type = ARRAY [1..max_no_of_balances] OF short;
+balance_set_type = SET OF 1..max_no_of_balances;
+mcbal_sections_type = RECORD
+{ 1} first: balance_index_tab_type;
+{ 49} last: balance_index_tab_type;
+{ 97} mcbal_balances: balance_set_type
+{= 97} END;
+rule_apply_type = flag_type;
+rule_apply_tab_type = ARRAY [1..adjust_rule_tab_len] OF rule_apply_type;
+return_code_type = short;
+record_no_type = short;
+empl_corr_values_type = ARRAY [1..max_empl_corr_values] OF saldo_type;
+cwrp_result_tab_type = RECORD
+{ 1} wpatid: wpatid_type;
+{ 5} codeid: codeid_type;
+{ 7} ruleid: ruleid_type
+{= 8} END;
+cwrp_period_result_tab_type = ARRAY [1..max_cwrp_days] OF cwrp_result_tab_type;
+attribid_type = ARRAY [1..attribid_len] OF char;
+attributes_type = ARRAY [1..max_no_of_attributes] OF attribid_type;
+parproid_type = ARRAY [1..parproid_len] OF char;
+projectid_type = ARRAY [1..projectid_len] OF char;
+rpoolid_type = ARRAY [1..rpoolid_len] OF char;
+taskid_type = ARRAY [1..taskid_len] OF char;
+versionid_type = ARRAY [1..versionid_len] OF char;
+balancetype_array_type = ARRAY [1..4] OF unsigned_byte;
+search_list_type = RECORD
+{ 1} length: short;
+{ 3} search_sets: ARRAY [1..max_search_sets_in_list] OF search_set_type
+{= 26} END;
+scb_type = RECORD
+{ 1} dsaempfcb: fcb_type;
+{ 21} dsvempfcb: fcb_type;
+{ 41} last_error: short;
+{ 43} best_search_list_length: short;
+{ 45} current_search_set: short;
+{ 47} key_len: short;
+{ 49} last_invalid_from: date_type;
+{ 55} last_key: ARRAY [1..30] OF char;
+{ 85} last_emplno: emplno_type;
+{ 95} use_last_key: flag_type;
+{ 96} first_pattern: ARRAY [1..30] OF char;
+{ 126} last_pattern: ARRAY [1..30] OF char;
+{ 156} best_key: char;
+{ 157} sorted_by_name: flag_type;
+{ 158} subkey_used: flag_type;
+{ 159} filler: ARRAY [1..14] OF char
+{= 172} END;
+semp_type = RECORD
+{ 1} variant_no: short;
+{ 3} from_date: date_type;
+{ 9} to_date: date_type;
+{ 15} deptno: deptno_type;
+{ 25} employcat: employcat_type;
+{ 29} costid: costid_type;
+{ 49} badgeno: long_badgeno_type;
+{ 69} emplno: emplno_type;
+{ 79} surname: surname_type;
+{ 109} select_options: select_options_type;
+{ 125} get_all_selected_variants: flag_type;
+{ 126} check_permission: flag_type;
+{ 127} employcat_filled: char;
+{ 128} check_interval: flag_type;
+{ 129} factory: packed_12_type;
+{ 141} mach_job: mach_job_type;
+{ 157} adjustcat: adjustcat_type;
+{ 161} tariffarea: tariffarea_type;
+{ 165} cycleid: cycleid_type;
+{ 169} cycle_start: short;
+{ 171} rpoolid: rpoolid_type;
+{ 183} accesscat: acccatid_type;
+{ 187} filler: ARRAY [1..14] OF char
+{= 200} END;
+sreal_type = short;
+ireal_type = long;
+prod_stepno_type = long;
+orderno_type = ARRAY [1..orderno_len] OF char;
+fault_reasonid_type = ARRAY [1..fault_reasonid_len] OF char;
+prod_status_type = char;
+prod_operationid_type = ARRAY [1..prod_operationid_len] OF char;
+piece_work_type_type = ARRAY [1..piece_work_type_len] OF char;
+prod_step_key_type = RECORD
+{ 1} orderno: orderno_type;
+{ 17} prod_stepno: prod_stepno_type;
+{ 21} prod_stepno_var: prod_stepno_type
+{= 24} END;
+pwtype_key_type = RECORD
+{ 1} piece_work_type: piece_work_type_type;
+{ 5} invalid_from: date_type
+{= 10} END;
+dsinst_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} flags: RECORD
+{+ 0} customer_code: char;
+{+ 1} costid_to_next_day: flag_type;
+{+ 2} update_dsttraf_flag: flag_type;
+{+ 3} pcsstat_flag: flag_type;
+{+ 4} saldo_ztariff_flag: flag_type;
+{+ 5} adj_income_flag: flag_type;
+{+ 6} dabsemp_calculation: char;
+{+ 7} monthly_schedu: flag_type;
+{+ 8} more_costbookings: flag_type;
+{+ 9} dabs_change_past: flag_type;
+{+ 10} use_3hour_guaranty: flag_type;
+{+ 11} scodeid_mtbal: flag_type;
+{+ 12} dsaldo_two_digits: flag_type;
+{+ 13} unique_badgeno_over_all_clients: flag_type;
+{+ 14} plan_info: char;
+{+ 15} holiday_single: flag_type;
+{+ 16} schedu_info: char;
+{+ 17} export_available: char;
+{+ 18} zdel_quick: flag_type;
+{+ 19} SAP_interface: char;
+{+ 20} flag1: flag_type;
+{+ 21} flag2: flag_type;
+{+ 22} flag3: flag_type;
+{+ 23} filler: ARRAY [1..9] OF filler_type
+{= 32} END;
+{ 41} country: char;
+{ 42} overtime_1_2_method: char;
+{ 43} auto_badgeno: long_badgeno_type;
+{ 63} sfc_installed: flag_type;
+{ 64} prw_installed: flag_type;
+{ 65} medical_solution_installed: flag_type;
+{ 66} canteen_installed: flag_type;
+{ 67} sfm_installed: flag_type;
+{ 68} client_installed: flag_type;
+{ 69} proj_management_installed: flag_type;
+{ 70} timeclt_installed: flag_type;
+{ 71} type_of_pps: char;
+{ 72} sfc_costid_usage: char;
+{ 73} absence_balance: short;
+{ 75} time_lost_balance: short;
+{ 77} missing_coretime_balance: short;
+{ 79} fkey_tab: fkey_tab_type;
+{ 147} companyname: ARRAY [1..70] OF char;
+{ 217} basis_module_installed: flag_type;
+{ 218} income_calc_installed: flag_type;
+{ 219} access_control_installed: flag_type;
+{ 220} pop_installed: flag_type;
+{ 221} cost_acc_installed: flag_type;
+{ 222} ttbal_installed: flag_type;
+{ 223} p3_installed: flag_type;
+{ 224} statistic_installed: flag_type;
+{ 225} severity_codes: ARRAY [1..maxseverity_codes] OF char;
+{ 233} beep_severity_codes: ARRAY [1..maxseverity_codes] OF char;
+{ 241} timer: ARRAY [1..8] OF char;
+{ 249} balance_type_tab: ARRAY [1..max_no_of_balances] OF char;
+{ 273} sfc_auto_registration: char;
+{ 274} sfc_auto_completion: char;
+{ 275} install_flag17: flag_type;
+{ 276} install_flag18: flag_type;
+{ 277} install_flag19: flag_type;
+{ 278} install_flag20: flag_type;
+{ 279} keep_time: short;
+{ 281} aemp_time: short;
+{ 283} past_income_change_flag: flag_type;
+{ 284} ztariff_v130_mode: char;
+{ 285} today_date: date_type;
+{ 291} dabsgrp_display_mode: char;
+{ 292} ztariff_optimization: char;
+{ 293} cost_pos_to_no: ARRAY [1..3] OF short;
+{ 299} cost_no_to_pos: ARRAY [1..3] OF short;
+{ 305} cost_maxlen: ARRAY [1..3] OF short;
+{ 311} cost_prestype: ARRAY [1..3] OF char;
+{ 314} sfc_variable_registration_mode: char;
+{ 315} sfc_auto_completion_mode: char;
+{ 316} flag4: flag_type;
+{ 317} cost_delimiter: ARRAY [1..2] OF char;
+{ 319} cost_alt_delimiter: ARRAY [1..2] OF char;
+{ 321} install_flag21: flag_type;
+{ 322} install_flag22: flag_type;
+{ 323} install_flag23: flag_type;
+{ 324} valid_for_overtime: flag_type;
+{ 325} real_worktime: flag_type;
+{ 326} sickness_codeid2: codeid_type;
+{ 328} install_flag24: flag_type;
+{ 329} sfc_apply_pwtype_daily: flag_type;
+{ 330} cost_checks: ARRAY [1..3] OF flag_type;
+{ 333} menue_mode: char;
+{ 334} codeid_worked: codeid_type;
+{ 336} codeid_day_off: codeid_type;
+{ 338} day_filler: codeid_type;
+{ 340} day_invalid: codeid_type;
+{ 342} real_delimiter: char;
+{ 343} video_attributes: video_attributes_type;
+{ 359} week_first_day_ztariff: char;
+{ 360} codeid_no_permission: codeid_type;
+{ 362} sickness_codeid: codeid_type;
+{ 364} sfc_parallelity_mode: char;
+{ 365} sfc_cost_priority: flag_type;
+{ 366} sfc_send_time_to_pps: char;
+{ 367} sfc_calc_partial_ps: flag_type;
+{ 368} change_from_date_text: packed_16_type;
+{ 384} tm_change_from_date_text: packed_16_type;
+{ 400} tarislib1: ARRAY [1..10] OF char;
+{ 410} tarislib2: ARRAY [1..10] OF char;
+{ 420} tarislib3: ARRAY [1..10] OF char;
+{ 430} use_prtempday: flag_type;
+{ 431} digits_from_orderno: short;
+{ 433} digits_from_prod_stepno: short;
+{ 435} pos_from_orderno: short;
+{ 437} basic_income: income_type;
+{ 441} prw_costtype: costid_type;
+{ 461} sfc_time: short;
+{ 463} v180_inst_date: date_type;
+{ 469} v220_inst_stamp: timestamp;
+{ 473} v230_inst_stamp: timestamp;
+{ 477} v240_inst_stamp: timestamp;
+{ 481} bankholtype: ARRAY [3..maxdaytypes] OF char;
+{ 489} balance_calc_tab: ARRAY [1..max_no_of_balances] OF char;
+{ 513} plan_time: short;
+{ 515} warn_time: short;
+{ 517} acclog_time: short;
+{ 519} errlog_time: short;
+{ 521} daily_delimiter: char;
+{ 522} unit_continued_payment: char;
+{ 523} duration_continued_payment: short;
+{ 525} codes_continued_payment: ARRAY [1..5] OF codeid_type;
+{ 535} vacation_balance: short;
+{ 537} negative_time_border: mod_type;
+{ 539} primary_languageid: languageid_type;
+{ 541} balance_order_tab: ARRAY [1..max_no_of_balances] OF short;
+{ 589} empl_corr_values_type_tab: ARRAY [1..8] OF char;
+{ 597} lang_timer: packed_8_type;
+{ 605} custdata: long;
+{ 609} custdata1: ARRAY [1..96] OF unsigned_byte;
+{ 705} min_pwd_len: short;
+{ 707} max_logon_tries: short;
+{ 709} email_on_request: flag_type;
+{ 710} email_on_approval: flag_type;
+{ 711} use_break_for_schedu: flag_type;
+{ 712} use_break_for_schedud: flag_type;
+{ 713} picture_url: url_type;
+{ 967} filler3: ARRAY [1..1] OF filler_type;
+{ 968} proj_time_acc_installed: flag_type;
+{ 969} dsmtbix_projno_flag: flag_type;
+{ 970} dsmtbix_costno_flag: flag_type;
+{ 971} dsmtbix_cttype_flag: flag_type;
+{ 972} dsmtbix_costid_flag: flag_type;
+{ 973} regular_worktime: duration_type;
+{ 975} empl_cost_factor: sreal_type;
+{ 977} commtype_wasc: commtype_type;
+{ 981} schedu_balance: short;
+{ 983} dsabs_future_months: short;
+{ 985} emplnotime_to_pps: char;
+{ 986} new_timer: timer_text_type;
+{ 1066} filler1: ARRAY [1..1] OF filler_type;
+{ 1067} pin_valid_len: short;
+{ 1069} max_pin_try: short;
+{ 1071} duration_form: char;
+{ 1072} filler2: ARRAY [1..79] OF filler_type
+{=1150} END;
+allowances_type = ARRAY [1..maxallowances] OF allowance_type;
+timepairs_record_type = RECORD
+{ 1} time_in: mod_type;
+{ 3} time_out: mod_type;
+{ 5} timepair_code: codeid_type
+{= 6} END;
+timepairs_type = ARRAY [1..maxtimepairs] OF timepairs_record_type;
+balance_rounding_type = RECORD
+{ 1} min_unit: short;
+{ 3} round_up: short;
+{ 5} minimum: short;
+{ 7} filler: short
+{= 8} END;
+l_form_type = ARRAY [1..7] OF char;
+l_data_type = ARRAY [1..1910] OF char;
+l_modes_type = ARRAY [1..500] OF short;
+l_message_type = ARRAY [1..78] OF char;
+day_emplno_type = RECORD
+{ 1} date: date_type;
+{ 7} emplno: emplno_type
+{= 16} END;
+emplno_day_seq_type = RECORD
+{ 1} emplno: emplno_type;
+{ 11} date: date_type;
+{ 17} sequenceno: short
+{= 18} END;
+emplno_day_type = RECORD
+{ 1} emplno: emplno_type;
+{ 11} date: date_type
+{= 16} END;
+emplno_year_type = RECORD
+{ 1} emplno: emplno_type;
+{ 11} year: short
+{= 12} END;
+breakusage_ext_type = ARRAY [1..maxbreaks] OF boolean;
+filter_result_type = (yes, no, abort);
+progname_type = short;
+parm_tab_line_type = ARRAY [1..parm_tab_line_len] OF char;
+parm_tab_type = ARRAY [1..parm_tab_len] OF parm_tab_line_type;
+pin_code_type = ARRAY [1..4] OF char;
+break_pattern_type = RECORD
+{ 1} time_from: mod_type;
+{ 3} time_to: mod_type;
+{ 5} paid_breaklen: duration_type;
+{ 7} unpaid_breaklen: duration_type
+{= 8} END;
+fkey_line_type = ARRAY [1..78] OF char;
+fkcb_type = RECORD
+{ 1} pageno: short;
+{ 3} no_of_pages: short;
+{ 5} fkey_line: ARRAY [1..fkey_maxlines] OF fkey_line_type;
+{ 473} line1: fkey_line_type;
+{ 551} line2: fkey_line_type
+{= 628} END;
+long_record_type = ARRAY [1..long_record_len] OF char;
+long_record_ptr_type = ^long_record_type;
+mode_type = char;
+action_type = char;
+action_ctab_type = ARRAY [1..32] OF char;
+action_subst_type = ARRAY [1..32] OF short;
+action_set_type = SET OF char;
+action_line_type = ARRAY [1..action_line_len] OF char;
+action_mask_type = RECORD
+{ 1} line1: action_line_type;
+{ 77} line2: action_line_type
+{= 152} END;
+keydata_type = ARRAY [1..keydata_len] OF char;
+prog_param_type = RECORD
+{ 1} CASE action: action_type OF
+{+ 1} action_getinfo: (fileid: ARRAY [1..10] OF char;
+{+ 11} title_ctab: long_text_type;
+{+ 41} keylen: short;
+{+ 43} total_keylen: short;
+{+ 45} progno: short;
+{+ 47} variants: flag_type;
+{+ 48} org_value: keydata_type;
+{+ 108} alignment1: char);
+{+ 1} action_update: (keydata: keydata_type;
+{+ 61} itemid: short);
+{+ 1} action_rename: (old_keydata: keydata_type;
+{+ 61} new_keydata: keydata_type);
+{= 122} END;
+buffer_pointer = ^buffer_type;
+comm_buffer_pointer = ^comm_buffer_type;
+comm_buffer_type = ARRAY [1..comm_buffer_len] OF char;
+time_array_type = ARRAY [1..time_array_len] OF char;
+date_array_type = ARRAY [1..8] OF char;
+taris_time_array_type = ARRAY [1..taris_time_array_len] OF char;
+cci_header_type = RECORD
+{ 1} data_len: long
+{= 4} END;
+cusers_name_type = ARRAY [1..cusers_name_len] OF char;
+mcb_type = RECORD
+{ 1} reserved: short;
+{ 3} getcursorpos: short;
+{ 5} key_code: short;
+{ 7} f4_window: short;
+{ 9} redisplay_flag: boolean
+{= 9} END;
+mc_param_type = RECORD
+{ 1} status: short;
+{ 3} message: message_type;
+{ 83} beep_flag: boolean
+{= 83} END;
+dschlog_data_type = ARRAY [1..4000] OF unsigned_byte;
+dschlog_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} date_and_time: date_and_time_type;
+{ 21} millisec: short;
+{ 23} emplno: emplno_type;
+{ 33} recno: record_no_type;
+{ 35} first_reclen: short;
+{ 37} second_reclen: short;
+{ 39} logonid: logonid_type;
+{ 47} os_logonid: packed_16_type;
+{ 63} terminalname: objectid_type;
+{ 71} updatetype: char;
+{ 72} filler: ARRAY [1..27] OF char;
+{ 99} rec_data_len: short;
+{ 101} rec_data: dschlog_data_type
+{=4100} END;
+tstat_tabline_type = RECORD
+{ 1} termid: objectid_type;
+{ 9} termno: short;
+{ 11} state: unsigned_byte;
+{ 12} term_code: char;
+{ 13} phys_termtype: objectid_type;
+{ 21} location: ARRAY [1..16] OF char;
+{ 37} error: code_type;
+{ 41} number_in: long;
+{ 45} error_in: long;
+{ 49} number_out: long;
+{ 53} error_out: long
+{= 56} END;
+tstat_tab_type = ARRAY [1..tstat_tab_len] OF tstat_tabline_type;
+terminal_state_type = ARRAY [1..2] OF char;
+pcs_term_state_type = RECORD
+{ 1} serialnumber: ARRAY [1..11] OF char;
+{ 12} align1: char;
+{ 13} driver: ARRAY [1..4] OF char;
+{ 17} bb: ARRAY [1..4] OF char;
+{ 21} dispcontrol: ARRAY [1..4] OF char;
+{ 25} rtk: ARRAY [1..4] OF char;
+{ 29} tcl: ARRAY [1..4] OF char;
+{ 33} sterminal: terminal_state_type;
+{ 35} sbb: terminal_state_type;
+{ 37} sdispcontrol: terminal_state_type;
+{ 39} sbbm: ARRAY [1..8] OF terminal_state_type;
+{ 55} display: ARRAY [1..80] OF char
+{= 134} END;
+print_msg_type = RECORD
+{ 1} msg_header: msg_header_type;
+{ 31} msgtype: short;
+{ 33} command: ARRAY [1..512] OF char;
+{ 545} logonid: logonid_type;
+{ 553} start_datetime: date_and_time_type;
+{ 565} priority: packed_2_type;
+{ 567} printerid: objectid_type;
+{ 575} printerfile: phys_filename_type;
+{ 607} outfile: phys_filename_type;
+{ 639} clientno: buffer_type;
+{ 641} languageid: languageid_type
+{= 642} END;
+staff_key_type = RECORD
+{ 1} mach_job: mach_job_type;
+{ 17} time_from: mod_type;
+{ 19} time_to: mod_type;
+{ 21} whole_day: flag_type;
+{ 22} link: alias_type;
+{ 37} invalid_from: date_type
+{= 42} END;
+djob_key_type = RECORD
+{ 1} emplno: emplno_type;
+{ 11} date: date_type;
+{ 17} time: mod_type
+{= 18} END;
+table_col_record_type = RECORD
+{ 1} datatype: char;
+{ 2} alignment1: ARRAY [1..3] OF char;
+{ 5} len: long
+{= 8} END;
+table_col_type = ARRAY [1..MAX_COLS] OF table_col_record_type;
+clientno_tab_type = ARRAY [1..clientno_tab_len] OF buffer_type;
+language_tab_type = ARRAY [1..language_tab_len] OF languageid_type;
+codepage_tab_type = ARRAY [0..255] OF char;
+ul_block_ptr_type = ^ul_block_type;
+ul_block_type = RECORD
+{ 1} chars: ARRAY [1..ul_block_len] OF char;
+{ 4097} nextpt: ul_block_ptr_type;
+{ 4101} prevpt: ul_block_ptr_type
+{=4104} END;
+ul_pos_type = RECORD
+{ 1} blockpt: ul_block_ptr_type;
+{ 5} recordno: short
+{= 6} END;
+ulcb_type = RECORD
+{ 1} last_error: short;
+{ 3} reclen: short;
+{ 5} new_cur_pos: ul_pos_type;
+{ 11} filler1: ARRAY [1..2] OF char;
+{ 13} no_of_records: long;
+{ 17} first_pos: ul_pos_type;
+{ 23} filler2: ARRAY [1..2] OF char;
+{ 25} last_pos: ul_pos_type;
+{ 31} filler3: ARRAY [1..2] OF char;
+{ 33} cur_pos: ul_pos_type
+{= 38} END;
+ix_block_ptr_type = ^ix_block_type;
+ix_pos_type = RECORD
+{ 1} blockpt: ix_block_ptr_type;
+{ 5} recordno: short
+{= 6} END;
+ix_block_type_keytab = RECORD
+{ 1} keyno: long;
+{ 5} next_pos: ix_pos_type;
+{ 11} alignment1: ARRAY [1..2] OF char;
+{ 13} data_pos: ul_pos_type
+{= 18} END;
+ix_block_type = RECORD
+{ 1} keytab: ARRAY [1..ix_keys_in_block] OF ix_block_type_keytab;
+{ 181} nextpt: ix_block_ptr_type;
+{ 185} prevpt: ix_block_ptr_type
+{= 188} END;
+ixcb_type = RECORD
+{ 1} last_error: short;
+{ 3} alignment1: ARRAY [1..2] OF char;
+{ 5} first_pos: ix_pos_type;
+{ 11} alignment2: ARRAY [1..2] OF char;
+{ 13} last_pos: ix_pos_type;
+{ 19} alignment3: ARRAY [1..2] OF char;
+{ 21} cur_pos: ix_pos_type;
+{ 27} alignment6: ARRAY [1..2] OF char;
+{ 29} hashtab: ARRAY [0..ix_hashtab_max] OF RECORD
+{+ 0} h_first_pos: ix_pos_type;
+{+ 6} alignment4: ARRAY [1..2] OF char;
+{+ 8} h_last_pos: ix_pos_type;
+{+ 14} alignment5: ARRAY [1..2] OF char
+{= 176} END;
+{ 205} free_first_pos: ix_pos_type;
+{ 211} alignment7: ARRAY [1..2] OF char;
+{ 213} free_last_pos: ix_pos_type
+{= 218} END;
+matchcode_table_element = RECORD
+{ 1} input_code: ARRAY [1..matchcode_table_text_len] OF char;
+{ 101} is_blank: boolean;
+{ 102} has_matchcode: boolean;
+{ 103} matchcode_pos: short;
+{ 105} matchcode_char: char;
+{ 106} index: indexname_type;
+{ 138} alignment1: char;
+{ 139} priority: short
+{= 140} END;
+matchcode_table_type = ARRAY [1..matchcode_table_size] OF matchcode_table_element;
+benzing_req = RECORD
+{ 1} dbgid: char;
+{ 2} dbdid: char;
+{ 3} dbbzus: char;
+{ 4} dbsaum: ARRAY [1..2] OF char;
+{ 6} dbuhrk: char;
+{ 7} dbyear: ARRAY [1..2] OF char;
+{ 9} dbmon: ARRAY [1..2] OF char;
+{ 11} dbday: ARRAY [1..2] OF char;
+{ 13} dbhh: ARRAY [1..2] OF char;
+{ 15} dbmm: ARRAY [1..2] OF char;
+{ 17} dbss: ARRAY [1..2] OF char;
+{ 19} dbfiller: char;
+{ 20} dbid: ARRAY [1..benz_did_len] OF char
+{= 219} END;
+benzing_reply = RECORD
+{ 1} awsaum: ARRAY [1..2] OF char;
+{ 3} awinat: ARRAY [1..42] OF char
+{= 44} END;
+var_balance_type = RECORD
+{ 1} start_pos: short;
+{ 3} max_len: short;
+{ 5} no_of_bal: short;
+{ 7} offset: short
+{= 8} END;
+var_balance_tab_type = ARRAY [1..max_no_of_bal_rec] OF var_balance_type;
+var_balance_type_tab = ARRAY [1..max_no_of_balances] OF char;
+tse_rec = RECORD
+{ 1} tse_installed: boolean;
+{ 2} tse_multi_clients_installed: boolean;
+{ 3} tse_cycle_installed: boolean;
+{ 4} tse_income_installed: boolean;
+{ 5} tse_adjust_installed: boolean;
+{ 6} tse_apply_and_grant_installed: boolean;
+{ 7} tse_cost_installed: boolean;
+{ 8} tse_proj_installed: boolean;
+{ 9} tse_pop_installed: boolean;
+{ 10} tse_access_installed: boolean
+{= 10} END;
+pntoln_badgeno_type = ARRAY [1..20] OF char;
+pntoln_key_type = char;
+token_type = short;
+Ptree_node_type = ^tree_node_type;
+tree_node_type = RECORD
+{ 1} next_child_left: Ptree_node_type;
+{ 5} next_child_right: Ptree_node_type;
+{ 9} token: token_type;
+{ 11} fieldid: fieldid_type;
+{ 27} condition_value: ARRAY [1..32] OF char
+{= 58} END;
+moduleid_text_type = ARRAY [1..moduleid_text_len] OF char;
+module_table_elem_type = RECORD
+{ 1} moduleid: short;
+{ 3} moduleid_text: moduleid_text_type;
+{ 43} alignment1: ARRAY [1..2] OF char;
+{ 45} maxemplno: long;
+{ 49} db_size: long;
+{ 53} db_all_size: long;
+{ 57} participant: char
+{= 57} END;
+project_time_type = RECORD
+{ 1} costid: costid_type;
+{ 21} duration: duration_type;
+{ 23} comment: long_text_type
+{= 52} END;
+project_tab_type = ARRAY [1..awtime_max_projects_per_day] OF project_time_type;
+licence_elem_type = RECORD
+{ 1} moduleid: short;
+{ 3} filler: ARRAY [1..2] OF filler_type;
+{ 5} used: long;
+{ 9} in_clientno: long;
+{ 13} in_all: long
+{= 16} END;
+licence_table_type = ARRAY [1..participant_array_len] OF licence_elem_type;
+short_block_type = ARRAY [1..8] OF short;
+hex_block_type = ARRAY [1..16] OF char;
+flag_block_type = ARRAY [1..64] OF flag_type;
+dsmdlptp_code_type = ARRAY [1..dsmdlptp_code_len] OF hex_block_type;
+dsmdsum_code_type = ARRAY [1..dsmdsum_code_len] OF hex_block_type;
+participant_flag_array_type = ARRAY [1..participant_array_len] OF flag_type;
+participant_long_array_type = ARRAY [1..participant_array_len] OF long;
+uemploy_table_elem_type = RECORD
+{ 1} ind_module: char;
+{ 2} alignment1: char;
+{ 3} old_moduleid: short;
+{ 5} old_moduleid_text: moduleid_text_type;
+{ 45} new_moduleid: short;
+{ 47} new_moduleid_text: moduleid_text_type
+{= 86} END;
+tsuemploy_table_elem_type = RECORD
+{ 1} ind_module: char;
+{ 2} filler: filler_type;
+{ 3} old_moduleid: short;
+{ 5} new_moduleid: short
+{= 6} END;
+tsuemploy_table_type = ARRAY [1..module_table_len] OF tsuemploy_table_elem_type;
+eload_table_elem_type = RECORD
+{ 1} moduleid: short;
+{ 3} moduleid_text: moduleid_text_type;
+{ 43} position: short
+{= 44} END;
+tseload_table_elem_type = RECORD
+{ 1} moduleid: short;
+{ 3} position: short
+{= 4} END;
+eload_table_type = ARRAY [1..module_table_len] OF eload_table_elem_type;
+tseload_table_type = ARRAY [1..module_table_len] OF tseload_table_elem_type;
+input_pduration_type = ARRAY [1..9] OF char;
+pduration_type = long;
+byte_8_type = ARRAY [1..8] OF byte;
+byte_28_type = ARRAY [1..28] OF byte;
+byte_32_type = ARRAY [1..32] OF byte;
+byte_48_type = ARRAY [1..48] OF byte;
+byte_56_type = ARRAY [1..56] OF byte;
+byte_64_type = ARRAY [1..64] OF byte;
+licence_module_type = RECORD
+{ 1} installed: boolean;
+{ 2} ase: boolean;
+{ 3} number: byte;
+{ 4} alignment1: char;
+{ 5} size: long
+{= 8} END;
+licencerec_type = RECORD
+{ 1} clientno: buffer_type;
+{ 3} ok: boolean;
+{ 4} client_depend: boolean;
+{ 5} test_timer: boolean;
+{ 6} alignment1: char;
+{ 7} number: short;
+{ 9} max_clientnos: short;
+{ 11} test_end_date: date_type;
+{ 17} test_max: long;
+{ 21} ASE_timer: boolean;
+{ 22} timer: timer_text_type;
+{ 102} ckey: packed_8_type;
+{ 110} as400bib: packed_10_type;
+{ 120} alignment2: char;
+{ 121} module_table: ARRAY [1..26] OF licence_module_type
+{= 328} END;
+pduration_positions_type = RECORD
+{ 1} total_no_of_positions: short;
+{ 3} positions: ARRAY [1..10] OF short
+{= 22} END;
+awtime_text_type = ARRAY [1..26] OF char;
+ccsid_tab_type = RECORD
+{ 1} visible_on_as400: char;
+{ 2} ord_ebcdic: packed_3_type;
+{ 5} ord_uppercase: packed_3_type;
+{ 8} ord_unmodified: packed_3_type;
+{ 11} ord_ansi: packed_3_type;
+{ 14} ord_pcsterminal: packed_3_type;
+{ 17} ord_ascii: packed_3_type;
+{ 20} special1_ord: packed_3_type;
+{ 23} special2_ord: packed_3_type;
+{ 26} special3_ord: packed_3_type;
+{ 29} special4_ord: packed_3_type;
+{ 32} special5_ord: packed_3_type
+{= 34} END;
+clientvalues_elem_ptr = ^clientvalues_elem_type;
+clientvalues_elem_type = RECORD
+{ 1} check: boolean;
+{ 2} clientno: buffer_type;
+{ 4} alignment1: char;
+{ 5} dsinstrec: dsinst_rec;
+{ 1155} alignment2: ARRAY [1..2] OF char;
+{ 1157} licencerec: licencerec_type;
+{ 1485} next: clientvalues_elem_ptr
+{=1488} END;
+siport_badgeno_type = ARRAY [1..siport_badgeno_len] OF char;
+zone_range_tab_type = RECORD
+{ 1} clientno: buffer_type;
+{ 3} termid: objectid_type;
+{ 11} from_zone: short;
+{ 13} to_zone: short;
+{ 15} tariffarea: tariffarea_type;
+{ 19} zexport_termid: objectid_type
+{= 26} END;
+zone_range_pointer = ^zone_range_list_type;
+zone_range_list_type = RECORD
+{ 1} next_pt: zone_range_pointer;
+{ 5} zone_range_tab: zone_range_tab_type
+{= 30} END;
+mask_cost_tab_rec_type = RECORD
+{ 1} costid: costid_type;
+{ 21} switch_time: mod_type;
+{ 23} termno: short;
+{ 25} modify_code: short;
+{ 27} to_time: mod_type;
+{ 29} filler1: ARRAY [1..4] OF filler_type
+{= 32} END;
+projno_array_type = RECORD
+{ 1} projno: ARRAY [1..20] OF char
+{= 20} END;
+projno_tab_type = ARRAY [1..max_costno_grupps] OF projno_array_type;
+statusid_type = ARRAY [1..statusid_len] OF char;
+statustype_type = char;
+wrk_status_type = RECORD
+{ 1} statusid: statusid_type;
+{ 9} statustype: statustype_type
+{= 9} END;
+
+{comdecl2} {CONST lens12.inc ???}
+ {dbrecs.inc was?}
+accat_type = ARRAY [1..8] OF char;
+pensum_type = ARRAY [1..4] OF char;
+emplno_qual_type = RECORD
+{ 1} emplno: emplno_type;
+{ 11} qualificationid: qualificationid_type
+{= 18} END;
+alt_wpatids_type = ARRAY [1..maxalt_wpats] OF wpatid_type;
+alt_wpatids_flag_type = ARRAY [1..maxalt_wpats] OF flag_type;
+zone_perm_tab_type = ARRAY [1..max_zones] OF char;
+calenid_type = RECORD
+{ 1} tariffarea: tariffarea_type;
+{ 5} year: short
+{= 6} END;
+dtimeid_type = RECORD
+{ 1} day_emplno: day_emplno_type;
+{ 17} sequenceno: char
+{= 17} END;
+income_group_type = ARRAY [1..max_inc_per_group] OF income_type;
+income_group_tab_type = ARRAY [1..max_no_of_inc_groups] OF income_group_type;
+adjust_key_type = RECORD
+{ 1} adjustcat: adjustcat_type;
+{ 5} invalid_from: date_type;
+{ 11} sequenceno: short
+{= 12} END;
+selopt_key_type = RECORD
+{ 1} seloptno: char;
+{ 2} selopt: char
+{= 2} END;
+balance_adj_type = RECORD
+{ 1} balance: unsigned_byte;
+{ 2} bal_unit: char;
+{ 3} count: short;
+{ 5} adjust_day: date_type;
+{ 11} method: short;
+{ 13} transbalanceid_1: short;
+{ 15} transbalanceid_2: short;
+{ 17} corr_value_1: saldo_type;
+{ 21} corr_value_2: saldo_type
+{= 24} END;
+balance_cbal_type = RECORD
+{ 1} balance: balance_type;
+{ 5} cycle_terminated: flag_type;
+{ 6} alignment1: filler_type;
+{ 7} sum_of_positive: short
+{= 8} END;
+adjust_rule_tab_type = ARRAY [1..adjust_rule_tab_len] OF balance_adj_type;
+cbal_balance_tab_type = ARRAY [1..max_no_of_balances] OF balance_cbal_type;
+add_value_tab_type = ARRAY [1..max_no_of_balances] OF balance_type;
+plan_key_type = RECORD
+{ 1} emplno: emplno_type;
+{ 11} date_to: date_type
+{= 16} END;
+rule_key_type = RECORD
+{ 1} ruleid: ruleid_type;
+{ 3} invalid_from: date_type
+{= 8} END;
+timepair_type = RECORD
+{ 1} codeid: codeid_type;
+{ 3} time_in: mod_type;
+{ 5} terminal_in: short;
+{ 7} modify_in: short;
+{ 9} time_out: mod_type;
+{ 11} terminal_out: short;
+{ 13} modify_out: short
+{= 14} END;
+wpat_key_type = RECORD
+{ 1} wpatid: wpatid_type;
+{ 5} invalid_from: date_type
+{= 10} END;
+dsabs_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} absid: emplno_day_type;
+{ 25} codeid_tab: month_codes_type;
+{ 87} last_filled_day: short;
+{ 89} ondutytype_tab: month_char_type;
+{ 120} filler1: ARRAY [1..1] OF filler_type;
+{ 121} ondutylen_tab: month_short_type;
+{ 183} filler: ARRAY [1..18] OF filler_type
+{= 200} END;
+dsaccat_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} catid: accat_type;
+{ 17} default_perm: char;
+{ 18} cat: ARRAY [1..24] OF RECORD
+{+ 0} employcat: employcat_type;
+{+ 4} perm: char
+{= 120} END;
+{ 138} filler: ARRAY [1..43] OF char
+{= 180} END;
+dsaccomm_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} catid: accat_type;
+{ 17} default_perm: char;
+{ 18} comm: ARRAY [1..24] OF RECORD
+{+ 0} commtype: commtype_type;
+{+ 4} perm: char
+{= 120} END;
+{ 138} filler: ARRAY [1..23] OF unsigned_byte
+{= 160} END;
+dsaccop_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} catid: accat_type;
+{ 17} default_perm: char;
+{ 18} cop: ARRAY [1..24] OF RECORD
+{+ 0} operationid: operationid_type;
+{+ 8} perm: char
+{= 216} END;
+{ 234} filler: ARRAY [1..27] OF unsigned_byte
+{= 260} END;
+dsaccost_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} catid: accat_type;
+{ 17} default_perm: char;
+{ 18} cost: ARRAY [1..24] OF RECORD
+{+ 0} costid: costid_type;
+{+ 20} perm: char
+{= 504} END;
+{ 522} filler: ARRAY [1..28] OF char
+{= 549} END;
+deptno_permission_type = RECORD
+{ 1} deptno: deptno_type;
+{ 11} perm: char
+{= 11} END;
+dsacdept_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} catid: accat_type;
+{ 17} default_perm: char;
+{ 18} dept: ARRAY [1..48] OF deptno_permission_type;
+{ 546} filler: ARRAY [1..15] OF char
+{= 560} END;
+accode_perm_type = RECORD
+{ 1} codeid: codeid_type;
+{ 3} codetype: codetype_type;
+{ 4} perm: char
+{= 4} END;
+dsaccode_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} catid: accat_type;
+{ 17} sequenceno: short;
+{ 19} default_perm: char;
+{ 20} codeid: codeid_type;
+{ 22} codetype: codetype_type;
+{ 23} perm: char;
+{ 24} filler: ARRAY [1..1] OF char
+{= 24} END;
+dsacinc_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} catid: accat_type;
+{ 17} default_perm: char;
+{ 18} inc: ARRAY [1..24] OF RECORD
+{+ 0} income: income_type;
+{+ 4} perm: char
+{= 120} END;
+{ 138} filler: ARRAY [1..39] OF char
+{= 176} END;
+acmask_perm_type = RECORD
+{ 1} maskid: objectid_type;
+{ 9} perm: char;
+{ 10} permission_code: char
+{= 10} END;
+dsacmask_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} catid: accat_type;
+{ 17} sequenceno: short;
+{ 19} default_perm: char;
+{ 20} mask: acmask_perm_type;
+{ 30} filler: ARRAY [1..3] OF char
+{= 32} END;
+dsacprog_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} catid: accat_type;
+{ 17} default_perm: char;
+{ 18} filler1: ARRAY [1..3] OF a_char;
+{ 21} prog: ARRAY [1..24] OF RECORD
+{+ 0} progid: objectid_type;
+{+ 8} perm: char;
+{+ 9} filler: char
+{= 240} END;
+{ 261} filler: ARRAY [1..40] OF char
+{= 300} END;
+dsacsel_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} catid: accat_type;
+{ 17} sequenceno: short;
+{ 19} default_perm: char;
+{ 20} selopt_key: selopt_key_type;
+{ 22} perm: char
+{= 22} END;
+acsel_perm_type = RECORD
+{ 1} seloptno: char;
+{ 2} selopt: char;
+{ 3} perm: char
+{= 3} END;
+dsacterm_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} catid: accat_type;
+{ 17} default_perm: char;
+{ 18} term: ARRAY [1..24] OF RECORD
+{+ 0} termid: objectid_type;
+{+ 8} perm: char
+{= 216} END;
+{ 234} filler: ARRAY [1..67] OF char
+{= 300} END;
+dsaczone_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} catid: accat_type;
+{ 17} default_perm: char;
+{ 18} zone_perm_tab: zone_perm_tab_type;
+{ 218} filler: ARRAY [1..23] OF filler_type
+{= 240} END;
+dsadjusr_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} adjust_key: adjust_key_type;
+{ 21} balance_adj: balance_adj_type;
+{ 45} filler: ARRAY [1..16] OF filler_type
+{= 60} END;
+dsadjust_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} adjust_key: adjust_key_type;
+{ 21} valid_from: date_type;
+{ 27} adjust_text: long_text_type;
+{ 57} chain_balance_tab: chain_balance_tab_type;
+{ 105} income_group: income_group_tab_type;
+{ 265} useable: flag_type;
+{ 266} filler: ARRAY [1..35] OF filler_type
+{= 300} END;
+dsadjustt_rec = RECORD
+{ 1} dsadjustrec: dsadjust_rec;
+{ 301} rule_tab: adjust_rule_tab_type
+{=2028} END;
+dsccbal_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} ccbalid: emplno_day_type;
+{ 25} add_value_tab: add_value_tab_type;
+{ 121} filler: ARRAY [1..40] OF filler_type
+{= 160} END;
+dsccbalr_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} ccbalrid: emplno_day_seq_type;
+{ 27} filler1: ARRAY [1..2] OF filler_type;
+{ 29} balance_adj: balance_adj_type;
+{ 53} filler: ARRAY [1..28] OF filler_type
+{= 80} END;
+dsccbalt_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} ccbalid: emplno_day_type;
+{ 25} add_value_tab: add_value_tab_type;
+{ 121} rule_tab: adjust_rule_tab_type;
+{ 1849} use_method_tab: rule_apply_tab_type;
+{ 1921} balance_numbers: ARRAY [1..max_no_of_balances] OF unsigned_byte
+{=1944} END;
+dsadmbno_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} date_and_time: date_and_time_type;
+{ 21} millisec: short;
+{ 23} badgeno: badgeno_type;
+{ 33} physical_key: ARRAY [1..20] OF char;
+{ 53} key_type: char;
+{ 54} key_state: char;
+{ 55} logonid: logonid_type;
+{ 63} owner: ARRAY [1..10] OF char;
+{ 73} filler: ARRAY [1..18] OF char
+{= 90} END;
+dsaemp_const_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} emplno: emplno_type;
+{ 19} deptno: deptno_type;
+{ 29} employcat: employcat_type;
+{ 33} filler3: ARRAY [1..1] OF filler_type;
+{ 34} factory: packed_12_type;
+{ 46} tariffarea: tariffarea_type;
+{ 50} pin_code: pin_code_type;
+{ 54} manager_emplno: emplno_type;
+{ 64} firstname: firstname_type;
+{ 84} surname: surname_type;
+{ 114} vacation_method: unsigned_byte;
+{ 115} vacation: ARRAY [1..maxvacations] OF dbalance_type;
+{ 123} allowances_workdays: allowances_type;
+{ 133} allowances_freedays: allowances_type;
+{ 143} accesscat: packed_4_type;
+{ 147} hometerm: objectid_type;
+{ 155} termcats: ARRAY [1..maxtermcats] OF termcat_type;
+{ 187} dist_deduct_on_call: ARRAY [1..2] OF duration_type;
+{ 191} v_invalid_from: date_type;
+{ 197} v_valid_from: date_type;
+{ 203} start_date: date_type;
+{ 209} ref_period_work_time: saldo_type;
+{ 213} ref_period_len: short;
+{ 215} phoneno: packed_14_type;
+{ 229} auto_cost_switch: flag_type;
+{ 230} individual_distance: flag_type;
+{ 231} valid_from: date_type;
+{ 237} valid_to: date_type;
+{ 243} cycleid: cycleid_type;
+{ 247} cycle_start: short;
+{ 249} std_effect_rate: sreal_type;
+{ 251} dist_deduct: ARRAY [1..2] OF duration_type;
+{ 255} adjustcat: adjustcat_type;
+{ 259} mean_std_worktime: duration_type;
+{ 261} mean_std_worktime_week: duration_type;
+{ 263} continued_pay_len: continued_pay_len_type;
+{ 265} filler4: ARRAY [1..7] OF filler_type;
+{ 272} working_location: unsigned_byte;
+{ 273} costid: costid_type;
+{ 293} sfc_participant: flag_type;
+{ 294} multi_machine_user: char;
+{ 295} birthdate: date_type;
+{ 301} mach_job: mach_job_type;
+{ 317} badgeno: long_badgeno_type;
+{ 337} select_options: select_options_type;
+{ 353} empl_corr_values: empl_corr_values_type;
+{ 369} empl_corr_values_add: empl_corr_values_type;
+{ 385} filler5: packed_16_type
+{= 400} END;
+dsaemp_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} emplno: emplno_type;
+{ 19} deptno: deptno_type;
+{ 29} employcat: employcat_type;
+{ 33} filler3: ARRAY [1..1] OF filler_type;
+{ 34} factory: packed_12_type;
+{ 46} tariffarea: tariffarea_type;
+{ 50} pin_code: pin_code_type;
+{ 54} manager_emplno: emplno_type;
+{ 64} firstname: firstname_type;
+{ 84} surname: surname_type;
+{ 114} vacation_method: unsigned_byte;
+{ 115} vacation: ARRAY [1..maxvacations] OF dbalance_type;
+{ 123} allowances_workdays: allowances_type;
+{ 133} allowances_freedays: allowances_type;
+{ 143} accesscat: acccatid_type;
+{ 147} hometerm: objectid_type;
+{ 155} termcats: ARRAY [1..maxtermcats] OF termcat_type;
+{ 187} dist_deduct_on_call: ARRAY [1..2] OF duration_type;
+{ 191} v_invalid_from: date_type;
+{ 197} v_valid_from: date_type;
+{ 203} start_date: date_type;
+{ 209} ref_period_work_time: saldo_type;
+{ 213} ref_period_len: short;
+{ 215} phoneno: packed_14_type;
+{ 229} auto_cost_switch: flag_type;
+{ 230} individual_distance: flag_type;
+{ 231} valid_from: date_type;
+{ 237} valid_to: date_type;
+{ 243} cycleid: cycleid_type;
+{ 247} cycle_start: short;
+{ 249} std_effect_rate: sreal_type;
+{ 251} dist_deduct: ARRAY [1..2] OF duration_type;
+{ 255} adjustcat: adjustcat_type;
+{ 259} mean_std_worktime: duration_type;
+{ 261} mean_std_worktime_week: duration_type;
+{ 263} continued_pay_len: continued_pay_len_type;
+{ 265} filler4: ARRAY [1..7] OF filler_type;
+{ 272} working_location: unsigned_byte;
+{ 273} costid: costid_type;
+{ 293} sfc_participant: flag_type;
+{ 294} multi_machine_user: char;
+{ 295} birthdate: date_type;
+{ 301} mach_job: mach_job_type;
+{ 317} badgeno: long_badgeno_type;
+{ 337} select_options: select_options_type;
+{ 353} empl_corr_values: empl_corr_values_type;
+{ 369} email_address: email_address_type;
+{ 401} postal_code: ARRAY [1..8] OF char;
+{ 409} home_town: ARRAY [1..32] OF char;
+{ 441} street: ARRAY [1..40] OF char;
+{ 481} phoneno1: phoneno_type;
+{ 505} handyno1: phoneno_type;
+{ 529} phoneno2: phoneno_type;
+{ 553} handyno2: phoneno_type;
+{ 577} photo_location: url_type;
+{ 831} filler6: ARRAY [1..1] OF filler_type;
+{ 832} user_template: logonid_type;
+{ 840} password: ARRAY [1..8] OF unsigned_byte;
+{ 848} alias: alias_type;
+{ 863} no_of_blank_lines: short;
+{ 865} position_number: short;
+{ 867} rpoolid: rpoolid_type;
+{ 879} hourly_wage: sreal_type;
+{ 881} last_change_pin: date_type;
+{ 887} last_change_pwd: date_type;
+{ 893} pin_locked: flag_type;
+{ 894} pwd_locked: flag_type;
+{ 895} filler5: ARRAY [1..106] OF filler_type
+{=1000} END;
+dsaltpat_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} emplno: emplno_type;
+{ 19} first_day: date_type;
+{ 25} altpat_tab: ARRAY [1..7] OF alt_wpatids_type;
+{ 249} warn_altpat_tab: ARRAY [1..7] OF alt_wpatids_flag_type;
+{ 305} filler: ARRAY [1..36] OF filler_type
+{= 340} END;
+dsacalen_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} tariffarea: tariffarea_type;
+{ 13} special_day: date_type;
+{ 19} special_day_text: long_text_type;
+{ 49} cal_function: char;
+{ 50} daytype: unsigned_byte;
+{ 51} date_offset: short;
+{ 53} time_difference: mod_type;
+{ 55} filler: ARRAY [1..26] OF filler_type
+{= 80} END;
+special_day_daytype_type = ARRAY [1..31] OF unsigned_byte;
+dscalen_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} calenid: calenid_type;
+{ 15} calen_text: long_text_type;
+{ 45} industry_day_1: short;
+{ 47} special_day_daytype: ARRAY [1..12] OF special_day_daytype_type;
+{ 419} time_difference: mod_type;
+{ 421} filler: ARRAY [1..30] OF char
+{= 450} END;
+dscant_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} emplno: emplno_type;
+{ 19} datetime: date_and_time_type;
+{ 31} modify_id: short;
+{ 33} termid: objectid_type;
+{ 41} amount: long;
+{ 45} termno: short;
+{ 47} articleno: objectid_type;
+{ 55} quantity: short;
+{ 57} filler: ARRAY [1..44] OF char
+{= 100} END;
+dscbal_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} cbalid: emplno_day_type;
+{ 25} prev_section_date: date_type;
+{ 31} next_section_date: date_type;
+{ 37} balance_tab: cbal_balance_tab_type;
+{ 229} filler: ARRAY [1..12] OF filler_type
+{= 240} END;
+dsccsid_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} ccsid_tab: ccsid_tab_type
+{= 42} END;
+dsccalen_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} tariffarea: tariffarea_type;
+{ 13} date: date_type;
+{ 19} sequenceno: short;
+{ 21} commt_text: long_text_type
+{= 50} END;
+dscemp_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} emplno: emplno_type;
+{ 19} working_location: unsigned_byte;
+{ 20} filler1: ARRAY [1..1] OF filler_type;
+{ 21} manager_emplno: emplno_type;
+{ 31} email_address: email_address_type;
+{ 63} filler2: ARRAY [1..26] OF filler_type;
+{ 89} rpoolid: rpoolid_type;
+{ 101} postal_code: ARRAY [1..8] OF char;
+{ 109} home_town: ARRAY [1..32] OF char;
+{ 141} street: ARRAY [1..40] OF char;
+{ 181} phoneno1: phoneno_type;
+{ 205} handyno1: phoneno_type;
+{ 229} phoneno2: phoneno_type;
+{ 253} handyno2: phoneno_type;
+{ 277} photo_location: url_type;
+{ 531} filler5: ARRAY [1..1] OF filler_type;
+{ 532} alias: alias_type;
+{ 547} no_of_blank_lines: short;
+{ 549} position_number: short;
+{ 551} hourly_wage: sreal_type;
+{ 553} filler3: ARRAY [1..54] OF filler_type;
+{ 607} text_1: ARRAY [1..60] OF char;
+{ 667} text_2: ARRAY [1..60] OF char;
+{ 727} last_date_auto_schedu: date_type;
+{ 733} last_closing: date_type;
+{ 739} qual_for_job: flag_type;
+{ 740} reserved01: char;
+{ 741} planned_until: date_type;
+{ 747} filler4: ARRAY [1..54] OF filler_type;
+{ 801} last_change_pin: date_type;
+{ 807} pin_locked: flag_type;
+{ 808} pwd_locked: flag_type;
+{ 809} last_change_pwd: date_type;
+{ 815} user_template: logonid_type;
+{ 823} filler: ARRAY [1..1178] OF filler_type
+{=2000} END;
+dscitem_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} articleno: objectid_type;
+{ 17} price: ARRAY [1..3] OF long;
+{ 29} article_text: long_text_type;
+{ 59} kind: char;
+{ 60} incomeid: income_type;
+{ 64} filler1: ARRAY [1..1] OF char;
+{ 65} invalid_from: date_type;
+{ 71} valid_from: date_type;
+{ 77} filler: ARRAY [1..4] OF char
+{= 80} END;
+dscode_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} wrk_code: wrk_code_type;
+{ 12} wrk_codetype_long: char;
+{ 13} wrk_codetext: long_text_type;
+{ 43} vacation_code: flag_type;
+{ 44} warning_if_absence: flag_type;
+{ 45} balanceid: short;
+{ 47} free_shift: flag_type;
+{ 48} worktime: char;
+{ 49} valid_for_overtime: flag_type;
+{ 50} overtime_allowance_possible: flag_type;
+{ 51} allowance_possible: flag_type;
+{ 52} real_worktime: flag_type;
+{ 53} valid_on_free_day: flag_type;
+{ 54} continue_code: char;
+{ 55} combination_code: char;
+{ 56} sv_day_flag: flag_type;
+{ 57} u_day_flag: flag_type;
+{ 58} debit_time_deduct_flag: flag_type;
+{ 59} note_break: flag_type;
+{ 60} flextime_allowed_flag: flag_type;
+{ 61} incomeid: income_type;
+{ 65} priority: short;
+{ 67} scodeid_day_off: codeid_type;
+{ 69} scodeid_holiday: codeid_type;
+{ 71} invalid_from: date_type;
+{ 77} valid_from: date_type;
+{ 83} scodeid_workday: codeid_type;
+{ 85} costid: costid_type;
+{ 105} color: color_attr_type;
+{ 113} wizard_mark: char;
+{ 114} standby_as_planned: flag_type;
+{ 115} useable: flag_type;
+{ 116} inside_normaltime: flag_type;
+{ 117} filler: ARRAY [1..24] OF filler_type
+{= 140} END;
+cols_key_type = RECORD
+{ 1} filetype: ARRAY [1..10] OF char;
+{ 11} logonid: logonid_type;
+{ 19} formatno: short;
+{ 21} col_no: short
+{= 22} END;
+dscols_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} cols_key: cols_key_type;
+{ 31} rec_pos: short;
+{ 33} rec_type: ARRAY [1..1] OF char;
+{ 34} title_one_line_flag: flag_type;
+{ 35} col_len: short;
+{ 37} title1: ARRAY [1..15] OF char;
+{ 52} title2: ARRAY [1..15] OF char;
+{ 67} col_dist: short;
+{ 69} conv_table_name: long_text_type;
+{ 99} justify: char;
+{ 100} fieldid: fieldid_type;
+{ 116} filler: ARRAY [1..21] OF char
+{= 136} END;
+commid_type = RECORD
+{ 1} emplno: emplno_type;
+{ 11} date: date_type;
+{ 17} commtype: commtype_type;
+{ 21} sequenceno: short
+{= 22} END;
+dscomm_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} commid: commid_type;
+{ 31} modify_code: short;
+{ 33} comment: ARRAY [1..60] OF char;
+{ 93} following_line: flag_type;
+{ 94} filler: ARRAY [1..7] OF unsigned_byte
+{= 100} END;
+dscommt_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} commtype: commtype_type;
+{ 13} commt_text: long_text_type;
+{ 43} filler: ARRAY [1..18] OF unsigned_byte
+{= 60} END;
+dscusers_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} jobid: cusers_name_type;
+{ 39} logonid: logonid_type;
+{ 47} os_username: cusers_name_type;
+{ 77} login_time: date_and_time_type;
+{ 89} clientname: cusers_name_type;
+{ 119} servername: cusers_name_type;
+{ 149} clientadr: cusers_name_type;
+{ 179} serveradr: cusers_name_type;
+{ 209} filler1: ARRAY [1..2] OF filler_type;
+{ 211} clientport: short;
+{ 213} serverport: short;
+{ 215} last_planner: char;
+{ 216} tcp_serverjob: cusers_name_type;
+{ 246} filler: ARRAY [1..35] OF unsigned_byte
+{= 280} END;
+dscycle_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} cycleid: cycleid_type;
+{ 13} cycle_text: long_text_type;
+{ 43} begin_date: date_type;
+{ 49} filler1: ARRAY [1..1] OF filler_type;
+{ 50} wizard_mark: char;
+{ 51} length: short;
+{ 53} shiftid: ARRAY [1..maxshifts_per_cycle] OF shiftid_type;
+{ 309} filler: ARRAY [1..42] OF filler_type
+{= 350} END;
+dsdbal_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} dbalid: emplno_day_type;
+{ 25} dbal: ARRAY [1..max_no_of_balances] OF dbalance_type;
+{ 73} auto_break: duration_type;
+{ 75} filler: ARRAY [1..6] OF filler_type
+{= 80} END;
+dsdept_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} deptno: deptno_type;
+{ 19} dept_text: long_text_type;
+{ 49} filler: ARRAY [1..12] OF char
+{= 60} END;
+dsdic_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} recid: recid_type;
+{ 17} fieldid: fieldid_type;
+{ 33} dic_text: long_text_type;
+{ 63} keyfield: short;
+{ 65} pos: short;
+{ 67} fieldtype: fieldtype_type;
+{ 69} len: short;
+{ 71} conv_table_name: long_text_type;
+{ 101} filler: ARRAY [1..40] OF filler_type
+{= 140} END;
+record_definition_type = ARRAY [1..max_fields_per_record] OF dsdic_rec;
+dist_deduct_tab_type = ARRAY [1..11] OF short;
+dsdist_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} dist_deduct_tabid: ARRAY [1..4] OF char;
+{ 13} dist_deduct_tab: ARRAY [1..10] OF dist_deduct_tab_type;
+{ 233} filler: ARRAY [1..168] OF char
+{= 400} END;
+dsdtime_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} dtimeid: dtimeid_type;
+{ 26} record_locked: char;
+{ 27} no_of_timepairs: short;
+{ 29} no_of_del_timepairs: short;
+{ 31} timepair_tab: ARRAY [1..maxtimepairs_per_record] OF timepair_type;
+{ 87} filler: ARRAY [1..14] OF char
+{= 100} END;
+all_timepairs_tab_type = ARRAY [1..maxtimepairs] OF timepair_type;
+dsdtimet_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} dtimet_key: day_emplno_type;
+{ 25} filler1: char;
+{ 26} record_locked: char;
+{ 27} no_of_timepairs: short;
+{ 29} no_of_del_timepairs: short;
+{ 31} timepair_tab: all_timepairs_tab_type;
+{ 255} del_timepair_tab: all_timepairs_tab_type;
+{ 479} filler: ARRAY [1..22] OF char
+{= 500} END;
+dsecalen_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} mach_job: mach_job_type;
+{ 25} date: date_type;
+{ 31} event: event_type;
+{ 33} del_flag: flag_type;
+{ 34} filler1: filler_type;
+{ 35} from_time: mod_type;
+{ 37} to_time: mod_type;
+{ 39} filler2: ARRAY [1..12] OF filler_type
+{= 50} END;
+dseload_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} parametername: ARRAY [1..8] OF char;
+{ 17} eload_text: long_text_type;
+{ 47} emplno_pos: short;
+{ 49} input_emplno_len: short;
+{ 51} manager_emplno_pos: short;
+{ 53} input_manager_emplno_len: short;
+{ 55} badgeno_pos: short;
+{ 57} input_badgeno_len: short;
+{ 59} costid_pos: short;
+{ 61} input_costid_len: short;
+{ 63} v_valid_from_yy_pos: short;
+{ 65} v_valid_from_mo_pos: short;
+{ 67} v_valid_from_dd_pos: short;
+{ 69} valid_from_yy_pos: short;
+{ 71} valid_from_mo_pos: short;
+{ 73} valid_from_dd_pos: short;
+{ 75} valid_to_yy_pos: short;
+{ 77} valid_to_mo_pos: short;
+{ 79} valid_to_dd_pos: short;
+{ 81} start_date_pos: ARRAY [1..3] OF short;
+{ 87} birthdate_pos: ARRAY [1..3] OF short;
+{ 93} select_options_pos: ARRAY [1..max_select_options] OF short;
+{ 125} empl_corr_values_pos: ARRAY [1..max_empl_corr_values] OF short;
+{ 133} input_empl_corr_values_len: short;
+{ 135} vacation_pos: ARRAY [1..maxvacations] OF short;
+{ 143} input_vacation_len: short;
+{ 145} allowances_pos: ARRAY [1..10] OF short;
+{ 165} input_allowances_len: short;
+{ 167} name_pos: short;
+{ 169} input_name_len: short;
+{ 171} surname_pos: short;
+{ 173} input_surname_len: short;
+{ 175} firstname_pos: short;
+{ 177} input_firstname_len: short;
+{ 179} deptno_pos: short;
+{ 181} input_deptno_len: short;
+{ 183} hometerm_pos: short;
+{ 185} input_hometerm_len: short;
+{ 187} tariffarea_pos: short;
+{ 189} input_tariffarea_len: short;
+{ 191} termcats_pos: short;
+{ 193} input_termcats_len: short;
+{ 195} pincode_pos: short;
+{ 197} input_pincode_len: short;
+{ 199} employcat_pos: short;
+{ 201} input_employcat_len: short;
+{ 203} phoneno_pos: short;
+{ 205} input_phoneno_len: short;
+{ 207} factory_pos: short;
+{ 209} input_factory_len: short;
+{ 211} accesscat_pos: short;
+{ 213} input_accesscat_len: short;
+{ 215} cycleid_pos: short;
+{ 217} input_cycleid_len: short;
+{ 219} cycle_start_pos: short;
+{ 221} ref_p_len_pos: short;
+{ 223} ref_p_work_time_pos: short;
+{ 225} adjustcat_pos: short;
+{ 227} input_adjustcat_len: short;
+{ 229} mean_std_w_pos: short;
+{ 231} input_mean_std_w_len: short;
+{ 233} mean_std_w_w_pos: short;
+{ 235} inp_mean_std_w_w_len: short;
+{ 237} cont_pay_len_pos: short;
+{ 239} inp_cont_pay_len_len: short;
+{ 241} machineid_pos: short;
+{ 243} input_machineid_len: short;
+{ 245} jobid_pos: short;
+{ 247} input_jobid_len: short;
+{ 249} working_location_pos: short;
+{ 251} input_working_location_len: short;
+{ 253} email_address_pos: short;
+{ 255} input_email_address_len: short;
+{ 257} position_number_pos: short;
+{ 259} input_position_number_len: short;
+{ 261} no_of_blank_lines_pos: short;
+{ 263} input_no_of_blank_lines_len: short;
+{ 265} alias_pos: short;
+{ 267} input_alias_len: short;
+{ 269} text_1_pos: short;
+{ 271} input_text_1_len: short;
+{ 273} text_2_pos: short;
+{ 275} input_text_2_len: short;
+{ 277} street_pos: short;
+{ 279} input_street_len: short;
+{ 281} postal_code_pos: short;
+{ 283} input_postal_code_len: short;
+{ 285} home_town_pos: short;
+{ 287} input_home_town_len: short;
+{ 289} telephoneno_pos: short;
+{ 291} input_telephoneno_len: short;
+{ 293} auto_cost_switch_pos: short;
+{ 295} dist_from_terminal_pos: short;
+{ 297} sfc_participant_pos: short;
+{ 299} multi_machine_user_pos: short;
+{ 301} vacation_method_pos: short;
+{ 303} input_vacation_method_len: short;
+{ 305} phoneno1_pos: short;
+{ 307} input_phoneno1_len: short;
+{ 309} phoneno2_pos: short;
+{ 311} input_phoneno2_len: short;
+{ 313} handyno1_pos: short;
+{ 315} input_handyno1_len: short;
+{ 317} handyno2_pos: short;
+{ 319} input_handyno2_len: short;
+{ 321} photo_location_pos: short;
+{ 323} input_photo_location_len: short;
+{ 325} user_template_pos: short;
+{ 327} input_user_template_len: short;
+{ 329} password_pos: short;
+{ 331} input_password_len: short;
+{ 333} rpoolid_pos: short;
+{ 335} input_rpoolid_len: short;
+{ 337} hourly_wage_pos: short;
+{ 339} module: ARRAY [1..32] OF tseload_table_elem_type;
+{ 467} v_valid_to_yy_pos: short;
+{ 469} v_valid_to_mo_pos: short;
+{ 471} v_valid_to_dd_pos: short;
+{ 473} filler: ARRAY [1..54] OF filler_type
+{= 526} END;
+dsevent_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} event: event_type;
+{ 11} event_text: long_text_type;
+{ 41} invalid_from: date_type;
+{ 47} valid_from: date_type;
+{ 53} event_percent: long;
+{ 57} event_absolute: long;
+{ 61} event_delay: short;
+{ 63} no_of_days: short;
+{ 65} allocation: char;
+{ 66} filler1: ARRAY [1..3] OF filler_type;
+{ 69} manual_allocation: ARRAY [1..7] OF long;
+{ 97} color: color_attr_type;
+{ 105} filler2: ARRAY [1..6] OF filler_type
+{= 110} END;
+dsfbadge_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} badgeno: long_badgeno_type;
+{ 29} hostno: short;
+{ 31} host_clientno: buffer_type;
+{ 33} host_termid: objectid_type;
+{ 41} host_termno: short;
+{ 43} host_termcat: termcat_type;
+{ 51} filler: ARRAY [1..30] OF filler_type
+{= 80} END;
+dsff10_rec = RECORD
+{ 1} key10: ARRAY [1..10] OF unsigned_byte;
+{ 11} data90: ARRAY [1..90] OF unsigned_byte
+{= 100} END;
+dsff16_rec = RECORD
+{ 1} key16: ARRAY [1..16] OF unsigned_byte;
+{ 17} data64: ARRAY [1..64] OF unsigned_byte
+{= 80} END;
+export_interface_type = ARRAY [1..2] OF char;
+export_line_type = ARRAY [1..2] OF char;
+export_status_type = ARRAY [1..2] OF char;
+export_data_type = ARRAY [1..export_data_len] OF char;
+export_key_type = RECORD
+{ 1} export_interface: export_interface_type;
+{ 3} line_type: export_line_type;
+{ 5} date_time_written: date_and_time_type;
+{ 17} millisec: short
+{= 18} END;
+dsexport_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} export_key: export_key_type;
+{ 27} export_status: export_status_type;
+{ 29} export_data: export_data_type;
+{ 278} filler: ARRAY [1..123] OF char
+{= 400} END;
+dsfsick_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} emplno: emplno_type;
+{ 19} date_to: date_type;
+{ 25} date_from: date_type;
+{ 31} codeid: codeid_type;
+{ 33} ref_date: date_type;
+{ 39} filler: ARRAY [1..22] OF char
+{= 60} END;
+dsjobflg_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} jobflag: ARRAY [1..3] OF char;
+{ 12} jobflg_txt: ARRAY [1..50] OF char;
+{ 62} filler: ARRAY [1..9] OF filler_type
+{= 70} END;
+dslang_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} tableno: record_no_type;
+{ 11} languageid: languageid_type;
+{ 13} foreign_key: ARRAY [1..dslang_key_len] OF char;
+{ 77} long_key1: long;
+{ 81} long_key2: long;
+{ 85} unsigned_key1: ARRAY [1..8] OF unsigned_byte;
+{ 93} date: date_type;
+{ 99} foreign_text: long_text_type;
+{ 129} filler: ARRAY [1..12] OF filler_type
+{= 140} END;
+lodist_deduct_tab_type = ARRAY [1..10] OF short;
+dslodist_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} lodist_deduct_tabid: ARRAY [1..4] OF char;
+{ 13} lodist_deduct_tab: ARRAY [1..50] OF lodist_deduct_tab_type;
+{ 1013} filler: ARRAY [1..188] OF filler_type
+{=1200} END;
+dslogatt_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} userid: packed_20_type;
+{ 29} login_time: date_and_time_type;
+{ 41} jobid: cusers_name_type;
+{ 71} os_username: cusers_name_type;
+{ 101} clientname: cusers_name_type;
+{ 131} access_granted: flag_type
+{= 131} END;
+dsltime_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} ltimeid: date_and_time_type;
+{ 21} termid: objectid_type;
+{ 29} termno: short;
+{ 31} req_code: char;
+{ 32} cost_req_code: char;
+{ 33} costid: costid_type;
+{ 53} badgeno: long_badgeno_type;
+{ 73} codeid: codeid_type;
+{ 75} book_date_time: date_and_time_type;
+{ 87} ignore_time: short;
+{ 89} reason: short;
+{ 91} codeidtype: char;
+{ 92} filler1: filler_type;
+{ 93} amount: long;
+{ 97} quantity: short;
+{ 99} citemno: objectid_type;
+{ 107} millisec: short;
+{ 109} emplno: emplno_type;
+{ 119} filler: ARRAY [1..2] OF filler_type
+{= 120} END;
+booklog_rec = dsltime_rec;
+dsmasks_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} menuename: objectid_type;
+{ 17} menue_title: menue_title_type;
+{ 63} languageid: languageid_type;
+{ 65} prog_tab: ARRAY [1..max_menue_lines] OF RECORD
+{+ 0} menue_line: menue_line_type;
+{+ 50} progname: objectid_type;
+{+ 58} info_field: menue_info_type
+{= 816} END;
+{ 881} filler: ARRAY [1..70] OF filler_type
+{= 950} END;
+short_adjust_rule_type = RECORD
+{ 1} method: short;
+{ 3} transbalanceid_1: short;
+{ 5} transbalanceid_2: short;
+{ 7} filler: ARRAY [1..2] OF filler_type;
+{ 9} corr_value_1: saldo_type;
+{ 13} corr_value_2: saldo_type
+{= 16} END;
+dsmcconf_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} operationid: operationid_type;
+{ 17} operation_text: long_text_type;
+{ 47} balanceid: short;
+{ 49} add_value: saldo_type;
+{ 53} rule_tab: ARRAY [1..mcconf_rule_tab_len] OF short_adjust_rule_type;
+{ 133} value_suggestion: saldo_type;
+{ 137} show_cond_min: saldo_type;
+{ 141} show_cond_max: saldo_type;
+{ 145} check_cond_min: saldo_type;
+{ 149} check_cond_max: saldo_type;
+{ 153} filler: ARRAY [1..48] OF char
+{= 200} END;
+dsperror_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} logonid: logonid_type;
+{ 17} start_datetime: date_and_time_type;
+{ 29} rowno: short;
+{ 31} date_time_written: date_and_time_type;
+{ 43} error_code: code_type;
+{ 47} vos_error: short;
+{ 49} error_text: error_text_type;
+{ 109} severity_code: char;
+{ 110} emplno: emplno_type;
+{ 120} exit_code: exit_code_type;
+{ 126} filler: ARRAY [1..25] OF unsigned_byte
+{= 150} END;
+dsplan_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} plan_key: plan_key_type;
+{ 25} date_from: date_type;
+{ 31} allowances: allowances_type;
+{ 41} wpatid: wpatid_type;
+{ 45} ruleid: ruleid_type;
+{ 47} codeid: codeid_type;
+{ 49} employcat: employcat_type;
+{ 53} tariffarea: tariffarea_type;
+{ 57} costid: costid_type;
+{ 77} cycleid: cycleid_type;
+{ 81} cycle_start: short;
+{ 83} special_service: codeid_type;
+{ 85} from_time: mod_type;
+{ 87} to_time: mod_type;
+{ 89} ondutylen_from_cur_wpat: char;
+{ 90} filler: ARRAY [1..31] OF unsigned_byte
+{= 120} END;
+apply_key_type = RECORD
+{ 1} emplno: emplno_type;
+{ 11} date_to: date_type;
+{ 17} apptype: short;
+{ 19} time: mod_type
+{= 20} END;
+dsapply_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} apply_key: apply_key_type;
+{ 29} date_from: date_type;
+{ 35} allowance: allowance_type;
+{ 37} allowance_remainder: allowance_type;
+{ 39} date_applied: date_type;
+{ 45} date_granted: date_type;
+{ 51} state: char;
+{ 52} granted_by_head: flag_type;
+{ 53} granted_by_pd: flag_type;
+{ 54} filler: ARRAY [1..15] OF filler_type
+{= 68} END;
+dsprstat_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} username: username_type;
+{ 41} logonid: logonid_type;
+{ 49} jobname: packed_10_type;
+{ 59} filler1: ARRAY [1..2] OF char;
+{ 61} processno: ulong;
+{ 65} start_datetime: date_and_time_type;
+{ 77} end_datetime: date_and_time_type;
+{ 89} print_file: phys_filename_type;
+{ 121} printerid: objectid_type;
+{ 129} jobstatus: char;
+{ 130} filler: ARRAY [1..31] OF unsigned_byte
+{= 160} END;
+dsquery_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} queryid: queryid_type;
+{ 17} sequenceno: short;
+{ 19} query_text: long_text_type;
+{ 49} root_recid: recid_type;
+{ 57} query_definition: ARRAY [1..query_def_len] OF char;
+{ 257} filler: ARRAY [1..44] OF filler_type
+{= 300} END;
+dsqueryt_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} queryid: queryid_type;
+{ 17} query_text: long_text_type;
+{ 47} root_recid: recid_type;
+{ 55} query_definition: ARRAY [1..queryt_def_len] OF char
+{=3054} END;
+dsrcalen_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} rcalenid: rcalenid_type;
+{ 13} rcalen_text: long_text_type;
+{ 43} tariffarea: tariffarea_type;
+{ 47} date: date_type;
+{ 53} date_last_year: date_type;
+{ 59} modified: char;
+{ 60} first_day: flag_type;
+{ 61} filler: ARRAY [1..20] OF filler_type
+{= 80} END;
+dsrcalls_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} mach_job: mach_job_type;
+{ 25} date: date_type;
+{ 31} time_from: mod_type;
+{ 33} no_calls: long;
+{ 37} time_to: mod_type;
+{ 39} average_time: short;
+{ 41} no_lost_calls: long;
+{ 45} filler: ARRAY [1..18] OF filler_type
+{= 62} END;
+dsrooms_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} roomnumber: ARRAY [1..4] OF char;
+{ 13} mpoint: char;
+{ 14} room_text: ARRAY [1..100] OF char;
+{ 114} filler: ARRAY [1..7] OF filler_type
+{= 120} END;
+dsrule_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} rule_key: rule_key_type;
+{ 17} valid_from: date_type;
+{ 23} rule_text: long_text_type;
+{ 53} offduty_code: codeid_type;
+{ 55} auto_time_come: char;
+{ 56} break_code: codeid_type;
+{ 58} auto_time_go: char;
+{ 59} calculation_rule: short;
+{ 61} code_come_auto_time: char;
+{ 62} code_come_warn_flag: flag_type;
+{ 63} code_go_auto_time: char;
+{ 64} code_go_warn_flag: flag_type;
+{ 65} balance_less_employment: char;
+{ 66} allowance_1_absolute: flag_type;
+{ 67} interval_go: short;
+{ 69} balance_priority: ARRAY [1..3] OF char;
+{ 72} round_point_of_time: char;
+{ 73} balance_rounding_tab: ARRAY [1..3] OF balance_rounding_type;
+{ 97} interval_come: short;
+{ 99} round_up_come: short;
+{ 101} round_up_go: short;
+{ 103} late_arrival: short;
+{ 105} early_leave: short;
+{ 107} late_arrive_code: codeid_type;
+{ 109} early_leave_code: codeid_type;
+{ 111} abs_warn_flag: flag_type;
+{ 112} closed_model_flag: flag_type;
+{ 113} time_of_rest: duration_type;
+{ 115} oncall_overtime_min: duration_type;
+{ 117} ondutylen_from_cur_wpat: flag_type;
+{ 118} wizard_mark: char;
+{ 119} useable: flag_type;
+{ 120} filler: ARRAY [1..21] OF filler_type
+{= 140} END;
+dsselopt_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} selopt_key: selopt_key_type;
+{ 11} selopt_text: long_text_type;
+{ 41} filler: ARRAY [1..20] OF char
+{= 60} END;
+dsshift_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} shiftid: shiftid_type;
+{ 13} shift_text: long_text_type;
+{ 43} ruleid: ruleid_type;
+{ 45} shift_unit: char;
+{ 46} alt_wpatid_for_type: flag_type;
+{ 47} count: short;
+{ 49} wpatid_dayno: ARRAY [1..maxdaytypes] OF wpatid_type;
+{ 89} wpatid_daytype: ARRAY [1..maxdaytypes] OF wpatid_type;
+{ 129} alt_wpatid: ARRAY [1..maxdaytypes] OF alt_wpatids_type;
+{ 449} warn_alt_wpatid: ARRAY [1..maxdaytypes] OF alt_wpatids_flag_type;
+{ 529} codeid: ARRAY [1..maxdaytypes] OF codeid_type;
+{ 549} wizard_mark: char;
+{ 550} filler: ARRAY [1..91] OF filler_type
+{= 640} END;
+ttraf_key_type = RECORD
+{ 1} termno: short;
+{ 3} dd: short
+{= 4} END;
+dsttraf_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} ttraf_key: ttraf_key_type;
+{ 13} number_in: long;
+{ 17} error_in: long;
+{ 21} number_out: long;
+{ 25} error_out: long;
+{ 29} filler: ARRAY [1..12] OF char
+{= 40} END;
+dsuser_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} logonid: logonid_type;
+{ 17} emplno: emplno_type;
+{ 27} password: objectid_type;
+{ 35} menuename: objectid_type;
+{ 43} acterm_cat: accat_type;
+{ 51} acmask_cat: accat_type;
+{ 59} acdept_cat: accat_type;
+{ 67} accat_cat: accat_type;
+{ 75} acinc_cat: accat_type;
+{ 83} accode_cat: accat_type;
+{ 91} username: username_type;
+{ 123} password_check_flag: flag_type;
+{ 124} change_old_data_flag: flag_type;
+{ 125} acprog_cat: accat_type;
+{ 133} own_data_perm: char;
+{ 134} video_attributes: video_attributes_type;
+{ 150} aczone_cat: accat_type;
+{ 158} accost_cat: accat_type;
+{ 166} time_manager: flag_type;
+{ 167} accop_cat: accat_type;
+{ 175} accomm_cat: accat_type;
+{ 183} printerid: objectid_type;
+{ 191} password_locked: flag_type;
+{ 192} password_overall: flag_type;
+{ 193} password_timestamp: long;
+{ 197} password_validity: short;
+{ 199} acsel_cat: accat_type;
+{ 207} accost_enter_cat: accat_type;
+{ 215} project_planer: flag_type;
+{ 216} master_proj_perm: char;
+{ 217} emplno_pattern: flag_type;
+{ 218} filler1: ARRAY [1..3] OF filler_type;
+{ 221} special_colors: special_colors_type;
+{ 349} mask_colors: ARRAY [1..20] OF one_masks_colors_type;
+{ 1949} filler: ARRAY [1..12] OF filler_type
+{=1960} END;
+dsusers_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} logonid: logonid_type;
+{ 17} prog_init: ARRAY [1..300] OF unsigned_byte;
+{ 317} emplno: emplno_type;
+{ 327} filler1: ARRAY [1..2] OF filler_type;
+{ 329} dmonth_date: date_type;
+{ 335} dmonth_balanceid: ARRAY [1..4] OF short;
+{ 343} dmonth_printerid: objectid_type;
+{ 351} dmonth_display_daily_incomes: flag_type;
+{ 352} filler2: ARRAY [1..1] OF filler_type;
+{ 353} dpres_date: date_type;
+{ 359} dpres_time: mod_type;
+{ 361} dpres_deptno: costid_type;
+{ 381} dpres_wpatid: ARRAY [1..3] OF wpatid_type;
+{ 393} dpres_select_options: select_options_type;
+{ 409} dpres_printerid: objectid_type;
+{ 417} dpres_selection: char;
+{ 418} dpres_org_type: char;
+{ 419} dpres_codeid: ARRAY [1..5] OF codeid_type;
+{ 429} dabsemp_date: date_type;
+{ 435} dabsemp_no_of_months: short;
+{ 437} dabsemp_fix_code: ARRAY [1..4] OF codeid_type;
+{ 445} dabsemp_printerid: objectid_type;
+{ 453} dabsgrp_date: date_type;
+{ 459} dabsgrp_deptno: deptno_type;
+{ 469} dabsgrp_costid: costid_type;
+{ 489} dabsgrp_select_options: select_options_type;
+{ 505} dabsgrp_printerid: objectid_type;
+{ 513} dabsgrp_mark_warning_flags: flag_type;
+{ 514} dabsgrp_mark_presence_flags: flag_type;
+{ 515} dabsgrp_offduty_char: char;
+{ 516} dabsgrp_codeid: ARRAY [1..5] OF codeid_type;
+{ 526} filler3: ARRAY [1..3] OF filler_type;
+{ 529} dcbal_deptno: deptno_type;
+{ 539} dcbal_balanceid: ARRAY [1..4] OF short;
+{ 547} dcbal_costid: costid_type;
+{ 567} dcbal_select_options: select_options_type;
+{ 583} dcbal_bal_type: char;
+{ 584} dcbal_sort: char;
+{ 585} dcbal_balance_min: long;
+{ 589} dcbal_balance_max: long;
+{ 593} dcbal_target_date: date_type;
+{ 599} dcbal_created_until_date: date_type;
+{ 605} dcbal_printerid: objectid_type;
+{ 613} dcbal_employcat: employcat_type;
+{ 617} dcbal_cols_extension: char;
+{ 618} dcbal_adj_balance_flags: ARRAY [1..4] OF flag_type;
+{ 622} filler4: ARRAY [1..3] OF filler_type;
+{ 625} derrors_date_time: date_and_time_type;
+{ 637} derrors_severity_codes: ARRAY [1..8] OF char;
+{ 645} derrors_jobnames: ARRAY [1..60] OF char;
+{ 705} derrors_username: userid_type;
+{ 721} derrors_no_of_days: short;
+{ 723} derrors_printerid: objectid_type;
+{ 731} filler5: ARRAY [1..2] OF filler_type;
+{ 733} tstat_date: date_type;
+{ 739} tstat_terminalid: objectid_type;
+{ 747} filler6: ARRAY [1..2] OF filler_type;
+{ 749} dwarn_date_time: date_and_time_type;
+{ 761} dwarn_no_of_days: short;
+{ 763} dwarn_warningtype: char;
+{ 764} dwarn_status: char;
+{ 765} dwarn_emplno: emplno_type;
+{ 775} dwarn_deptno: deptno_type;
+{ 785} dwarn_employcat: employcat_type;
+{ 789} dwarn_badgeno: long_badgeno_type;
+{ 809} dwarn_costid: costid_type;
+{ 829} dwarn_select_options: select_options_type;
+{ 845} dwarn_printerid: objectid_type;
+{ 853} demp_printerid: objectid_type;
+{ 861} dcost_date_from: date_type;
+{ 867} dcost_date_to: date_type;
+{ 873} dcost_sum_1: char;
+{ 874} dcost_sum_2: char;
+{ 875} dcost_deptno: deptno_type;
+{ 885} dcost_employcat: employcat_type;
+{ 889} dcost_select_options: select_options_type;
+{ 905} dcost_costid: costid_type;
+{ 925} dcost_income: income_type;
+{ 929} dcost_printerid: objectid_type;
+{ 937} dcost_regular_costid: costid_type;
+{ 957} schedu_deptno: deptno_type;
+{ 967} schedu_start_date: date_type;
+{ 973} schedu_no_of_weeks: short;
+{ 975} schedu_printerid: objectid_type;
+{ 983} schedu_quote: short;
+{ 985} schedu_unit: char;
+{ 986} filler7: ARRAY [1..3] OF filler_type;
+{ 989} daccz_zoneid: short;
+{ 991} daccz_from_date_and_time: date_and_time_type;
+{ 1003} daccz_to_date_and_time: date_and_time_type;
+{ 1015} daccz_deptno: deptno_type;
+{ 1025} daccz_printerid: objectid_type;
+{ 1033} dacce_zoneid: short;
+{ 1035} dacce_from_date_and_time: date_and_time_type;
+{ 1047} dacce_to_date_and_time: date_and_time_type;
+{ 1059} dacce_printerid: objectid_type;
+{ 1067} filler8: ARRAY [1..2] OF filler_type;
+{ 1069} dzone_zoneid: short;
+{ 1071} dzone_start_dat: date_and_time_type;
+{ 1083} dzone_deptno: deptno_type;
+{ 1093} dzone_pres_time: duration_type;
+{ 1095} dzone_duration: duration_type;
+{ 1097} dzone_printerid: objectid_type;
+{ 1105} dvisit_update_table: flag_type;
+{ 1106} filler9: ARRAY [1..3] OF filler_type;
+{ 1109} pstep_orderno: orderno_type;
+{ 1125} pstep_prod_stepno: ARRAY [1..5] OF char;
+{ 1130} pstep_prod_stepno_var: ARRAY [1..5] OF char;
+{ 1135} pstep_formno: ARRAY [1..10] OF char;
+{ 1145} pstep_machid: objectid_type;
+{ 1153} pstep_coll_orderid: orderno_type;
+{ 1169} dmsg_orderno: orderno_type;
+{ 1185} dmsg_date_time: date_and_time_type;
+{ 1197} dmsg_prod_stepno: prod_stepno_type;
+{ 1201} dmsg_prod_stepno_var: prod_stepno_type;
+{ 1205} dmsg_emplno: emplno_type;
+{ 1215} dmsg_machid: objectid_type;
+{ 1223} filler10: ARRAY [1..2] OF filler_type;
+{ 1225} dstatus_orderno: orderno_type;
+{ 1241} dstatus_prod_stepno: prod_stepno_type;
+{ 1245} dstatus_prod_stepno_var: prod_stepno_type;
+{ 1249} dstatus_prod_operationid: prod_operationid_type;
+{ 1253} dstatus_emplno: emplno_type;
+{ 1263} dstatus_date_time: date_and_time_type;
+{ 1275} dstatus_machid: objectid_type;
+{ 1283} dstatus_fault_reasonid: fault_reasonid_type;
+{ 1287} dstatus_status: char;
+{ 1288} filler11: ARRAY [1..1] OF filler_type;
+{ 1289} dswarn_prod_stepno: prod_stepno_type;
+{ 1293} dswarn_prod_stepno_var: prod_stepno_type;
+{ 1297} dswarn_date_time: date_and_time_type;
+{ 1309} dswarn_no_of_days: short;
+{ 1311} dswarn_state: char;
+{ 1312} dswarn_warning_type: char;
+{ 1313} dswarn_emplno: emplno_type;
+{ 1323} dswarn_orderno: orderno_type;
+{ 1339} dswarn_machid: objectid_type;
+{ 1347} dswarn_printerid: objectid_type;
+{ 1355} filler12: ARRAY [1..2] OF filler_type;
+{ 1357} dpsopn_begin_date_time: date_and_time_type;
+{ 1369} dpsopn_end_date_time: date_and_time_type;
+{ 1381} dpsopn_machid: objectid_type;
+{ 1389} dpsopn_prod_operationid: prod_operationid_type;
+{ 1393} dpsopn_only_ready: flag_type;
+{ 1394} dpsopn_printerid: objectid_type;
+{ 1402} filler13: ARRAY [1..3] OF filler_type;
+{ 1405} lpstep_orderno: orderno_type;
+{ 1421} lpstep_machid: objectid_type;
+{ 1429} lpstep_prod_operationid: prod_operationid_type;
+{ 1433} lpstep_begin_date_time: date_and_time_type;
+{ 1445} lpstep_end_date_time: date_and_time_type;
+{ 1457} lpstep_pstep_status: char;
+{ 1458} lpstep_printerid: objectid_type;
+{ 1466} filler14: ARRAY [1..3] OF filler_type;
+{ 1469} dorder_orderno: orderno_type;
+{ 1485} dorder_text: long_text_type;
+{ 1515} dorder_articleno: ARRAY [1..16] OF char;
+{ 1531} dorder_order_state: char;
+{ 1532} dorder_state: char;
+{ 1533} dorder_planned_begin: date_and_time_type;
+{ 1545} dorder_planned_end: date_and_time_type;
+{ 1557} dorder_current_data: char;
+{ 1558} filler15: ARRAY [1..3] OF filler_type;
+{ 1561} dfrsn_from_date: date_type;
+{ 1567} dfrsn_to_date: date_type;
+{ 1573} dfrsn_machid: objectid_type;
+{ 1581} dfrsn_fault_reasonid: fault_reasonid_type;
+{ 1585} dfrsn_emplno: emplno_type;
+{ 1595} dfrsn_sum1: char;
+{ 1596} dfrsn_sum2: char;
+{ 1597} dfrsn_printerid: objectid_type;
+{ 1605} reass_date: date_type;
+{ 1611} reass_printerid: objectid_type;
+{ 1619} filler16: ARRAY [1..2] OF filler_type;
+{ 1621} corder_orderno: orderno_type;
+{ 1637} corder_machid: objectid_type;
+{ 1645} corder_prod_operationid: prod_operationid_type;
+{ 1649} corder_pstep_state: char;
+{ 1650} corder_additional_psteps: char;
+{ 1651} filler17: ARRAY [1..2] OF filler_type;
+{ 1653} ccomp_orderno: orderno_type;
+{ 1669} ccomp_machid: objectid_type;
+{ 1677} ccomp_prod_operationid: prod_operationid_type;
+{ 1681} pwbal_date: date_type;
+{ 1687} pwbal_emplno: emplno_type;
+{ 1697} upstep_orderno: orderno_type;
+{ 1713} upstep_machid: objectid_type;
+{ 1721} upstep_pw_type: piece_work_type_type;
+{ 1725} upstep_state: char;
+{ 1726} upstep_prod_operationid: prod_operationid_type;
+{ 1730} filler18: ARRAY [1..3] OF filler_type;
+{ 1733} ltime_begin_date_time: date_and_time_type;
+{ 1745} ltime_end_date_time: date_and_time_type;
+{ 1757} ltime_badgeno: long_badgeno_type;
+{ 1777} ltime_function_code: unsigned_byte;
+{ 1778} filler19: ARRAY [1..3] OF filler_type;
+{ 1781} anlbal_balanceid: short;
+{ 1783} anlbal_target_date: date_type;
+{ 1789} anlbal_created_until_date: date_type;
+{ 1795} filler20: ARRAY [1..2] OF filler_type;
+{ 1797} cplanm_deptno: deptno_type;
+{ 1807} cplanm_costid: costid_type;
+{ 1827} cplanm_select_options: select_options_type;
+{ 1843} cplanm_state: char;
+{ 1844} cplanm_sort_char: char;
+{ 1845} comm_commtype: commtype_type;
+{ 1849} comm_printerid: objectid_type;
+{ 1857} comm_cover: flag_type;
+{ 1858} filler21: ARRAY [1..3] OF filler_type;
+{ 1861} monov_date: date_type;
+{ 1867} monov_balanceid: ARRAY [1..3] OF short;
+{ 1873} filler22: ARRAY [1..4] OF filler_type;
+{ 1877} dscost_emplno: emplno_type;
+{ 1887} dscost_date_from: date_type;
+{ 1893} dscost_date_to: date_type;
+{ 1899} dscost_deptno: deptno_type;
+{ 1909} dscost_select_options: select_options_type;
+{ 1925} dscost_costid: costid_type;
+{ 1945} dscost_machid: objectid_type;
+{ 1953} dscost_orderno: orderno_type;
+{ 1969} dscost_prod_stepno: ARRAY [1..5] OF char;
+{ 1974} dscost_prod_stepno_var: ARRAY [1..5] OF char;
+{ 1979} dscost_articleno: ARRAY [1..16] OF char;
+{ 1995} dscost_summation1: char;
+{ 1996} dscost_summation2: char;
+{ 1997} dscost_summation3: char;
+{ 1998} dscost_printerid: objectid_type;
+{ 2006} filler23: ARRAY [1..3] OF filler_type;
+{ 2009} pscap_machid: objectid_type;
+{ 2017} pscap_costid: costid_type;
+{ 2037} pscap_date_from: date_type;
+{ 2043} pscap_date_to: date_type;
+{ 2049} pscap_cw: ARRAY [1..2] OF char;
+{ 2051} filler24: ARRAY [1..2] OF filler_type;
+{ 2053} psprod_machid: objectid_type;
+{ 2061} psprod_costid: costid_type;
+{ 2081} psprod_date_from: date_type;
+{ 2087} psprod_date_to: date_type;
+{ 2093} psprod_cw: ARRAY [1..2] OF char;
+{ 2095} pspord_orderno: orderno_type;
+{ 2111} psprod_printerid: objectid_type;
+{ 2119} filler25: ARRAY [1..2] OF filler_type;
+{ 2121} accemp_emplno: emplno_type;
+{ 2131} accemp_zoneid: short;
+{ 2133} accemp_printerid: objectid_type;
+{ 2141} schedu_schedsid: objectid_type;
+{ 2149} schedu_select_options: select_options_type;
+{ 2165} schedu_use_prtempday: flag_type;
+{ 2166} schedu_filter_sort_char1: char;
+{ 2167} schedu_filter_sort_char2: char;
+{ 2168} schedu_filter_sort_char3: char;
+{ 2169} schedu_filter_sort_char4: char;
+{ 2170} schedu_ascid: objectid_type;
+{ 2178} filler26: ARRAY [1..3] OF filler_type;
+{ 2181} plan_printerid: objectid_type;
+{ 2189} stpgm_printerid: objectid_type;
+{ 2197} ppord_printerid: objectid_type;
+{ 2205} pscap_printerid: objectid_type;
+{ 2213} pstruc_projectid: projectid_type;
+{ 2225} pstruc_versionid: versionid_type;
+{ 2229} pstruc_parproid: parproid_type;
+{ 2241} pnet_projectid: projectid_type;
+{ 2253} pnet_versionid: versionid_type;
+{ 2257} pnet_taskid: taskid_type;
+{ 2269} pnet_attributes: attributes_type;
+{ 2365} pnet_rpool_assigned: rpoolid_type;
+{ 2377} pnet_emplno_assigned: emplno_type;
+{ 2387} pnet_processing_rate_min: sreal_type;
+{ 2389} pnet_processing_rate_max: sreal_type;
+{ 2391} filler27: ARRAY [1..2] OF filler_type;
+{ 2393} pbar_projectid: projectid_type;
+{ 2405} pbar_versionid: versionid_type;
+{ 2409} pbar_taskid: taskid_type;
+{ 2421} pbar_attributes: attributes_type;
+{ 2517} pbar_rpool_assigned: rpoolid_type;
+{ 2529} pbar_emplno_assigned: emplno_type;
+{ 2539} pbar_processing_rate_min: sreal_type;
+{ 2541} pbar_processing_rate_max: sreal_type;
+{ 2543} filler28: ARRAY [1..6] OF filler_type;
+{ 2549} res_start_date: date_type;
+{ 2555} res_unitlen: short;
+{ 2557} res_unittype: char;
+{ 2558} res_rpoolid: rpoolid_type;
+{ 2570} res_emplno: emplno_type;
+{ 2580} res_projectid: projectid_type;
+{ 2592} res_versionid: versionid_type;
+{ 2596} filler29: ARRAY [1..7] OF filler_type;
+{ 2603} dpwarn_start_date: date_type;
+{ 2609} dpwarn_start_time: time_type;
+{ 2615} dpwarn_projectid: projectid_type;
+{ 2627} dpwarn_versionid: versionid_type;
+{ 2631} dpwarn_parproid: parproid_type;
+{ 2643} dpwarn_taskid: taskid_type;
+{ 2655} dpwarn_rpoolid: rpoolid_type;
+{ 2667} dpwarn_emplno: emplno_type;
+{ 2677} dpwarn_state: char;
+{ 2678} dpwarn_pmwarn_char: char;
+{ 2679} filler30: ARRAY [1..2] OF filler_type;
+{ 2681} dsplan_printerid: objectid_type;
+{ 2689} dsplan_from: date_type;
+{ 2695} dsplan_to: date_type;
+{ 2701} cplane_outlook: flag_type;
+{ 2702} filler31: ARRAY [1..3] OF filler_type;
+{ 2705} awtime_pm_kontierungen: flag_type;
+{ 2706} filler32: ARRAY [1..3] OF filler_type;
+{ 2709} filler: ARRAY [1..792] OF filler_type
+{=3500} END;
+dsvisit_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} emplno: emplno_type;
+{ 19} surname: surname_type;
+{ 49} firstname: firstname_type;
+{ 69} company: long_text_type;
+{ 99} badgeno: long_badgeno_type;
+{ 119} accesscat: acccatid_type;
+{ 123} filler1: ARRAY [1..2] OF filler_type;
+{ 125} valid_from_date: date_type;
+{ 131} valid_from_time: mod_type;
+{ 133} valid_to_date: date_type;
+{ 139} valid_to_time: mod_type;
+{ 141} carlicid: ARRAY [1..12] OF char;
+{ 153} contact: long_text_type;
+{ 183} pin_code: pin_code_type;
+{ 187} factory: packed_12_type;
+{ 199} filler: ARRAY [1..62] OF filler_type
+{= 260} END;
+warn_log_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} req_code: char;
+{ 10} book_code: char;
+{ 11} emplno: emplno_type;
+{ 21} old_badgeno: badgeno_type;
+{ 31} state: char;
+{ 32} seqno: unsigned_byte;
+{ 33} date_time_written: date_and_time_type;
+{ 45} work_day: date_type;
+{ 51} time: mod_type;
+{ 53} termid: objectid_type;
+{ 61} logonid: logonid_type;
+{ 69} warntype: short;
+{ 71} warnparameter: ARRAY [1..20] OF char;
+{ 91} badgeno: long_badgeno_type;
+{ 111} filler: ARRAY [1..20] OF filler_type
+{= 130} END;
+special_service_type = RECORD
+{ 1} special_code: codeid_type;
+{ 3} from_time: mod_type;
+{ 5} to_time: mod_type
+{= 6} END;
+dswopen_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} wopenid: emplno_day_type;
+{ 25} wpatid: wpatid_type;
+{ 29} ruleid: ruleid_type;
+{ 31} allowances: allowances_type;
+{ 41} daily_codeid: codeid_type;
+{ 43} reass_flag: flag_type;
+{ 44} ondutylen_from_cur_wpat: flag_type;
+{ 45} alt_wpatids_flag: flag_type;
+{ 46} tariffarea: tariffarea_type;
+{ 50} employcat: employcat_type;
+{ 54} breakusage: unsigned_byte;
+{ 55} auto_break_tot_max: allowance_type;
+{ 57} cycle_wpatid: wpatid_type;
+{ 61} original_wpatid: wpatid_type;
+{ 65} costid: costid_type;
+{ 85} special_service: ARRAY [1..3] OF special_service_type;
+{ 103} filler: ARRAY [1..8] OF filler_type
+{= 110} END;
+dswpat_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} wpat_key: wpat_key_type;
+{ 19} valid_from: date_type;
+{ 25} wpat_text: long_text_type;
+{ 55} wpat: ARRAY [1..3] OF RECORD
+{+ 0} time_from: mod_type;
+{+ 2} time_to: mod_type;
+{+ 4} ondutylen: duration_type
+{= 18} END;
+{ 73} freeshift: duration_type;
+{ 75} break_pattern: ARRAY [1..maxbreaks] OF break_pattern_type;
+{ 123} break_tot_min: duration_type;
+{ 125} break_tot_max: duration_type;
+{ 127} break_time: mod_type;
+{ 129} work_min_break: duration_type;
+{ 131} onduty_inc: duration_type;
+{ 133} break_inc: duration_type;
+{ 135} break_percent: short;
+{ 137} break_interval: RECORD
+{+ 0} time_come: mod_type;
+{+ 2} time_go: mod_type
+{= 4} END;
+{ 141} day_allowance: RECORD
+{+ 0} time_from: mod_type;
+{+ 2} time_to: mod_type
+{= 4} END;
+{ 145} daybreak: mod_type;
+{ 147} daybreak_tariff: mod_type;
+{ 149} open_checkout: mod_type;
+{ 151} work_mean_break: duration_type;
+{ 153} break_tot_mean: duration_type;
+{ 155} interval_ind_come: char;
+{ 156} interval_ind_go: char;
+{ 157} charge_break_flag: flag_type;
+{ 158} break_limit_on_worktime: flag_type;
+{ 159} sliding_break: flag_type;
+{ 160} wizard_mark: char;
+{ 161} min_work_length: duration_type;
+{ 163} selid: ARRAY [1..2] OF char;
+{ 165} block_break_time: duration_type;
+{ 167} break_tot_block: duration_type;
+{ 169} useable: flag_type;
+{ 170} filler: ARRAY [1..11] OF filler_type
+{= 180} END;
+placeno_type = ARRAY [1..2] OF char;
+roomnumber_type = ARRAY [1..4] OF char;
+mpoint_type = char;
+jobflag_type = ARRAY [1..3] OF char;
+dswplace_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} emplno: emplno_type;
+{ 19} work_day: date_type;
+{ 25} placeno: placeno_type;
+{ 27} climno: char;
+{ 28} mpoint: char;
+{ 29} jobflag: jobflag_type;
+{ 32} roomnumber: roomnumber_type;
+{ 36} district_payment: ARRAY [1..3] OF char;
+{ 39} pay_method: char;
+{ 40} gedingeno: ARRAY [1..2] OF char;
+{ 42} bpu: char;
+{ 43} worker_rank: ARRAY [1..4] OF char;
+{ 47} journey: char;
+{ 48} bonus1: ARRAY [1..3] OF char;
+{ 51} filler1: ARRAY [1..2] OF filler_type;
+{ 53} amount1: long;
+{ 57} bonus2: ARRAY [1..3] OF char;
+{ 60} filler2: filler_type;
+{ 61} amount2: long;
+{ 65} bonus3: ARRAY [1..3] OF char;
+{ 68} filler3: filler_type;
+{ 69} amount3: long;
+{ 73} Info1: ARRAY [1..10] OF char;
+{ 83} Info2: ARRAY [1..10] OF char;
+{ 93} Info3: ARRAY [1..10] OF char;
+{ 103} Info4: ARRAY [1..10] OF char;
+{ 113} Info5: ARRAY [1..10] OF char
+{= 122} END;
+fmsglog_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} date_time_written: date_and_time_type;
+{ 21} millisec: short;
+{ 23} termid: objectid_type;
+{ 31} termno: short;
+{ 33} badgeno: badgeno_type;
+{ 43} emplno: emplno_type;
+{ 53} filler: ARRAY [1..18] OF unsigned_byte;
+{ 71} data: ARRAY [1..40] OF char
+{= 110} END;
+fmsglog2_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} date_time_written: date_and_time_type;
+{ 21} millisec: short;
+{ 23} termid: objectid_type;
+{ 31} termno: short;
+{ 33} badgeno: long_badgeno_type;
+{ 53} emplno: emplno_type;
+{ 63} filler: ARRAY [1..8] OF filler_type;
+{ 71} data: ARRAY [1..100] OF char
+{= 170} END;
+help_page_line_rec = ARRAY [1..78] OF char;
+help_page_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} chapter: chapter_type;
+{ 19} sequenceno: short;
+{ 21} line_tab: ARRAY [1..18] OF help_page_line_rec
+{=1424} END;
+helptable_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} maskname: objectid_type;
+{ 17} chapter: chapter_type
+{= 26} END;
+spiinf_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} pgmname: packed_10_type;
+{ 19} std_spi: packed_10_type;
+{ 29} subpgm01: packed_10_type;
+{ 39} subpgm02: packed_10_type;
+{ 49} subpgm03: packed_10_type;
+{ 59} subpgm04: packed_10_type;
+{ 69} subpgm05: packed_10_type;
+{ 79} subpgm06: packed_10_type;
+{ 89} subpgm07: packed_10_type;
+{ 99} subpgm08: packed_10_type;
+{ 109} subpgm09: packed_10_type;
+{ 119} subpgm10: packed_10_type;
+{ 129} subpgm11: packed_10_type;
+{ 139} subpgm12: packed_10_type;
+{ 149} subpgm13: packed_10_type;
+{ 159} subpgm14: packed_10_type;
+{ 169} subpgm15: packed_10_type;
+{ 179} subpgm16: packed_10_type;
+{ 189} subpgm17: packed_10_type;
+{ 199} subpgm18: packed_10_type;
+{ 209} subpgm19: packed_10_type;
+{ 219} subpgm20: packed_10_type;
+{ 229} subpgm21: packed_10_type;
+{ 239} subpgm22: packed_10_type;
+{ 249} subpgm23: packed_10_type;
+{ 259} subpgm24: packed_10_type;
+{ 269} subpgm25: packed_10_type;
+{ 279} subpgm26: packed_10_type;
+{ 289} subpgm27: packed_10_type;
+{ 299} subpgm28: packed_10_type;
+{ 309} subpgm29: packed_10_type;
+{ 319} subpgm30: packed_10_type;
+{ 329} subpgm31: packed_10_type;
+{ 339} subpgm32: packed_10_type;
+{ 349} subpgm33: packed_10_type;
+{ 359} subpgm34: packed_10_type;
+{ 369} subpgm35: packed_10_type;
+{ 379} subpgm36: packed_10_type;
+{ 389} subpgm37: packed_10_type;
+{ 399} subpgm38: packed_10_type;
+{ 409} subpgm39: packed_10_type;
+{ 419} subpgm40: packed_10_type;
+{ 429} subpgm41: packed_10_type;
+{ 439} subpgm42: packed_10_type;
+{ 449} subpgm43: packed_10_type;
+{ 459} subpgm44: packed_10_type;
+{ 469} subpgm45: packed_10_type;
+{ 479} subpgm46: packed_10_type;
+{ 489} subpgm47: packed_10_type;
+{ 499} subpgm48: packed_10_type;
+{ 509} subpgm49: packed_10_type;
+{ 519} subpgm50: packed_10_type;
+{ 529} subpgm51: packed_10_type;
+{ 539} subpgm52: packed_10_type;
+{ 549} subpgm53: packed_10_type;
+{ 559} subpgm54: packed_10_type;
+{ 569} subpgm55: packed_10_type;
+{ 579} subpgm56: packed_10_type;
+{ 589} subpgm57: packed_10_type;
+{ 599} subpgm58: packed_10_type;
+{ 609} subpgm59: packed_10_type;
+{ 619} subpgm60: packed_10_type;
+{ 629} subpgm61: packed_10_type;
+{ 639} subpgm62: packed_10_type;
+{ 649} subpgm63: packed_10_type;
+{ 659} subpgm64: packed_10_type;
+{ 669} subpgm65: packed_10_type;
+{ 679} subpgm66: packed_10_type;
+{ 689} subpgm67: packed_10_type;
+{ 699} subpgm68: packed_10_type;
+{ 709} subpgm69: packed_10_type;
+{ 719} subpgm70: packed_10_type;
+{ 729} subpgm71: packed_10_type;
+{ 739} subpgm72: packed_10_type;
+{ 749} subpgm73: packed_10_type;
+{ 759} subpgm74: packed_10_type;
+{ 769} subpgm75: packed_10_type;
+{ 779} subpgm76: packed_10_type;
+{ 789} subpgm77: packed_10_type;
+{ 799} subpgm78: packed_10_type;
+{ 809} subpgm79: packed_10_type;
+{ 819} subpgm80: packed_10_type;
+{ 829} subpgm81: packed_10_type;
+{ 839} subpgm82: packed_10_type;
+{ 849} subpgm83: packed_10_type;
+{ 859} subpgm84: packed_10_type;
+{ 869} subpgm85: packed_10_type;
+{ 879} subpgm86: packed_10_type;
+{ 889} subpgm87: packed_10_type;
+{ 899} subpgm88: packed_10_type;
+{ 909} subpgm89: packed_10_type;
+{ 919} subpgm90: packed_10_type;
+{ 929} subpgm91: packed_10_type;
+{ 939} subpgm92: packed_10_type;
+{ 949} subpgm93: packed_10_type;
+{ 959} subpgm94: packed_10_type;
+{ 969} subpgm95: packed_10_type;
+{ 979} subpgm96: packed_10_type;
+{ 989} subpgm97: packed_10_type;
+{ 999} subpgm98: packed_10_type;
+{ 1009} subpgm99: packed_10_type;
+{ 1019} subpgm100: packed_10_type;
+{ 1029} subpgm101: packed_10_type;
+{ 1039} subpgm102: packed_10_type;
+{ 1049} subpgm103: packed_10_type;
+{ 1059} subpgm104: packed_10_type;
+{ 1069} subpgm105: packed_10_type;
+{ 1079} subpgm106: packed_10_type;
+{ 1089} subpgm107: packed_10_type;
+{ 1099} subpgm108: packed_10_type;
+{ 1109} subpgm109: packed_10_type;
+{ 1119} subpgm110: packed_10_type;
+{ 1129} subpgm111: packed_10_type;
+{ 1139} subpgm112: packed_10_type;
+{ 1149} subpgm113: packed_10_type;
+{ 1159} subpgm114: packed_10_type;
+{ 1169} subpgm115: packed_10_type;
+{ 1179} subpgm116: packed_10_type;
+{ 1189} subpgm117: packed_10_type;
+{ 1199} subpgm118: packed_10_type;
+{ 1209} subpgm119: packed_10_type;
+{ 1219} subpgm120: packed_10_type;
+{ 1229} heapsize_first: long;
+{ 1233} heapsize_max: long;
+{ 1237} stacksize: long;
+{ 1241} cobolcaps: packed_10_type;
+{ 1251} cmdname: packed_10_type;
+{ 1261} originalname: packed_30_type;
+{ 1291} qtcpneeded: flag_type;
+{ 1292} reserved_01: packed_10_type;
+{ 1302} reserved_02: packed_10_type;
+{ 1312} reserved_03: packed_10_type;
+{ 1322} reserved_04: packed_10_type;
+{ 1332} reserved_05: packed_10_type;
+{ 1342} reserved: ARRAY [1..100] OF char
+{=1441} END;
+ipcb_type = RECORD
+{ 1} dsabsfcb: fcb_type;
+{ 21} dsadjustfcb: fcb_type;
+{ 41} dscalenfcb: fcb_type;
+{ 61} dscodefcb: fcb_type;
+{ 81} dsdtimefcb: fcb_type;
+{ 101} dsplanfcb: fcb_type;
+{ 121} dsshiftfcb: fcb_type;
+{ 141} dsvempfcb: fcb_type;
+{ 161} dswopenfcb: fcb_type;
+{ 181} dswpatfcb: fcb_type;
+{ 201} dsrulefcb: fcb_type;
+{ 221} logonid: logonid_type;
+{ 229} dsinstrec: dsinst_rec;
+{ 1379} ask_user: boolean;
+{ 1380} codes_only: boolean;
+{ 1381} is_plan: boolean;
+{ 1382} consider_code_priorities: boolean;
+{ 1383} dsabsrec: dsabs_rec;
+{ 1583} dsabsrec_read: boolean;
+{ 1584} dsabsrec_changed: boolean;
+{ 1585} no_new: short;
+{ 1587} no_changed: short;
+{ 1589} dsvemprec: dsaemp_rec;
+{ 2589} version_number: short
+{=2590} END;
+chosen_day_type = cit_yesterday..cit_today;
+chosen_day_set = SET OF chosen_day_type;
+info_rec_type = (dswopen, dsdtime, dswpat);
+info_rec_set = SET OF info_rec_type;
+common_info_pointer = ^common_info_type;
+common_info_type = RECORD
+{ 1} dswopen_read: boolean;
+{ 2} dsdtime_read: boolean;
+{ 3} dswpat_read: boolean;
+{ 4} write_dswopen: boolean;
+{ 5} org_dswopenrec: dswopen_rec;
+{ 115} dswopenrec: dswopen_rec;
+{ 225} org_dsdtimetrec: dsdtimet_rec;
+{ 725} dsdtimetrec: dsdtimet_rec;
+{ 1225} dswpatrec: dswpat_rec;
+{ 1405} old_no_of_timepairs: short;
+{ 1407} old_no_of_del_timepairs: short;
+{ 1409} current_index: short;
+{ 1411} current_is_coming: boolean;
+{ 1412} alt_wpat_chosen: boolean
+{=1412} END;
+common_info_tab = ARRAY [cit_yesterday..cit_today] OF common_info_pointer;
+vl_dscolsrec_tab_tab_type = RECORD
+{ 1} dscolsrec: dscols_rec;
+{ 137} conv_table_pos: short;
+{ 139} filler: ARRAY [1..2] OF char
+{= 140} END;
+vl_dscolsrec_tab_type = RECORD
+{ 1} cols: ARRAY [1..vl_max_cols] OF vl_dscolsrec_tab_tab_type;
+{ 4481} no_cols: short
+{=4482} END;
+dsdocno_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} emplno: emplno_type;
+{ 19} date_from: date_type;
+{ 25} documentno: long;
+{ 29} codeid: codeid_type;
+{ 31} time_from: mod_type;
+{ 33} time_to: mod_type;
+{ 35} income: income_type;
+{ 39} costid: costid_type;
+{ 59} filler: ARRAY [1..2] OF filler_type
+{= 60} END;
+info_text_type = ARRAY [1..13] OF char;
+sapid_type = RECORD
+{ 1} badgeno: badgeno_type;
+{ 11} valid_from: date_type
+{= 16} END;
+dssap_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} sapid: sapid_type;
+{ 25} valid_to: date_type;
+{ 31} info: ARRAY [1..10] OF info_text_type;
+{ 161} filler: ARRAY [1..30] OF char
+{= 190} END;
+booklog_sap_rec = RECORD
+{ 1} satza: ARRAY [1..3] OF char;
+{ 4} terid: ARRAY [1..4] OF char;
+{ 8} ldate: ARRAY [1..8] OF char;
+{ 16} ltime: ARRAY [1..6] OF char;
+{ 22} erdat: ARRAY [1..8] OF char;
+{ 30} ertim: ARRAY [1..6] OF char;
+{ 36} zausw: ARRAY [1..8] OF char;
+{ 44} abwgr: ARRAY [1..4] OF char;
+{ 48} exlga: ARRAY [1..4] OF char;
+{ 52} hrazl: ARRAY [1..9] OF char;
+{ 61} zeinh: ARRAY [1..3] OF char;
+{ 64} hrbet: ARRAY [1..9] OF char;
+{ 73} cr: char;
+{ 74} lf: char
+{= 74} END;
+lhzzma_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} emplno: emplno_type;
+{ 19} date: date_type;
+{ 25} worked_time: short;
+{ 27} balance_3: short;
+{ 29} balance_9: short;
+{ 31} filler: ARRAY [1..10] OF char
+{= 40} END;
+taris_rec = RECORD
+{ 1} clientno: buffer_type;
+{ 3} termid: objectid_type;
+{ 11} year: packed_2_type;
+{ 13} month: packed_2_type;
+{ 15} day: packed_2_type;
+{ 17} hour: packed_2_type;
+{ 19} minute: packed_2_type;
+{ 21} second: packed_2_type;
+{ 23} badgeno: badgeno_type;
+{ 33} req_code: char;
+{ 34} access_req_code: char;
+{ 35} codeidtype: char;
+{ 36} codeid: codeid_type;
+{ 38} citemno: objectid_type;
+{ 46} amount: packed_11_type;
+{ 57} quantity: packed_6_type;
+{ 63} costid: costid_type;
+{ 83} long_badgeno: long_badgeno_type
+{= 102} END;
+dspntoln_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} physical_key: pntoln_badgeno_type;
+{ 29} logical_key: pntoln_badgeno_type;
+{ 49} key_type: pntoln_key_type;
+{ 50} filler: ARRAY [1..10] OF filler_type
+{= 59} END;
+dsqual_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} qualificationid: qualificationid_type;
+{ 17} qualification_text: long_text_type;
+{ 47} delete_period: short;
+{ 49} qual_refresh: short;
+{ 51} qual_warn: short;
+{ 53} filler: ARRAY [1..18] OF filler_type
+{= 70} END;
+dsable_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} able_key: emplno_qual_type;
+{ 27} first_date: date_type;
+{ 33} last_date: date_type;
+{ 39} no_of_days: short;
+{ 41} no_of_days_corr: short;
+{ 43} filler: ARRAY [1..28] OF char
+{= 70} END;
+dsmdlptp_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} emplno: emplno_type;
+{ 19} badgeno: long_badgeno_type;
+{ 39} code: dsmdlptp_code_type;
+{ 55} filler: ARRAY [1..40] OF filler_type
+{= 94} END;
+dsmdsum_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} code: dsmdsum_code_type;
+{ 281} filler: ARRAY [1..40] OF filler_type
+{= 320} END;
+dscostgr_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} costid_grp: costid_type;
+{ 29} costid_grp_text: long_text_type;
+{ 59} seq_no: short;
+{ 61} costno: costid_type;
+{ 81} projno: costid_type;
+{ 101} cttype: costid_type;
+{ 121} filler: ARRAY [1..20] OF filler_type
+{= 140} END;
+dspmstat_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} wrk_status: wrk_status_type;
+{ 18} status_committed: wrk_status_type;
+{ 27} status_rejected: wrk_status_type;
+{ 36} status_text: long_text_type;
+{ 66} catid: accat_type;
+{ 74} wrk_code: wrk_code_type;
+{ 77} filler: ARRAY [1..24] OF filler_type
+{= 100} END;
+
+
+{pspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspsp}
+ {dbconf.inc}
+mod_objecttype_type = RECORD
+{ 1} moduleid: objectid_type;
+{ 9} objecttype: objecttype_type
+{= 16} END;
+dsfconf_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} fileid: objectid_type;
+{ 17} file_text: long_text_type;
+{ 47} logging_flag: flag_type;
+{ 48} standard_file: flag_type;
+{ 49} maskid: objectid_type;
+{ 57} record_length: short;
+{ 59} fileno: short;
+{ 61} transaction_flag: flag_type;
+{ 62} filler: ARRAY [1..39] OF filler_type
+{= 100} END;
+dspconf_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} programid: objectid_type;
+{ 17} programname: phys_filename_type;
+{ 49} print_file: phys_filename_type;
+{ 81} priority: short;
+{ 83} no_of_parameters: short;
+{ 85} privileged_flag: flag_type;
+{ 86} pconf_text: long_text_type;
+{ 116} filler: ARRAY [1..35] OF unsigned_byte
+{= 150} END;
+parameter_type = RECORD
+{ 1} parm_text: ARRAY [1..16] OF char;
+{ 17} parmname: ARRAY [1..16] OF char;
+{ 33} parmtype: char;
+{ 34} form_flag: flag_type;
+{ 35} minimum: short;
+{ 37} maximum: short;
+{ 39} max_length: short;
+{ 41} max_occurrences: short;
+{ 43} required_flag: flag_type;
+{ 44} parm_default: parm_tab_line_type;
+{ 104} conv_table_name: long_text_type;
+{ 134} filler: ARRAY [1..3] OF filler_type
+{= 136} END;
+dspconfp_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} programid: objectid_type;
+{ 17} sequenceno: short;
+{ 19} parameter: parameter_type;
+{ 155} filler: ARRAY [1..26] OF filler_type
+{= 180} END;
+dspconft_rec = RECORD
+{ 1} dspconfrec: dspconf_rec;
+{ 151} parameter_tab: ARRAY [1..parm_tab_len] OF parameter_type
+{=3414} END;
+dsprconf_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} printerid: objectid_type;
+{ 17} print_queue_name: print_queue_name_type;
+{ 49} printer_text: long_text_type;
+{ 79} printerfile: phys_filename_type;
+{ 111} filler: ARRAY [1..90] OF char
+{= 200} END;
+dstconf_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} termid: objectid_type;
+{ 17} termno: short;
+{ 19} termtype: objecttype_type;
+{ 27} term_code: char;
+{ 28} term_address: objecttype_type;
+{ 36} phys_termtype: objecttype_type;
+{ 44} download_fileid: objectid_type;
+{ 52} moduleid: objectid_type;
+{ 60} filler3: filler_type;
+{ 61} dist_deduct_grp: short;
+{ 63} termname_in: phys_filename_type;
+{ 95} termname_out: phys_filename_type;
+{ 127} filler1: ARRAY [1..1] OF filler_type;
+{ 128} location: long_text_type;
+{ 158} telno: ARRAY [1..16] OF char;
+{ 174} deptno: deptno_type;
+{ 184} user: long_text_type;
+{ 214} termcat: termcat_type;
+{ 222} perm_download: flag_type;
+{ 223} telno_modem: ARRAY [1..14] OF char;
+{ 237} info_path: objectid_type;
+{ 245} entry_pointname: phys_filename_type;
+{ 277} ignore_time: short;
+{ 279} forms_input: flag_type;
+{ 280} printerid: objectid_type;
+{ 288} costid: costid_type;
+{ 308} exit_allowed: flag_type;
+{ 309} tariffarea: tariffarea_type;
+{ 313} life_check_interval: short;
+{ 315} life_check_timeout: short;
+{ 317} time_sync_interval: short;
+{ 319} from_zoneid: short;
+{ 321} to_zoneid: short;
+{ 323} door_open_time: short;
+{ 325} door_signal_time: short;
+{ 327} log_entry: flag_type;
+{ 328} log_exit: flag_type;
+{ 329} log_rejected: flag_type;
+{ 330} count_entry: flag_type;
+{ 331} count_exit: flag_type;
+{ 332} auto_booking: char;
+{ 333} log_storno_entry: flag_type;
+{ 334} log_storno_exit: flag_type;
+{ 335} pin_code: flag_type;
+{ 336} off_line_mode: char;
+{ 337} entry_from_any_zone: flag_type;
+{ 338} filler2: ARRAY [1..11] OF filler_type;
+{ 349} dist_deduct_come: duration_type;
+{ 351} dist_deduct_go: duration_type;
+{ 353} filler: ARRAY [1..8] OF filler_type
+{= 360} END;
+dstmasks_rec = RECORD
+{ 1} rec_header: rec_header_type;
+{ 9} progno: short;
+{ 11} maskname: objectid_type;
+{ 19} masktitle: menue_line_type
+{= 68} END;
+
+
+{pspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspsp}
+ {tsvrmsg.inc}
+ts_msg_header_type = RECORD
+{ 1} byte: buffer_type;
+{ 3} msgno: short;
+{ 5} queue_name: ARRAY [1..1] OF char;
+{ 6} filler: ARRAY [1..1] OF unsigned_byte;
+{ 7} logonid: logonid_type;
+{ 15} sessionid: short;
+{ 17} seqno: long;
+{ 21} reqno: short;
+{ 23} progno: short;
+{ 25} old_key: keydata_type
+{= 84} END;
+line_flags_type = RECORD
+{ 1} selected: char;
+{ 2} attribute: char
+{= 2} END;
+mask_perm_array = ARRAY [1..maxacmasks] OF acmask_perm_type;
+mask_accesses_type = RECORD
+{ 1} catid: accat_type;
+{ 9} default_perm: char;
+{ 10} filler: ARRAY [1..3] OF char;
+{ 13} mask: mask_perm_array
+{= 972} END;
+selopt_perm_array = ARRAY [1..maxacsel] OF acsel_perm_type;
+selopt_accesses_type = RECORD
+{ 1} catid: accat_type;
+{ 9} default_perm: char;
+{ 10} selopt_tab: selopt_perm_array
+{= 153} END;
+common_type = RECORD
+{ 1} menuename: objectid_type;
+{ 9} termno: short;
+{ 11} termname: phys_filename_type;
+{ 43} own_data_perm: char;
+{ 44} default_perm: char;
+{ 45} dept_accesses: dsacdept_rec;
+{ 605} no_dept_exceptions: short;
+{ 607} no_mask_exceptions: short;
+{ 609} mask_accesses: mask_accesses_type;
+{ 1581} dsusersrec: dsusers_rec;
+{ 5081} logonid_emplno: emplno_type;
+{ 5091} logonid_surname: surname_type;
+{ 5121} logonid_firstname: firstname_type;
+{ 5141} logonid_email: email_address_type;
+{ 5173} emplno: emplno_type;
+{ 5183} date: date_type;
+{ 5189} project_planer: flag_type;
+{ 5190} filler1: ARRAY [1..1] OF char;
+{ 5191} alignment1: ARRAY [1..2] OF char;
+{ 5193} mask_colors: ARRAY [1..20] OF one_masks_colors_type;
+{ 6793} special_colors: special_colors_type;
+{ 6921} color_masks: ARRAY [1..20] OF menue_line_type;
+{ 7921} printer_name: objectid_type;
+{ 7929} logonid: logonid_type;
+{ 7937} deptno: deptno_type;
+{ 7947} employcat: employcat_type;
+{ 7951} no_selopt_exceptions: short;
+{ 7953} selopt_accesses: selopt_accesses_type;
+{ 8106} programname: ARRAY [1..20] OF objectid_type
+{=8265} END;
+code_perm_array = ARRAY [1..maxaccodes] OF accode_perm_type;
+code_accesses_type = RECORD
+{ 1} catid: accat_type;
+{ 9} default_perm: char;
+{ 10} code: code_perm_array
+{= 201} END;
+accesses_type = RECORD
+{ 1} logonid: logonid_type;
+{ 9} logonid_emplno: emplno_type;
+{ 19} logonid_surname: surname_type;
+{ 49} logonid_firstname: firstname_type;
+{ 69} logonid_email: email_address_type;
+{ 101} ownid: objectid_type;
+{ 109} own_taskid: short;
+{ 111} own_data_perm: char;
+{ 112} default_perm: char;
+{ 113} time_manager: flag_type;
+{ 114} change_old_data: flag_type;
+{ 115} master_proj_perm: char;
+{ 116} filler1: ARRAY [1..1] OF char;
+{ 117} no_cat_exceptions: short;
+{ 119} cat_accesses: dsaccat_rec;
+{ 299} code_accesses: code_accesses_type;
+{ 500} filler5: ARRAY [1..1] OF char;
+{ 501} no_code_exceptions: short;
+{ 503} comm_accesses: dsaccomm_rec;
+{ 663} no_comm_exceptions: short;
+{ 665} no_cop_exceptions: short;
+{ 667} cop_accesses: dsaccop_rec;
+{ 927} cost_accesses: dsaccost_rec;
+{ 1476} filler2: ARRAY [1..1] OF char;
+{ 1477} no_cost_exceptions: short;
+{ 1479} dept_accesses: dsacdept_rec;
+{ 2039} no_dept_exceptions: short;
+{ 2041} no_inc_exceptions: short;
+{ 2043} inc_accesses: dsacinc_rec;
+{ 2219} filler3: ARRAY [1..2] OF char;
+{ 2221} no_mask_exceptions: short;
+{ 2223} mask_accesses: mask_accesses_type;
+{ 3195} prog_accesses: dsacprog_rec;
+{ 3495} no_prog_exceptions: short;
+{ 3497} no_zone_exceptions: short;
+{ 3499} zone_accesses: dsaczone_rec;
+{ 3739} search_list_acdept: search_list_type;
+{ 3765} search_list_accat: search_list_type;
+{ 3791} search_list_accost: search_list_type;
+{ 3817} search_list_acsel: search_list_type;
+{ 3843} no_selopt_exceptions: short;
+{ 3845} selopt_accesses: selopt_accesses_type;
+{ 3998} filler4: ARRAY [1..1] OF char;
+{ 3999} no_cost_enter_exceptions: short;
+{ 4001} cost_enter_accesses: dsaccost_rec
+{=4549} END;
+ts_req_msg_pointer = ^ts_req_msg_type;
+ts_req_msg_type = RECORD
+{ 1} msg_header: ts_msg_header_type;
+{ 85} indexname: indexname_type;
+{ 117} function_code: ARRAY [1..function_code_len] OF char;
+{ 118} filler: ARRAY [1..15] OF char;
+{ 133} reqdata: buffer_type
+{= 134} END;
+ts_copy_pointer = ^ts_copy_type;
+ts_copy_type = RECORD
+{ 1} old_key: keydata_type;
+{ 61} new_key: keydata_type
+{= 120} END;
+ts_print_pointer = ^ts_print_type;
+ts_print_type = RECORD
+{ 1} byte: buffer_type;
+{ 3} programid: objectid_type;
+{ 11} printerid: objectid_type;
+{ 19} parm_tab: parm_tab_type;
+{ 1459} prstatkey: packed_30_type
+{=1488} END;
+prt_zone_type = short;
+mask_timepair_tab_type = ARRAY [1..64] OF RECORD
+{ 1} timepair: timepair_type;
+{ 15} modify_in: char;
+{ 16} modify_out: char;
+{ 17} time_in_hrec: ARRAY [1..7] OF char;
+{ 24} time_out_hrec: ARRAY [1..7] OF char
+{=1920} END;
+ts_cplan_pointer = ^ts_cplan_type;
+ts_cplan_type = RECORD
+{ 1} calling_client: short;
+{ 3} emplno: emplno_type;
+{ 13} deptno: deptno_type;
+{ 23} costid: costid_type;
+{ 43} select_options: select_options_type;
+{ 59} state: unsigned_byte;
+{ 60} sort_char: char;
+{ 61} indexname: indexname_type;
+{ 93} cur_deptno: deptno_type;
+{ 103} cur_costid: costid_type;
+{ 123} cur_firstname: firstname_type;
+{ 143} cur_surname: surname_type;
+{ 173} cur_emplno: emplno_type;
+{ 183} cur_date: date_type;
+{ 189} cur_date_to: date_type;
+{ 195} cur_time: mod_type;
+{ 197} cur_apptype: short;
+{ 199} last_deptno: deptno_type;
+{ 209} last_costid: costid_type;
+{ 229} emplno_apply_read: emplno_type;
+{ 239} filler: ARRAY [1..2] OF filler_type;
+{ 241} scb: scb_type
+{= 412} END;
+ts_next_page_type = ARRAY [1..8] OF unsigned_byte;
+ts_rpl_msg_pointer = ^ts_rpl_msg_type;
+ts_rpl_msg_type = RECORD
+{ 1} msg_header: ts_msg_header_type;
+{ 85} error_code: code_type;
+{ 89} sys_error: short;
+{ 91} error_index: short;
+{ 93} error_text: error_text_type;
+{ 153} no_of_lines: short;
+{ 155} more_flag: flag_type;
+{ 156} filler: ARRAY [1..1] OF char;
+{ 157} next_page: ts_next_page_type;
+{ 165} rpldata: buffer_type
+{= 166} END;
+ts_rpl_line_pointer = ^ts_rpl_line_type;
+ts_rpl_line_type = RECORD
+{ 1} formatno: long;
+{ 5} line_flags: line_flags_type;
+{ 7} line_data: buffer_type
+{= 8} END;
+ts_cplan_lpt = ^ts_cplan_rpl_line;
+ts_cplan_rpl_line = RECORD
+{ 1} formatno: long;
+{ 5} line_flags: line_flags_type;
+{ 7} emplno: emplno_type;
+{ 17} name: ARRAY [1..15] OF char;
+{ 32} filler: ARRAY [1..3] OF char;
+{ 35} deptno: deptno_type;
+{ 45} plantype: unsigned_byte;
+{ 46} state: char;
+{ 47} date_from: date_type;
+{ 53} date_to: date_type;
+{ 59} days: short;
+{ 61} time: mod_type;
+{ 63} allowance_days: short;
+{ 65} allowance: allowance_type;
+{ 67} allowance_remainder: allowance_type;
+{ 69} date_applied: date_type;
+{ 75} date_granted: date_type;
+{ 81} email_employee: email_address_type
+{= 112} END;
+ts_cplan_rpl_pointer = ^ts_cplan_rpl_type;
+ts_cplan_rpl_type = RECORD
+{ 1} vacation_claim: balance_type;
+{ 5} old_vacation: balance_type;
+{ 9} vacation_taken: balance_type;
+{ 13} vacation_planned: balance_type;
+{ 17} vacation_to_plan: balance_type;
+{ 21} balance1: balance_type;
+{ 25} balance2: balance_type;
+{ 29} balance3: balance_type;
+{ 33} balance_date: date_type;
+{ 39} indexname: indexname_type;
+{ 71} cur_deptno: deptno_type;
+{ 81} cur_costid: costid_type;
+{ 101} cur_firstname: firstname_type;
+{ 121} cur_surname: surname_type;
+{ 151} cur_emplno: emplno_type;
+{ 161} cur_date: date_type;
+{ 167} cur_date_to: date_type;
+{ 173} cur_apptype: short;
+{ 175} cur_time: mod_type;
+{ 177} email_self: email_address_type;
+{ 209} email_manager: email_address_type;
+{ 241} firstname_manager: firstname_type;
+{ 261} surname_manager: surname_type;
+{ 291} emplno_apply_read: emplno_type;
+{ 301} last_deptno: deptno_type;
+{ 311} last_costid: costid_type;
+{ 331} self_inquiry_flag: flag_type;
+{ 332} manager_flag: flag_type;
+{ 333} read_all_flag: flag_type;
+{ 334} low_vacation: flag_type;
+{ 335} scb: scb_type;
+{ 507} alignment1: ARRAY [1..2] OF char;
+{ 509} line_tab: ARRAY [1..cplan_rpl_ct] OF ts_cplan_rpl_line
+{=3532} END;
+ts_cplan_update_pointer = ^ts_cplan_update_type;
+ts_cplan_update_type = RECORD
+{ 1} old_line: ts_cplan_rpl_line;
+{ 113} new_line: ts_cplan_rpl_line;
+{ 225} vacation_claim: balance_type;
+{ 229} old_vacation: balance_type;
+{ 233} vacation_taken: balance_type;
+{ 237} vacation_planned: balance_type;
+{ 241} vacation_to_plan: balance_type;
+{ 245} balance1: balance_type;
+{ 249} balance2: balance_type;
+{ 253} balance3: balance_type;
+{ 257} balance_date: date_type;
+{ 263} calling_client: short;
+{ 265} self_inquiry_flag: flag_type;
+{ 266} update_apply_type: char;
+{ 267} read_new_flag: flag_type;
+{ 268} low_vacation: flag_type
+{= 268} END;
+comm_buffer_conv_pointer = ^comm_buffer_conv_type;
+comm_buffer_conv_type = RECORD
+{ 1} CASE cb_type: long OF
+{+ 4} 1: (byte: buffer_type);
+{+ 4} 2: (buffer: comm_buffer_type);
+{+ 4} 3: (req: ts_req_msg_type;
+{+ 138} alignment1: ARRAY [1..2] OF char);
+{+ 4} 4: (rpl: ts_rpl_msg_type;
+{+ 170} alignment2: ARRAY [1..2] OF char);
+{=4100} END;
+page_pointer = ^page_type;
+page_type = RECORD
+{ 1} prev_page: page_pointer;
+{ 5} next_page: page_pointer;
+{ 9} page: comm_buffer_conv_type
+{=4108} END;
+list_cb_pointer = ^list_cb_type;
+list_cb_type = RECORD
+{ 1} current_line: short;
+{ 3} selected: short;
+{ 5} no_of_lines: short;
+{ 7} max_nol_in_page: short;
+{ 9} first_page: page_pointer;
+{ 13} last_page: page_pointer;
+{ 17} no_of_top_lines: short;
+{ 19} no_of_bottom_lines: short;
+{ 21} const_page: page_pointer;
+{ 25} use_attributes: boolean;
+{ 26} filler1: ARRAY [1..1] OF char;
+{ 27} selected_col: short;
+{ 29} user_cursor: short;
+{ 31} reserved_cursor: short
+{= 32} END;
+
+
+{pspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspsp}
+ {ts_demp-inc}
+ts_demp_pointer = ^ts_demp_type;
+ts_demp_type = RECORD
+{ 1} byte: buffer_type;
+{ 3} emplno: emplno_type;
+{ 13} start_emplno: emplno_type;
+{ 23} deptno: deptno_type;
+{ 33} start_deptno: deptno_type;
+{ 43} surname: surname_type;
+{ 73} start_surname: surname_type;
+{ 103} badgeno: long_badgeno_type;
+{ 123} start_badgeno: long_badgeno_type;
+{ 143} costid: costid_type;
+{ 163} start_costid: costid_type;
+{ 183} select_options: select_options_type;
+{ 199} accesscat: acccatid_type;
+{ 203} employcat: employcat_type;
+{ 207} start_employcat: employcat_type;
+{ 211} jobid: jobid_type;
+{ 219} start_jobid: jobid_type;
+{ 227} machineid: jobid_type;
+{ 235} start_machineid: jobid_type;
+{ 243} adjustcat: adjustcat_type;
+{ 247} tariffarea: tariffarea_type;
+{ 251} cycleid: cycleid_type;
+{ 255} cycle_start: short;
+{ 257} variants: char;
+{ 258} fileid: ARRAY [1..10] OF char;
+{ 268} first_page: flag_type;
+{ 269} date_from: date_type;
+{ 275} date_to: date_type;
+{ 281} start_date: date_type;
+{ 287} is_first_variant: flag_type;
+{ 288} employ_flag: flag_type;
+{ 289} visit_flag: flag_type;
+{ 290} femp_flag: flag_type;
+{ 291} company: long_text_type;
+{ 321} carlicid: ARRAY [1..12] OF char;
+{ 333} factory: packed_12_type;
+{ 345} foreign_clientno: buffer_type;
+{ 347} foreign_emplno: emplno_type;
+{ 357} rpoolid: rpoolid_type;
+{ 369} scb: scb_type
+{= 540} END;
+ts_demp_download_lpt = ^ts_demp_download_line;
+ts_demp_download_line = RECORD
+{ 1} emplno: emplno_type;
+{ 11} clientno: buffer_type;
+{ 13} sign: char;
+{ 14} filler: ARRAY [1..3] OF char
+{= 16} END;
+ts_demp_download_pointer = ^ts_demp_download_type;
+ts_demp_download_type = RECORD
+{ 1} no_of_lines: short;
+{ 3} no_of_ok_lines: short;
+{ 5} more_flag: flag_type;
+{ 6} first_call: flag_type;
+{ 7} filler: ARRAY [1..2] OF char;
+{ 9} line_tab: ARRAY [1..demp_download_ct] OF ts_demp_download_line
+{=3608} END;
+ts_demp_lpt = ^ts_demp_rpl_line;
+ts_demp_rpl_line = RECORD
+{ 1} formatno: long;
+{ 5} line: line_flags_type;
+{ 7} emplno: emplno_type;
+{ 17} pseudo_date: date_type;
+{ 23} deptno: deptno_type;
+{ 33} line_data: ARRAY [1..75] OF char;
+{ 108} sfc_participant: flag_type;
+{ 109} v_valid_from: date_type;
+{ 115} employee: ARRAY [1..34] OF char;
+{ 149} clientno: buffer_type;
+{ 151} sign: char;
+{ 152} position: signed_byte
+{= 152} END;
+ts_demp_rpl_pointer = ^ts_demp_rpl_type;
+ts_demp_rpl_type = RECORD
+{ 1} byte: buffer_type;
+{ 3} last_emplno: emplno_type;
+{ 13} last_deptno: deptno_type;
+{ 23} last_surname: surname_type;
+{ 53} last_badgeno: long_badgeno_type;
+{ 73} last_costid: costid_type;
+{ 93} last_employcat: employcat_type;
+{ 97} last_machineid: jobid_type;
+{ 105} last_jobid: jobid_type;
+{ 113} indexname: indexname_type;
+{ 145} scb: scb_type;
+{ 317} next_date: date_type;
+{ 323} is_first_variant: flag_type;
+{ 324} title1: vl_index_output_line_type;
+{ 399} title2: vl_index_output_line_type;
+{ 474} filler: ARRAY [1..9] OF char;
+{ 483} cols_dinfo_tab: vl_cols_dinfo_type;
+{ 741} vl_rec_type_tab: vl_rec_type_tab_type;
+{ 805} line_tab: ARRAY [1..demp_rpl_ct] OF ts_demp_rpl_line
+{=3540} END;
+
+
+{pspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspsp}
+ get_line_pointer_type = FUNCTION (page: page_pointer; ind: short):
+ ts_rpl_line_pointer;
+ copy_line_to_page_type = PROCEDURE (line: ts_rpl_line_pointer;
+ page: page_pointer; ind: short);
+
+VAR
+{pspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspsp}
+demp_list : list_cb_type;
+message_code : code_type;
+
+FUNCTION get_demp_line (page: page_pointer; line: short): ts_rpl_line_pointer;
+
+{$I pageutlsH.inc}
+
+IMPLEMENTATION
+
+CONST
+ versionno = 230;
+
+{ *********************** init_list *************************************** }
+
+PROCEDURE init_list (VAR list: list_cb_type; max_nol: short) ;
+
+{ initialisiert 'list_cb_type' }
+
+BEGIN WITH list DO BEGIN
+current_line := 1;
+no_of_lines := 0;
+first_page := nil;
+last_page := nil;
+max_nol_in_page := max_nol;
+no_of_top_lines := 0;
+no_of_bottom_lines := 0;
+const_page := nil;
+END; END; { init_list }
+
+{ *********************** dispose_list ************************************ }
+
+PROCEDURE dispose_list (VAR list: list_cb_type) ;
+
+{ gibt den Speicher der Liste frei und initialisiert 'list_cb_type' }
+
+VAR
+ page_temp: page_pointer;
+
+BEGIN WITH list DO BEGIN
+WHILE first_page <> nil DO
+ BEGIN
+ page_temp := first_page;
+ first_page := first_page^.next_page;
+ DISPOSE (page_temp);
+ END;
+WHILE const_page <> nil DO
+ BEGIN
+ page_temp := const_page;
+ const_page := const_page^.next_page;
+ DISPOSE (page_temp);
+ END;
+init_list (list, max_nol_in_page);
+END; END; { dispose_list }
+
+{ *********************** copy_list *************************************** }
+
+PROCEDURE copy_list (source: list_cb_type; VAR dest: list_cb_type) ;
+
+{ erstellt eine identische Kopie der Liste source }
+
+VAR
+ p, source_ptr, dest_ptr: page_pointer;
+
+BEGIN
+
+dispose_list (dest);
+dest := source;
+dest.first_page := nil;
+dest.last_page := nil;
+dest.const_page := nil;
+
+source_ptr := source.first_page;
+dest_ptr := nil;
+WHILE source_ptr <> nil DO
+ BEGIN
+ new (p);
+ IF p = nil THEN
+ EXIT(**); { memory allocation failure }
+ p^.prev_page := dest_ptr;
+ p^.next_page := nil;
+ p^.page := source_ptr^.page;
+ IF dest_ptr = nil THEN
+ dest.first_page := p
+ ELSE
+ dest_ptr^.next_page := p;
+ dest.last_page := p;
+ dest_ptr := p;
+ source_ptr := source_ptr^.next_page;
+ END;
+
+source_ptr := source.const_page;
+dest_ptr := nil;
+WHILE source_ptr <> nil DO
+ BEGIN
+ new (p);
+ IF p = nil THEN
+ EXIT(**); { memory allocation failure }
+ p^.prev_page := dest_ptr;
+ p^.next_page := nil;
+ p^.page := source_ptr^.page;
+ IF dest_ptr = nil THEN
+ dest.const_page := p
+ ELSE
+ dest_ptr^.next_page := p;
+ dest_ptr := p;
+ source_ptr := source_ptr^.next_page;
+ END;
+
+END; { copy_list }
+
+{ ************************ get_line *************************************** }
+
+PROCEDURE get_line (list: list_cb_type; line: short; VAR page: page_pointer;
+ VAR ind: short) ;
+
+{ setzt page/ind auf Zeile Nummer 'line' (fortlaufend) }
+
+BEGIN
+page := list.first_page;
+ind := line;
+IF line < 1 THEN
+ page := nil;
+WHILE page <> nil DO
+ BEGIN
+ IF ind <= page^.page.rpl.no_of_lines THEN
+ EXIT(**);
+ ind := ind - page^.page.rpl.no_of_lines;
+ page := page^.next_page;
+ END;
+END; { get_line }
+
+{ ************************ get_const_line ********************************* }
+
+PROCEDURE get_const_line (list: list_cb_type; line: short; VAR page: page_pointer;
+ VAR ind: short) ;
+
+{ setzt page/ind auf Zeile Nummer 'line' (fortlaufend) in den festen Zeilen }
+
+BEGIN
+page := list.const_page;
+ind := line;
+IF line < 1 THEN
+ page := nil;
+WHILE page <> nil DO
+ BEGIN
+ IF ind <= page^.page.rpl.no_of_lines THEN
+ EXIT(**);
+ ind := ind - page^.page.rpl.no_of_lines;
+ page := page^.next_page;
+ END;
+END; { get_const_line }
+
+{ ************************ get_next_line ********************************** }
+
+PROCEDURE get_next_line (list: list_cb_type; VAR page: page_pointer;
+ VAR ind: short) ;
+
+{ holt den Nachfolger von page/ind }
+{ Parameter 'list' obsolete }
+
+VAR
+ cur_last_line: short;
+
+BEGIN
+IF page = nil THEN
+ EXIT(**);
+ind := ind + 1;
+cur_last_line := page^.page.rpl.no_of_lines;
+WHILE (page <> nil) AND (ind > cur_last_line) DO
+ BEGIN
+ page := page^.next_page;
+ ind := 1;
+ IF page <> nil THEN
+ cur_last_line := page^.page.rpl.no_of_lines;
+ END;
+END; { get_next_line }
+
+{ ************************ get_prev_line ********************************** }
+
+PROCEDURE get_prev_line (list: list_cb_type; VAR page: page_pointer;
+ VAR ind: short) ;
+
+{ holt den Vorgaenger von page/ind }
+{ Parameter 'list' obsolete }
+
+BEGIN
+IF page = nil THEN
+ EXIT(**);
+ind := ind - 1;
+WHILE (page <> nil) AND (ind < 1) DO
+ BEGIN
+ page := page^.prev_page;
+ IF page <> nil THEN
+ ind := page^.page.rpl.no_of_lines;
+ END;
+END; { get_prev_line }
+
+{ ************************ get_next_visible_line ************************** }
+
+PROCEDURE get_next_visible_line (list: list_cb_type;
+ VAR page: page_pointer; VAR ind: short; VAR line: short;
+ get_line_pointer: get_line_pointer_type) ;
+
+{ holt den naechsten sichtbaren Nachfolger von page/ind;
+ erhoeht 'line' um die bis dahin ueberlesenen versteckten Zeilen }
+
+VAR
+ attribute: char;
+ selection: char;
+
+BEGIN
+REPEAT
+ get_next_line (list, page, ind);
+ get_line_flags (page, ind, selection, attribute, get_line_pointer);
+ IF attribute = attribute_hide THEN
+ line := line + 1;
+ UNTIL (page = nil) OR (attribute <> attribute_hide);
+END; { get_next_visible_line }
+
+
+{ ************************ get_first_visible_line ************************** }
+PROCEDURE get_first_visible_line (list: list_cb_type;
+ VAR cur: short; VAR page: page_pointer; VAR ind: short;
+ VAR line: short; get_line_pointer: get_line_pointer_type);
+
+
+VAR
+ attribute: char;
+ selection: char;
+ hidden: short;
+
+BEGIN
+hidden := 0;
+get_line (list, cur, page, ind);
+get_line_flags (page, ind, selection, attribute, get_line_pointer);
+IF attribute = attribute_hide THEN
+ BEGIN
+ hidden := 1;
+ get_next_visible_line (list, page, ind, hidden, get_line_pointer);
+ END;
+line := line + hidden;
+cur := cur + hidden;
+END;
+
+
+{ ************************ get_prev_visible_line ************************** }
+
+PROCEDURE get_prev_visible_line (list: list_cb_type;
+ VAR page: page_pointer; VAR ind: short; VAR line: short;
+ get_line_pointer: get_line_pointer_type) ;
+
+{ holt den naechsten sichtbaren Vorgaenger von page/ind;
+ erniedrigt 'line' um die bis dahin ueberlesenen versteckten Zeilen }
+
+VAR
+ attribute: char;
+ selection: char;
+
+BEGIN
+REPEAT
+ get_prev_line (list, page, ind);
+ get_line_flags (page, ind, selection, attribute, get_line_pointer);
+ IF attribute = attribute_hide THEN
+ line := line - 1;
+ UNTIL (page = nil) OR (attribute <> attribute_hide);
+END; { get_prev_visible_line }
+
+{ ************************* append_page *********************************** }
+
+PROCEDURE append_page (VAR list: list_cb_type;
+ buffer_ptr: ts_rpl_msg_pointer; to_page: page_pointer) ;
+
+{ haengt die Reply 'buffer_ptr' als Seite an 'to_page' an }
+
+VAR
+ p: page_pointer;
+
+BEGIN
+NEW (p);
+IF p = nil THEN
+ EXIT(**); { memory allocation failure }
+MOVE (buffer_ptr^.msg_header.byte[1], p^.page.byte[1], comm_buffer_len);
+list.no_of_lines := list.no_of_lines + buffer_ptr^.no_of_lines;
+
+IF to_page = nil THEN
+ BEGIN
+ p^.prev_page := nil;
+ p^.next_page := nil;
+ END
+ELSE
+ BEGIN
+ p^.prev_page := to_page;
+ p^.next_page := to_page^.next_page;
+ to_page^.next_page := p;
+ IF p^.next_page <> nil THEN
+ p^.next_page^.prev_page := p;
+ END;
+
+IF list.first_page = nil THEN
+ BEGIN
+ list.first_page := p;
+ list.last_page := p;
+ END
+ELSE
+ IF list.last_page = to_page THEN
+ list.last_page := p;
+END; { append_page }
+
+{ ************************* append_const_page ***************************** }
+
+PROCEDURE append_const_page (VAR list: list_cb_type;
+ buffer_ptr: ts_rpl_msg_pointer; to_page: page_pointer) ;
+
+{ haengt die Reply 'buffer_ptr' als Seite an 'to_page' der festen Zeilen an }
+
+VAR
+ p: page_pointer;
+
+BEGIN
+NEW (p);
+IF p = nil THEN
+ EXIT(**); { memory allocation failure }
+MOVE (buffer_ptr^.msg_header.byte[1], p^.page.byte[1], comm_buffer_len);
+list.no_of_bottom_lines := list.no_of_bottom_lines + buffer_ptr^.no_of_lines;
+
+IF to_page = nil THEN
+ BEGIN
+ p^.prev_page := nil;
+ p^.next_page := nil;
+ END
+ELSE
+ BEGIN
+ p^.prev_page := to_page;
+ p^.next_page := to_page^.next_page;
+ to_page^.next_page := p;
+ IF p^.next_page <> nil THEN
+ p^.next_page^.prev_page := p;
+ END;
+
+IF list.const_page = nil THEN
+ BEGIN
+ list.const_page := p;
+ list.const_page := p;
+ END;
+END; { append_const_page }
+
+{ ************************* create_const_page ***************************** }
+
+PROCEDURE create_const_page (VAR list: list_cb_type; notl, nobl: short;
+ buffer_ptr: ts_rpl_msg_pointer) ;
+
+{ erzeugt die Seite fuer Anzeige konstanter Zeilen in der display_logic;
+ die Seite wird mit 'notl' (no_of_top_lines), 'nobl' (no_of_bottom_lines)
+ und 'buffer_ptr' initialisiert; eine Aufruf mit 0,0,nil ist erlaubt }
+
+BEGIN
+{ erzeuge konstante Seite }
+IF list.const_page <> nil THEN
+ EXIT(**);
+NEW (list.const_page);
+IF list.const_page = nil THEN
+ EXIT(**); { memory allocation failure }
+
+{ fuelle Seite }
+IF buffer_ptr <> nil THEN
+ MOVE (buffer_ptr^.msg_header.byte[1], list.const_page^.page.byte[1],
+ comm_buffer_len);
+list.const_page^.prev_page := nil;
+list.const_page^.next_page := nil;
+list.no_of_top_lines := notl;
+list.no_of_bottom_lines := nobl;
+END; { create_const_page }
+
+{ ************************* more ****************************************** }
+
+FUNCTION more (list: list_cb_type): boolean ;
+
+{ gibt das more_flag der Liste zurueck }
+
+BEGIN
+IF list.last_page = nil THEN
+ more := false
+ELSE
+ more := (list.last_page^.page.rpl.more_flag = flag_on);
+END; { more }
+
+{ ************************* nol_in_page *********************************** }
+
+FUNCTION nol_in_page (page: page_pointer): short ;
+
+{ no of lines in page }
+
+BEGIN
+IF page = nil THEN
+ nol_in_page := 0
+ELSE
+ nol_in_page := page^.page.rpl.no_of_lines;
+END; { nol_in_page }
+
+{ ************************* set_nol_in_list ******************************* }
+
+PROCEDURE set_nol_in_page (page: page_pointer; nol: short) ;
+
+{ Setze 'no of lines in page' auf einen neuen Wert }
+
+BEGIN
+IF page <> nil THEN
+ page^.page.rpl.no_of_lines := nol;
+END; { set_nol_in_page }
+
+{ ************************* change_line *********************************** }
+
+PROCEDURE change_line (VAR list: list_cb_type; mode: char;
+ lpt: ts_rpl_line_pointer; dest_page: page_pointer; dest_ind: short;
+ get_line_pointer: get_line_pointer_type;
+ copy_line_to_page: copy_line_to_page_type
+ ) ;
+
+{ Kopieren, Loeschen und Einfuegen einer Zeile in eine Seite:
+ Kopieren : kopiere lpt nach dest
+ change_line (list, change_copy, $ADDR (line), dest_page, dest_ind);
+ Loeschen : loesche dest
+ change_line (list, change_delete, nil, dest_page, dest_ind);
+ Einfuegen: fuege lpt vor dest ein
+ change_line (list, change_insert, $ADDR (line), dest_page, dest_ind); }
+
+VAR
+ i: short;
+ nol : short;
+ buffer: comm_buffer_conv_type;
+
+BEGIN
+
+CASE mode OF
+
+ change_delete:
+ { loescht eine Zeile }
+ BEGIN
+ FOR i := dest_ind + 1 TO nol_in_page (dest_page) DO
+ copy_line_to_page (get_line_pointer (dest_page, i), dest_page, i - 1);
+ list.no_of_lines := list.no_of_lines - 1;
+ set_nol_in_page (dest_page, nol_in_page (dest_page) - 1);
+ END;
+
+ change_insert:
+ { fuegt eine Zeile vor 'dest' ein;
+ falls die Zeile auf der geforderten Seite keinen Platz hat, wird
+ eine neue Seite eingefuegt }
+ BEGIN
+ IF dest_page = nil THEN
+ IF (list.first_page <> nil) AND (list.no_of_lines = 0) THEN
+ BEGIN
+ { Liste enthaelt nur leere Seiten }
+ dest_page := list.first_page;
+ dest_ind := 1;
+ END
+ ELSE
+ BEGIN
+ { die angesprochene Seite existiert nicht: fuege leere Seite an;
+ falls bereits eine existiert, dann verwende diese bereits
+ initialisierte Seite }
+ IF list.first_page <> nil THEN
+ buffer.buffer := list.first_page^.page.buffer;
+ buffer.rpl.no_of_lines := 0;
+ buffer.rpl.more_flag := flag_off;
+ append_page (list, @buffer.rpl , list.last_page);
+ dest_page := list.last_page;
+ dest_ind := 1;
+ IF dest_page = nil THEN
+ EXIT(**);
+ END;
+
+ IF nol_in_page (dest_page) = list.max_nol_in_page THEN
+ { es musz eine neue Seite eingefuegt werden }
+ BEGIN
+ nol := list.no_of_lines; { merke Anzahl Zeilen }
+
+ { dupliziere dest_page und fuege sie hinter dest_page ein }
+ append_page (list, @dest_page^.page.rpl , dest_page);
+
+ { ueberschreibe dest_ind mit neuer Zeile }
+ copy_line_to_page (lpt, dest_page, dest_ind);
+
+ { loesche alle weiteren Zeilen in dieser Seite }
+ set_nol_in_page (dest_page, dest_ind);
+
+ { loesche die Zeilen 1 bis dest_ind - 1 in zweiter Seite }
+ FOR i := 1 TO dest_ind - 1 DO
+ change_line (list, change_delete, nil, dest_page^.next_page, 1,
+ get_line_pointer, copy_line_to_page);
+
+ list.no_of_lines := nol + 1; { restauriere Anzahl Zeilen }
+ END
+ ELSE
+ BEGIN
+ { verschiebe nachfolgende Zeilen }
+ FOR i := nol_in_page (dest_page) DOWNTO dest_ind DO
+ copy_line_to_page (get_line_pointer (dest_page, i), dest_page, i + 1);
+
+ { kopiere Zeile in freigewordenen Platz }
+ copy_line_to_page (lpt, dest_page, dest_ind);
+
+ { erhoehe Anzahl Zeilen }
+ list.no_of_lines := list.no_of_lines + 1;
+ set_nol_in_page (dest_page, nol_in_page (dest_page) + 1);
+ END;
+ END;
+
+ change_copy:
+ { kopiert die Zeile lpt nach dest }
+ copy_line_to_page (lpt, dest_page, dest_ind);
+
+ ELSE(**)
+ END;
+
+END; { change_line }
+
+{ ************************ get_last_const_page **************************** }
+
+FUNCTION get_last_const_page (list: list_cb_type): page_pointer;
+
+{ holt letzte Seite in den 'festen' Zeilen }
+
+VAR
+ page: page_pointer;
+
+BEGIN
+page := list.const_page;
+IF page <> nil THEN
+ WHILE page^.next_page <> nil DO
+ page := page^.next_page;
+get_last_const_page := page;
+END; { get_last_const_page }
+
+{ ************************* change_const_line ***************************** }
+
+PROCEDURE change_const_line (VAR list: list_cb_type; mode: char;
+ lpt: ts_rpl_line_pointer; dest_page: page_pointer; dest_ind: short;
+ get_line_pointer: get_line_pointer_type;
+ copy_line_to_page: copy_line_to_page_type
+ ) ;
+
+{ Version fuer 'feste Zeilen' }
+
+{ Kopieren, Loeschen und Einfuegen einer Zeile in eine Seite:
+ Kopieren : kopiere lpt nach dest
+ change_line (list, change_copy, $ADDR (line), dest_page, dest_ind);
+ Loeschen : loesche dest
+ change_line (list, change_delete, nil, dest_page, dest_ind);
+ Einfuegen: fuege lpt vor dest ein
+ change_line (list, change_insert, $ADDR (line), dest_page, dest_ind); }
+
+VAR
+ i: short;
+ nol : short;
+ buffer: comm_buffer_conv_type;
+
+BEGIN
+
+CASE mode OF
+
+ change_delete:
+ { loescht eine Zeile }
+ BEGIN
+ FOR i := dest_ind + 1 TO nol_in_page (dest_page) DO
+ copy_line_to_page (get_line_pointer (dest_page, i), dest_page, i - 1);
+ list.no_of_bottom_lines := list.no_of_bottom_lines - 1;
+ set_nol_in_page (dest_page, nol_in_page (dest_page) - 1);
+ END;
+
+ change_insert:
+ { fuegt eine Zeile vor 'dest' ein;
+ falls die Zeile auf der geforderten Seite keinen Platz hat, wird
+ eine neue Seite eingefuegt }
+ BEGIN
+ IF dest_page = nil THEN
+ IF (list.const_page <> nil) AND (list.no_of_bottom_lines = 0) THEN
+ BEGIN
+ { Liste enthaelt nur leere Seiten }
+ dest_page := list.const_page;
+ dest_ind := 1;
+ END
+ ELSE
+ BEGIN
+ { die angesprochene Seite existiert nicht: fuege leere Seite an;
+ falls bereits eine existiert, dann verwende diese bereits
+ initialisierte Seite }
+ IF list.const_page <> nil THEN
+ buffer.buffer := list.const_page^.page.buffer;
+ buffer.rpl.no_of_lines := 0;
+ buffer.rpl.more_flag := flag_off;
+ append_const_page (list, @buffer.rpl , get_last_const_page (list));
+ dest_page := get_last_const_page (list);
+ dest_ind := 1;
+ IF dest_page = nil THEN
+ EXIT(**);
+ END;
+
+ IF nol_in_page (dest_page) = list.max_nol_in_page THEN
+ { es musz eine neue Seite eingefuegt werden }
+ BEGIN
+ nol := list.no_of_bottom_lines; { merke Anzahl Zeilen }
+
+ { dupliziere dest_page und fuege sie hinter dest_page ein }
+ append_const_page (list, @dest_page^.page.rpl , dest_page);
+
+ { ueberschreibe dest_ind mit neuer Zeile }
+ copy_line_to_page (lpt, dest_page, dest_ind);
+
+ { loesche alle weiteren Zeilen in dieser Seite }
+ set_nol_in_page (dest_page, dest_ind);
+
+ { loesche die Zeilen 1 bis dest_ind - 1 in zweiter Seite }
+ FOR i := 1 TO dest_ind - 1 DO
+ change_const_line (list, change_delete, nil, dest_page^.next_page, 1,
+ get_line_pointer, copy_line_to_page);
+
+ list.no_of_bottom_lines := nol + 1; { restauriere Anzahl Zeilen }
+ END
+ ELSE
+ BEGIN
+ { verschiebe nachfolgende Zeilen }
+ FOR i := nol_in_page (dest_page) DOWNTO dest_ind DO
+ copy_line_to_page (get_line_pointer (dest_page, i), dest_page, i + 1);
+
+ { kopiere Zeile in freigewordenen Platz }
+ copy_line_to_page (lpt, dest_page, dest_ind);
+
+ { erhoehe Anzahl Zeilen }
+ list.no_of_bottom_lines := list.no_of_bottom_lines + 1;
+ set_nol_in_page (dest_page, nol_in_page (dest_page) + 1);
+ END;
+ END;
+
+ change_copy:
+ { kopiert die Zeile lpt nach dest }
+ copy_line_to_page (lpt, dest_page, dest_ind);
+
+ ELSE(**)
+ END;
+
+END; { change_const_line }
+
+{ ************************* set_line_flags ******************************** }
+
+PROCEDURE set_line_flags
+ (page: page_pointer; ind: short; select, attribute: char;
+ get_line_pointer: get_line_pointer_type) ;
+
+{ Setze Zeilenattribute der Zeile page/ind auf select/attribute:
+ select = ' ' keine Aenderung
+ select = invert_flag, dann invertiere 'selected'
+ attribute = ' ' keine Aenderung }
+
+VAR
+ lpt: ts_rpl_line_pointer;
+
+BEGIN
+lpt := get_line_pointer (page, ind);
+IF lpt <> nil THEN
+ BEGIN
+ IF select <> ' ' THEN
+ IF select = invert_flag THEN
+ IF (lpt^.line_flags.selected = flag_on) OR
+ (lpt^.line_flags.selected = action_select) OR
+ (lpt^.line_flags.selected = chr(1)) THEN
+ lpt^.line_flags.selected := flag_off
+ ELSE
+ lpt^.line_flags.selected := flag_on
+ ELSE
+ lpt^.line_flags.selected := select;
+ IF attribute <> ' ' THEN
+ lpt^.line_flags.attribute := attribute;
+ END;
+END; { set_line_flags }
+
+{ ************************* get_line_flags ******************************** }
+
+PROCEDURE get_line_flags
+ (page: page_pointer; ind: short; VAR select, attribute: char;
+ get_line_pointer: get_line_pointer_type) ;
+
+{ holt die Attribute der Zeile }
+
+VAR
+ lpt: ts_rpl_line_pointer;
+
+BEGIN
+lpt := get_line_pointer (page, ind);
+IF lpt = nil THEN
+ BEGIN
+ select := flag_off;
+ attribute := attribute_normal;
+ END
+ELSE
+ BEGIN
+ select := lpt^.line_flags.selected;
+ attribute := lpt^.line_flags.attribute;
+ END;
+END; { get_line_flags }
+
+{ ************************* is_selected *********************************** }
+
+FUNCTION is_selected
+ (list: list_cb_type; page: page_pointer; ind: short;
+ get_line_pointer: get_line_pointer_type): boolean ;
+
+{ prueft auf Selektion einer Zeile:
+ eine Zeile ist selektiert, wenn
+ 'line_flags.selected' = flag_on oder action_selected oder chr(1)
+ oder 'liste.selected' auf dieser Zeile steht }
+
+VAR
+ selpage : page_pointer;
+ selind : short;
+ selected : char;
+ attribute: char;
+
+BEGIN
+get_line (list, list.selected, selpage, selind);
+IF (page = nil) OR (selpage = nil) THEN
+ BEGIN
+ is_selected := false;
+ EXIT(**)
+ END;
+IF (page = selpage) AND (ind = selind) THEN
+ is_selected := true
+ELSE
+ BEGIN
+ get_line_flags (page, ind, selected, attribute, get_line_pointer);
+ is_selected := (selected = flag_on) OR (selected = action_select) OR
+ (selected = chr(1));
+ END;
+END; { is_selected }
+
+{ ************************* set_list_line_flags *************************** }
+
+PROCEDURE set_list_line_flags
+ (VAR list: list_cb_type; select, attribute: char;
+ get_line_pointer: get_line_pointer_type
+ ) ;
+
+{ Setze alle Zeilenattribute der Liste auf die neuen Werte
+ (siehe 'set_line_flags') }
+
+VAR
+ page: page_pointer;
+ ind : short;
+
+BEGIN
+page := list.first_page;
+ind := 1;
+WHILE page <> nil DO
+ BEGIN
+ set_line_flags (page, ind, select, attribute, get_line_pointer);
+ get_next_line (list, page, ind);
+ END;
+END; { set_list_line_flags }
+
+{ ************************* get_next_selected_line ************************ }
+
+PROCEDURE get_next_selected_line
+ (VAR list: list_cb_type; VAR page: page_pointer; VAR ind: short;
+ get_line_pointer: get_line_pointer_type) ;
+
+{ holt den naechsten selektierten Nachfolger von page/ind }
+
+VAR
+ selected : char;
+ attribute: char;
+
+BEGIN
+REPEAT
+ get_next_line (list, page, ind);
+ list.selected := list.selected + 1;
+ IF page = nil THEN
+ EXIT(**);
+ get_line_flags (page, ind, selected, attribute, get_line_pointer);
+ IF (selected = flag_on) OR (selected = action_select) OR (selected = chr(1)) THEN
+ EXIT(**);
+ UNTIL false;
+END; { get_next_selected_line }
+
+{ ************************* get_prev_selected_line ************************ }
+
+PROCEDURE get_prev_selected_line
+ (VAR list: list_cb_type; VAR page: page_pointer; VAR ind: short;
+ get_line_pointer: get_line_pointer_type) ;
+
+{ holt den naechsten selektierten Vorgaenger von page/ind }
+
+VAR
+ selected : char;
+ attribute: char;
+
+BEGIN
+REPEAT
+ get_prev_line (list, page, ind);
+ list.selected := list.selected - 1;
+ IF page = nil THEN
+ EXIT(**);
+ get_line_flags (page, ind, selected, attribute, get_line_pointer);
+ IF (selected = flag_on) OR (selected = action_select) OR (selected = chr(1)) THEN
+ EXIT(**);
+ UNTIL false;
+END; { get_prev_selected_line }
+
+{ ************************* get_first_selected_line_m *********************** }
+
+PROCEDURE get_first_selected_line_m
+ (VAR list: list_cb_type; VAR page: page_pointer; VAR ind: short;
+ get_line_pointer: get_line_pointer_type) ;
+
+{ holt die erste selektierte Zeile der Liste }
+
+VAR
+ selected : char;
+ attribute: char;
+
+BEGIN
+list.selected := 1;
+get_line (list, 1, page, ind);
+get_line_flags (page, ind, selected, attribute, get_line_pointer);
+IF (selected = flag_on) OR (selected = action_select) OR (selected = chr(1)) THEN
+ EXIT(**);
+get_next_selected_line (list, page, ind, get_line_pointer);
+END; { get_first_selected_line_m }
+
+{ ************************* get_first_selected_line ************************ }
+
+PROCEDURE get_first_selected_line
+ (VAR list: list_cb_type; VAR page: page_pointer; VAR ind: short;
+ get_line_pointer: get_line_pointer_type) ;
+
+{ holt die erste selektierte Zeile der Liste }
+
+BEGIN
+get_line (list, 1, page, ind);
+IF page = nil THEN
+ EXIT(**);
+IF is_selected (list, page, ind, get_line_pointer) THEN
+ EXIT(**);
+list.selected := 1;
+get_next_selected_line (list, page, ind, get_line_pointer);
+END; { get_first_selected_line }
+
+{ ************************* get_selected_emplno *************************** }
+
+CONST
+ cur_emplno = 1;
+ next_emplno = 2;
+ prev_emplno = 3;
+
+TYPE
+{hie war $I tsdemp.inc}
+
+ conv_demp_type = RECORD
+ CASE ptr_type: integer OF
+ 1: (buffer_ptr: buffer_pointer);
+ 2: (req_ptr : ts_demp_pointer);
+ 3: (rpl_ptr : ts_demp_rpl_pointer);
+ END;
+ lpt_demp_ptr_type = RECORD
+ CASE ptr_type: integer OF
+ 1: (lpt : ts_demp_lpt);
+ 2: (rpl_lpt : ts_rpl_line_pointer);
+ END;
+
+FUNCTION get_demp_line (page: page_pointer; line: short): ts_rpl_line_pointer;
+
+VAR
+ c1: conv_demp_type;
+ c2: lpt_demp_ptr_type;
+
+BEGIN
+get_demp_line := nil;
+IF (line < 1) OR (line > demp_rpl_ct) THEN
+ page := nil;
+IF page = nil THEN
+ EXIT(**);
+c1.buffer_ptr := @page^.page.rpl.rpldata ;
+c2.lpt := @c1.rpl_ptr^.line_tab(.line.) ;
+get_demp_line := c2.rpl_lpt;
+END; { get_demp_line }
+
+FUNCTION get_selected_emplno (which_emplno: short): string;
+
+VAR
+ c1: lpt_demp_ptr_type;
+ page: page_pointer;
+ line: short;
+ old_selected : short;
+
+BEGIN
+
+get_selected_emplno := '';
+old_selected := demp_list.selected;
+
+get_line (demp_list, demp_list.selected, page, line);
+IF page = nil THEN
+ BEGIN
+ message_code := '6601';
+ EXIT(**)
+ END;
+
+IF which_emplno = next_emplno THEN
+ get_next_selected_line (demp_list, page, line, get_demp_line);
+IF which_emplno = prev_emplno THEN
+ get_prev_selected_line (demp_list, page, line, get_demp_line);
+
+IF page = nil THEN
+ BEGIN
+ demp_list.selected := old_selected;
+ IF which_emplno = prev_emplno THEN
+ message_code := '6602';
+ IF which_emplno = next_emplno THEN
+ message_code := '6603';
+ END
+ELSE
+ BEGIN
+ c1.rpl_lpt := get_demp_line (page, line);
+
+{pspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspsp}
+{ get_selected_emplno := STRI (@c1.lpt^.emplno, SizeOf (c1.lpt^.emplno)) ;}
+ END;
+
+END; { get_selected_emplno }
+
+{ ************************* get_next_selected_emplno *********************** }
+
+FUNCTION get_next_selected_emplno : string ;
+
+BEGIN
+get_next_selected_emplno := get_selected_emplno (next_emplno);
+END; { get_next_selected_emplno }
+
+{ ************************* get_prev_selected_emplno *********************** }
+
+FUNCTION get_prev_selected_emplno : string ;
+
+BEGIN
+get_prev_selected_emplno := get_selected_emplno (prev_emplno);
+END; { get_prev_selected_emplno }
+
+BEGIN
+END;
+
+PROCEDURE timestamp_to_date
+ (at_timestamp : long; VAR date: date_type)
+ ;
+
+{ converts a number of days (where 1.1.1901 is 1) into a date }
+
+LABEL 1;
+
+{ number of days passed, when the i+1-st month starts }
+
+
+(*
+CONST month_days : ARRAY [0..11] of short =
+ (0,31,59,90,120,151,181,212,243,273,304,334);
+*)
+
+
+
+VAR
+ i, no_of_leap_years: short;
+
+BEGIN
+
+IF at_timestamp <= 0 THEN WITH date DO
+ BEGIN
+ yy := 0; mo := 0; dd := 0;
+ EXIT(**)
+ END;
+
+date.yy := (at_timestamp DIV 365) + 1901;
+no_of_leap_years := (date.yy - 1901) DIV 4;
+IF no_of_leap_years >= (at_timestamp MOD 365) THEN
+ BEGIN
+ date.yy := date.yy - 1;
+ at_timestamp := 365 - (no_of_leap_years - (at_timestamp MOD 365));
+ IF ((date.yy MOD 4) = 0) THEN
+ at_timestamp := at_timestamp + 1; {leap year is not yet completed, but
+ one day has already been subtracted before}
+ END
+ELSE
+ at_timestamp := (at_timestamp MOD 365) - no_of_leap_years;
+
+IF ((date.yy MOD 4) = 0) AND (at_timestamp = 60) THEN
+ BEGIN
+ date.mo := 2;
+ date.dd := 29;
+ EXIT(**)
+ END
+ELSE
+ BEGIN
+ FOR i := 1 TO 11 DO
+ IF at_timestamp <= month_days[i] THEN
+ BEGIN
+ date.mo := i;
+ date.dd := at_timestamp - month_days[i-1];
+ GOTO 1;
+ END;
+ date.mo := 12;
+ date.dd := at_timestamp - month_days[11];
+ END;
+
+1:
+IF ((date.yy MOD 4) = 0) AND (date.mo > 2) THEN
+ {subtract one day}
+ IF date.dd = 1 THEN
+ BEGIN
+ date.mo := date.mo - 1;
+ {last day of date.mo}
+ date.dd := month_days[date.mo] - month_days[date.mo - 1];
+ END
+ ELSE
+ date.dd := date.dd - 1;
+
+END; { timestamp_to_date }
+
+(* end of location *)
+
+BEGIN
+END.
diff --git a/misc/pascal/tests/src/README b/misc/pascal/tests/src/README
new file mode 100644
index 000000000..f13a2f7e1
--- /dev/null
+++ b/misc/pascal/tests/src/README
@@ -0,0 +1,9 @@
+README
+^^^^^^
+
+Some of these pascal files were collected from the internet
+and their original sources are lost to memory. Since they are
+included here only for testing purposes, I suspect that there
+are no licensing issues... However, I would avoid using any of
+these files as part of a pascal application!
+
diff --git a/misc/pascal/tests/testall.sh b/misc/pascal/tests/testall.sh
new file mode 100755
index 000000000..6af7570ea
--- /dev/null
+++ b/misc/pascal/tests/testall.sh
@@ -0,0 +1,124 @@
+#!/bin/sh
+############################################################################
+# testall.sh
+#
+# Copyright (C) 2008 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# 3. Neither the name NuttX nor the names of its contributors may be
+# used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+############################################################################
+#set -x
+
+TSTLST="\
+./501-uses.sh\
+"
+
+# Parse command line
+DOLIST=A
+if [ -n "$1" ]; then
+ case "$1" in
+ [0,1,2,5,8,9,A] )
+ DOLIST=${1}
+ ;;
+ a )
+ DOLIST=A
+ ;;
+ * )
+ echo ""; echo "Unrecognized filter option"
+ show_usage
+ ;;
+ esac
+fi
+
+# Tell them how they are supposed to use this script
+function show_usage ()
+{
+ echo "USAGE:"
+ echo " ${0} [FILTER]"
+ echo "WHERE:"
+ echo " FILTER=0: Execute on basic functionaly tests"
+ echo " FILTER=1: Execute only math and runtime libraries"
+ echo " FILTER=2: Execute only string tests"
+ echo " FILTER=5: Execute only multi-file tests"
+ echo " FILTER=8: Execute only Erie pascal programs"
+ echo " FILTER=9: Execute only miscellaneous large programs"
+ echo " FILTER=A: Execute all tests"
+ echo " Default: Execute all tests"
+ exit 1
+}
+
+# Check if the following test should be executed
+function check_dolist ()
+{
+ BASEFILE=`basename ${1}`
+ FILECHAR=`echo "${BASEFILE}" | cut -b1`
+ if [ "${DONTLIST}" == "${FILECHAR}" ]; then
+ echo "YES"
+ else
+ if [ "${DOLIST}" == "A" ]; then
+ echo "NO"
+ else
+ if [ "${DOLIST}" == "${FILECHAR}" ]; then
+ echo "NO"
+ else
+ echo "YES"
+ fi
+ fi
+ fi
+}
+
+# Clean up
+rm -f src/*.o src/*.o1 src/*.pex src/*.err src/*.lst
+
+# Compile and execute all of the selected tests in the src
+# directory. Skip the multiple scripts; they must be handled
+# by custom scripts
+DONTLIST=5
+for file in `ls -1 src/*.pas`; do
+
+ SKIPPING=`check_dolist $file`
+ if [ "${SKIPPING}" == "YES" ]; then
+ echo "SKIPPING $file"
+ else
+ echo "########${file}########";
+ ./testone.sh ${file}
+ fi
+done
+
+# Special tests performed by custom scripts
+DONTLIST=X
+for file in ${TSTLST}; do
+ SKIPPING=`check_dolist $file`
+ if [ "${SKIPPING}" == "YES" ]; then
+ echo "SKIPPING $file"
+ else
+ ${file}
+ fi
+done
+exit
diff --git a/misc/pascal/tests/testone.sh b/misc/pascal/tests/testone.sh
new file mode 100755
index 000000000..9f407e331
--- /dev/null
+++ b/misc/pascal/tests/testone.sh
@@ -0,0 +1,166 @@
+#!/bin/sh
+############################################################################
+# testone.sh
+#
+# Copyright (C) 2008 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# 3. Neither the name NuttX nor the names of its contributors may be
+# used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+############################################################################
+#set -x
+
+source ../.config
+
+if [ "${CONFIG_INSN16}" == "y" ]; then
+ BINDIR=bin16
+fi
+if [ "${CONFIG_INSN32}" == "y" ]; then
+ BINDIR=bin32
+fi
+
+PASCAL=../${BINDIR}/pascal
+POPT=../${BINDIR}/popt
+REGM=../${BINDIR}/regm
+PLINK=../${BINDIR}/plink
+PRUN=../${BINDIR}/prun
+
+# Tell them how they are supposed to use this script
+
+function show_usage ()
+{
+ echo "USAGE:"
+ echo " ${0} [OPTION] <pas-file-basename>"
+ echo "OPTIONS:"
+ echo " -t <strstksz>: Select string stack size"
+ echo " -h: Show this text"
+ exit 1
+}
+
+# Get the source file name and path
+
+function get_sourcename ()
+{
+ PASBASENAME=`basename ${PASFILENAME} .pas`
+ PASDIRNAME=`dirname ${PASFILENAME}`
+ if [ "${PASDIRNAME}" == "." ]; then
+ PASDIRNAME=src
+ fi
+
+ PASFILENAME=${PASDIRNAME}/${PASBASENAME}.pas
+ if [ ! -f "${PASFILENAME}" ]; then
+ echo "ERROR: ${PASFILENAME} does not exist"
+ exit 1
+ fi
+}
+
+# Compile source file
+
+function compile_source ()
+{
+ if [ ! -f ${PASFILENAME} ]; then
+ echo "No source file"
+ else
+ PASOPTS=-Isrc
+ ${PASCAL} ${PASOPTS} ${PASFILENAME} 2>&1 || rm -f src/${PASBASENAME}.o1
+ if [ -f src/${PASBASENAME}.err ] ; then
+ cat src/${PASBASENAME}.err | grep Line
+ fi
+ if [ ! -f src/${PASBASENAME}.o1 ] ; then
+ echo "Compilation failed"
+ else
+
+ if [ "${CONFIG_REGM}" == "y" ]; then
+ POPTOPTS=-r
+ ${POPT} ${POPTOPTS} src/${PASBASENAME}.o1 2>&1
+ ${REGM} src/${PASBASENAME}.o1 2>&1
+ else
+ POPTOPTS=
+ ${POPT} ${POPTOPTS} src/${PASBASENAME}.o1 2>&1
+ ${PLINK} src/${PASBASENAME}.o src/${PASBASENAME}.pex 2>&1
+ fi
+ fi
+ fi
+}
+
+# Run test
+
+function test_program ()
+{
+ if [ "${CONFIG_REGM}" == "y" ]; then
+ echo "Don't know how to run REGM programs yet"
+ else
+ echo "Using string stack size = ${STRSTKSZ}"
+ PRUNOPTS="-t ${STRSTKSZ}"
+
+ if [ ! -f src/${PASBASENAME}.pex ]; then
+ echo "No p-code executable"
+ else
+ if [ -f src/${PASBASENAME}.inp ] ; then
+ ${PRUN} ${PRUNOPTS} src/${PASBASENAME}.pex 2>&1 <src/${PASBASENAME}.inp
+ else
+ ${PRUN} ${PRUNOPTS} src/${PASBASENAME}.pex 2>&1
+ fi
+ fi
+ fi
+}
+
+
+# Parse command line
+
+STRSTKSZ=1024
+PASFILENAME=
+
+while [ -n "$1" ]; do
+ case "$1" in
+ -t )
+ STRSTKSZ=$2
+ shift
+ ;;
+ -h )
+ show_usage
+ ;;
+ * )
+ PASFILENAME=$1
+ ;;
+ esac
+ shift
+done
+
+if [ -z "${PASFILENAME}" ]; then
+ echo "ERROR: No file name provided"
+ show_usage
+ exit 1
+fi
+
+# Get the source file name and path
+
+get_sourcename
+compile_source
+test_program
+