summaryrefslogtreecommitdiff
path: root/ipl/packs/loadfuncpp/examples
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/packs/loadfuncpp/examples')
-rw-r--r--ipl/packs/loadfuncpp/examples/Makefile51
-rw-r--r--ipl/packs/loadfuncpp/examples/Makefile.mak34
-rw-r--r--ipl/packs/loadfuncpp/examples/arglist.cpp18
-rw-r--r--ipl/packs/loadfuncpp/examples/arglist.icn7
-rw-r--r--ipl/packs/loadfuncpp/examples/callicon.cpp18
-rw-r--r--ipl/packs/loadfuncpp/examples/callicon.icn24
-rw-r--r--ipl/packs/loadfuncpp/examples/carl.icn50
-rw-r--r--ipl/packs/loadfuncpp/examples/coexp.cpp20
-rw-r--r--ipl/packs/loadfuncpp/examples/coexp.icn15
-rw-r--r--ipl/packs/loadfuncpp/examples/compare.icn7
-rw-r--r--ipl/packs/loadfuncpp/examples/examples.txt12
-rw-r--r--ipl/packs/loadfuncpp/examples/extwidget.cpp35
-rw-r--r--ipl/packs/loadfuncpp/examples/extwidget.icn14
-rw-r--r--ipl/packs/loadfuncpp/examples/factorials.icn27
-rw-r--r--ipl/packs/loadfuncpp/examples/hello.icn3
-rw-r--r--ipl/packs/loadfuncpp/examples/hexwords.icn18
-rw-r--r--ipl/packs/loadfuncpp/examples/hexwords_oneline.icn8
-rw-r--r--ipl/packs/loadfuncpp/examples/iterate.cpp26
-rw-r--r--ipl/packs/loadfuncpp/examples/iterate.icn13
-rw-r--r--ipl/packs/loadfuncpp/examples/iterate2.cpp31
-rw-r--r--ipl/packs/loadfuncpp/examples/iterate2.icn13
-rw-r--r--ipl/packs/loadfuncpp/examples/iterate3.cpp32
-rw-r--r--ipl/packs/loadfuncpp/examples/iterate3.icn9
-rw-r--r--ipl/packs/loadfuncpp/examples/jmexample.cpp52
-rw-r--r--ipl/packs/loadfuncpp/examples/jmexample.icn8
-rw-r--r--ipl/packs/loadfuncpp/examples/kwd_vbl.cpp17
-rw-r--r--ipl/packs/loadfuncpp/examples/kwd_vbl.icn10
-rw-r--r--ipl/packs/loadfuncpp/examples/loadfuncpp.h481
-rw-r--r--ipl/packs/loadfuncpp/examples/methodcall.cpp18
-rw-r--r--ipl/packs/loadfuncpp/examples/methodcall.icn23
-rw-r--r--ipl/packs/loadfuncpp/examples/mkexternal.cpp15
-rw-r--r--ipl/packs/loadfuncpp/examples/mkexternal.icn14
-rw-r--r--ipl/packs/loadfuncpp/examples/newprimes.icn4
-rw-r--r--ipl/packs/loadfuncpp/examples/numbernamer.icn61
-rw-r--r--ipl/packs/loadfuncpp/examples/primes.icn26
-rw-r--r--ipl/packs/loadfuncpp/examples/runerr.cpp31
-rw-r--r--ipl/packs/loadfuncpp/examples/runerr.icn32
-rw-r--r--ipl/packs/loadfuncpp/examples/stop.cpp16
-rw-r--r--ipl/packs/loadfuncpp/examples/stop.icn10
-rw-r--r--ipl/packs/loadfuncpp/examples/sums.icn8
-rw-r--r--ipl/packs/loadfuncpp/examples/sums2.icn6
41 files changed, 1317 insertions, 0 deletions
diff --git a/ipl/packs/loadfuncpp/examples/Makefile b/ipl/packs/loadfuncpp/examples/Makefile
new file mode 100644
index 0000000..06bfc3f
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/Makefile
@@ -0,0 +1,51 @@
+
+#Automatically generated from Makefile.mak and examples.txt by ../savex.icn
+
+ifndef TARGET
+
+ifneq ($(strip $(shell g++ -v 2>&1 | grep "darwin")),)
+TARGET=mac
+else
+ifneq ($(strip $(shell g++ -v 2>&1 | grep "cygwin")),)
+TARGET=cygwin
+else
+TARGET=other
+endif
+endif
+
+endif
+
+
+FLAGS_cygwin = /opt/icon/bin/iload.a -Wl,--enable-auto-import
+FLAGS_other =
+
+SHARED_mac = -bundle -undefined suppress
+SHARED_cygwin = -shared
+SHARED_other = -shared
+
+IMPLIB_cygwin = -Wl,--out-implib=iload.a
+PIC_other = -fPIC
+PIC_mac = -flat_namespace
+
+
+
+EXAMPLES = callicon.exe coexp.exe extwidget.exe iterate.exe iterate2.exe iterate3.exe jmexample.exe kwd_vbl.exe methodcall.exe mkexternal.exe runerr.exe stop.exe
+DYNAMICS = callicon.so coexp.so extwidget.so iterate.so iterate2.so iterate3.so jmexample.so kwd_vbl.so methodcall.so mkexternal.so runerr.so stop.so
+
+%.so : %.cpp loadfuncpp.h loadfuncpp.u1
+ g++ $(SHARED_$(TARGET)) $(PIC_$(TARGET)) -o $@ $< $(FLAGS_$(TARGET))
+
+%.exe : %.icn %.so iload.so
+ icont -so $@ $*
+
+default: $(DYNAMICS) $(EXAMPLES)
+
+.PHONY : iload.so loadfuncpp.h loadfuncpp.u1
+
+loadfuncpp.h : ../loadfuncpp.h
+ cp ../loadfuncpp.h ./
+
+test : clean default
+
+clean :
+ rm -f *.exe *.so *.o *% *~ core .#* *.u?
diff --git a/ipl/packs/loadfuncpp/examples/Makefile.mak b/ipl/packs/loadfuncpp/examples/Makefile.mak
new file mode 100644
index 0000000..28c87a3
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/Makefile.mak
@@ -0,0 +1,34 @@
+
+ifndef TARGET
+ifneq ($(strip $(shell g++ -v 2>&1 | grep "cygwin")),)
+TARGET=cygwin
+else
+TARGET=other
+endif
+endif
+
+FLAGS_cygwin = /opt/icon/bin/iload.a -Wl,--enable-auto-import
+FLAGS_other =
+
+PIC_other = -fPIC
+
+EXAMPLES = #exe#
+DYNAMICS = #so#
+
+%.so : %.cpp loadfuncpp.h loadfuncpp.u1
+ g++ -shared $(PIC_$(TARGET)) -o $@ $< $(FLAGS_$(TARGET))
+
+%.exe : %.icn %.so iload.so
+ icont -so $@ $*
+
+default: $(DYNAMICS) $(EXAMPLES)
+
+.PHONY : iload.so loadfuncpp.h loadfuncpp.u1
+
+loadfuncpp.h : ../loadfuncpp.h
+ cp ../loadfuncpp.h ./
+
+test : clean default
+
+clean :
+ rm -f *.exe *.so *.o *% *~ core .#*
diff --git a/ipl/packs/loadfuncpp/examples/arglist.cpp b/ipl/packs/loadfuncpp/examples/arglist.cpp
new file mode 100644
index 0000000..a62d347
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/arglist.cpp
@@ -0,0 +1,18 @@
+
+/* Example of a C++ extension to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Type 'make <platform>' to build.
+ * For available <platform>s type 'make'.
+ * Carl Sturtivant, 2007/9/25
+ */
+
+#include "loadfuncpp.h"
+
+
+extern "C" int iexample(int argc, value argv[]) {
+ safe x(argc, argv); //make the arguments into an Icon list
+ argv[0] = x;
+ return SUCCEEDED;
+}
+
+
diff --git a/ipl/packs/loadfuncpp/examples/arglist.icn b/ipl/packs/loadfuncpp/examples/arglist.icn
new file mode 100644
index 0000000..bb17a46
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/arglist.icn
@@ -0,0 +1,7 @@
+
+procedure main()
+ loadfunc("./iload.so", "loadfuncpp")
+ f := loadfunc("./iexample.so", "iexample")
+ every write( !( f(1,2,3,4) ) )
+end
+
diff --git a/ipl/packs/loadfuncpp/examples/callicon.cpp b/ipl/packs/loadfuncpp/examples/callicon.cpp
new file mode 100644
index 0000000..7d0a224
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/callicon.cpp
@@ -0,0 +1,18 @@
+
+/* Example of a C++ extension to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Type 'make <platform>' to build.
+ * For available <platform>s type 'make'.
+ * Carl Sturtivant, 2007/9/25
+ */
+
+#include "loadfuncpp.h"
+
+
+
+extern "C" int iexample(int argc, value argv[]) {
+ argv[0] = argv[1].apply(argv[2]);
+ return SUCCEEDED;
+}
+
+
diff --git a/ipl/packs/loadfuncpp/examples/callicon.icn b/ipl/packs/loadfuncpp/examples/callicon.icn
new file mode 100644
index 0000000..c3e10ee
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/callicon.icn
@@ -0,0 +1,24 @@
+
+link loadfuncpp
+
+procedure main()
+ icall := loadfuncpp("./callicon.so", "iexample")
+
+ write( icall(f, ["Argument passed"]) )
+end
+
+procedure f(arg)
+ write(arg)
+ write("Called from C++")
+ every write( g(arg) )
+ x := create g(arg)
+ while writes(@x)
+ write()
+ return "Result string!"
+end
+
+procedure g(arg)
+ suspend !arg
+end
+
+
diff --git a/ipl/packs/loadfuncpp/examples/carl.icn b/ipl/packs/loadfuncpp/examples/carl.icn
new file mode 100644
index 0000000..2d7c6a4
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/carl.icn
@@ -0,0 +1,50 @@
+
+#here's cat in icon (line by line):
+
+procedure main()
+ while write(read()) #fails when eof
+end
+
+#here's writing out the command line arguments
+
+procedure main(arg) #passed a list of strings
+ every write( !arg) # ! (bang) makes a generator sequence
+end
+
+#here's finding all lines in standard input containing "frog"
+
+procedure main()
+ while line := read() do line ? #string matching subject is line
+ if find("frog") then write(line)
+end
+
+#here's finding the text on each line that contains "frog" that
+#lies before the first occurrence of "frog"
+
+procedure main()
+ while line := read() do line ? #string matching subject is line
+ write( tab(find("frog")) )
+end
+
+#here's generating the first 1000 squares
+
+procedure main()
+ every write( squares() ) \1000 #truncate generator to 1000 results
+end
+
+procedure squares()
+ n := 0
+ repeat {
+ n +:= 1
+ suspend n^2 #shoot out next element of generator sequence
+ }
+end
+
+procedure main()
+ (n := 1) | |( n +:= 1, n^2 )
+end
+
+#So that
+procedure main()
+ every write( (n := 1) | |( n +:= 1, n^2 ) ) \1000
+end
diff --git a/ipl/packs/loadfuncpp/examples/coexp.cpp b/ipl/packs/loadfuncpp/examples/coexp.cpp
new file mode 100644
index 0000000..6c3b1d1
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/coexp.cpp
@@ -0,0 +1,20 @@
+
+/* Example of a C++ extension to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Type 'make <platform>' to build.
+ * For available <platform>s type 'make'.
+ * Carl Sturtivant, 2007/9/25
+ */
+
+#include "loadfuncpp.h"
+
+extern "C" int activate(int argc, value argv[]) {
+ argv[0] = argv[1].activate();
+ return SUCCEEDED;
+}
+
+extern "C" int refresh(int argc, value argv[]) {
+ argv[0] = argv[1].refreshed();
+ return SUCCEEDED;
+}
+
diff --git a/ipl/packs/loadfuncpp/examples/coexp.icn b/ipl/packs/loadfuncpp/examples/coexp.icn
new file mode 100644
index 0000000..5f38014
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/coexp.icn
@@ -0,0 +1,15 @@
+
+link loadfuncpp
+
+procedure main()
+ activate := loadfuncpp("./coexp.so", "activate")
+ refresh := loadfuncpp("./coexp.so", "refresh")
+ x := create 1 to 7
+ @x
+ @x
+ write( activate(x) )
+ x := refresh(x)
+ write( activate(x) )
+end
+
+
diff --git a/ipl/packs/loadfuncpp/examples/compare.icn b/ipl/packs/loadfuncpp/examples/compare.icn
new file mode 100644
index 0000000..c6823ec
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/compare.icn
@@ -0,0 +1,7 @@
+
+procedure main()
+ loadfunc("./iload.so", "loadfuncpp")
+ f := loadfunc("./iexample.so", "iexample")
+ write( f(100,10) )
+end
+
diff --git a/ipl/packs/loadfuncpp/examples/examples.txt b/ipl/packs/loadfuncpp/examples/examples.txt
new file mode 100644
index 0000000..40eb40a
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/examples.txt
@@ -0,0 +1,12 @@
+callicon
+coexp
+extwidget
+iterate
+iterate2
+iterate3
+jmexample
+kwd_vbl
+methodcall
+mkexternal
+runerr
+stop
diff --git a/ipl/packs/loadfuncpp/examples/extwidget.cpp b/ipl/packs/loadfuncpp/examples/extwidget.cpp
new file mode 100644
index 0000000..bb42364
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/extwidget.cpp
@@ -0,0 +1,35 @@
+
+/* Example of a C++ extension to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Type 'make iexample' to build.
+ * Carl Sturtivant, 2008/3/16
+ */
+
+#include "loadfuncpp.h"
+using namespace Icon;
+
+#include <cstdio>
+
+class Widget: public external {
+ long state;
+ public:
+ Widget(long x): state(x) {}
+
+ virtual value name() {
+ return "Widget";
+ }
+ virtual external* copy() {
+ return new Widget(state);
+ }
+ virtual value image() {
+ char sbuf[100];
+ sprintf(sbuf, "Widget_%ld(%ld)", id, state);
+ return value(NewString, sbuf);
+ }
+};
+
+extern "C" int iexample(int argc, value argv[]) {
+ argv[0] = new Widget(99);
+ return SUCCEEDED;
+}
+
diff --git a/ipl/packs/loadfuncpp/examples/extwidget.icn b/ipl/packs/loadfuncpp/examples/extwidget.icn
new file mode 100644
index 0000000..b924fd7
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/extwidget.icn
@@ -0,0 +1,14 @@
+
+link loadfuncpp
+
+procedure main()
+ iexample := loadfuncpp("./extwidget.so", "iexample")
+ external := iexample()
+ external2 := copy(external)
+ write( type(external) )
+ write( image(external) )
+ write( type(external2) )
+ write( image(external2) )
+end
+
+
diff --git a/ipl/packs/loadfuncpp/examples/factorials.icn b/ipl/packs/loadfuncpp/examples/factorials.icn
new file mode 100644
index 0000000..908ea97
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/factorials.icn
@@ -0,0 +1,27 @@
+procedure main ()
+ every n := 1 to 10 do {
+ write (n, "! = ", memoized_factorial ( n ) );
+ }
+ n := 135; write(n, "! = ", memoized_factorial ( n ) );
+ n := 155; write(n, "! = ", memoized_factorial ( n ) );
+end
+procedure memoized_factorial ( k )
+ static results;
+ static k_limit;
+ static k_old;
+ initial {
+ results := [1];
+ k_limit := 10 ^ 5;
+ k_old := 1;
+ }
+ if (k < k_limit) then {
+ while (k > *results) do results := results ||| list(*results)
+ every n := (k_old + 1) to k do {
+ results[n] := n * results[n - 1];
+ }
+ k_old := k;
+ return results[k];
+ } else {
+ return ((k / &e) ^ n) * sqrt(2 * &pi * n);
+ }
+end
diff --git a/ipl/packs/loadfuncpp/examples/hello.icn b/ipl/packs/loadfuncpp/examples/hello.icn
new file mode 100644
index 0000000..5a24d9a
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/hello.icn
@@ -0,0 +1,3 @@
+procedure main ()
+ write ( "Yarrr, matey, bilge the yardarm!" );
+end
diff --git a/ipl/packs/loadfuncpp/examples/hexwords.icn b/ipl/packs/loadfuncpp/examples/hexwords.icn
new file mode 100644
index 0000000..43c35ca
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/hexwords.icn
@@ -0,0 +1,18 @@
+procedure printable(word)
+ if ("" == word) then {
+ return "";
+ } else {
+ return map(map(word, "oOiIzZeEsStT", "001122335577"), &lcase, &ucase);
+ }
+end
+procedure main(arg)
+ word_file := "/usr/share/dict/words";
+ find := '0123456789abcdefABCDEFoOiIzZeEsStT';
+ usage := "Finds all the words in a word file that can be written using /^[A-Fa-f0-9$/";
+ words := open(word_file) | stop("Unable to open: " || word_file)
+ while word := trim(read(words)) do {
+ if ('' == word -- find) then {
+ write(printable(word) || " " || word);
+ }
+ }
+end
diff --git a/ipl/packs/loadfuncpp/examples/hexwords_oneline.icn b/ipl/packs/loadfuncpp/examples/hexwords_oneline.icn
new file mode 100644
index 0000000..6e11041
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/hexwords_oneline.icn
@@ -0,0 +1,8 @@
+procedure printable(word)
+ return "" == word | map(map(word, "oOiIzZeEsStT", "001122335577"), &lcase, &ucase);
+end
+procedure main()
+ find := '0123456789abcdefABCDEFoOiIzZeEsS';
+ words := open(word_file := "/usr/share/dict/words") | stop("Unable to open: " || word_file);
+ every write(printable( | 1 ( | (word := trim(read(words))) , not("" == word) , ('' == word -- find))));
+end
diff --git a/ipl/packs/loadfuncpp/examples/iterate.cpp b/ipl/packs/loadfuncpp/examples/iterate.cpp
new file mode 100644
index 0000000..9f60d13
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/iterate.cpp
@@ -0,0 +1,26 @@
+
+/* Example of a C++ extension to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Type 'make iexample' to build.
+ * Carl Sturtivant, 2008/3/16
+ */
+
+#include "loadfuncpp.h"
+using namespace Icon;
+
+
+struct addup: public iterate {
+ safe total;
+ addup(): total((long)0) {}
+ virtual void takeNext(const value& x) {
+ total = total + x;
+ }
+};
+
+extern "C" int iexample(int argc, value argv[]) {
+ addup sum;
+ sum.every(argv[1], argv[2]);
+ argv[0] = sum.total;
+ return SUCCEEDED;
+}
+
diff --git a/ipl/packs/loadfuncpp/examples/iterate.icn b/ipl/packs/loadfuncpp/examples/iterate.icn
new file mode 100644
index 0000000..0d6de0e
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/iterate.icn
@@ -0,0 +1,13 @@
+
+link loadfuncpp
+
+
+procedure main()
+ total := loadfuncpp("./iterate.so", "iexample")
+ write( total(g, [1,2,3,4,5]) )
+end
+
+procedure g(ls[])
+ suspend !ls
+end
+
diff --git a/ipl/packs/loadfuncpp/examples/iterate2.cpp b/ipl/packs/loadfuncpp/examples/iterate2.cpp
new file mode 100644
index 0000000..c32bdf9
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/iterate2.cpp
@@ -0,0 +1,31 @@
+
+/* Example of a C++ extension to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Type 'make iexample' to build.
+ * Carl Sturtivant, 2008/3/16
+ */
+
+#include "loadfuncpp.h"
+using namespace Icon;
+
+
+struct addup: public iterate {
+ safe total;
+ int count;
+ addup(): total((long)0), count(0) {}
+
+ virtual void takeNext(const value& x) {
+ total = total + x;
+ }
+ virtual bool wantNext(const value& x) {
+ return ++count <= 3;
+ }
+};
+
+extern "C" int iexample(int argc, value argv[]) {
+ addup sum;
+ sum.every(argv[1], argv[2]);
+ argv[0] = sum.total;
+ return SUCCEEDED;
+}
+
diff --git a/ipl/packs/loadfuncpp/examples/iterate2.icn b/ipl/packs/loadfuncpp/examples/iterate2.icn
new file mode 100644
index 0000000..3863ba1
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/iterate2.icn
@@ -0,0 +1,13 @@
+
+link loadfuncpp
+
+
+procedure main()
+ total := loadfuncpp("./iterate2.so", "iexample")
+ write( total(g, [1,2,3,4,5]) )
+end
+
+procedure g(ls[])
+ suspend !ls
+end
+
diff --git a/ipl/packs/loadfuncpp/examples/iterate3.cpp b/ipl/packs/loadfuncpp/examples/iterate3.cpp
new file mode 100644
index 0000000..1b1dd70
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/iterate3.cpp
@@ -0,0 +1,32 @@
+
+/* Example of a C++ extension to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Type 'make iexample' to build.
+ * Carl Sturtivant, 2008/3/16
+ */
+
+#include "loadfuncpp.h"
+using namespace Icon;
+
+
+struct addup: public iterate {
+ safe total;
+ int count;
+ addup(): total((long)0) {
+ count = 0;
+ }
+ virtual void takeNext(const value& x) {
+ total = total + x;
+ }
+ virtual bool wantNext(const value& x) {
+ return ++count <= 3;
+ }
+};
+
+extern "C" int iexample(value argv[]) {
+ addup sum;
+ sum.bang(argv[1]);
+ argv[0] = sum.total;
+ return SUCCEEDED;
+}
+
diff --git a/ipl/packs/loadfuncpp/examples/iterate3.icn b/ipl/packs/loadfuncpp/examples/iterate3.icn
new file mode 100644
index 0000000..1f6414d
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/iterate3.icn
@@ -0,0 +1,9 @@
+
+link loadfuncpp
+
+
+procedure main()
+ total := loadfuncpp("./iterate3.so", "iexample", 1) #arity present
+ write( total([1,2,3,4,5]) )
+end
+
diff --git a/ipl/packs/loadfuncpp/examples/jmexample.cpp b/ipl/packs/loadfuncpp/examples/jmexample.cpp
new file mode 100644
index 0000000..a367fd5
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/jmexample.cpp
@@ -0,0 +1,52 @@
+
+/* Example of a C++ extension to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Type 'make <platform>' to build.
+ * For available <platform>s type 'make'.
+ * Carl Sturtivant, 2007/9/25
+ */
+
+#include "loadfuncpp.h"
+
+enum { JMUP, JMDOWN };
+class sequence: public generator {
+ long count;
+ long limit;
+ int direction;
+ bool hasNext() {
+ switch(direction) {
+ case JMUP:
+ return count <= limit;
+ case JMDOWN:
+ return count >= limit;
+ default:
+ return false;
+ }
+ }
+ value giveNext() {
+ switch(direction) {
+ case JMUP:
+ return count++;
+ case JMDOWN:
+ return count--;
+ default:
+ return nullvalue;
+ }
+ }
+ public:
+ sequence(value start, value end) {
+ count = start;
+ limit = end;
+ direction = ((count < limit) ? JMUP : JMDOWN);
+ };
+};
+
+extern "C" int jm_test_1(int argc, value argv[]) {
+ if( argc != 2 ) {
+ return FAILED;
+ }
+ sequence s(argv[1], argv[2]);
+ return s.generate(argv);
+}
+
+
diff --git a/ipl/packs/loadfuncpp/examples/jmexample.icn b/ipl/packs/loadfuncpp/examples/jmexample.icn
new file mode 100644
index 0000000..d2cc973
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/jmexample.icn
@@ -0,0 +1,8 @@
+
+link loadfuncpp
+
+procedure main()
+ f := loadfuncpp("./jmexample.so", "jm_test_1")
+ every write(f(1, 10) | f(10, 1) | f(10, 10) | f(-1, 1))
+end
+
diff --git a/ipl/packs/loadfuncpp/examples/kwd_vbl.cpp b/ipl/packs/loadfuncpp/examples/kwd_vbl.cpp
new file mode 100644
index 0000000..d754304
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/kwd_vbl.cpp
@@ -0,0 +1,17 @@
+
+/* Example of a C++ extension to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Type 'make iexample' to build.
+ * Carl Sturtivant, 2007/9/25
+ */
+
+#include "loadfuncpp.h"
+using namespace Icon;
+
+extern "C" int iexample(int argc, value argv[]) {
+ safe y = argv[1];
+ &progname = y;
+ argv[0] = &progname;
+ return SUCCEEDED;
+}
+
diff --git a/ipl/packs/loadfuncpp/examples/kwd_vbl.icn b/ipl/packs/loadfuncpp/examples/kwd_vbl.icn
new file mode 100644
index 0000000..4d4c9e8
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/kwd_vbl.icn
@@ -0,0 +1,10 @@
+
+link loadfuncpp
+
+procedure main()
+ keyword := loadfuncpp("./kwd_vbl.so", "iexample")
+ x := keyword("frog")
+ write(&progname)
+end
+
+
diff --git a/ipl/packs/loadfuncpp/examples/loadfuncpp.h b/ipl/packs/loadfuncpp/examples/loadfuncpp.h
new file mode 100644
index 0000000..5704f60
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/loadfuncpp.h
@@ -0,0 +1,481 @@
+
+/* C++ support for easy extensions to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Include this and link to iload.cpp which
+ * contains the necessary glue.
+ * See iexample.cpp for typical use.
+ * Carl Sturtivant, 2008/3/17
+ */
+
+#include<new>
+#include<cstdio>
+
+enum kind { Null, Integer, BigInteger, Real, Cset, File, Procedure, Record, List,
+ Set=10, Table=12, String, Constructor, Coexpression=18, External, Variable };
+
+enum special_value { NullString, StringLiteral, NewString, NullChar, Illegal };
+
+enum {
+ SUCCEEDED = 7, // Icon function call returned: A_Continue
+ FAILED = 1 // Icon function call failed: A_Resume
+};
+
+class value; //Icon value (descriptor)
+class safe; //for garbage-collection-safe Icon valued C++ variables and parameters of all kinds
+class keyword; //Icon keyword represented as an object with unary &
+class variadic; //for garbage-collection-safe variadic function argument lists
+class proc_block; //block specifying a procedure to iconx
+class external_block; //block specifying an external value to iconx
+class external_ftable; //function pointers specifying external value behavior to iconx
+class external; //C++ Object specifying an external value
+
+typedef int iconfunc(value argv[]); //type of icon built in functions or operators with a fixed number of arguments
+typedef int iconfvbl(int argc, value argv[]); //type of icon built in functions with a variable number of arguments
+
+extern const value nullvalue; //for default arguments
+extern const value nullstring;
+extern const value nullchar;
+extern const value illegal; //for unwanted trailing arguments
+extern void syserror(const char*); //fatal termination Icon-style with error message
+#define Fs_Read 0001 // file open for reading
+#define Fs_Write 0002 // file open for writing
+extern value IconFile(int fd, int status, char* fname); //make an Icon file descriptor
+extern value integertobytes(value); //get the bytes of an Icon long integer as an Icon string (ignore sign)
+extern value bytestointeger(value); //get the bytes of a new Icon long integer from an Icon string
+extern value base64(value); //convert string or integer to base64 encoding (string)
+extern value base64tointeger(value); //decode base64 string to integer
+extern value base64tostring(value); //decode base64 string to string
+
+namespace Icon {
+//all keywords excepting &fail, &cset (avoiding a name collision with function cset)
+extern keyword allocated;
+extern keyword ascii;
+extern keyword clock;
+extern keyword collections;
+extern keyword current;
+extern keyword date;
+extern keyword dateline;
+extern keyword digits;
+extern keyword dump;
+extern keyword e;
+extern keyword error;
+extern keyword errornumber;
+extern keyword errortext;
+extern keyword errorvalue;
+extern keyword errout;
+extern keyword features;
+extern keyword file;
+extern keyword host;
+extern keyword input;
+extern keyword lcase;
+extern keyword letters;
+extern keyword level;
+extern keyword line;
+extern keyword main;
+extern keyword null;
+extern keyword output;
+extern keyword phi;
+extern keyword pi;
+extern keyword pos;
+extern keyword progname;
+extern keyword random;
+extern keyword regions;
+extern keyword source;
+extern keyword storage;
+extern keyword subject;
+extern keyword time;
+extern keyword trace;
+extern keyword ucase;
+extern keyword version;
+}; //namespace Icon
+
+static void initialize_keywords();
+
+class keyword { //objects representing Icon keywords
+ friend void initialize_keywords();
+ iconfunc* f;
+ public:
+ safe operator&(); //get the keyword's value (could be an Icon 'variable')
+};
+
+
+class value { //a descriptor with class
+//data members modelled after 'typedef struct { word dword, vword; } descriptor;' from icall.h
+ private:
+ long dword;
+ long vword;
+ public:
+ friend class safe;
+ friend value IconFile(FILE* fd, int status, char* fname);
+ friend value integertobytes(value);
+ friend value bytestointeger(value);
+ friend value base64(value);
+ friend value base64tointeger(value);
+ friend value base64tostring(value);
+ value(); //&null
+ value(special_value, const char* text = "");
+ value(int argc, value* argv); //makes a list of parameters passed in from Icon
+ value(int);
+ value(long);
+ value(float);
+ value(double);
+ value(char*);
+ value(const char*);
+ value(const char*, long);
+ value(proc_block&);
+ value(proc_block*);
+ value(external*);
+ operator int();
+ operator long();
+ operator float();
+ operator double();
+ operator char*();
+ operator external*();
+ operator proc_block*() const;
+ bool operator==(const value&) const;
+ value& dereference();
+ value intify();
+ bool isNull();
+ bool notNull();
+ bool isExternal(const value&);
+ value size() const;
+ kind type();
+ bool toString(); //attempted conversion in place
+ bool toCset();
+ bool toInteger();
+ bool toReal();
+ bool toNumeric();
+ value subscript(const value&) const; //produces an Icon 'variable'
+ value& assign(const value&); //dereferences Icon style
+ value put(value x = nullvalue);
+ value push(value x = nullvalue);
+ void dump() const;
+ void printimage() const;
+ int compare(const value&) const; //comparator-style result: used for Icon sorting
+ value negative() const; // -x
+ value complement() const; // ~x
+ value refreshed() const; // ^x
+ value random() const; // ?x
+ value plus(const value&) const;
+ value minus(const value&) const;
+ value multiply(const value&) const;
+ value divide(const value&) const;
+ value remainder(const value&) const;
+ value power(const value&) const;
+ value union_(const value&) const; // x ++ y
+ value intersection(const value&) const; // x ** y
+ value difference(const value&) const; // x -- y
+ value concatenate(const value&) const; // x || y
+ value listconcatenate(const value&) const;// x ||| y
+ value slice(const value&, const value&) const; // x[y:z]
+ value& swap(value&); // x :=: y
+ value activate(const value& y = nullvalue) const; // y @ x ('*this' is activated)
+ value apply(const value&) const; // x!y (must return, not fail or suspend)
+}; //class value
+
+
+class generator {
+//class to inherit from for defining loadable functions that are generators
+ public:
+ int generate(value argv[]); //call to suspend everything produced by next()
+ protected: //override these, and write a constructor
+ virtual bool hasNext();
+ virtual value giveNext();
+}; //class generator
+
+
+class iterate {
+//class to inherit from for iterating over f!arg or !x
+ public:
+ void every(const value& g, const value& arg); //perform the iteration over g!arg
+ void bang(const value& x); //perform the iteration over !x
+ //override these, write a constructor and the means of recovering the answer
+ virtual bool wantNext(const value& x);
+ virtual void takeNext(const value& x);
+};
+
+
+
+class safe_variable {
+//data members modelled after 'struct tend_desc' from rstructs.h
+ friend class value;
+ friend inline int safecall_0(iconfunc*, value&);
+ friend inline int safecall_1(iconfunc*, value&, const value&);
+ friend inline int safecall_2(iconfunc*, value&, const value&, const value&);
+ friend inline int safecall_3(iconfunc*, value&, const value&, const value&, const value&);
+ friend inline int safecall_4(iconfunc*, value&, const value&, const value&, const value&, const value&);
+ friend inline int safecall_5(iconfunc*, value&, const value&, const value&, const value&, const value&, const value&);
+ friend inline int safecall_6(iconfunc*, value&, const value&, const value&, const value&, const value&, const value&, const value&);
+ friend inline int safecall_v0(iconfvbl*, value&);
+ friend inline int safecall_v1(iconfvbl*, value&, const value&);
+ friend inline int safecall_v2(iconfvbl*, value&, const value&, const value&);
+ friend inline int safecall_v3(iconfvbl*, value&, const value&, const value&, const value&);
+ friend inline int safecall_vbl(iconfvbl*,safe&, const variadic&);
+ protected:
+ safe_variable *previous;
+ int num;
+ value val;
+ safe_variable();
+ safe_variable(int);
+ safe_variable(long);
+ safe_variable(double);
+ safe_variable(value);
+ safe_variable(proc_block&);
+ safe_variable(proc_block*);
+ safe_variable(int, value*);
+ inline void push(safe_variable*& tendlist, int numvalues=1);
+ inline void pop(safe_variable*& tendlist);
+}; //class safe_variable
+
+
+class variadic: public safe_variable {
+ public:
+ variadic(int);
+ variadic(long);
+ variadic(float);
+ variadic(double);
+ variadic(char*);
+ variadic(value);
+ variadic(const safe&);
+ variadic(const safe&, const safe&);
+ variadic& operator,(const safe&);
+ operator value();
+ ~variadic();
+}; //class variadic
+
+
+class external_block {
+//modelled on 'struct b_external' in icon/src/h/rstructs.h
+ friend class external;
+ friend class value;
+ static long extra_bytes; //silent extra parameter to new
+ long title;
+ long blksize;
+ long id;
+ external_ftable* funcs;
+ external* val;
+ static void* operator new(size_t); //allocated by iconx
+ static void operator delete(void*); //do nothing
+ external_block();
+};
+
+class external {
+ friend class value;
+ static external_block* blockptr; //silent extra result of new
+ protected:
+ long id;
+ public:
+ static void* operator new(size_t); //allocated by new external_block()
+ static void operator delete(void*); //do nothing
+ external();
+ virtual ~external() {} //root class
+ virtual long compare(external*);
+ virtual value name();
+ virtual external* copy();
+ virtual value image();
+};
+
+
+class safe: public safe_variable {
+//use for a garbage collection safe icon valued safe C++ variable
+ friend class variadic;
+ friend class global;
+ public:
+ safe(); //&null
+ safe(const safe&);
+ safe(int);
+ safe(long);
+ safe(float);
+ safe(double);
+ safe(char*);
+ safe(const value&);
+ safe(const variadic&);
+ safe(proc_block&);
+ safe(proc_block*);
+ safe(int, value*); //from parameters sent in from Icon
+ ~safe();
+ safe& operator=(const safe&);
+ //augmenting assignments here
+ safe& operator+=(const safe&);
+ safe& operator-=(const safe&);
+ safe& operator*=(const safe&);
+ safe& operator/=(const safe&);
+ safe& operator%=(const safe&);
+ safe& operator^=(const safe&);
+ safe& operator&=(const safe&);
+ safe& operator|=(const safe&);
+ // ++ and -- here
+ safe& operator++();
+ safe& operator--();
+ safe operator++(int);
+ safe operator--(int);
+ //conversion to value
+ operator value() const;
+ //procedure call
+ safe operator()();
+ safe operator()(const safe&);
+ safe operator()(const safe& x1, const safe& x2,
+ const safe& x3 = illegal, const safe& x4 = illegal,
+ const safe& x5 = illegal, const safe& x6 = illegal,
+ const safe& x7 = illegal, const safe& x8 = illegal);
+ safe operator[](const safe&);
+
+ friend safe operator*(const safe&); //size
+ friend safe operator-(const safe&);
+ friend safe operator~(const safe&); //set complement
+ friend safe operator+(const safe&, const safe&);
+ friend safe operator-(const safe&, const safe&);
+ friend safe operator*(const safe&, const safe&);
+ friend safe operator/(const safe&, const safe&);
+ friend safe operator%(const safe&, const safe&);
+ friend safe operator^(const safe&, const safe&); //exponentiation
+ friend safe operator|(const safe&, const safe&); //union
+ friend safe operator&(const safe&, const safe&); //intersection
+ friend safe operator&&(const safe&, const safe&); //set or cset difference
+ friend safe operator||(const safe&, const safe&); //string concatenation
+ friend bool operator<(const safe&, const safe&);
+ friend bool operator>(const safe&, const safe&);
+ friend bool operator<=(const safe&, const safe&);
+ friend bool operator>=(const safe&, const safe&);
+ friend bool operator==(const safe&, const safe&);
+ friend bool operator!=(const safe&, const safe&);
+ friend variadic operator,(const safe&, const safe&); //variadic argument list construction
+
+ safe slice(const safe&, const safe&); // x[y:z]
+ safe apply(const safe&); // x ! y
+ safe listcat(const safe&); // x ||| y
+ safe& swap(safe&); // x :=: y
+ safe create(); // create !x
+ safe create(const safe&); // create x!y
+ safe activate(const safe& y = nullvalue); // y@x
+ safe refresh(); // ^x
+ safe random(); // ?x
+ safe dereference(); // .x
+ bool isIllegal() const; //is an illegal value used for trailing arguments
+}; //class safe
+
+
+//Icon built-in functions
+namespace Icon {
+ safe abs(const safe&);
+ safe acos(const safe&);
+ safe args(const safe&);
+ safe asin(const safe&);
+ safe atan(const safe&, const safe&);
+ safe center(const safe&, const safe&, const safe&);
+ safe char_(const safe&);
+ safe chdir(const safe&);
+ safe close(const safe&);
+ safe collect();
+ safe copy(const safe&);
+ safe cos(const safe&);
+ safe cset(const safe&);
+ safe delay(const safe&);
+ safe delete_(const safe&, const safe&);
+ safe detab(const variadic&);
+ safe detab( const safe& x1, const safe& x2,
+ const safe& x3=illegal, const safe& x4=illegal,
+ const safe& x5=illegal, const safe& x6=illegal,
+ const safe& x7=illegal, const safe& x8=illegal );
+ safe display(const safe&, const safe&);
+ safe dtor(const safe&);
+ safe entab(const variadic&);
+ safe entab( const safe& x1, const safe& x2,
+ const safe& x3=illegal, const safe& x4=illegal,
+ const safe& x5=illegal, const safe& x6=illegal,
+ const safe& x7=illegal, const safe& x8=illegal );
+ safe errorclear();
+ safe exit(const safe&);
+ safe exp(const safe&);
+ safe flush(const safe&);
+ safe function(); //generative: returns a list
+ safe get(const safe&);
+ safe getch();
+ safe getche();
+ safe getenv(const safe&);
+ safe iand(const safe&, const safe&);
+ safe icom(const safe&);
+ safe image(const safe&);
+ safe insert(const safe&, const safe&, const safe&);
+ safe integer(const safe&);
+ safe ior(const safe&, const safe&);
+ safe ishift(const safe&, const safe&);
+ safe ixor(const safe&, const safe&);
+ safe kbhit();
+ safe left(const safe&, const safe&, const safe&);
+ safe list(const safe&, const safe&);
+ safe loadfunc(const safe&, const safe&);
+ safe log(const safe&);
+ safe map(const safe&, const safe&, const safe&);
+ safe member(const safe&, const safe&);
+ safe name(const safe&);
+ safe numeric(const safe&);
+ safe open(const safe&, const safe&);
+ safe ord(const safe&);
+ safe pop(const safe&);
+ safe proc(const safe&, const safe&);
+ safe pull(const safe&);
+ safe push(const variadic&);
+ safe push( const safe& x1, const safe& x2,
+ const safe& x3=illegal, const safe& x4=illegal,
+ const safe& x5=illegal, const safe& x6=illegal,
+ const safe& x7=illegal, const safe& x8=illegal );
+ safe put(const variadic&);
+ safe put( const safe& x1, const safe& x2,
+ const safe& x3=illegal, const safe& x4=illegal,
+ const safe& x5=illegal, const safe& x6=illegal,
+ const safe& x7=illegal, const safe& x8=illegal );
+ safe read(const safe&);
+ safe reads(const safe&, const safe&);
+ safe real(const safe&);
+ safe remove(const safe&);
+ safe rename(const safe&, const safe&);
+ safe repl(const safe&, const safe&);
+ safe reverse(const safe&);
+ safe right(const safe&, const safe&, const safe&);
+ safe rtod(const safe&);
+ safe runerr(const safe&, const safe&);
+ safe runerr(const safe&);
+ safe seek(const safe&, const safe&);
+ safe serial(const safe&);
+ safe set(const safe&);
+ safe sin(const safe&);
+ safe sort(const safe&, const safe&);
+ safe sortf(const safe&, const safe&);
+ safe sqrt(const safe&);
+ safe stop();
+ safe stop(const variadic&);
+ safe stop( const safe& x1, const safe& x2,
+ const safe& x3=illegal, const safe& x4=illegal,
+ const safe& x5=illegal, const safe& x6=illegal,
+ const safe& x7=illegal, const safe& x8=illegal );
+ safe string(const safe&);
+ safe system(const safe&);
+ safe table(const safe&);
+ safe tan(const safe&);
+ safe trim(const safe&, const safe&);
+ safe type(const safe&);
+ safe variable(const safe&);
+ safe where(const safe&);
+ safe write();
+ safe write(const variadic&);
+ safe write( const safe& x1, const safe& x2,
+ const safe& x3=illegal, const safe& x4=illegal,
+ const safe& x5=illegal, const safe& x6=illegal,
+ const safe& x7=illegal, const safe& x8=illegal );
+ safe writes(const variadic&);
+ safe writes( const safe& x1, const safe& x2,
+ const safe& x3=illegal, const safe& x4=illegal,
+ const safe& x5=illegal, const safe& x6=illegal,
+ const safe& x7=illegal, const safe& x8=illegal );
+ //generative functions follow, crippled to return a single value
+ safe any(const safe&, const safe&, const safe&, const safe&);
+ safe many(const safe&, const safe&, const safe&, const safe&);
+ safe upto(const safe&, const safe&, const safe&, const safe&);
+ safe find(const safe&, const safe&, const safe&, const safe&);
+ safe match(const safe&, const safe&, const safe&, const safe&);
+ safe bal(const safe&, const safe&, const safe&, const safe&, const safe&, const safe&);
+ safe move(const safe&);
+ safe tab(const safe&);
+}; //namespace Icon
+
diff --git a/ipl/packs/loadfuncpp/examples/methodcall.cpp b/ipl/packs/loadfuncpp/examples/methodcall.cpp
new file mode 100644
index 0000000..0f13195
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/methodcall.cpp
@@ -0,0 +1,18 @@
+
+/* Example of a C++ extension to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Type 'make iexample' to build.
+ * Carl Sturtivant, 2008/3/16
+ */
+
+#include "loadfuncpp.h"
+using namespace Icon;
+
+#include<cstdio>
+
+extern "C" int iexample(int argc, value argv[]) {
+
+
+ return SUCCEEDED;
+}
+
diff --git a/ipl/packs/loadfuncpp/examples/methodcall.icn b/ipl/packs/loadfuncpp/examples/methodcall.icn
new file mode 100644
index 0000000..ab48d06
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/methodcall.icn
@@ -0,0 +1,23 @@
+
+link loadfuncpp
+
+
+record thing(val, method)
+
+procedure method(x)
+ object := self() | stop("not bound to a record")
+ object.val := x
+end
+
+procedure main()
+
+ obj := thing()
+ obj.method := bindself(method, obj)
+
+ write(image(obj.method))
+
+ obj.method(99)
+
+ write( obj.val )
+end
+
diff --git a/ipl/packs/loadfuncpp/examples/mkexternal.cpp b/ipl/packs/loadfuncpp/examples/mkexternal.cpp
new file mode 100644
index 0000000..39c9b84
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/mkexternal.cpp
@@ -0,0 +1,15 @@
+
+/* Example of a C++ extension to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Type 'make iexample' to build.
+ * Carl Sturtivant, 2007/9/25
+ */
+
+#include "loadfuncpp.h"
+using namespace Icon;
+
+extern "C" int iexample(int argc, value argv[]) {
+ argv[0] = new external();
+ return SUCCEEDED;
+}
+
diff --git a/ipl/packs/loadfuncpp/examples/mkexternal.icn b/ipl/packs/loadfuncpp/examples/mkexternal.icn
new file mode 100644
index 0000000..ec388cf
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/mkexternal.icn
@@ -0,0 +1,14 @@
+
+link loadfuncpp
+
+procedure main()
+ iexample := loadfuncpp("./mkexternal.so", "iexample")
+ external := iexample()
+ external2 := copy(external)
+ write( type(external) )
+ write( image(external) )
+ write( type(external2) )
+ write( image(external2) )
+end
+
+
diff --git a/ipl/packs/loadfuncpp/examples/newprimes.icn b/ipl/packs/loadfuncpp/examples/newprimes.icn
new file mode 100644
index 0000000..4f2391a
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/newprimes.icn
@@ -0,0 +1,4 @@
+procedure main()
+ #limit to the first 10000 primes
+ every write(!(p := 1, a := [2])| 1(|(p +:= 2), not(p % !a = 0), put(a, p))) \1000
+end
diff --git a/ipl/packs/loadfuncpp/examples/numbernamer.icn b/ipl/packs/loadfuncpp/examples/numbernamer.icn
new file mode 100644
index 0000000..1996c8d
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/numbernamer.icn
@@ -0,0 +1,61 @@
+
+procedure main(arg)
+ every write( number(!arg, 0) )
+end
+
+procedure number(n, state)
+ static small, large, units
+ initial {
+ small := ["one", "two", "three", "four", "five", "six", "seven", "eight",
+ "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
+ "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]
+ large := ["ten", "twenty", "thirty", "forty", "fifty", "sixty",
+ "seventy", "eighty", "ninety"]
+ units := ["thousand", "million", "billion", "trillion", "quadrillion",
+ "quintillion", "sextillion", "septillion", "octillion", "nonillion"]
+ }
+ n := integer(n) | fail
+ if 0 = n then return "zero"
+ if 0 > n then return "minus " || number(-n)
+ if 20 > n then return small[n]
+ if 100 > n then {
+ x := n / 10
+ r := n % 10
+ if (0 = r) then {
+ return large[x]
+ } else {
+ return large[x] || "-" || number(r, state)
+ }
+ }
+ if (1000 > n) then {
+ x := n / 100
+ r := n % 100
+ if (0 = r) then {
+ return number(x, 1) || " hundred"
+ } else {
+ if (0 = state) then {
+ return number(x, 1) || " hundred and " || number(r, 1)
+ } else {
+ return number(x, 1) || " hundred " || number(r, 1)
+ }
+ }
+ }
+
+ every i := 1 to *units do {
+ j := (*units - i + 1)
+ k := j * 3
+ m := 10^k
+ x := n / m
+ r := n % m
+ if (0 < x) then {
+ if (0 = r) then {
+ return number(x, 1) || " " || units[j]
+ } else if ( 100 > r) then {
+ return number(x, 1) || " " || units[j] || " and " || number(r, 1)
+ } else {
+ return number(x, 1) || " " || units[j] || ", " || number(r, 0)
+ }
+ }
+ }
+ return "Error NaN: " || n
+end
diff --git a/ipl/packs/loadfuncpp/examples/primes.icn b/ipl/packs/loadfuncpp/examples/primes.icn
new file mode 100644
index 0000000..ecbd1f1
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/primes.icn
@@ -0,0 +1,26 @@
+procedure main()
+ #limit to the first x primes
+ local x;
+ x := 20;
+ every write(!(p := 1, a := [2])| 1(|(p +:= 2), not(p % !a = 0), put(a, p))) \x
+ list_primes(x);
+end
+
+procedure list_primes(prime_limit)
+ local p;
+ local a;
+ local s;
+ initial {
+ p := 1;
+ a := [2];
+ }
+ until (prime_limit <= *a) do {
+ p +:= 2;
+ s := sqrt(p);
+
+ if (not(p % !a = 0)) then {
+ put(a, p);
+ }
+ }
+ every write(!a)
+end
diff --git a/ipl/packs/loadfuncpp/examples/runerr.cpp b/ipl/packs/loadfuncpp/examples/runerr.cpp
new file mode 100644
index 0000000..e572133
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/runerr.cpp
@@ -0,0 +1,31 @@
+
+/* Example of a C++ extension to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Type 'make iexample' to build.
+ * Carl Sturtivant, 2007/9/25
+ */
+
+#include "loadfuncpp.h"
+
+#include<stdio.h>
+
+extern "C" int iexample(value argv[]) {
+ safe callme(argv[1]), text(argv[2]);
+ printf("Calling callme\n");
+ callme();
+ printf("Callme returned\n");
+ printf("Calling callme\n");
+ callme();
+ printf("Callme returned\n");
+ //Icon::runerr(123, text);
+ return FAILED;
+}
+
+extern "C" int iexample2(value argv[]) {
+ //Icon::display(&Icon::level, &Icon::output);
+ safe nextcall(argv[1]), rerr(argv[2]);
+ nextcall();
+ rerr(123, "Bye!");
+ //Icon::runerr(123, "Bye!");
+ return FAILED;
+}
diff --git a/ipl/packs/loadfuncpp/examples/runerr.icn b/ipl/packs/loadfuncpp/examples/runerr.icn
new file mode 100644
index 0000000..8c39c9a
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/runerr.icn
@@ -0,0 +1,32 @@
+
+link loadfuncpp
+
+procedure main()
+ x := [1,2,3]
+ main2()
+end
+
+global newdisplay
+
+procedure main2()
+ newrunerr := loadfuncpp("runerr.so", "iexample", 2)
+ newdisplay := loadfuncpp("runerr.so", "iexample2", 2)
+#&trace := -1
+ newrunerr(callme, "Hello!")
+ write("We don't get here!")
+end
+
+procedure callme()
+ initial {
+ write("callme() called! first time!")
+ return
+ }
+ write("callme() called for second time!")
+ newdisplay(nextcall, runerr)
+ #runerr(123, "callme error termination!")
+ return
+end
+
+procedure nextcall()
+ write("Call to nextcall")
+end
diff --git a/ipl/packs/loadfuncpp/examples/stop.cpp b/ipl/packs/loadfuncpp/examples/stop.cpp
new file mode 100644
index 0000000..74373dd
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/stop.cpp
@@ -0,0 +1,16 @@
+
+/* Example of a C++ extension to icon via loadfunc,
+ * without garbage collection difficulties.
+ * Type 'make iexample' to build.
+ * Carl Sturtivant, 2007/9/25
+ */
+
+#include "loadfuncpp.h"
+using namespace Icon;
+
+extern "C" int iexample(int argc, value argv[]) {
+ safe x = argv[1];
+ stop(x);
+ return SUCCEEDED;
+}
+
diff --git a/ipl/packs/loadfuncpp/examples/stop.icn b/ipl/packs/loadfuncpp/examples/stop.icn
new file mode 100644
index 0000000..6177bad
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/stop.icn
@@ -0,0 +1,10 @@
+
+link loadfuncpp
+
+procedure main()
+ newstop := loadfuncpp("./stop.so", "iexample")
+ newstop("Stop!")
+ write("We don't get here!")
+end
+
+
diff --git a/ipl/packs/loadfuncpp/examples/sums.icn b/ipl/packs/loadfuncpp/examples/sums.icn
new file mode 100644
index 0000000..062fceb
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/sums.icn
@@ -0,0 +1,8 @@
+procedure main()
+ local n, sum # Declare two local variables
+ sum := 0 # Set the sum to zero
+ every n := 1 to 5 do # For n equal to 1, 2, 3, 4, 5 ...
+ sum := sum + n; # ...add n to the sum
+
+ write ( "The sum of all numbers from 1 to 5 is ", sum );
+end
diff --git a/ipl/packs/loadfuncpp/examples/sums2.icn b/ipl/packs/loadfuncpp/examples/sums2.icn
new file mode 100644
index 0000000..a5c136e
--- /dev/null
+++ b/ipl/packs/loadfuncpp/examples/sums2.icn
@@ -0,0 +1,6 @@
+procedure main()
+ local sum;
+ sum := 0;
+ every sum +:= 1 to 5
+ write ( "The sum of all numbers from 1 to 5 is ", sum );
+end