Full Code of ab25cq/clover2 for AI

master 6aaf2de7473a cached
477 files
7.2 MB
1.9M tokens
1277 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (11,091K chars total). Download the full file to get everything.
Repository: ab25cq/clover2
Branch: master
Commit: 6aaf2de7473a
Files: 477
Total size: 7.2 MB

Directory structure:
gitextract_2dc0dl64/

├── .gitattributes
├── .pc/
│   ├── .quilt_patches
│   ├── .quilt_series
│   ├── .version
│   ├── applied-patches
│   └── empty.patch/
│       ├── .timestamp
│       └── Makefile.in
├── .travis.yml
├── C.clcl
├── CGI.clcl
├── CHANGELOG
├── CLang.clcl
├── CLibrary.clcl
├── Command.clcl
├── Container.clcl
├── ExtensionClassTest.cl
├── ExtensionClassTest.clcl
├── ExtensionTest.c
├── ExtensionTest.h
├── File.clcl
├── Fundamental.clcl
├── JITTest.cl
├── JITTest.clcl
├── JITTest2.clcl
├── JS.jsclcl
├── LICENSE
├── Makefile.in
├── MyOwnLibrary.clcl
├── README.md
├── Range.clcl
├── Reflection.clcl
├── Socket.clcl
├── String.clcl
├── SystemCalls.clcl
├── TODO
├── Thread.clcl
├── a.cl
├── a.clcl
├── a.csv
├── a.jscl
├── a.ojscl
├── a.txt
├── aaa
├── all_build.sh
├── app-sample/
│   ├── mfiler5/
│   │   ├── Fundamental.clcl
│   │   ├── Makefile.in
│   │   ├── config.log
│   │   ├── config.status
│   │   ├── configure
│   │   ├── configure.in
│   │   ├── install.sh
│   │   ├── mf1app.clcl
│   │   ├── mf2win.clcl
│   │   ├── mf3isearch.clcl
│   │   ├── mf4vd.clcl
│   │   ├── mf5
│   │   ├── mfiler5.cl
│   │   └── update_mfiler5.sh
│   └── vicl/
│       ├── Fundamental.clcl
│       ├── Makefile.in
│       ├── README.md
│       ├── SKK-JISYO.L
│       ├── TODO
│       ├── a.c
│       ├── a.cl
│       ├── a.clcl
│       ├── aaa/
│       │   ├── aaa
│       │   └── bbb
│       ├── c.cl
│       ├── config.log
│       ├── config.status
│       ├── configure
│       ├── configure.in
│       ├── install.sh
│       ├── update_vicl.sh
│       ├── vicl
│       ├── vicl10VisualMode.clcl
│       ├── vicl11Undo.clcl
│       ├── vicl12grave.clcl
│       ├── vicl13dot.clcl
│       ├── vicl14Completion.clcl
│       ├── vicl15CCompletion.clcl
│       ├── vicl16VVisual.clcl
│       ├── vicl17Macro.clcl
│       ├── vicl18Range.clcl
│       ├── vicl19Signal.clcl
│       ├── vicl1App.clcl
│       ├── vicl20Backup.clcl
│       ├── vicl21Utf8.clcl
│       ├── vicl2Win.clcl
│       ├── vicl3InsertMode.clcl
│       ├── vicl4Edit.clcl
│       ├── vicl5Word.clcl
│       ├── vicl6Brace.clcl
│       ├── vicl7DirPane.clcl
│       ├── vicl8CommandMode.clcl
│       ├── vicl9SearchMode.clcl
│       ├── vicl_insert_file
│       ├── vicl_open_file
│       ├── viclone.cl
│       ├── viclone_insert_file.cl
│       └── viclone_open_file.cl
├── b.cl
├── b.clcl
├── b.txt
├── bbb
├── c.txt
├── code/
│   ├── AllocSize.clcl
│   ├── AndAndOrOrTest.clcl
│   ├── AnonymousTest.clcl
│   ├── AnonymousTest2.clcl
│   ├── ArrayTest.clcl
│   ├── ArrayTest2.cl
│   ├── ArrayTest2.clcl
│   ├── ArrayTest3.clcl
│   ├── ArrayTest4.clcl
│   ├── ArrayTest5.clcl
│   ├── BlockTest.clcl
│   ├── BlockTest2.clcl
│   ├── BlockTest3.clcl
│   ├── BlockTest4.clcl
│   ├── BlockTest5.clcl
│   ├── BlockVarTest.clcl
│   ├── BoolTest.clcl
│   ├── BufferTest.clcl
│   ├── ByteTest.clcl
│   ├── CArrayTest.clcl
│   ├── CFFI
│   ├── CFFI.bc
│   ├── CFFI.cl
│   ├── CFFI.ll
│   ├── CFFI.s
│   ├── CFFITest.clcl
│   ├── CGITest.clcl
│   ├── CStruct.c
│   ├── CStruct.h
│   ├── CStructTest.clcl
│   ├── CastTest.clcl
│   ├── CharTest.clcl
│   ├── ClassFieldAndFieldTest.clcl
│   ├── ClassMethodTest.clcl
│   ├── CloneTest.clcl
│   ├── ClosureTest.clcl
│   ├── CommandTest.clcl
│   ├── CommentTest.clcl
│   ├── DefaultMethodArgTest.clcl
│   ├── DelegateTest.clcl
│   ├── DependencyTest.clcl
│   ├── DirTest.clcl
│   ├── E.cl
│   ├── E.clcl
│   ├── EFTest.clcl
│   ├── EnumTest.clcl
│   ├── EqualableArrayTest.clcl
│   ├── FileTest.clcl
│   ├── FloatTest.clcl
│   ├── ForBlock.clcl
│   ├── FunTest.clcl
│   ├── GCMemoryTest.clcl
│   ├── GenericsTest.clcl
│   ├── GenericsTest2.clcl
│   ├── GenericsTest3.clcl
│   ├── GenericsTest4.clcl
│   ├── GenericsTestX.clcl
│   ├── HashTest.clcl
│   ├── HelloWorld.clcl
│   ├── HereDocument.clcl
│   ├── IncrementTest.clcl
│   ├── InheritClassA.clcl
│   ├── InheritTest.clcl
│   ├── InitializeTest.clcl
│   ├── IntegerTest.clcl
│   ├── InterfaceTest.clcl
│   ├── IsTest.clcl
│   ├── KotlinTest.clcl
│   ├── LambdaArrayTest.clcl
│   ├── ListTest.clcl
│   ├── ListTest2.clcl
│   ├── ListTest3.clcl
│   ├── MapTest.clcl
│   ├── MethodBlock.clcl
│   ├── MethodDynamicTest.clcl
│   ├── MethodDynamicTest2.clcl
│   ├── MethodGenericsTest.clcl
│   ├── MethodInternal.clcl
│   ├── MethodInternalTest.clcl
│   ├── MixinLayers.clcl
│   ├── MixinLayers2.clcl
│   ├── ModuleTest.clcl
│   ├── MultiLineString.cl
│   ├── NormalBlockTest.clcl
│   ├── NullTest.clcl
│   ├── NumberTest.clcl
│   ├── NumberTest2.clcl
│   ├── ObjectCast.clcl
│   ├── ObjectTest.clcl
│   ├── OmitBlockParamTest.clcl
│   ├── OperatorTest.clcl
│   ├── PatternMatchingTest.clcl
│   ├── Person.clcl
│   ├── Person.ojsclcl
│   ├── PointerTest.clcl
│   ├── PointerTest2.clcl
│   ├── PointerTest3.clcl
│   ├── PrintfTest.clcl
│   ├── QuetionOperator.clcl
│   ├── RangeTest.clcl
│   ├── ReflectionTest.clcl
│   ├── RegexTest.clcl
│   ├── ResultTest.clcl
│   ├── ResultTest2.clcl
│   ├── ResultTypeTest.clcl
│   ├── ReturnTest.clcl
│   ├── SelectTest.cl
│   ├── SelfClassTest.clcl
│   ├── SelfOmittedField.clcl
│   ├── SetterGetterTest.clcl
│   ├── SignalTest.clcl
│   ├── SocketTest.cl
│   ├── SocketTest.clcl
│   ├── SocketTestClient.cl
│   ├── SocketTestClientInet.cl
│   ├── SocketTestInet.cl
│   ├── SocketTestServer.cl
│   ├── SocketTestServerInet.cl
│   ├── SpecialFieldTest.clcl
│   ├── StackTest.clcl
│   ├── StringTest.clcl
│   ├── StringTest2.clcl
│   ├── StringTest3.clcl
│   ├── SystemCallTest.clcl
│   ├── SystemTest.clcl
│   ├── TestDep.clcl
│   ├── TimeTest.clcl
│   ├── TryTest.clcl
│   ├── TupleTest.clcl
│   ├── TypeDataTest.clcl
│   ├── TypeInference.clcl
│   ├── UnboxingTest.clcl
│   ├── UserObjectTest.clcl
│   ├── UserThrowTest.cl
│   ├── UserThrowTest.clcl
│   ├── VariablesTest.clcl
│   ├── VoidResultTest.clcl
│   ├── WhenTest.clcl
│   ├── anonymous.cl
│   ├── anonymous2.cl
│   ├── buffer.cl
│   ├── byte.cl
│   ├── carray.cl
│   ├── char.cl
│   ├── closure.cl
│   ├── command.cl
│   ├── cstruct_test.bc
│   ├── cstruct_test.cl
│   ├── cstruct_test.ll
│   ├── cstruct_test.s
│   ├── default_method_arg.cl
│   ├── delegate.cl
│   ├── delegate.clcl
│   ├── dependecy.cl
│   ├── dir.cl
│   ├── enum.cl
│   ├── equalable_array.cl
│   ├── equalable_array.clcl
│   ├── file.cl
│   ├── float.cl
│   ├── fun.cl
│   ├── generics4.cl
│   ├── getopt.cl
│   ├── getopt_long.cl
│   ├── getopt_long_only.cl
│   ├── hash.cl
│   ├── interface.cl
│   ├── interface.clcl
│   ├── is.cl
│   ├── js.jscl
│   ├── js.ojscl
│   ├── kotlin.cl
│   ├── kotlin.clcl
│   ├── list.cl
│   ├── list2.cl
│   ├── list3.cl
│   ├── main.cl
│   ├── method_block.cl
│   ├── method_generics.cl
│   ├── method_generics.clcl
│   ├── method_internal.cl
│   ├── null_test.cl
│   ├── num.ojscl
│   ├── number.cl
│   ├── number2.cl
│   ├── object.cl
│   ├── parser_test.cl
│   ├── pattern_matching.cl
│   ├── printf.cl
│   ├── reflection.cl
│   ├── result.cl
│   ├── result_type.cl
│   ├── result_type.clcl
│   ├── return.cl
│   ├── return.clcl
│   ├── setter_getter.cl
│   ├── string2.cl
│   ├── string3.cl
│   ├── string3.clcl
│   ├── system_test.cl
│   ├── thread.cl
│   ├── time.cl
│   ├── try.cl
│   ├── tuple.cl
│   ├── type_data.cl
│   ├── type_inference.cl
│   └── when.cl
├── compile-test-code.sh
├── config.h.in
├── configure
├── configure.in
├── d.txt
├── examples/
│   ├── Dep1.clcl
│   ├── Dep2.clcl
│   ├── Hello.cl
│   ├── Hello2.cl
│   ├── Hello2.clcl
│   ├── Makefile
│   ├── a.c
│   ├── dep_error.cl
│   └── fun.cl
├── ext/
│   └── hello.c
├── ext.cl
├── ext.clcl
├── home_build.sh
├── install.sh
├── install_deb.sh
├── llclover2
├── make_arm_el.sh
├── make_deb.sh
├── manual/
│   ├── Home-en.md
│   ├── Home.md
│   ├── Range-en.md
│   ├── Range.md
│   ├── _Footer.md
│   ├── _Sidebar.md
│   ├── anonymous-en.md
│   ├── anonymous.md
│   ├── buffer-en.md
│   ├── buffer.md
│   ├── changelog-en.md
│   ├── changelog.md
│   ├── clover-en.md
│   ├── clover.md
│   ├── collection-en.md
│   ├── collection.md
│   ├── command-en.md
│   ├── command.md
│   ├── conclusion-en.md
│   ├── conclusion.md
│   ├── conribution-en.md
│   ├── contribution.md
│   ├── diary-en.md
│   ├── diary.md
│   ├── directory-en.md
│   ├── directory.md
│   ├── extension-en.md
│   ├── extension.md
│   ├── feature-en.md
│   ├── feature.md
│   ├── file-en.md
│   ├── file.md
│   ├── global-en.md
│   ├── global.md
│   ├── lambda-en.md
│   ├── lambda.md
│   ├── libraries-en.md
│   ├── libraries.md
│   ├── object-en.md
│   ├── object.md
│   ├── path-en.md
│   ├── path.md
│   ├── pointer-en.md
│   ├── pointer.md
│   ├── reflection-en.md
│   ├── reflection.md
│   ├── regex-en.md
│   ├── regex.md
│   ├── string-en.md
│   ├── string.md
│   ├── syntax.md
│   ├── system-en.md
│   ├── system.md
│   ├── thread-en.md
│   ├── thread.md
│   ├── to_html.sh
│   ├── typing-en.md
│   ├── typing.md
│   ├── update_wiki.sh
│   ├── usage-en.md
│   ├── usage.md
│   ├── usage2-en.md
│   └── usage2.md
├── moveVarDecls.hs
├── output_of_pwd
├── src/
│   ├── a.c
│   ├── alignment.c
│   ├── array.c
│   ├── block.c
│   ├── bool.c
│   ├── buffer.c
│   ├── byte.c
│   ├── carray.c
│   ├── cast.c
│   ├── char.c
│   ├── class_clover.c
│   ├── class_clover_compile_time.c
│   ├── class_clover_runtime.c
│   ├── class_compiler.c
│   ├── class_system.c
│   ├── class_thread.c
│   ├── class_thread.o.localhost.13934.Fx3LJx
│   ├── clover2-buffer.h
│   ├── clover2-debug.h
│   ├── clover2-macros.h
│   ├── clover2-xfunc.h
│   ├── clover_to_clang.c
│   ├── clover_to_clang.o.localhost.14761.eyEh1h
│   ├── code.c
│   ├── common.h
│   ├── compiler.c
│   ├── constant.c
│   ├── debug.c
│   ├── exception.c
│   ├── float.c
│   ├── get_type.c
│   ├── hash.c
│   ├── heap.c
│   ├── integer.c
│   ├── interpreter.c
│   ├── js.c
│   ├── klass.c
│   ├── klass_compile_time.c
│   ├── list.c
│   ├── long.c
│   ├── main.c
│   ├── method_compiler.c
│   ├── module.c
│   ├── native_method.c
│   ├── node.c
│   ├── node_block.c
│   ├── node_block_type.c
│   ├── node_type.c
│   ├── object.c
│   ├── parser.
│   ├── parser.c
│   ├── pointer.c
│   ├── regex.c
│   ├── script.c
│   ├── script_ctime.c
│   ├── short.c
│   ├── stack.c
│   ├── string.c
│   ├── tuple.c
│   ├── type.c
│   ├── utf.c
│   ├── vm.c
│   ├── vtable.c
│   └── xfunc.c
├── sys.txt
├── tags
├── test_dir/
│   ├── a
│   ├── b
│   └── c
├── thread_debug.cl
├── update_clover.sh
├── version_up.cl
├── vm.c
├── z.cl
└── zzz.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
* linguist-vendored
*.c linguist-vendored=false


================================================
FILE: .pc/.quilt_patches
================================================
debian/patches


================================================
FILE: .pc/.quilt_series
================================================
series


================================================
FILE: .pc/.version
================================================
2


================================================
FILE: .pc/applied-patches
================================================
empty.patch
empty.patch


================================================
FILE: .pc/empty.patch/.timestamp
================================================


================================================
FILE: .pc/empty.patch/Makefile.in
================================================
#######################################################
# installed directories
#######################################################
prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
datadir=@datadir@
mandir=@mandir@
sharedstatedir=@sharedstatedir@
sysconfdir=@sysconfdir@/clover2
includedir=@includedir@/clover2
datarootdir=@datarootdir@/clover2
docdir=@datadir@/doc

##########################################################
# environmnet variables
##########################################################
CC=@CC@
CXX=@CXX@
INSTALL=@INSTALL@
CFLAGS=@CFLAGS@
CXXFLAGS=@CXXFLAGS@
LIBS=@LIBS@
OS=@OS@
DESTDIR=@prefix@
OBJS=@OBJS@
COMPILER_OBJS=@COMPILER_OBJS@
JIT_OBJS=@JIT_OBJS@
JIT_RUNTIME_OBJS=@JIT_RUNTIME_OBJS@
COMMON_OBJS=@COMMON_OBJS@
INTERPRETER=@INTERPRETER@
JIT=@JIT@

##########################################################
# main
##########################################################
all: cclover2 clover2 $(INTERPRETER) SortableArray.oclcl
	if which ctags > /dev/null; then if test $(OS) = DARWIN; then ctags src/*.c > /dev/null 2>&1; else ctags -R; fi; fi

cclover2: config.h src/compiler.o $(COMMON_OBJS) $(COMPILER_OBJS) $(JIT_OBJS)
	if test $(JIT) = 1; then $(CXX) -o cclover2 src/compiler.o $(COMMON_OBJS) $(COMPILER_OBJS) $(JIT_OBJS) $(CFLAGS) $(LIBS) $(CXXFLAGS); else $(CC) -o cclover2 src/compiler.o $(COMMON_OBJS) $(COMPILER_OBJS) $(CFLAGS) $(LIBS); fi

src/script_ctime.o: config.h src/script_ctime.c
	$(CC) -c -o src/script_ctime.o src/script_ctime.c $(CFLAGS:-O3=)

clover2: config.h src/main.o $(COMMON_OBJS) $(OBJS) $(JIT_RUNTIME_OBJS)
	if test $(JIT) = 1; then $(CXX) -o clover2 src/main.o $(COMMON_OBJS) $(OBJS) $(JIT_RUNTIME_OBJS) $(CFLAGS) $(LIBS) $(CXXFLAGS); else $(CC) -o clover2 src/main.o $(COMMON_OBJS) $(OBJS) $(CFLAGS) $(LIBS); fi

iclover2: config.h src/interpreter.o $(COMMON_OBJS) $(OBJS) $(COMPILER_OBJS) $(JIT_RUNTIME_OBJS)
	if test $(JIT) = 1; then $(CXX) -o iclover2 src/interpreter.o $(COMMON_OBJS) $(OBJS) $(COMPILER_OBJS) $(JIT_RUNTIME_OBJS) $(CFLAGS) $(LIBS) $(CXXFLAGS); else $(CC) -o iclover2 src/interpreter.o $(COMMON_OBJS) $(OBJS) $(COMPILER_OBJS) $(CFLAGS) $(LIBS); fi

SortableArray.oclcl: Fundamental.clcl String.clcl Container.clcl CLParser.clcl Range.clcl Command.clcl File.clcl MyOwnLibrary.clcl
	./cclover2 -core MyOwnLibrary.clcl

#########################################################
# Object files
#########################################################
$(OBJ): src/*.h Makefile configure

#########################################################
# install
#########################################################
install:
	mkdir -p $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 PcreOVec.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 System.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Clover.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Global.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 String.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Buffer.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Exception.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Object.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Byte.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 UByte.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Short.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 UShort.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Integer.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 UInteger.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Long.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 ULong.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Float.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Double.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Pointer.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Char.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Bool.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Array.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 EqualableArray.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 SortableArray.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 IHashKey.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 IEqualable.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 ISortable.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 HashItem.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Hash.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 ListItem.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 List.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 EqualableList.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 SortableList.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Tuple1.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Tuple2.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Tuple3.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Tuple4.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Tuple5.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Tuple6.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Tuple7.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Tuple8.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Tuple9.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Tuple10.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 File.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Path.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Directory.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 termios.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Job.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 Command.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 tm.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 timespec.oclcl $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 stat.oclcl $(DESTDIR)/share/clover2

	if test $(JIT) = 1;then llvm-dis Clover.bc && $(INSTALL) -m 644 Clover.bc $(DESTDIR)/share/clover2; fi
	if test -e libClover.so; then $(INSTALL) -m 755 libClover.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libClover.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Global.bc && $(INSTALL) -m 644 Global.bc $(DESTDIR)/share/clover2; fi
	if test -e libGlobal.so; then $(INSTALL) -m 755 libGlobal.so.1.0.0 $(DESTDIR)/share/clover2/; cp -a libGlobal.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis String.bc && $(INSTALL) -m 644 String.bc $(DESTDIR)/share/clover2; fi
	if test -e libString.so; then $(INSTALL) -m 755 libString.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libString.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Buffer.bc && $(INSTALL) -m 644 Buffer.bc $(DESTDIR)/share/clover2; fi
	if test -e libBuffer.so; then $(INSTALL) -m 755 libBuffer.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libBuffer.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Byte.bc && $(INSTALL) -m 644 Byte.bc $(DESTDIR)/share/clover2; fi
	if test -e libByte.so; then $(INSTALL) -m 755 libByte.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libByte.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis UByte.bc && $(INSTALL) -m 644 UByte.bc $(DESTDIR)/share/clover2; fi
	if test -e libUByte.so; then $(INSTALL) -m 755 libUByte.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libUByte.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Short.bc && $(INSTALL) -m 644 Short.bc $(DESTDIR)/share/clover2; fi
	if test -e libShort.so; then $(INSTALL) -m 755 libShort.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libShort.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis UShort.bc && $(INSTALL) -m 644 UShort.bc $(DESTDIR)/share/clover2; fi
	if test -e libUShort.so; then $(INSTALL) -m 755 libUShort.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libUShort.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Integer.bc && $(INSTALL) -m 644 Integer.bc $(DESTDIR)/share/clover2; fi
	if test -e libInteger.so; then $(INSTALL) -m 755 libInteger.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libInteger.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis UInteger.bc && $(INSTALL) -m 644 UInteger.bc $(DESTDIR)/share/clover2; fi
	if test -e libUInteger.so; then $(INSTALL) -m 755 libUInteger.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libUInteger.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Long.bc && $(INSTALL) -m 644 Long.bc $(DESTDIR)/share/clover2; fi
	if test -e libLong.so; then $(INSTALL) -m 755 libLong.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libLong.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis ULong.bc && $(INSTALL) -m 644 ULong.bc $(DESTDIR)/share/clover2; fi
	if test -e libULong.so; then $(INSTALL) -m 755 libULong.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libULong.so $(DESTDIR)/share/clover2; fi
	if test $(JIT) = 1;then llvm-dis Float.bc && $(INSTALL) -m 644 Float.bc $(DESTDIR)/share/clover2; fi
	if test -e libFloat.so; then $(INSTALL) -m 755 libFloat.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libFloat.so $(DESTDIR)/share/clover2; fi
	if test $(JIT) = 1;then llvm-dis Double.bc && $(INSTALL) -m 644 Double.bc $(DESTDIR)/share/clover2; fi
	if test -e libDouble.so; then $(INSTALL) -m 755 libDouble.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libDouble.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Pointer.bc && $(INSTALL) -m 644 Pointer.bc $(DESTDIR)/share/clover2; fi
	if test -e libPointer.so; then $(INSTALL) -m 755 libPointer.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libPointer.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Char.bc && $(INSTALL) -m 644 Char.bc $(DESTDIR)/share/clover2; fi
	if test -e libChar.so; then $(INSTALL) -m 755 libChar.so.1.0.0; cp -a libChar.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Bool.bc && $(INSTALL) -m 644 Bool.bc $(DESTDIR)/share/clover2; fi
	if test -e libBool.so; then $(INSTALL) -m 755 libBool.so.1.0.0; cp -a libBool.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Array.bc && $(INSTALL) -m 644 Array.bc $(DESTDIR)/share/clover2; fi
	if test -e libArray.so; then $(INSTALL) -m 755 libArray.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libArray.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis EqualableArray.bc && $(INSTALL) -m 644 EqualableArray.bc $(DESTDIR)/share/clover2; fi
	if test -e libEqualableArray.so; then $(INSTALL) -m 755 libEqualableArray.so.1.0.0; cp -a libEqualableArray.so $(DESTDIR)/share/clover2/; fi

	if test $(JIT) = 1;then llvm-dis SortableArray.bc && $(INSTALL) -m 644 SortableArray.bc $(DESTDIR)/share/clover2; fi
	if test -e libSortableArray.so; then $(INSTALL) -m 755 libSortableArray.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libSortableArray.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Hash.bc && $(INSTALL) -m 644 Hash.bc $(DESTDIR)/share/clover2; fi
	if test -e libHash.so; then $(INSTALL) -m 755 libHash.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libHash.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis List.bc && $(INSTALL) -m 644 List.bc $(DESTDIR)/share/clover2; fi
	if test -e libList.so; then $(INSTALL) -m 755 libList.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libList.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis EqualableList.bc && $(INSTALL) -m 644 EqualableList.bc $(DESTDIR)/share/clover2; fi
	if test -e libEqualableList.so; then $(INSTALL) -m 755 libEqualableList.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libEqualableList.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis SortableList.bc && $(INSTALL) -m 644 SortableList.bc $(DESTDIR)/share/clover2; fi
	if test -e libSortableList.so; then $(INSTALL) -m 755 libSortableList.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libSortableList.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Tuple1.bc && $(INSTALL) -m 644 Tuple1.bc $(DESTDIR)/share/clover2; fi
	if test -e libTuple1.so; then $(INSTALL) -m 755 libTuple1.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libTuple1.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Tuple2.bc && $(INSTALL) -m 644 Tuple2.bc $(DESTDIR)/share/clover2; fi
	if test -e libTuple2.so; then $(INSTALL) -m 755 libTuple2.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libTuple2.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Tuple3.bc && $(INSTALL) -m 644 Tuple3.bc $(DESTDIR)/share/clover2; fi
	if test -e libTuple3.so; then $(INSTALL) -m 755 libTuple3.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libTuple3.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Tuple4.bc && $(INSTALL) -m 644 Tuple4.bc $(DESTDIR)/share/clover2; fi
	if test -e libTuple4.so; then $(INSTALL) -m 755 libTuple4.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libTuple4.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Tuple5.bc && $(INSTALL) -m 644 Tuple5.bc $(DESTDIR)/share/clover2; fi
	if test -e libTuple5.so; then $(INSTALL) -m 755 libTuple5.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libTuple5.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Tuple6.bc && $(INSTALL) -m 644 Tuple6.bc $(DESTDIR)/share/clover2; fi
	if test -e libTuple6.so; then $(INSTALL) -m 755 libTuple6.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libTuple6.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Tuple7.bc && $(INSTALL) -m 644 Tuple7.bc $(DESTDIR)/share/clover2; fi
	if test -e libTuple7.so; then $(INSTALL) -m 755 libTuple7.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libTuple7.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Tuple8.bc && $(INSTALL) -m 644 Tuple8.bc $(DESTDIR)/share/clover2; fi
	if test -e libTuple8.so; then $(INSTALL) -m 755 libTuple8.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libTuple8.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Tuple9.bc && $(INSTALL) -m 644 Tuple9.bc $(DESTDIR)/share/clover2; fi
	if test -e libTuple9.so; then $(INSTALL) -m 755 libTuple9.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libTuple9.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Tuple10.bc && $(INSTALL) -m 644 Tuple10.bc $(DESTDIR)/share/clover2; fi
	if test -e libTuple10.so; then $(INSTALL) -m 755 libTuple10.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libTuple10.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis File.bc && $(INSTALL) -m 644 File.bc $(DESTDIR)/share/clover2; fi
	if test -e libFile.so; then $(INSTALL) -m 755 libFile.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libFile.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Path.bc && $(INSTALL) -m 644 Path.bc $(DESTDIR)/share/clover2; fi
	if test -e libPath.so; then $(INSTALL) -m 755 libPath.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libPath.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Directory.bc && $(INSTALL) -m 644 Directory.bc $(DESTDIR)/share/clover2; fi
	if test -e libDirectory.so; then $(INSTALL) -m 755 libDirectory.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libDirectory.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Job.bc && $(INSTALL) -m 644 Job.bc $(DESTDIR)/share/clover2; fi
	if test -e libJob.so; then $(INSTALL) -m 755 libJob.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libJob.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis Command.bc && $(INSTALL) -m 644 Command.bc $(DESTDIR)/share/clover2; fi
	if test -e libCommand.so; then $(INSTALL) -m 755 libCommand.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libCommand.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis tm.bc && $(INSTALL) -m 644 tm.bc $(DESTDIR)/share/clover2; fi
	if test -e libtm.so; then $(INSTALL) -m 755 libtm.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libtm.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis timespec.bc && $(INSTALL) -m 644 timespec.bc $(DESTDIR)/share/clover2; fi
	if test -e libtimespec.so; then $(INSTALL) -m 755 libtimespec.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libtimespec.so $(DESTDIR)/share/clover2; fi

	if test $(JIT) = 1;then llvm-dis stat.bc && $(INSTALL) -m 644 stat.bc $(DESTDIR)/share/clover2; fi
	if test -e libstat.so; then $(INSTALL) -m 755 libstat.so.1.0.0 $(DESTDIR)/share/clover2; cp -a libstat.so $(DESTDIR)/share/clover2; fi

	$(INSTALL) -m 644 MArray.clm $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 MArray.clm $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 MEqualableArray.clm $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 MEqualableList.clm $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 MInclude.clm $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 MList.clm $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 MPrintOutObject.clm $(DESTDIR)/share/clover2
	$(INSTALL) -m 644 MWrapperClassBase.clm $(DESTDIR)/share/clover2

	mkdir -p "$(DESTDIR)/bin"
	$(INSTALL) -m 755 clover2 "$(DESTDIR)/bin"
	$(INSTALL) -m 755 cclover2 "$(DESTDIR)/bin"
	if test -e ./iclover2; then $(INSTALL) -m 755 iclover2 "$(DESTDIR)/bin"; fi

	mkdir -p $(DESTDIR)/share/doc/clover2
	$(INSTALL) -m 644 manual/*.md "$(DESTDIR)/share/doc/clover2"

#########################################################
# uninstall
#########################################################
uninstall:
	rm -f "$(DESTDIR)"/bin/clover2
	rm -f "$(DESTDIR)"/bin/cclover2
	rm -f "$(DESTDIR)"/bin/iclover2
	rm -f "$(DESTDIR)"/share/clover2/*
	rmdir "$(DESTDIR)"/share/clover2

#########################################################
# permission
#########################################################
permission:
	chmod 644 *
	chmod 755 .git man src configure
	chmod 644 src/*.c
	chmod 644 src/*.h
	chmod 755 update_clover.sh

########################################################
# clean
########################################################
clean:
	rm -fR clover2 clover2.dSYM cclover2 cclover2.dSYM iclover2 iclover2.dSYM src/*.o config.log config.status *.stackdump autom4te.cache .DS_Store core.* a.out *.oclcl *.bc *.s *.o *.ocl code/*.ocl code/*.oclcl *.clm a.c src/*.dwo *.ll *.so.1.0.0 *.so *.class
	(cd examples/; make clean)

distclean: clean
	rm -fR  config.h Makefile autom4te.cache

parser:
	./cclover2 CLParser.clcl

########################################################
# test
########################################################
test: parser
	@echo "Compile to test code..."
	./cclover2 code/ListTest.clcl
	./cclover2 code/OperatorTest.clcl
	./cclover2 code/GenericsTest2.clcl;
	./cclover2 code/GenericsTest3.clcl
	./cclover2 code/BlockVarTest.clcl
	./cclover2 code/UserObjectTest.clcl
	./cclover2 code/PointerTest.clcl
	./cclover2 code/PointerTest2.clcl
	./cclover2 code/IncrementTest.clcl
	./cclover2 code/InitializeTest.clcl
	./cclover2 code/StackTest.clcl
	./cclover2 code/ArrayTest.clcl
	./cclover2 code/HelloWorld.clcl
	./cclover2 code/CastTest.clcl
	./cclover2 code/StringTest.clcl
	./cclover2 code/InterfaceTest.clcl
	./cclover2 code/NullTest.clcl
	./cclover2 code/SpecialFieldTest.clcl
	./cclover2 code/SelfClassTest.clcl
	./cclover2 code/ModuleTest.clcl
	./cclover2 code/GenericsTest.clcl
	./cclover2 code/VariablesTest.clcl
	./cclover2 code/BlockTest.clcl
	./cclover2 code/BlockTest2.clcl
	./cclover2 code/BlockTest3.clcl
	./cclover2 code/BlockTest4.clcl
	./cclover2 code/BlockTest5.clcl
	./cclover2 code/InheritTest.clcl
	./cclover2 code/VoidResultTest.clcl
	./cclover2 code/IntegerTest.clcl
	./cclover2 code/TryTest.clcl
	./cclover2 code/NormalBlockTest.clcl
	./cclover2 code/ArrayTest2.clcl
	./cclover2 code/HashTest.clcl
	./cclover2 code/ArrayTest3.clcl
	./cclover2 code/ArrayTest4.clcl
	./cclover2 code/ArrayTest5.clcl
	./cclover2 code/RegexTest.clcl
	./cclover2 code/ListTest2.clcl
	./cclover2 code/ListTest3.clcl
	./cclover2 code/TupleTest.clcl
	./cclover2 code/PrintfTest.clcl
	./cclover2 code/EqualableArrayTest.clcl
	./cclover2 code/BufferTest.clcl
	./cclover2 code/SystemTest.clcl
	./cclover2 code/FloatTest.clcl
	./cclover2 code/NumberTest.clcl
	./cclover2 code/StringTest2.clcl
	./cclover2 code/StringTest3.clcl
	./cclover2 code/CArrayTest.clcl
	./cclover2 code/TimeTest.clcl
	./cclover2 code/FileTest.clcl
	./cclover2 code/DirTest.clcl
	./cclover2 code/CommandTest.clcl
	./cclover2 code/AnonymousTest.clcl
	./cclover2 code/FunTest.clcl
	./cclover2 code/TypeInference.clcl
	./cclover2 code/AnonymousTest2.clcl
	./cclover2 code/KotlinTest.clcl
	./cclover2 code/MethodGenericsTest.clcl
	./cclover2 code/MethodBlock.clcl
	./cclover2 code/ReturnTest.clcl
	./cclover2 code/ResultTypeTest.clcl
	./cclover2 code/IsTest.clcl
	./cclover2 code/NullTest.clcl
	./cclover2 code/DependencyTest.clcl
	./cclover2 code/ObjectTest.clcl
	./cclover2 code/DefaultMethodArgTest.clcl
	./cclover2 code/EnumTest.clcl
	./cclover2 code/ByteTest.clcl
	./cclover2 code/SetterGetterTest.clcl
	./cclover2 code/EFTest.clcl
	./cclover2 code/MethodInternalTest.clcl
	./cclover2 code/WhenTest.clcl
	./cclover2 code/ResultTest.clcl
	./cclover2 code/NumberTest2.clcl
	./cclover2 code/TypeDataTest.clcl
	./cclover2 code/PatternMatchingTest.clcl
	./cclover2 code/ParserTest.clcl
	./cclover2 code/GenericsTest4.clcl
	./cclover2 code/DelegateTest.clcl
	./cclover2 code/RangeTest.clcl
	./cclover2 code/SelfOmittedField.clcl
	./cclover2 code/UnboxingTest.clcl
	./cclover2 code/AndAndOrOrTest.clcl
	./cclover2 code/ClosureTest.clcl
	./cclover2 code/MapTest.clcl
	./cclover2 code/main.cl && ./clover2 code/main.cl

	if locale -a | grep ja_JP.utf8; then export LANG="ja_JP_utf8"; export LC_ALL="ja_JP.utf8"; ./clover2 code/char.cl; else export LANG="C.UTF-8"; export LC_ALL="C.UTF-8"; ./clover2 code/char.cl; fi

	if test `uname` != Darwin; then gcc -shared -Wl,-soname=libExtTest.so.1 -o libExtTest.so.1.0.0 -I src/ -I . -I/usr/local/include -fPIC ext/hello.c; ln -fs libExtTest.so.1.0.0 libExtTest.so; ./cclover2 ext.clcl && ./clover2 ext.cl; fi



================================================
FILE: .travis.yml
================================================
language: c
script: sudo apt-get update && sudo apt install clang libpcre3-dev ctags -y && sudo ./configure --with-optimize && make && sudo make install && make test
sudo: required


================================================
FILE: C.clcl
================================================
class C version 1
{
    def puts(str:byte*):int;
    def strcmp(str1:byte*, str2:byte*):int;
}


================================================
FILE: CGI.clcl
================================================

inherit System
{
    LC_ALL: static int;
    LC_ADDRESS: static int;
    LC_COLLATE: static int;
    LC_CTYPE: static int;
    LC_IDENTIFICATION: static int;
    LC_MEASUREMENT: static int;
    LC_MESSAGES: static int;
    LC_MONETARY: static int;
    LC_NAME: static int;
    LC_NUMERIC: static int;
    LC_PAPER: static int;
    LC_TELEPHONE: static int;
    LC_TIME:static int;

    LOCK_SH: static int;
    LOCK_EX: static int;
    LOCK_UN: static int;
    
    def setlocale(category:int, locale:String): static native String throws Exception;

    def initialize_cgi_system(): static native;

    def initialize() : static {
        inherit();
        initialize_cgi_system();
    }

    def flock(fd:int, operation:int): static native throws Exception;
}

module MCSVFileToList
{
    def putcsv(fname:String) {
        if(self.length() > 0) {
            file := File(fname, "w");

            item := self.head.item;

            if(item.className().equals("String")) {
                self2:SELF<String> = self.toAnonymous();

                n := 0;

                self2.each {
                    qit := it.quotedString();
                    file.write(qit);

                    if(n != self2.length()-1) {
                        file.write(",");
                    }

                    n++;
                }
            }

            file.close();
        }
    }
}

inherit List <T:Object>
{
    include MCSVFileToList;
}

inherit EqualableList <T:IEqualable>
{
    include MCSVFileToList;
}

inherit SortableList<T:ISortable>
{
    include MCSVFileToList;
}

inherit File
{
    def createListFromCSV(fname:String): static SortableList<String> {
        result := SortableList<String>();

        file := p"\{fname}".read().toString();

        str:= "";

        for(i:=0; i<file.length(); i++) {
            c := file.chars(i);

            if(c == '\\') {
                c2 := file.chars(i+1);
                i++;

                if(c2 != '\0') {
                    str.append(c2);
                }
            }
            elif(c == ',') {
                result.add(str);

                str = "";
            }
            else {
                str.append(c);
            }
        }

        if(str.length() != 0) {
            result.add(str);
        }

        return result;
    }

    def lock(shared:bool) throws Exception {
        if(self.fd == -1 && self.stream.identifyWith(null)) {
            throw Exception("Can't find file descriptor");
        }

        if(!self.stream.identifyWith(null)) {
            fd:int = fileno(self.stream);

            if(shared) {
                flock(fd, LOCK_SH);
            }
            else {
                flock(fd, LOCK_EX);
            }
        }
        else {
            if(shared) {
                flock(self.fd, LOCK_SH);
            }
            else {
                flock(self.fd, LOCK_EX);
            }
        }
    }

    def unlock() throws Exception {
        if(self.fd == -1 && self.stream.identifyWith(null)) {
            throw Exception("Can't find file descriptor");
        }

        if(!self.stream.identifyWith(null)) {
            fd:int = fileno(self.stream);

            flock(fd, LOCK_UN);
        }
        else {
            flock(fd, LOCK_UN);
        }
    }

    def lockBlock(fname:String, shared:bool, block:lambda()): static throws Exception {
        file:File = File(fname, "w");
        file.lock(shared);
        block();
        file.unlock();
        file.close();
        #unlink(fname);
    }

    def lockBlock(shared:bool, block:lambda()) throws Exception {
        lock(shared);
        block();
        unlock();
    }
}

inherit String
{
    def quotedString():String {
        result := "";
        for(i := 0; i<self.length(); i++) {
            c := self.chars(i);
            if((c <= 127) && !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))) {
                result.append('\\');
                result.append(c);
            }
            else {
                result.append(c);
            }
        }

        return result;
    }

    def getPlainTextFromQuotedString(): String {
        result := "";
        for(i := 0; i<self.length(); i++) {
            c := self.chars(i);
            if(c == '\\') {
                c2 := self.chars(i+1);
                if(c2 != '\0') {
                    result.append(c2);
                }
                i++;
            }
            else {
                result.append(c);
            }
        }

        return result;
    }

    def decodeFromForm():String {
        result := b"";

        for(i:=0; i<self.length(); i++) {
            c := self.chars(i);

            if(c == '+') {
                result.append(' ');
            }
            elif(c == '%') {
                hex := self.subString(i+1, i+3);
                hex.insert(0, "0x");
                value := hex.hex();
                result.append(value);

                i+=2;
            }
            else {
                result.append(c.toString().toBuffer());
            }
        }

        return result.toString();
    }

    def removeTag():String {
        return self.clone().sub(/</g, "&lt;").sub(/>/g, "&gt;");
    }
}


================================================
FILE: CHANGELOG
================================================

version 10.6.0

    Correspond OSX(Intel, Homebrew)

version 10.5.7

    Fixed String.insert(int, char) bug

version 10.4.6

    Fixed block size bug

version 10.4.5

    Faster compile speed.

version 10.4.4

    Finished to implement C-FFI on JIT.

version 10.4.3

    Finished to implement C-FFI on JIT.

version 10.4.2

    Finished to implement C-FFI on JIT.

    Continue to implement C Header Parser.

version 10.4.1

    Continue to implement C-FFI on JIT.

version 10.4.0

    Continue to implement C-FFI on JIT.

version 10.3.8

    Some chages

version 10.3.7

    Some chages

version 10.3.6

    Fixed the bug on PC

version 10.3.5

    Finish curses library implement. I could't have suported all routines yet. It's too many....

version 10.3.4

    Continue to start curses library support.
    
version 10.3.3

    Continue to start curses library support.

version 10.3.2

    normal block local variable bug.

    The case of `for(i:=0; i<5; i++) {}`, the i variable is inner block scope.

    for it in {1,2,3} { it.toString().println(); } can be ruunned.
    
version 10.3.1

    new Editor sample.

version 10.3.0

    Added List.iterator.

version 10.2.9

    Bug fix of JIT. a:long = 0x02; Clover.test("BOOL test",  (a & 0x02).to_bool); The code is failed before version 10.2.9

version 10.2.8

    Bug fix.

version 10.2.7

    Class.getNoneClassMethod, Class.getClassMethod, Class.getClassFieldsを追加。

version 10.2.7

    Appended Class.getNoneClassMethod, Class.getClassMethod, Class.getClassFields.

version 10.2.6

    Clover.loadを追加。    

version 10.2.6

    Appended Clover.load.

version 10.2.5

    GCはユーザーがClover.gc()を呼ばないと呼び出されないようになりました。主にパフォーマンスが理由です。メインループでClover.compaction()とともに1000回に一回程度呼び出してください。呼び出されない場合使用メモリが増えつづけます。注意してください。

version 10.2.5

    GC is no longer called unless the user calls Clover.gc ().  Mainly because of performance.  Call Clover.compaction () once every 1000 times in the main loop.  If it is not called, memory usage continues to increase.  be careful. 


version 10.2.4

    Optimize List Container Library.

version 10.2.3

    Fixed finalize method bug. Now you can use the method using GC in the finalize method.

version 10.2.2

    Added erase(3), idlok(3), idcok(3) method.

version 10.2.1

    Java Script Reflection.

version 10.2.0

    Fixed the bug of REPL

version 10.1.9

    Implement tyclover2 for Java Script.

version 10.1.8

    Continue to implement the output of Java Script source 

version 10.1.7

    Continue to implement the output of Java Script source 

version 10.1.6

    Continue to implement the output of Java Script source 

version 10.1.5

    Continue to implement the output of Java Script source 

version 10.1.4

    Continue to implement the output of Java Script source 

version 10.1.3

    Continue to implement the output of Java Script source 

version 10.1.2

    Class field and field can have been declared by "val" keyword. It's readonly field.

    Continue to implement the output of Java Script source 

version 10.1.1

    Continue to implement the output of Java Script source 

version 10.1.0

    Continue to implement the output of Java Script source 

version 10.0.9

    Continue to implement the output of Java Script source 

version 10.0.8

    Continue to implement the output of Java Script source 

version 10.0.7

    Method default parametor bug.
    
    Started the output of Java Script source 

version 10.0.6

    Fixed AND operator on ULong type.

version 10.0.5

    Fixed finalizer bug.

version 10.0.4

    LLVMコマンド関連。

version 10.0.4

    LLVM command related.

version 10.0.3

    LLVM 7.0が推奨になりました。

version 10.0.3

    LLVM 7.0 is now recommended.

version 10.0.2.

    AndroidのtermuxでJITを動かしました。

    LLVM 7.0に対応。

    JITのコンパイル時手違いでコンパイルできなかった問題を修正。

version 10.0.2.

    I ran JIT on Android's termux. 

    It corresponds to LLVM 7.0. 

    Fixed an issue that could not be compiled with JIT compile time mistake. 

version 10.0.1

    Androidのtermuxで動作確認

version 10.0.1

    Running test of Android termux.

version 10.0.0

    String.deleteWithRange, String.deleteAtを追加。エラーメッセージ数を8に変更。

version 10.0.0

    Added String.deleteWithRange, String.deleteAt. Changend parser error message max as 8.

version 8.3.1

    エラーメッセージのバグを修正。getmaxx, getmaxyをioctlを使うようにしました。

version 8.3.1
    
    Fixed error message bug. Now getmaxx and getmaxy use ioctl

version 8.3.0

    パーサーのエラーメッセージの出力を最大10個までに制限。

version 8.3.0

    Limit the output of parser error message to a maximum of 10. 

version 8.2.9

    クラスファイルのファイル名のバージョン情報の記号に@を使うように変更。makeファイルで$は使えない様子だったため。

version 8.2.9

    Changed to use @ for the symbol of the version information of class file file name.  Because it seemed that $ could not be used in the make file.

version 8.2.8

    クラスにバージョンがつけられるようになりました。分割コンパイル時に便利です。

version 8.2.8

    We now have versions for classes.  It is convenient for split compilation. 

version 8.2.7

    iclover2 -c "ls -al"などが動くようになりました。

version 8.2.7

    iclover2 -c "ls -al" etc now work now.

version 8.2.6

    The output of error message was changed. 

version 8.2.6

   エラーメッセージの出力を変えました。

version 8.2.6

    The output of error message was changed. 

version 8.2.5

    tryのcatch文が省略できるようになりました。

version 8.2.5

    The try catch statement can now be omitted.

version 8.2.4

    sprintf(String,List), printf(String, List)がいつかのバージョンよりエンバグしていました。すみません。

version 8.2.4

    sprintf (String, List), printf (String, List) were embagging from some version.  I'm sorry. 

version 8.2.3

    REPLのバグを多数修正。

version 8.2.3

    Many REPL bug fixes. 

version 8.2.2

    List.deleteByID, EqualableList.deleteByID, SortableList.deleteByIDを追加
    tyclover2のバグを修正。(vicl向け)

version 8.2.2

    Add List.deleteByID, EqualableList.deleteByID, SortableList.deleteByID
    Fixed a bug in tyclover2.  (for vicl) 

version 8.2.1

    tyclover2のバグを修正。(vicl向け)

version 8.2.1

    Fixed a bug in tyclover2.  (for vicl) 

version 8.2.0

    REPLのバグを修正

version 8.2.0

    Fixed a bug in REPL

version 8.1.8

    tyclover2のバグを修正

version 8.1.8

    Fixed the bug of tyclover2

version 8.1.7

    initializeメソッドもdynamic指定できるようになりました。

version 8.1.7

    The initialize method can also be dynamically specified. 

version 8.1.6

    クラスメソッドもdynamic指定できるようになりました。

version 8.1.6

    Class methods can also be dynamically specified. 

version 8.1.5

    メソッドにdynamic指定ができるようになりました。動的にメソッドを実行できます。分割コンパイル時のmixin-layersで便利に使えると思います。

version 8.1.5

    Method can now be dynamically specified.  You can execute methods dynamically.  I think that it can be conveniently used in mixin-layers at split compilation.

version 8.1.4

    System.mvprintw(String,SortableList<ISortable>)の追加。

version 8.1.4

    Added System.mvprintw (String, SortableList).

version 8.1.3

    Hash.add, List.push(List), EqualableList.push(EqualableList), SortableList.push(SortableList)を追加。Listのadd(T)はあまり使用しないでください。addは要素の追加と言う意味でなく加算の意味で使用したいと思います。List.add(List)など。Listの要素の追加はpushを使ってください。
   
version 8.1.3

    Added Hash.add, List.push (List), EqualableList.push (EqualableList), SortableList.push (SortableList).  Please do not use add (T) of List much.  I do not think that add is an element addition meaning but want to use it in the meaning of addition.  List.add (List) and so on.  To add the elements of List please use push.

version 8.1.2

    JITでif文の条件式に論理演算子がありなんども実行すると落ちるバグを修正。

version 8.1.2

    Fixed a bug in JIT where there is a logical operator in the conditional expression of the if statement and it goes down if it runs a lot.

version 8.1.1

    JITでクラスファイルのコンパイルを-O2から-O3に変更しました。

version 8.1.1

    Changed class file compilation from -O2 to -O3 in JIT. 

version 8.1.0

    実行時に落ちることがある大きなバグを修正しました。

version 8.1.0

    Fixed a major bug that may be lost at run time.

version 8.0.2

    JITでインストールされていないクラスがあったため、修正。

version 8.0.2

    Fixed as there were classes not installed by JIT. 

version 8.0.1

    ちょっと手違いで"ABC".sub(/.(.)./) { it2.items(0) } => Bが動きませんでした。動くようになりました。

version 8.0.1

    "ABC".sub (/.(.)./) {it2.items (0)} => B did not work with a slight mistake.  I got to move. 

version 8.0.0

    JITが今度こそ安定したと思います。JITを書き直しました。

version 8.0.0

    I think that JIT has stabilized this time.  I rewrote JIT. 

version 7.5.2

    Fixed bug of BuferTest

version 7.5.1

    Buffer.clear, Buffer.split, Buffer.add, Buffer.compare, System.memsetを追加。

version 7.5.1

    Added Buffer.clear, Buffer.split, Buffer.add, Buffer.compare, System.memset.

version 7.5.0

    クラスの分割コンパイル機能を入れました。コンパイル済みのクラスファイルにメソッドやフィールドを追加したい場合、inherit クラス名で良くなりました。mixin-layersとして使う場合はよりmixin-layersが厳密になり、後方のレイヤーのフィールドやメソッドにアクセスできません。リファクタリング時有効でしょう。

    インタプリタのバグを修正。かなり致命的バグで、僕の環境では動いていましたが、動いたのが不思議なくらいのバグでした。すみません。

    gccに対応。

    古いARMに対応。(netwalkerで動きました)。ただしシェルモードはカーネルのバージョンが古すぎると動かない様子です。

    バージョンアップする場合古いバージョンが残っていると動かないので、sudo make uninstallしてください。

    あとクラスファイルの仕様が変わっているのでいままでのソースファイルの再コンパイルお願いします。

version 7.5.0

    I put in class divide compile function.  If you want to add methods and fields to a compiled class file, the inherit class name is better.  When used as mixin-layers, mixin-layers becomes more rigorous and you can not access the fields and methods of the backward layer.  It will be effective at refactoring.
Fixed an interpreter bug.  It was a fairly fatal bug and it worked in my environment, but it was a strange bug that it worked.  I'm sorry.

    It corresponds to gcc. 

    It corresponds to the old ARM.  (It worked with netwalker).  However, shell mode seems to not work if the kernel version is too old. 
    Upgrading Please do sudo make uninstall because it will not work if an old version is left. 
    Since the specification of the class file has changed, recompile the source file up to now. 

version 7.1.4

    Buffer.toStringFromPointedPoint()のバグを修正。Buffer.head(), Buffer.tail()を追加。

version 7.1.4

    Fixed a bug in Buffer.toStringFromPointedPoint().  Added Buffer.head() and Buffer.tail().

version 7.1.3

    Buffer.toStringFromPointedPoint(), Buffer.toPointerAtPointedPoint()を追加。

version 7.1.3

    Added Buffer.toStringFromPointedPoint (), Buffer.toPointerAtPointedPoint ().

version 7.1.2

    エディッタのためにtyclover2を改良しました。

version 7.1.2

    I improved tyclover2 for the editor.

version 7.1.1

    tyclover2のバグを修正しました。

version 7.1.1

    A bug in tyclover 2 has been fixed.

version 7.1.0

    tyclover2のバグを修正しました。

version 7.1.0

    A bug in tyclover 2 has been fixed.

version 7.0.9

    型が違うリストを表現できるようになりました。
    
    {"AAA", 1} --> SortableList<ISortable>

    elist { "AAA", 1 } --> EqualableList<IEqualable>

    list { "AAA", 1 } --> List<Object>

    printfの引数へリストを渡すことができます。

version 7.0.9

    You can now express lists of different types. 

    {"AAA", 1} -> SortableList<ISortable>
    elist {"AAA", 1} -> EqualableList<IEqualable>
    list {"AAA", 1} -> List<Object>

    You can pass a list to printf's arguments.

version 7.0.8

    シェルモードでコマンド結果をファイルに書き込むことができるようになりました。pwd > XXX; ls -al >> XXXなど。

version 7.0.8

    You can now write command results to a file in shell mode.  pwd > XXX; ls - al >> XXX and so on. 

version 7.0.7

    SortableListの表現に{"AAA", "BBB"}などと言う表現が使えるようになりました。

    Arrayクラスにいくつかのメソッドが加わってます。

    インターフェース同士の代入を厳密にするようになりました。

    printf, sprintfにリストの表現も引数に取ることができるようになりました。

version 7.0.7

    You can use expressions such as {"AAA", "BBB"} etc in the expression of SortableList. Several methods are added to the Array class. We began to strictly assign interfaces to each other. Now printf, sprintf can now take a list representation as an argument.

version 7.0.6

    Fixed bug with getting command name from PATH environment variable

version 7.0.5

    When transferring a class, you can now assign an object to the transfer class.

    class Path { path:delegate String; def initialize() {} }; b := Path(); a:String = b;

version 7.0.4

    Fixed REPL bug and appended Path Object completion.

version 7.0.3

    Fixed REPL bug

version 7.0.2

    Command has been able to get Path Object.

version 7.0.1

    Fixed command completion bugs.

version 7.0.0

    Refctoring REPL and fixed bugs. Now Clover2 REPL has gotten good completion like IDE.

version 6.7.6

    Fixed interpreter bug.

version 6.7.5

    Fixed interpreter bug.

version 6.7.4

    Appended 'regex "regex"' expression for regex for including # regex.

    Command completion changes

version 6.7.3

    Some chages for tyclover2

version 6.7.2

    Fixed REPL bug.

    Removed List.toSortableList, List.toEqualableList EqualableList.toSortableList.

    Fixed Interface checking bug.

version 6.7.1

    Some chages for tyclover2

version 6.7.0

    Prevent memory overflow when block. Now when block number is 64 to 32.

version 6.6.9

    Add future to tyclover2

version 6.6.8

    Fixed exception message bug.

version 6.6.7

    Prevent from overflow when block. Now when block number is 16 to 64

version 6.6.6

    Appended tyclover2 program for getting type.

version 6.6.5

    appended System.nodelay.

version 6.6.4

    appended Null class for REPL

    Fixed some bugs of REPL

version 6.6.3

    Fixed block object bug

version 6.6.2

    Appended System.setEscapeDelay and System.getEscapeDelay method.

    Fixed bug of VM.

version 6.6.1

    Fixed bug of shell mode

version 6.6.0

    GCのバグを修正。

    Command.selector()の追加。

version 6.6.0

    Fixed bug with GC.

    Append Command.selector method.

version 6.5.9

    System.send,System.sendto, System.recv, Sytem.recvfromの追加。

    Fixed bug of Buffer with string expression.

version 6.5.9

    Appended System.send,System.sendto, System.recv, System.recvfrom.

    Fixed bug of Buffer with string expression.

version 6.5.8

    Improved String.indexOf, String.rindexOf algorism

    Fixed bug of shell mode

    Fixed bug of Command Class

version 6.5.7

    JITの改良。

version 6.5.7

    Improvement of JIT.

version 6.5.6

    JITのバグを修正。

    iclover2のプロンプトの修正。iclover2の初期の文字列とカーソル位置を-s, -pオプションで指定できるようになりました。-cで一度コマンドを実行したら、プログラムを終了します。

version 6.5.6

    Fixed a bug with JIT

    Fixed iclover 2 prompt. The initial character string and cursor position of iclover 2 can now be specified with the -s and -p options. Once the command is executed with -c, the program is terminated.

version 6.5.5

    JITのバグを修正。

version 6.5.5

    Fixed a bug with JIT

version 6.5.4

    インタプリタでls | lなどとするとインタプリタ自体が落ちるバグを修正。

version 6.5.4

    Fixed a bug in which the interpreter itself drops if ls | l, etc. in the interpreter.

clover2 (6.5.3-1) unstable; urgency=medium

	* Appended EqualableList.toList, SortableList.toList,
	SortableList.toEqualableList method.
	* Appended EqualableList.uniq, SortableList.uniq method

version 6.5.2

    例外のメッセージのバグを修正しました。

version 6.5.2

    Fixed the bug that which is the message of Exception.

version 6.5.1

    ブロックの戻り値は必要に応じて自動的にboxingやcastされていましたが、もう少し柔軟な仕組みにしています。if文の戻り値も同様です。

    filterメソッドを各種基礎クラスに追加しています。以下は通ります。a:int = -1.filter { if(it == -1) { 0 } else { 2 } }。mapだと.cast("Integer")メソッドが必要となるため、追加しました。filterの場合はこの場合Integer型を返すため、aに代入されるときにunboxingされるため便利に使えると思います。

version 6.5.1

    The return value of the block was boxing and casting automatically as necessary, but it makes it a more flexible mechanism. The return value of the if statement is also the same.

    We have added a filter method to various basic classes. Below you will find: a: int = -1.filter {if (== - 1) {0} els e {2}}. We added the map because it needs the .cast ("Integer") method. In the case of filter, in this case it returns Integer type, so it will be unboxing when assigning to a and I think that it can be used conveniently.

version 6.5.0

    IIteratorbleがインストールされていない問題を修正。すみません。大きなバグでした。Rangeを使うプログラムは動かなかったはずです。あとJITが安定しました。しかし、Clover2のエディッタの体感速度で測りましたが、JITとVMとの処理速度の差はあまりありません。(JITの方がメモリの消費量は多い)。あまりJITは意味がありませんね、、、うーん。あとClover2で作ったコンソールエディッタの体感速度ですが、小さなテキストの編集ならC言語で書いたvimとそんなに変わりません。ただし、1万行を超えるテキストをClover2で編集した場合、カーソル移動は問題ないんですが、undoしようとすると、やはり処理速度がだいぶ落ちます。でも、まあ、それなりに実用的な速度は出ていますね。参考まで。

version 6.5.0

    Fixed an issue where IIteratorble was not installed. Excuse me. It was a big bug. The program using Range should have not worked. And JIT became stable. However, although it measured by the sensory speed of Clover 2's editor, there is not much difference in processing speed between JIT and VM. (JIT consumes more memory). JIT has little meaning, is not it? It is the perceived speed of the console editor created with Clover 2, but if editing small texts it does not change much like vim written in C language. However, if you edit more than ten thousand lines of text with Clover 2, moving the cursor is fine, but if you try to undo, the processing speed drops a lot. But, well, as it is, the practical speed has come out. for your information.

version 6.0.3

    GCにバグがありました。リファレンスカウントの廃止。すみません。version 6.0.0からエンバグしてる様子です。

version 6.0.3

    Fixed the bug of GC. Stop to use Refference Count GC algorithm. I'm sorry. From version 6.0.0, there is the bug.

version 6.0.2

    シェルモードでロングオプションに対応していない問題に対応。

version 6.0.2

    Corresponds to problems not supporting long options in shell mode.

version 6.0.1

    ./configure --with-optmizeがシェルモードで実行されないバグを修正。

version 6.0.1

    Fixed bug of shellmode which is unable to run ./configure --with-optimize etc.

version 6.0.0

    JITに対応。raspberry pi 3でもClover2で作ったエディッタ(vicl)が実用的な速度で動きます。かなりClover2自体を高速化できました。ただし、JITではGCは自動的には行いません。ユーザーがClover.gc()を呼ぶ必要があります。メインループに入れてください。

version 6.0.0

    It corresponds to JIT. The raspberry pi 3 editor (vicl) made with Clover 2 moves at a practical speed. It was able to speed up Clover 2 itself considerably. However, in JIT, GC will not do it automatically. Users need to call Clover.gc (). Please put it in the main loop.

version 5.9.9
    
    GCのアルゴリズムの修正。かなり速くなりました。Clover.compaction()を追加。エディッタなどずっと走っているプログラムではClover.compaction()をメインループに入れてください。メモリの消費量を抑えられます。
    新しいGCのアルゴリズムにはJITは対応していません。JITは6.0.0で実装します。とりあえずリリース。
    クラスファイルの仕様が変わっています。既存のソースの再コンパイルをお願いします。

version 5.9.9

    Modification of GC algorithm. It got fairly fast. Added Clover.compaction (). For a program running all the time, such as editor please put Clover.compaction () in the main loop. It can reduce memory consumption. JIT does not correspond to the new GC algorithm. JIT is implemented at 6.0.0. For the time being released. The specification of the class file has changed. Please recompile the existing source


version 5.0.9

    JIT のバグを修正しました。今度こそ、安定したと思います。

version 5.0.9

    Fixed a bug in JIT. I think that this time it was stable.

version 5.0.8
    
    フィールドやクラスフィールドの多重代入が行えるようになりました。

    JIT のバグを修正しました。今度こそ、安定したと思います。

    クラスファイルの定義が変わりました。再コンパイルお願いします。

    clone, initialize, nothingメソッドが自動的に定義されなくなりました。ソースの変更お願いします。

    コメントのバグを修正。

version 5.0.8

    Multiple assignment of fields and class fields can now be performed.

    Fixed a bug in JIT. I think that this time it was stable.

    Chaged class file definition. Please re-compile the source files.

    The clone, initialize, and nothing methods are no longer automatically defined. Please change the source.

    Fixed comment bug.

version 5.0.7

    Fixed JIT bug and && or || bug.

version 5.0.6

    Tuning using memory. Fixed memory leaks.

version 5.0.5

    List.insert(index:int, list_:List<T>)の追加

version 5.0.5

    Added List.insert(index:int, list_:List<T>)

version 5.0.4

    &&と||の優先順位にバグがありました。修正。

version 5.0.4

    There was a bug in priorities of && and ||. Fix.

version 5.0.3

    Fixed Memory bug

version 5.0.2

    インタプリタが落ちてました。修正。

version 5.0.2

    Fixed Interpreter bug.

version 5.0.1

    GCのアルゴリズムを変えました。少し高速化したかもしれません。

version 5.0.1

    Chaged GC algorithm. Maybe Clover2 has been more faster.

version 5.0.0

    GCのアルゴリズムを変えました。少し高速化したかもしれません。

version 5.0.0

    Chaged GC algorithm. Maybe Clover2 has been more faster.

version 4.9.8

    Added Command.getErrorOutput():Command and Command.getOutputWithError():Command.

version 4.9.7

    Added nothing():SELF method to all classes

version 4.9.6

    Added Hash.map, Hash.selectValues, Hash.keyValues.

version 4.9.5

    Fixed bug with printw, wprintw.

version 4.9.4

    Fixed bug with comment. See code/CommentTest.clcl

version 4.9.3

    Fixed bug with used '#'

version 4.9.2

    クロージャー内で例外が起こった場合バグがありました。修正。

version 4.9.2

    Bug fixed of occuring a exception in closure.

version 4.9.1

    メソッドブロックのリファクタリング。lambdaによるブロックオブジェクトの戻り値は省略できないようになりました。(ソースの整理のため)

version 4.9.1 

    Refactoring method blocks. Return value of block object by lambda can not be omitted>. (For organizing the source)

version 4.9.0

    Fixed method result bug.

    Fixed Generics bug.

    Fixed block object bug

    Added ? and : operator for null checking and exception checking.

version 4.8.9

    Fixed JIT bug

version 4.8.9

    Fixed JIT bug

version 4.8.8

    1_000 == 1000

    var a = 1 <==> var a:int = 1 <==> a := 1

version 4.8.8

    1_000 == 1000

    var a = 1 <==> var a:int = 1 <==> a := 1

version 4.8.7

    Bufferクラスにバグがありました。修正。

version 4.8.7
    
    Fixed Buffer class bug.

version 4.8.6

    Buffer.cloneにバグがありました。修正。

version 4.8.6
    
    Fixed Buffer.clone bug.

version 4.8.6

    SortableListとSortableArrayにcompareメソッドを追加。

version 4.8.5

    SortableListとSortableArrayにcompareメソッドを追加。

version 4.8.5

    Appended compare method to SortableList and SortableArray.

version 4.8.4

    Buffer.initialize にappedableフラグを追加しました。メモリーをコピーしないでBufferクラスが作れます。

version 4.8.4

    Appended appendable flag to Buffer.initialize. You can make Buffer class without copying memory.

version 4.8.3

    各種基礎クラスにadd,next,prevメソッドを追加。ISortableインターフェスにaddメソッドを追加。IIteratorableインターフェースを追加。RangeクラスのGenerics引数インターフェースはIIteratorableになりました。RangeクラスはIIteratorableインターフェースを満たさないといけません。ソースの変更が必要となります。その代わり"A".."D"などが動きます。SortableListクラスにsumメソッドを追加。RangeクラスにtoList(),toEqualableList(),toSortableList()メソッドを追加。String.clclの主要なメソッドの戻り値や引数がEqualableListからSortableListに変更されています。Stringを使ったコードで引数の戻り値の型をEqualableList<String>に指定していた場合ソースの変更が必要となります。すみません。

version 4.8.3

    Added add, next, prev methods to various basic classes. Added add method to ISortable interface. Added IIteratorable interface. The Generics argument interface of the Range class is now IIteratorable. The Range class must satisfy the IIterato rable interface. Source change is required. Instead, "A" .. "D" etc works. Added sum method to SortableList class. Added toList (), toEqualableList (), toSortableList () method to Range class. The return value and argument of the main method of String.clcl has changed from EqualableList to SortableList. If you used String to specify the argument return type as EqualableList <String> in the code, you will need to change the source. Excuse me.

version 4.8.2

    __BEGIN___, ___END___で囲ったソースがクラスのコンパイル時、コンパイル前に実行されるようになりました。

version 4.8.2

    ___ BEGIN___, ___END___ enclosed sources are now executed before compiling, when compiling classes.

version 4.8.2

version 4.8.1

    リフレクションによるcloneメソッドの作成にバグがありJITでテストが動かないバグを修正。

version 4.8.1

    Fixed a bug that caused a bug in the creation of clone method by reflection and the test did not work with JIT.

version 4.8.0

    List.multiplyWithSelf(n:Int):SELF<T>;を加えました。
    List.selectWithSelf(block_:lambda(T):bool):SELF<T>;を加えました。
    List.subListWithSelf(start:int, end:int):SELF<T>;を加えました。
    List.fillWithSelf(start:int, end:int, item:T):SELF<T>;を加えました。
    List.fillWithSelf(item:T):SELF<T>;を加えました。
    List.reverseWithSelf():SELF<T>;を加えました。
    List.shuffleWithSelf():SELF<T>;を加えました。

version 4.8.0

    Added List.multiplyWithSelf(n:Int):SELF<T>;
    Added List.selectWithSelf(block_:lambda(T):bool):SELF<T>;
    Added List.subListWithSelf(start:int, end:int):SELF<T>;
    Added List.fillWithSelf(start:int, end:int, item:T):SELF<T>;
    Added List.fillWithSelf(item:T):SELF<T>;
    Added List.reverseWithSelf():SELF<T>;
    Added List.shuffleWithSelf():SELF<T>;

version 4.7.9

    List.deleteWithRange, EqualableList.deleteWithRange, SortableList.deleteWithRangeが対象となるオブジェクト自身の状態を変えるようになりました

version 4.7.9

    List.deleteWithRange, EqualableList.deleteWithRange, SortableList.deleteWithRange have changed inner stat.

version 4.7.8

    REPLのバグを修正。

version 4.7.8

    Fixed bug of REPL.

version 4.7.7

    モジュールのSELFとGenericsの関係のバグを修正。

version 4.7.7

    Fixed a bug in relation between module SELF and Generics.

version 4.7.6

    Added System.mvprintw(y:int, x:int, str:String);
    Added map method to Numeric classes

version 4.7.6

    Added System.mvprintw(y:int, x:int, str:String);
    Added map method to Numeric classes

version 4.7.5
    
    Class.getMethods(); を加えました。
    String.rindexOf();を加えました。
    Clover.primitiveClassToBoxingClass(name:String);を加えました。
    Clover.boxingClassToPrimitiveClass(name:String);を加えました。
    Bool.if(lambda):Anoymous?を加えました。
    Bool.ifWithException(lambda):Anoymous?を加えました。
    ? post operator. --> str:String? = null; str?.match(/./). はNull Pointer Exceptionにはなりません。 str := "ABC"; str?.match(/./). これは動きます。
    ==と!= 演算子をユーザーオブジェクトに入れました。str:String? = null; assert(str == null). これは動きます。

version 4.7.5
    
    Added Class.getMethods();
    Added String.rindexOf();
    Added Clover.primitiveClassToBoxingClass(name:String);
    Added Clover.boxingClassToPrimitiveClass(name:String);
    Added Bool.if(lambda):Anoymous?
    Added Bool.ifWithException(lambda):Anoymous?
    Added ? post operator. --> str:String? = null; str?.match(/./). It doesn't throw Exception. str := "ABC"; str?.match(/./). It's works.
    Added == and != operator for User Object. str:String? = null; assert(str == null). It works.

version 4.7.4

    List.delete(int,int)を削除。

version 4.7.4

    Removed List.delete(int,int).

version 4.7.3

    Added List.detete(int,int).

version 4.7.2

    テストがおちていました。修正。 

version 4.7.2

    Fixed make test bug

version 4.7.1

    Fixed a bug that could not define a field with generic class nested within class.

version 4.7.1

    クラスの中で入れ子になるジェネリクスのクラスを持つフィールドを定義できないバグを修正。

version 4.7.1

    Fixed a bug that could not define a field with generic class nested within class.

version 4.7.0

    メモリーセーフなポインタを入れました。詳しくはマニュアルを見てください。

version 4.7.0

    Append memory safe pointer(Buffer class) to Clover2. See manual

version 4.6.9

    THraedのバグを修正しました。

version 4.6.9

    Fixed bug of thread

version 4.6.8

    amd64では--with-jitと--with-threadが安定しました。

verson 4.6.8

    --with-jit and --with-thread is stable on amd64


version 4.6.7

    Now Clvoer2 can have runned on sparc64, maybe other Bigendian Platform.

version 4.6.6

    メモリのバグを修正。i686で動作確認。ppc64はまだです。

version 4.6.6

    Fixed memory bug. Test on i686. I have not testted on ppc64 yet.

version 4.6.5

    --with-threadオプションをconfigurenに追加。--with-optimizeとは同時は付けられません。もし、--with-threadを付ける場合は--with-jitも付けることをお勧めします。

    JITでのThraedにバグがありました。修正。

version 4.6.5

    Added --with-thread option to configuren. --with-optimize can not be attached at the same time. If you add -with-thread we recommend --with-jit as well.

    Fixed bug of jit with thread

version 4.6.4

    --with-threadオプションをconfigurenに追加。もし--with-threadをつけないと最適化が有効になります。threadは使えませんが、、、。

version 4.6.4

    Added --with-tread option to configure. If compile without --with-thread, optimizatioin is enabled.

version 4.6.3

    構造体の初期化の問題を修正。

version 4.6.3

    Fix bug of structure variable initialization.

version 4.6.2

    メソッドの引数に関するバグがあったため修正。

version 4.6.2

    Fixed bug of method arguments.

version 4.6.1

    each内でbreakするとバグがあったため、修正。

version 4.6.1
    
    Fixed a bug in break at method block.

version 4.6.0

    JITでblock中に例外が起こった場合、catch出来ないバグを修正。List.eachなどでbreakできるようになりました。

version 4.6.0
    
    Fixed a bug that can not be caught when an exception occurs in block in JIT. You can now break with List.each and so on.

version 4.5.9

    String.deleteの仕様が変わっています。

version 4.5.9

    Chaged String.delete definition.

version 4.5.8

    lsやmakeなどがClover.controllingTerminalProgramsから外されました。lsを端末制御したい場合はシェルモードでlsと書き、端末制御したく無い場合はls()と書いてください。

version 4.5.8

    ls, make etc. have been removed from Clover.controllingTerminalPrograms. If you want to control ls, write ls in shell mode and ls () if you do not want terminal control.

version 4.5.7

    メモリのバグがありました。修正。重要なバグでした。

version 4.5.7

    Fix important memory bugs.

version 4.5.6

    String.deleteメソッドを追加しました。

    Rangeのバグを修正しました。

    シェルモードのバグを修正しました。

version 4.5.6

    append String.delete method to Clover2 Library.

    Fixed Range class bug.

    Fixed shell mode bug.

version 4.5.5

    バグフィックス。

version 4.5.5
    
    Fixed Bug

version 4.5.4

    変数宣言にvar, valを入れました。raedonlyの変数はvalにて宣言できます。

version 4.5.4
    
    Added "var", "val" keyword for local variable assignment. You can declare readonly varialbe with "val" keyword.

version 4.5.3

    バグフィックス。安定したと思います。

version 4.5.3

    Fixed bug.Maybe stable version.

version 4.5.2

    バグフィックス。

version 4.5.2

    Fixed bug.

version 4.5.1

    C-FFIはオプショナルになりました。使う場合はconfigureに--with-c-ffiを付けてください。

version 4.5.1

    I make c-ffi optional. If you want to use it, please add --with-c-ffi to configure option.

version 4.5.0

    Cに対するブリッジを入れました。関数と定数が取り込めます。

    Bufferクラスはpointerクラスにunboxingされます。

version 4.5.0

    I put a bridge for C. Functions and constants can be imported.

    Buffer class is unboxing to pointer class

version 4.2.7

    String.inesrtのバグを修正しました。

version 4.2.7

    Fixed bug of String.insert.

version 4.2.6

    Hashクラスの値の簡易表記が変わりました。a:Hash<String, Integer> = ["AAA"=>2, "BBB"=>3].

    コンパイラの使用メモリを減らしました。(1Gは必要だと思います)

    ppc64, i386でコンパイル、テストしました。

version 4.2.6

    The simplified representation of the value of the Hash class has changed. a:Hash<String, Integer> = ["AAA"=>2, "BBB"=>3].

    Reduce the memory clover2 compiler used

    test in the ppc64, i386

version 4.2.5

    Commandクラスのバグを修正。

    JITのバグを修正。

    シェルモードのバグを修正。

version 4.2.5
    
    Fixed bug of Command Class.

    Fixed bug of JIT

    Fixed bug of Shell mode.

    Hashクラスの値の簡易表記が変わりました。a:Hash<String, Integer> = ["AAA"=>2, "BBB"=>3].

version 4.2.4

    whenの仕様が変わってます

version 4.2.4

    changed when expression

version 4.2.3

    いくつかのバグを直しました。

version 4.2.3

    Fixed some bugs

version 4.2.2

    JITのランタイムをライブラリに追加しました。(libclover2.so)

    Compile 時のリフレクションでJITを有効にしました。

version 4.2.2

    Added JIT runtime to dynamic library (libclover2.so)

    Turn on running JIT method on Compile Time Scripting.

version 4.2.1

    JITで||と&&にバグが有ったため修正

    JITでb:=123; -b == 0が真になるバグを修正。OP_REVERSEのバグを修正。

version 4.2.1

    Fixed JIT bugs.

version 4.2.0

    GCのアルゴリズムの修正。GC中のファイナライザで更にメモリが必要になったらセグメンテーション違反していましたが、修正。

    LLVMがちゃんと対応できてませんでしたが、修正。LLVM3.8とLLVM4.0 laterに対応。

version 4.2.0

    Modification of GC algorithm. Segmentation violated when finalizers in GC needed more memory, but it was fixed. LLVM was not able to respond properly, but it was fixed. Corresponds to LLVM 3.8 and LLVM 4.0 later.

version 4.1.8
    
    クラスのソースファイルのincludeファイルの検索パスのルーチンを作りました。カレントディレクトリだけでなく$PREFIX/share/clover2や~/.clover2にあるファイルも検索されます。cclover2 -core a.clclなどでinclude "MyOwnLibrary.clcl"などすれば基礎ライブラリの改造が出来ます。

    クラスファイルとモジュールとインクルードファイルのファイルの検索ルーチンのバグを修正しました。カレントディレクトリのクラスファイルが優先されます。またスクリプトファイルがある位置のディレクトリも検索ルーチンに加わっています。

    例外の仕様を変えました。メソッド呼び出し時のみだけでなく、スクリプト最上位で例外が起こってもcatchできます。
    例外のメッセージの出力をClover.onExceptionで行うようにしました。CGIや端末制御しているときは出力先を変えてください。Clover.onException(String,bool):staticをオーバーライドすればそう出来ます。

    -xなどのパースが通らないバグを修正

    /を含む文字列が演算子だと思われずにコマンドだと思われるバグを修正

    クラスの自動コンパイルを廃止しています。

version 4.1.8

    I created a search path routine for include files of class source files. Files in $ PREFIX / share / clover 2 and ~ /. Clover 2 are searched in addition to the current directory. If you include "MyOwnLibrary.clcl" etc in cclover2 - core a.clcl etc, you can modify the basic library. Fixed a bug in file search routines for class files, modules, and include files. The class file of the current directory takes precedence. Also, the directory where the script file is located is also added to the search routine. I changed the specification of the exception. You can catch not only when calling a method but also when an exception occurs at the top of the script. We have made Clover.onException output the exception message. Please change the output destination when CGI or terminal control. You can do so by overriding Clover.onException (String, bool): static. Fixed a bug that parsing does not pass like -x Fixed a bug that seems to be a command without a character string including a fix thought to be an operator.The class compilation is abolished.

version 4.1.7
    
    Clover.onExceptionフックを作りました。例外が起こったときに実行されます。

version 4.1.7

    I made a Clover.onException hook. It is executed when an exception occurs.

version 4.1.6
    
    ラムダの配列でラムダのオブジェクトがマークされない問題を修正。

version 4.1.6
    
    Fixed lambda array object bug.

version 4.1.5
    
    ラムダの配列に対するラムダの実行ができなったので、できるようにしました。

    cloneメソッドのバグを修正。

version 4.1.5

    I have made it possible to execute lambda on lambda's array, so I can do it. Fixed a bug in the clone method.

version 4.1.4

    PathクラスはStringクラスにメソッドを委譲するようになりました。

    Added curses library

version 4.1.4

    Now Path class delegates String class

    Added curses library

version 4.1.3

    Cloneメソッドのバグを修正。

version 4.1.3

    Fiexed clone method bugs.

version 4.1.2

    Cloneメソッドのバグを修正。

    クラスフィールドやフィールドの++, --などが動いていなかったため修正。

version 4.1.2

    Fixed clone method bugs

    Fixed because class fields and field ++, - and so did not move.

version 4.1.1

    Cloneメソッドのバグを修正。

    string expressionに、その箇所のあとのスペースが削除されるバグを修正しました。

    free_objectにバグが有ったため修正。

version 4.1.1

    Fixed clone method bugs

    Fixed a bug in string expression that removes spaces after that place.

    Fixed because there was a bug in free_object.

version 4.1.0

    IEqualableとISortableとIHashKeyにcloneメソッドが追加されました。cloneはコンパイル時のリフレクションで自動的に実装されるようになりました。詳しくはReflection.clclを見てください。

version 4.1.0

    The clone method has been added to IEqualable, ISortable and IHashKey. clone is now automatically implemented by reflection at compile time. See Reflection.clcl for details.

version 4.0.9

    I changed the memory management format of the extension library object.

version 4.0.9

    拡張ライブラリのオブジェクトのメモリの管理形式を変えました。

version 4.0.9

    I changed the memory management format of the extension library object.

version 4.0.8

    Systemにいくつかのメソッドを追加。

    libbsd-devもしくはlibbsd-develのライブラリが必要になりました。(オプション。あるとSystem.getbsizeが有効になる)

    REPLの補完でSystemクラスのクラスフィールドの補完も有効になりました。

    Socketのライブラリをつくりました。詳しくはSocket.clclを見てください。

    signalシステムコールの移植。

    ioctlシステムコールの移植。

    selectシステムコールの移植。

    mutex のバグを直した。

version 4.0.8

    Added several methods to System.

    A library of libbsd-dev or libbsd-devel is required. (Optional, if System.getbsize is enabled)

    With completion of REPL, completion of class field of System class is also effective.

    I made a library of Socket. See Socket.clcl for details.

    port of the system call.

    Porting the ioctl system call.

    Porting of select system call

    Mutex bug may be fixed.

version 4.0.7

    String.removeTagでセキュリティホールが見つかりました。修正。

version 4.0.7

    I found Security holl of String.removeTag. Fix.

version 4.0.6

    正規表現で/を使う文字を使っていると正規表現の終端だと処理してしまうバグが有りました。\/で回避できるようにしました。
    
    String.removeTag()の追加

version 4.0.6

    There was a bug that will handle if it is the end of a regular expression if you use a character that uses / in regular expressions. I tried to avoid it with \/.
 
    Addition of String.removeTag ()

version 4.0.5

    SystemクラスのクラスフィールドはSystem.という表記を省略できるようになりました。つまりaccess(fname, R_OK) == 0などはコンパイルが通ります。

    String.decodeFromForm()をいれました。CGIで便利です

    識別子の処理をリファクタリング。バグがあったと思います。修正。

    同じクラスのクラスメソッドとクラスフィールドの呼び出し時にクラス名を省略できるようになりました。

version 4.0.5

    The class field of the System class can now omit the notation System. In other words, access(fname, R_OK) == 0 etc is compiled.

    I put String.decodeFromForm (). It is useful in CGI

    Refactoring processing of identifiers. I think there was a bug. Fix.

    Class names can now be omitted when calling class methods and class fields of the same class.

version 4.0.4

    Multi line stringのインデントのバグを修正。

version 4.0.4

    Multi line string bug was fiexed.

version 4.0.3

    Regexのバグを修正。

    String Expression(\{})の中は式じゃなくてブロックになりました。

version 4.0.3

    Fixed regex bug.

    Inside String Expression (\{}) it became a block instead of an expression

version 4.0.2

    CSVファイルの入出力をサポート。ファイルのロック用のメソッドの用意。

    コンパイラーにバグがありました。修正。

    JITのバグを修正

version 4.0.2

    CSV File was supported. flock was supported.

    Fixed compiler bug.

    Fixed JIT bug.

version 4.0.1

    CGIのためのライブラリを作り始めています。System.setlocaleの追加。System.setenvの第3引数を省略できるようにしました。

    コンパイラーにバグがありました。修正。

version 4.0.1

    Started to make CGI library. System.setlocale was appended.

    Fixed compiler bug.

version 4.0.0

    スレッドを追加しました。詳しくはThreadクラスの解説を読んでください。

    def allocSize(): int でヒープから取得するメモリのサイズを指定できるようになりました。主に拡張ライブラリで使います。

    allocatedSize()スペシャルメソッドを追加しました。オブジェクトのヒープから取得したメモリのサイズを返します。主に拡張ライブラリ使うもので特にユーザーは使うことがないでしょう。

    headOfmemory()スペシャルメソッドを追加しました。オブジェクトのヒープから取得したメモリの先頭サイズを返します。主に拡張ライブラリで使うもので特にユーザーは使うことがないでしょう。

    クラスファイルの仕様が変更されてます。コンパイルされたクラスファイルは再度コンパイルが必要になってます。再コンパイルをお願いします。

    UShortのboxingのbugをfix

version 4.0.0

    Threads were added. For details, please read the explanation of Thread class.

    def allocSize (): int allows you to specify the size of the memory to get from the heap. We mainly use it in extension library.

    The allocatedSize () special method was added. Returns the size of the memory retrieved from the heap of the object.
        It mainly uses extended libraries, so users will not use them in particular.

    The headOfmemory () special method was added. Returns the starting size of the memory obtained from the heap of the object. It is mainly used for extended libraries, so users will not use them in particular.

    The specification of the class file has been changed. Compiled class files need to be recompiled again. Please recompile.

    Fixed boxing bug of UShort

version 3.7.6

    Multi line stringを入れました。

    CloverクラスにgetMethod(name:String), getClassField(name:String), getField(name:String)を入れました。またClassクラスにnumFields, numMethods, numClassFieldsをフィールドを追加。

    CloverクラスにisLoaded(name:String), isDefined(name:String)クラスを追加。

    CloverクラスにappendClassを入れました。

    オブジェクトの作成時newを省略できるようになりました。

version 3.7.6

    Added Multi line stirng.

    I added getMethod (name: String), getClassField (name: String), getField (name: String) to lover class. Also add numFields, numMethods, numClassFields fields to the Class class

    I added Clover.isLoaded(name:String), Clover.isDefined(name:String).

    I added Clover.appendClass(code:String).

    new can now be omitted when creating objects.

version 3.7.5
    
    Added Compile time scripting and Reflection.

version 3.7.4

    getppid, setsid, getsid, setpgrp, setpigdをSystemクラスに追加しました。

    REPLで配列に対するメソッドコールの補完にバグが有りました。修正。

version 3.7.4

    Added getppid, setsid, getsid, setpgrp, setpigd to System Class
    
    There was a bug in completing method calls for arrays in REPL. Fix.

version 3.7.3

    hashの値の表現に簡易表現を追加しました。a:Hash<String,Integer> = [ "AAA":2, "BBB":3 ]はコンパイルが通ります。

version 3.7.3

    simplified expression was added to the expression of the value of hash. a: Hash <String, Integer> = ["AAA": 2, "BBB": 3] is compiled

version 3.7.2

    変数への数値の代入時にint --> floatなどdoubleやfloatの場合は自動変換しなくなりました。
    (int --> long)などは暗黙のキャストが行われます

version 3.7.2

    When assigning a numeric value to a variable, it does not automatically convert to double or float such as int -> float. (int -> long) etc. are implicitly cast

version 3.7.1

    ローカル変数の多重代入を入れました。

    > (a, b) := (1,2)
    > (a, b) = (b, a)

    タプルの表記で簡単なものを追加しました。

    (1,"AAA", 1.1)  # == Tuple<Integer, String, Double>

version 3.7.1

    Added Multiple Assignements for local variables

    > (a, b) := (1,2)
    > (a, b) = (b, a)

    An easy thing was added by the notation of a tuple

    > (1,"AAA", 1.1)  # == Tuple<Integer, String, Double>

version 3.7.0

    コマンドライン引数のバグを修正。

    System.getopt, System.getopt_long, System.getopt_long_onlyを追加。

    -clean, --version, -versionオプションの廃止(-> 同名のコマンドライン引数が取れなくなるため)

version 3.7.0

    Fixed command line argument bug.

    System.getopt, System.getopt_long, System.getopt_long_only added.

    -clean, --version, -version option is deprecated (-> command line argument of the same name can not be taken)

version 3.6.9
    
    whenにパターンマッチングが入りました。以下のように使います。

    e := new Array<String>();

    f := when(e.className()) {
        match /.+<String>/: {
            123;
        }
        else {
            456;
        }
    }

    Clover.test("when test5", f == 123);

version 3.6.9

    Pattern matching has been entered into when. I use it as follows.

    e := new Array<String>();

    f := when(e.className()) {
        match /.+<String>/: {
            123;
        }
        else {
            456;
        }
    }

    Clover.test("when test5", f == 123);

version 3.6.8

    メモリリークといくつかのバグを修正しました。

version 3.6.8

    Fixed some bugs and memory leak.

version 3.6.7

    コマンドのサスペンドがversion 3.6.3でバグになっていました。修正。

version 3.6.7

    The command suspend was a bug in version 3.6.3. Fix.

version 3.6.6

    cd コマンドを実行した時に環境変数PWDを設定するようになりました。

    System.setenvの戻り値をBufferからStringに変更しました

version 3.6.6

    The environment variable PWD is now set when the cd command is executed.

    System.setenv's return value changed from Buffer to String

version 3.6.5

    REPLの補完のバグを修正。

version 3.6.5

    Fixed REPL complementary bug.

version 3.6.4

    プリミティブ型じゃない配列に対するメソッドコールのバグを修正。

    REPLの補完のバグを修正。

    Clover.ARGV, ARGC, VERSIONを追加。

version 3.6.4

    Fixed a bug in method calls for arrays that are not primitive types.

    Fixed REPL complementary bug.

    Added Clover.ARGV and ARGC, VERSION.

version 3.6.3

    System.mbstowcs, System.wcstombsのAPIの変更。詳しくはString.clclを見てください。

    System.tcgetatter, System.cfmakerawのAPIの変更。詳しくはCommand.clclを見てください。

    REPLの補完のバグを修正。

version 3.6.3

    System.mbstowcs, System.wcstombs API changes. See String.clcl for details.
    System.tcgetatter, System.cfmakeraw API change. See Command.clcl for details.

    Fixed REPL complementary bug.

version 3.6.2

    Systemクラスのクラス名を省略できるようになりました。

    各種システムコールの追加

version 3.6.2

    The class name of System class can be omitted.

    Addition of various system calls

version 3.6.1
    
    ポインタの演算子の右辺値はulongじゃなくても大丈夫になりました。a := 1; b := &a; b += 4は動きます。

version 3.6.1

    The right side value of the operator of the pointer is okay if it is not ulong. a: = 1; b: = & a; b + = 4 works.

version 3.6.0

    ファイルクラスにnew File("fname.txt", "w");などを入れました。内部的にはfopenやfwrite, freadされてバッファリングされます。

version 3.6.0

    I put new File ("fname.txt", "w"); etc in the file class. Internally it is fopen, fwrite, fread and buffered.

version 3.5.9

    メソッドの引数で数値型の変換は暗黙で行われるようになりました。int --> ulongなど。

version 3.5.9

    Numeric type conversion is now implicit in method arguments. int -> ulong and so on.

version 3.5.8

    configureの他のCPUへの対応やディレクトリ内のファイルの整理をしました。

versioin 3.5.8

    I configured configure and handle other CPUs and organize files in the directory.

version 3.5.7

    unset 変数名という命令を加えました。変数の宣言を取り消します。

    PowerPCに対応しました。

version 3.5.7

    We added an instruction called unset variable name. Cancel the variable declaration.

    It corresponds to PowerPC.


================================================
FILE: CLang.clcl
================================================
class CLangVariable
{
    var name:String;
    var type:String;
    var offset:int;

    def initialize(name:String, type:String, offset:int=0) {
        self.name = name.clone();
        self.type = type.clone();
        self.offset = offset;
    }

    def clone():CLangVariable {
        result := CLangVariable(self.name, self.type, self.offset);

        return result;
    }
    def compare(right:CLangVariable): int {
        return self.name.compare(right.name);
    }
    def equals(right:CLangVariable): bool {
        return self.name.equals(right.name) && self.type.equals(right.type) && self.offset == right.offset;
    }

    def toString():String {
        return "variable name \{name} type \{type} offset \{offset}";
    }
}

class CLangStruct {
    var name:String;
    var tagName:String;
    var fields:SortableList<CLangVariable>;

    def initialize(name:String, tag_name:String, fields:SortableList<CLangVariable>) {
        self.name = name.clone();
        self.fields = fields.clone();
        self.tagName = tag_name.clone();
    }

    def clone():CLangStruct {
        result := CLangStruct(self.name, self.tagName, self.fields);
        return result;
    }
    def compare(right:CLangStruct): int {
        return self.name.compare(right.name);
    }
    def equals(right:CLangStruct): bool {
        return self.name.equals(right.name) && self.tagName.equals(right.tagName) && self.fields.equals(right.fields);
    }

    def toString():String {
        return "struct name \{name} tagName \{tagName} fields \{fields}";
    }
}

class CLangUnion {
    var name:String;
    var tagName:String;
    var fields:SortableList<CLangVariable>;

    def initialize(name:String, tag_name:String, fields:SortableList<CLangVariable>) {
        self.name = name.clone();
        self.fields = fields.clone();
        self.tagName = tag_name.clone();
    }

    def clone():CLangUnion {
        result := CLangUnion(self.name, self.tagName, self.fields);
        return result;
    }
    def compare(right:CLangUnion): int {
        return self.name.compare(right.name);
    }
    def equals(right:CLangUnion): bool {
        return self.name.equals(right.name) && self.tagName.equals(right.tagName) && self.fields.equals(right.fields);
    }

    def toString():String {
        return "struct name \{name} tagName \{tagName} fields \{fields}";
    }
}

class CLangFunc {
    var type:String;
    var name:String;
    var params:SortableList<CLangVariable>;

    def initialize(type:String, name:String, params:SortableList<CLangVariable>)
    {
        self.type = type.clone();
        self.name = name.clone();
        self.params = params.clone();
    }

    def clone():CLangFunc {
        result := CLangFunc(self.type, self.name, self.params);

        return result;
    }
    def compare(right:CLangFunc): int {
        return self.name.compare(right.name);
    }
    def equals(right:CLangFunc): bool {
        return self.name.equals(right.name) && self.type.equals(right.type) && self.params.equals(right.params);
    }

    def toString():String {
        return "type \{type} name \{name} params \{params}";
    }
}

class CLang
{
    var p:Buffer;
    var source:Buffer;

    var funcs:SortableList<CLangFunc>;
    var structs:SortableList<CLangStruct>;
    var unions:SortableList<CLangUnion>;
    var vars:SortableList<CLangVariable>;

    def initialize(source:Buffer) {
        self.p = source;
        self.source = source;

        self.funcs = SortableList<CLangFunc>();
        self.structs = SortableList<CLangStruct>();
        self.unions = SortableList<CLangUnion>();
        self.vars = SortableList<CLangVariable>();
    }

    def skipLFAndSpaces() {
        while(p->byte == ' ' || p->byte == '\t' || p->byte == '\n') 
        {
            p++;
        }
    }

    def getWord():String {
        buf := "";
        while(p->byte != '\0') {
            if(isalnum(p->byte.to_char) || p->byte == '_')
            {
                buf.append(p->byte.to_char);
                p++;
            }
            else {
                break;
            }
        }
        skipLFAndSpaces();

        return buf;

    }
    def parseVarName():String {
        result := getWord();

        if(p->byte == '[') {
            result.append(p->byte.to_char);
            p++;
            skipLFAndSpaces();

            while(isdigit(p->byte.to_char)) {
                result.append(p->byte.to_char);
                p++;
                skipLFAndSpaces();
            }

            if(p->byte == ']') {
                result.append(p->byte.to_char);
                p++;
                skipLFAndSpaces();
            }
            else {
                throw Exception("Require ]");
            }
        }

        return result;
    }
    def parseParams():SortableList<CLangVariable> {
        result := SortableList<CLangVariable>();

        while(p->byte != '\0') {
            if(p->byte == ')') {
                p++;
                skipLFAndSpaces();
                break;
            }

            type := parseType();
            name := parseVarName();

            variable := CLangVariable(name, type);

            result.push(variable);

            if(p->byte == ',') {
                p++;
                skipLFAndSpaces();
            }
            elif(p->byte == ')') {
                p++;
                skipLFAndSpaces();
                break;
            }
            else {
                throw Exception("Require , or )");
            }
        }
        
        return result;
    }

    def parseType(): String {
        result := getWord();

        if(result.equals("struct")) {
            result = getWord();
        }
        elif(result.equals("union")) {
            result = getWord();
        }

        while(p->byte == '*') {
            result.append(p->byte.to_char);

            p++;
            skipLFAndSpaces();
        }

        return result;
    }

    def expected_next_charactor(c:byte) {
        if(p->byte == c) {
            p++;
            skipLFAndSpaces();
        }
        else {
            throw Exception("expected next character is \{c}");
        }
    }

    def parseStruct():CLangStruct {
        tmp := getWord();

        name := "";

        if(p->byte != '{') {
            name = getWord();
        }

        expected_next_charactor('{');

        fields := SortableList<CLangVariable>;

        tag_name := "";

        while(true) {
            if(p->byte == '}') {
                p++;
                skipLFAndSpaces();

                if(p->byte == ';') {
                    p++;
                    skipLFAndSpaces();
                }
                else {
                    tag_name = getWord();
                    expected_next_charactor(';');
                }
                break;
            }
            else {
                p_before := p.p;

                buf := getWord();

                if(buf.equals("struct")) {
                    struct_ := parseStruct();

                    for(it in struct_.fields) {
                        field_type := "";
                        field_name := "";

                        if(struct_.tagName.equals(""))
                        {
                            field_type = it.type;
                            field_name = it.name;
                        }
                        else {
                            field_type = it.type;
                            field_name = struct_.tagName.add("$").add(it.name);
                        }

                        variable := CLangVariable(field_name, field_type);

                        fields.push(variable);
                    }
                }
                elif(buf.equals("union")) {
                    union_ := parseUnion();

                    for(it in union_.fields) {
                        field_type := "";
                        field_name := "";

                        if(union_.tagName.equals(""))
                        {
                            field_type = it.type;
                            field_name = it.name;
                        }
                        else {
                            field_type = it.type;
                            field_name = union_.tagName.add("$").add(it.name);
                        }

                        variable := CLangVariable(field_name, field_type);

                        fields.push(variable);
                    }
                }
                else {
                    p.p = p_before;

                    field_type := parseType();
                    field_name := parseVarName();

                    expected_next_charactor(';');

                    variable := CLangVariable(field_name, field_type);

                    fields.push(variable);
                }
            }
        }

        return CLangStruct(name, tag_name, fields);
    }

    def parseUnion():CLangUnion {
        tmp := getWord();

        name := "";

        if(p->byte != '{') {
            name = getWord();
        }

        expected_next_charactor('{');

        fields := SortableList<CLangVariable>;

        tag_name := "";

        while(true) {
            if(p->byte == '}') {
                p++;
                skipLFAndSpaces();

                if(p->byte == ';') {
                    p++;
                    skipLFAndSpaces();
                }
                else {
                    tag_name = getWord();
                    expected_next_charactor(';');
                }
                break;
            }
            else {
                p_before := p.p;

                buf := getWord();

                if(buf.equals("struct")) {
                    struct_ := parseStruct();

                    for(it in struct_.fields) {
                        field_type := "";
                        field_name := "";

                        if(struct_.tagName.equals(""))
                        {
                            field_type = it.type;
                            field_name = it.name;
                        }
                        else {
                            field_type = it.type;
                            field_name = struct_.tagName.add("$").add(it.name);
                        }

                        variable := CLangVariable(field_name, field_type);

                        fields.push(variable);
                    }
                }
                elif(buf.equals("union")) {
                    union_ := parseUnion();

                    for(it in union_.fields) {
                        field_type := "";
                        field_name := "";

                        if(union_.tagName.equals(""))
                        {
                            field_type = it.type;
                            field_name = it.name;
                        }
                        else {
                            field_type = it.type;
                            field_name = union_.tagName.add("$").add(it.name);
                        }

                        variable := CLangVariable(field_name, field_type);

                        fields.push(variable);
                    }
                }
                else {
                    p.p = p_before;

                    field_type := parseType();
                    field_name := parseVarName();

                    expected_next_charactor(';');

                    variable := CLangVariable(field_name, field_type);

                    fields.push(variable);
                }
            }
        }

        return CLangUnion(name, tag_name, fields);
    }

    def parseFunction(type:String, name:String) {
        params := parseParams();

        if(p->byte == ';') {
            p++;
            skipLFAndSpaces();
        }

        fun := CLangFunc(type, name, params);
        funcs.push(fun);
    }

    def removeComment()
    {
        result := Buffer();
        p = source;
        while(true) {
            if(p->byte == '/' && (p+1)->byte == '*')
            {
                while(true) {
                    if(p->byte == '*' 
                        && (p+1)->byte == '/')
                    {
                        p+=2;
                        break;
                    }
                    elif(p->byte == '\0') {
                        throw Exception("Require */ before the source end");
                    }
                    else {
                        p++;
                    }
                }
            }
            elif(p->byte == '/' && (p+1)->byte == '/')
            {
                while(true) {
                    if(p->byte == '\n')
                    {
                        p++;
                        break;
                    }
                    elif(p->byte == '\0') {
                        break;
                    }
                    else {
                        p++;
                    }
                }
            }
            elif(p->byte == '\0') {
                result.append(p->byte);
                break;
            }
            else {
                result.append(p->byte);
                p++;
            }
        }

        source = result;
        p = source;
    }

    def parseHeader() {
        skipLFAndSpaces();

        while(p->byte != '\0') {
            p_before := p.p;

            buf := getWord();

            if(buf.equals("struct")) {
                tmp := getWord();

                if(p->byte == '{') {
                    p.p = p_before;

                    struct_ := parseStruct();
                    structs.push(struct_);
                }
                else {
                    p.p = p_before;

                    type := parseType();
                    name := parseVarName();

                    if(p->byte == '(') {
                        p++;
                        skipLFAndSpaces();

                        parseFunction(type, name);
                    }
                    else {
                        if(p->byte == ';') {
                            p++;
                            skipLFAndSpaces();
                        }

                        var_ := CLangVariable(name, type);
                        vars.push(var_);
                    }
                }
            }
            elif(buf.equals("union")) {
                tmp := getWord();

                if(p->byte == '{') {
                    p.p = p_before;

                    union_ := parseUnion();
                    unions.push(union_);
                }
                else {
                    p.p = p_before;

                    type := parseType();
                    name := parseVarName();

                    if(p->byte == '(') {
                        p++;
                        skipLFAndSpaces();

                        parseFunction(type, name);
                    }
                    else {
                        if(p->byte == ';') {
                            p++;
                            skipLFAndSpaces();
                        }

                        var_ := CLangVariable(name, type);
                        vars.push(var_);
                    }
                }
            }
            elif(buf.equals("typedef")) {
            }
            elif(buf.equals("extern")) {
                type := parseType();
                name := parseVarName();

                if(p->byte == '(') {
                    field_type :=
                    field_name :=
                    p++;
                    skipLFAndSpaces();

                    parseFunction(type, name);
                }
                else {
                    if(p->byte == ';') {
                        p++;
                        skipLFAndSpaces();
                    }

                    var_ := CLangVariable(name, type);
                    vars.push(var_);
                }
            }
            ### Function ###
            else {
                p.p = p_before;

                type := parseType();
                name := parseVarName();

                if(p->byte == '(') {
                    p++;
                    skipLFAndSpaces();

                    parseFunction(type, name);
                }
                else {
                    if(p->byte == ';') {
                        p++;
                        skipLFAndSpaces();
                    }

                    var_ := CLangVariable(name, type);
                    vars.push(var_);
                }
            }
        }
    }
    def include(fname:String): static {
        source := fname.toPath().read();
        source.append('\0');

        c := CLang(source);
        c.removeComment();

        c.parseHeader();

        Clover.appendClass(c.pasteHeader());
    }
    def translateCVarNameToClover2VarName(name:String, type:String):String
    {
        result := name;

        if(name.match(/.+\[\d+\]/)) {
            result  = name.scan(/(.+)\[\d+\]/).items(1);
        }

        return result;
    }

    def translateCTypeToClover2Type(name:String, type:String):String
    {
        if(type.match(/char\*+/)) {
            stars := type.scan(/char(\*+)/).items(1);
            type = "byte".add(stars);
        }
        elif(type.equals("char")) {
            type = "byte";
        }

        if(name.match(/.+\[\d+\]/)) {
            array_name := name.scan(/.+(\[\d+\])/).items(1);
            type.append(array_name);
        }

        return type;
    }

    def pasteStructs(): String {
        result := "";

        Command.mkdir("-p", getenv("HOME").add("/.clover2/tmp"));
        Command.chmod("755", getenv("HOME").add("/.clover2/tmp"));

        for(it in structs) {
            """
            #include <stdio.h>
            #include <stdlib.h>

            \{source}

            int main() {
                struct \{it.name} data;
                printf("%ld\\n", sizeof(struct \{it.name}));
                \{
                result := "";
                for(it2 in it.fields) {
                    result.append(
                        """
                        printf("%ld\\n", (char*)&data.\{it2.name.sub(/\$/g, ".")} - (char*)&data);
                        """
                    );
                }
                result;
                }
                exit(0);
            }
            """.write(getenv("HOME").add("/.clover2/tmp/tmp.c"));

            gcc("-o", "clover2_get_struct_size", getenv("HOME").add("/.clover2/tmp/tmp.c"));
            system("./clover2_get_struct_size > clover2_get_struct_size_out");
            output := cat("clover2_get_struct_size_out").toString().split(/\n/);

            size := output.items(0).to_int();
            n := 1;
            for(it2 in it.fields) {
                it2.offset = output.items(n).to_int();
                n++;
            }
            rm("./clover2_get_struct_size")
            rm("./clover2_get_struct_size_out")


            result.append(
                """
                struct \{it.name}:\{size} {
                \{
                    result := "";
                    for(it2 in it.fields) {
                        name := it2.name;
                        type := it2.type;
                        offset := it2.offset;

                        clover2_name := translateCVarNameToClover2VarName(name, type);
                        clover2_type := translateCTypeToClover2Type(name, type);

                        result.append("\{clover2_name}:\{clover2_type}:\{offset};\n");
                    }
                    result;
                }
                }
                """
            );
        }
        for(it in unions) {
            """
            #include <stdio.h>
            #include <stdlib.h>

            \{source}

            int main() {
                union \{it.name} data;
                printf("%ld\\n", sizeof(union \{it.name}));
                \{
                result := "";
                for(it2 in it.fields) {
                    result.append(
                        """
                        printf("%ld\\n", (char*)&data.\{it2.name.sub(/\$/g, ".")} - (char*)&data);
                        """
                    );
                }
                result;
                }
                exit(0);
            }
            """.write(getenv("HOME").add("/.clover2/tmp/tmp.c"));

            gcc("-o", "clover2_get_struct_size", getenv("HOME").add("/.clover2/tmp/tmp.c"));
            system("./clover2_get_struct_size > clover2_get_struct_size_out");
            output := cat("clover2_get_struct_size_out").toString().split(/\n/);

            size := output.items(0).to_int();
            n := 1;
            for(it2 in it.fields) {
                it2.offset = output.items(n).to_int();
                n++;
            }
            rm("./clover2_get_struct_size")
            rm("./clover2_get_struct_size_out")


            result.append(
                """
                struct \{it.name}:\{size} {
                \{
                    result := "";
                    for(it2 in it.fields) {
                        name := it2.name;
                        type := it2.type;
                        offset := it2.offset;

                        clover2_name := translateCVarNameToClover2VarName(name, type);
                        clover2_type := translateCTypeToClover2Type(name, type);

                        result.append("\{clover2_name}:\{clover2_type}:\{offset};\n");
                    }
                    result;
                }
                }
                """
            );
        }

        return result;
    }

    def pasteHeader():String {
        result := "class C version 2 {\n";
        for(it in funcs) {
            params := "";
            i := 0;
            for(it2 in it.params) {
                name := it2.name.clone();
                type := it2.type.clone();

                clover2_name := translateCVarNameToClover2VarName(name, type);
                clover2_type := translateCTypeToClover2Type(name, type);
                params.append("\{clover2_name}:\{clover2_type}");

                if(i != it.params.length()-1) {
                    params.append(", ");
                }

                i++;
            }

            if(it.type.equals("void")) {
                result.append("def \{it.name}(\{params});\n");
            }
            else {
                name := it.name;
                type := it.type;
                type = translateCTypeToClover2Type(name, type);
                result.append("def \{name}(\{params}):\{type};\n");
            }
        }
        for(it in vars) {
            name := it.name;
            type := it.type;
            type = translateCTypeToClover2Type(name, type);

            if(name.match(/[a-zA-Z_0-9]+\[[0-9]+\]/)) {
                name = name.scan(/([a-zA-Z_0-9]+)\[[0-9]+\]/).items(1);
                #type = "pointer"
            }

            if(type.match(/[a-zA-Z_0-9]+\*+/)) {
                type = "pointer"
            }
            
            result.append("var \{name}:\{type};\n");
        }

        result.append("}\n");

        result.append(pasteStructs());

result.println();

        return result;
    }
}


================================================
FILE: CLibrary.clcl
================================================

inherit System
{
    def strcmp(x:pointer, y:pointer): int from libc.so.6
}


================================================
FILE: Command.clcl
================================================

inherit System
{
    typedef wait_status int;
    typedef wait_option int;
    typedef tcflag_t int;
    typedef cc_t byte;
    typedef speed_t int;

    WNOHANG:static wait_option;
    WUNTRACED:static wait_option;
    WCONTINUED:static wait_option;

    SIGHUP: static int;
    SIGINT: static int;
    SIGQUIT: static int;
    SIGILL: static int;
    SIGABRT: static int;
    SIGFPE: static int;
    SIGKILL: static int;
    SIGSEGV: static int;
    SIGPIPE: static int;
    SIGALRM: static int;
    SIGTERM: static int;
    SIGUSR1: static int;
    SIGUSR2: static int;
    SIGCHLD: static int;
    SIGCONT: static int;
    SIGSTOP: static int;
    SIGTSTP: static int;
    SIGTTIN: static int;
    SIGTTOU: static int;
    
    # c_iflag bits
    IGNBRK: static int;
    BRKINT: static int;
    IGNPAR: static int;
    PARMRK: static int;
    INPCK: static int;
    ISTRIP: static int;
    INLCR: static int;
    IGNCR: static int;
    ICRNL: static int;
    IUCLC: static int;
    IXON: static int;
    IXANY: static int;
    IXOFF: static int;
    IMAXBEL: static int;
    IUTF8: static int;

    # c_oflag bits
    OPOST: static int;
    OLCUC: static int;
    ONLCR: static int;
    OCRNL: static int;
    ONOCR: static int;
    ONLRET: static int;
    OFILL: static int;
    OFDEL: static int;
    NLDLY: static int;
    NL0: static int;
    NL1: static int;
    CRDLY: static int;
    CR0: static int;
    CR1: static int;
    CR2: static int;
    CR3: static int;
    TABDLY: static int;
    TAB0: static int;
    TAB1: static int;
    TAB2: static int;
    TAB3: static int;
    BSDLY: static int;
    BS0: static int;
    BS1: static int;
    FFDLY: static int;
    FF0: static int;
    FF1: static int;

    VTDLY: static int;
    VT0: static int;
    VT1: static int;

    XTABS: static int;

    # c_cflag bit meaning 
    CBAUD: static int;
    B0: static int;
    B50: static int;
    B75: static int;
    B110: static int;
    B134: static int;
    B150: static int;
    B200: static int;
    B300: static int;
    B600: static int;
    B1200: static int;
    B1800: static int;
    B2400: static int;
    B4800: static int;
    B9600: static int;
    B19200: static int;
    B38400: static int;
    EXTA: static int;
    EXTB: static int;
    CSIZE: static int;
    CS5: static int;
    CS6: static int;
    CS7: static int;
    CS8: static int;
    CSTOPB: static int;
    CREAD: static int;
    PARENB: static int;
    PARODD: static int;
    HUPCL: static int;
    CLOCAL: static int;
    CBAUDEX: static int;
    B57600: static int;
    B115200: static int;
    B230400: static int;
    B460800: static int;
    B500000: static int;
    B576000: static int;
    B921600: static int;
    B1000000: static int;
    B1152000: static int;
    B1500000: static int;
    B2000000: static int;
    B2500000: static int;
    B3000000: static int;
    B3500000: static int;
    B4000000: static int;
    CIBAUD: static int;
    CMSPAR: static int;
    CRTSCTS: static int;

    # c_lflag bits
    ISIG: static int;
    ICANON: static int;
    XCASE: static int;
    ECHO: static int;
    ECHOE: static int;
    ECHOK: static int;
    ECHONL: static int;
    NOFLSH: static int;
    TOSTOP: static int;
    ECHOCTL: static int;
    ECHOPRT: static int;
    ECHOKE: static int;
    FLUSHO: static int;
    PENDIN: static int;
    IEXTEN: static int;
    EXTPROC: static int;

    # tcflow() and TCXONC use these */
    TCOOFF: static int;
    TCOON: static int;
    TCIOFF: static int;
    TCION: static int;

    # tcflush() and TCFLSH use these */
    TCIFLUSH: static int;
    TCOFLUSH: static int;
    TCIOFLUSH: static int;

    # tcsetattr uses these
    TCSANOW: static int;
    TCSADRAIN: static int;
    TCSAFLUSH: static int;

    # c_cc characters
    VINTR: static int;
    VQUIT: static int;
    VERASE: static int;
    VKILL: static int;
    VEOF: static int;
    VTIME: static int;
    VMIN: static int;
    VSWTC: static int;
    VSTART: static int;
    VSTOP: static int;
    VSUSP: static int;
    VEOL: static int;
    VREPRINT: static int;
    VDISCARD: static int;
    VWERASE: static int;
    VLNEXT: static int;
    VEOL2: static int;

    def initialize_command_system():static native;

    def initialize(): static {
        inherit();
        initialize_command_system();
    }

    def system(str:String): static native int throws Exception;
    def pipe(read_fd:pointer@int, write_fd:pointer@int): static native throws Exception;
    def popen(command:String, type:String): static native pointer@FILE throws Exception;
    def pclose(stream:pointer@FILE): static native int;
    def fork(block_:lambda()): static native pid_t throws Exception;
    def dup2(fd1:int, fd2:int): static native int throws Exception;
    def execvp(method_name:String, params:List<String>): static native throws Exception;
    def execv(method_name:String, params:List<String>): static native throws Exception;
    def waitpid(pid:pid_t, status:pointer@wait_status, option:wait_option): static native pid_t;

    def WIFEXITED(status:wait_status): static native bool;
    def WEXITSTATUS(status:wait_status): static native int;
    def WIFSIGNALED(status:wait_status): static native bool;
    def WTERMSIG(status:wait_status):static native int;
    def WCOREDUMP(status:wait_status): static native int;
    def WIFSTOPPED(status:wait_status): static native bool;
    def WSTOPSIG(status:wait_status):  static native int;
    def WIFCONTINUED(status:wait_status): static native bool;

    def getpid():static native pid_t;
    def setpgid(pid:pid_t, pgid:pid_t): static native throws Exception;
    def kill(pid:pid_t, sig:int): static native throws Exception;

    def tcsetpgrp(fd:int, pid:pid_t): static native int throws Exception;

    def tcgetattr(fd:int): static native termios throws Exception;
    def tcsetattr(fd:int, optional_actions:int, terminfo:termios): static native throws Exception;
    def tcsendbreak(fd:int, duration:int): static native throws Exception;
    def tcdrain(fd:int): static native throws Exception;
    def tcflush(fd:int, queue_selector:int): static native throws Exception;
    def tcflow(fd:int, action:int): static native throws Exception;
    def cfmakeraw(): static native termios;
    def cfgetispeed(terminfo:termios): static native speed_t;
    def cfgetospeed(terminfo:termios): static native speed_t;
    def cfsetispeed(terminfo:termios, speed:speed_t): static native throws Exception;
    def cfsetospeed(terminfo:termios, speed:speed_t): static native throws Exception;
    def cfsetspeed(terminfo:termios, speed:speed_t): static native throws Exception;
    def getmaxx(): native static int throws Exception;
    def getmaxy(): native static int throws Exception;
}

class termios
{
    include MObjectBase;

    c_iflag:tcflag_t;
    c_oflag:tcflag_t;
    c_cflag:tcflag_t;
    c_lflag:tcflag_t;
    c_cc:cc_t[];

    def initialize() {
        self.c_iflag = 0;
        self.c_oflag = 0;
        self.c_cflag = 0;
        self.c_lflag = 0;
        self.c_cc = cc_t[32];
    }
    
    def clone():termios {
        result := termios();

        result.c_iflag = self.c_iflag;
        result.c_oflag = self.c_oflag;
        result.c_cflag = self.c_cflag;
        result.c_lflag = self.c_lflag;
        result.c_cc = cc_t[32];
        for(i:=0; i<32; i++) {
            result.c_cc[i] = self.c_cc[i];
        }

        return result;
    }
}

class Job
{
    include MObjectBase;

    title:String;
    pgrp:pid_t;
    terminfo:termios;

    def initialize(title:String, pgrp:pid_t, terminfo:termios) {
        self.title = title;
        self.pgrp = pgrp;
        self.terminfo = terminfo;
    }

    def initialize() {}

    def clone(): Job {
        result := Job();

        if(self.title.identifyWith(null).negative()) {
            result.title = self.title.clone();
        }
        result.pgrp = self.pgrp;
        if(self.terminfo.identifyWith(null).negative()) {
            result.terminfo = self.terminfo.clone();
        }

        return result;
    }

    def toString():String {
        return self.title;
    }
    def equals(job:Job): bool {
        if(job.is("WildCard")) {
            return true;
        }
        else {
            return self.pgrp == job.pgrp;
        }
    }
    def equals(right:WildCard): bool {
        return true;
    }
    def forground() {
        terminfo := tcgetattr(0);

        tcsetattr(0, TCSANOW, self.terminfo);
        tcsetpgrp(0, self.pgrp);

        kill(self.pgrp, SIGCONT);

        status:wait_status = 0;
        pid2 := waitpid(self.pgrp, &status, WUNTRACED);

        if(WIFSTOPPED(status)) {
            rcode := WSTOPSIG(status) +128;

            terminfo2 := tcgetattr(0);

            self.terminfo = terminfo2;

            tcsetattr(0, TCSANOW, terminfo);
            tcsetpgrp(0, getpid());
        }
        elif(WIFSIGNALED(status)) {
            printf("Job<%s> is done.\n", array { self.title });

            Clover.jobs.delete(self);

            tcsetattr(0, TCSANOW, terminfo);
            tcsetpgrp(0, getpid());
        }
        else {
            Clover.jobs.delete(self);

            tcsetattr(0, TCSANOW, terminfo);
            tcsetpgrp(0, getpid());
        }
    }
}

inherit Clover 
{
    jobs: static EqualableList<Job>;

    def initialize(): static {
        inherit();

        Clover.jobs = EqualableList<Job>();
    }
}

dynamic_class Command
{
    include MObjectBase;

    data:String;
    error:String;
    resultCode:int;

    controllingTerminalPrograms: static EqualableList<String>;

    def initialize() : static {
        Command.controllingTerminalPrograms = equalable_list { "bash", "zsh", "yash", "vim", "less", "top", "htop", "lv", "emacs", "nano", "vi", "fd", "mc" };
    }

    def initialize() {
        self.data = "";
        self.resultCode = 0;
        self.error = "";
    }
    def initialize(value:Command) {
        self.setValue(value);
    }
    def initialize(data:String, result_code:int) {
        self.data = data;
        self.resultCode = result_code;
        self.error = "";
    }
    def initialize(data:String, result_code:int, error:String) {
        self.data = data;
        self.resultCode = result_code;
        self.error = error;
    }

    def clone(): Command {
        result := Command();

        if(self.data != null) {
            result.data = self.data.clone();
        }
        if(self.error != null) {
            result.error = self.error.clone();
        }

        result.resultCode = self.resultCode;

        return result;
    }

    def setValue(value:Command) {
        self.data = value.data;
        self.resultCode = value.resultCode;
        self.error = value.error;
    }

    def flatternParams(params:Array<Object>):static List<String> {
        params2 := List<String>();

        params.each {
            if(it.className().equals("String")) {
                params2.add(it.toAnonymous().cast("String"));
            }
            elif(it.className().equals("Path")) {
                params2.add(it.toAnonymous().cast("Path").toString());
            }
            elif(it.className().match(/^List</)) {
                list_:List<Anonymous> = it.toAnonymous();

                list_.each {
                    if(it.className().equals("String")) {
                        params2.add(it.toAnonymous().cast("String"));
                    }
                }
            }
            elif(it.className().match(/^EqualableList</)) {
                list_:EqualableList<Anonymous> = it.toAnonymous();

                list_.each {
                    if(it.className().equals("String")) {
                        params2.add(it.toAnonymous().cast("String"));
                    }
                }
            }
            elif(it.className().match(/^SortableList</)) {
                list_:SortableList<Anonymous> = it.toAnonymous();

                list_.each {
                    if(it.className().equals("String")) {
                        params2.add(it.toAnonymous().cast("String"));
                    }
                }
            }
            elif(it.className().match(/^Array</)) {
                array_:Array<Anonymous> = it.toAnonymous();

                array_.each {
                    if(it.className().equals("String")) {
                        params2.add(it.toAnonymous().cast("String"));
                    }
                }
            }
            elif(it.className().match(/^EqualableArray</)) {
                array_:EqualableArray<Anonymous> = it.toAnonymous();

                array_.each {
                    if(it.className().equals("String")) {
                        params2.add(it.toAnonymous().cast("String"));
                    }
                }
            }
            elif(it.className().match(/^SortableArray</)) {
                array_:SortableArray<Anonymous> = it.toAnonymous();

                array_.each {
                    if(it.className().equals("String")) {
                        params2.add(it.toAnonymous().cast("String"));
                    }
                }
            }
        }

        return params2;
    }

    def callingMethod(method_name:String, params:Array<Object>, num_method_chains:int, max_method_chains:int) : static Command throws Exception 
    {
        controlling_terminal_flag := false;
        no_controlling_terminal_flag := false;
        getting_stderr_flag := false;

        params2 := flatternParams(params);

        params2.each {
            if(it.equals("--controlling-terminal")) {
                controlling_terminal_flag = true;
            }
            elif(it.equals("--no-controlling-terminal")) {
                no_controlling_terminal_flag = true;
            }
            elif(it.equals("--getting-stderr") || it.equals("-stderr")) {
                getting_stderr_flag = true;
            }
        }

        params2 = params2.select { !it.equals("--controlling-terminal") && !it.equals("--no-controlling-terminal") && !it.equals("--getting-stderr") && !it.equals("-stderr"); }

        if(getting_stderr_flag) {
            str:String? = null;
            return Command.executeCommandWithGettingStderr(method_name, params2, str);
        }
        elif(num_method_chains == max_method_chains-1 && (controlling_terminal_flag || Command.controllingTerminalPrograms.indexOf(method_name) != -1) && !no_controlling_terminal_flag )
        {
            return Command.executeCommandWithControllingTerminal(method_name, params2);
        }
        else {
            str:String? = null;
            return Command.executeCommand(method_name, params2, str);
        }
    }

    def callingMethod(method_name:String, params:Array<Object>, num_method_chains:int, max_method_chains:int) : Command throws Exception 
    {
        controlling_terminal_flag := false;
        no_controlling_terminal_flag := false;
        getting_stderr_flag := false;
        
        params2 := flatternParams(params);

        params2.each {
            if(it.equals("--controlling-terminal")) {
                controlling_terminal_flag = true;
            }
            elif(it.equals("--no-controlling-terminal")) {
                no_controlling_terminal_flag = true;
            }
            elif(it.equals("--getting-stderr") || it.equals("-stderr")) {
                getting_stderr_flag = true;
            }
        }

        params2 = params2.select { !it.equals("--controlling-terminal") && !it.equals("--no-controlling-terminal") && !it.equals("--getting-stderr") && !it.equals("-stderr"); }

        if(getting_stderr_flag) {
            return Command.executeCommandWithGettingStderr(method_name, params2, self.data);
        }
        elif(num_method_chains == max_method_chains-1 && (controlling_terminal_flag || Command.controllingTerminalPrograms.indexOf(method_name) != -1) && !no_controlling_terminal_flag )
        {
            return Command.executeCommandWithControllingTerminalByPipe(method_name, params2, self.data);
        }
        else {
            return Command.executeCommand(method_name, params2, self.data);
        }
    }

    def expandArg(arg:String, quoted_string:bool=false):static SortableList<String> {
        if(Directory.isGlobString(arg) && !quoted_string) {
            dir := dirname(arg);
            if(dir.equals(".")) {
                pattern := "";
                if(arg.subString(0, 2).equals("./")) {
                    pattern = arg.subString(2, -1);
                }
                else {
                    pattern = arg;
                }

                if(quoted_string) {
                    return slist { pattern };
                }
                else {
                    return Directory.glob(dir, pattern, 0).map { it.subString(2,-1); }.select { !it.equals(".") && !it.equals("..") };
                }
            }
            elif(dir.equals("/")) {
                pattern := arg.subString(1, -1);

                if(quoted_string) {
                    return slist { pattern };
                }
                else {
                    return Directory.glob(dir, pattern, 0).select { !it.equals("/.") && !it.equals("/.."); }
                }
            }
            else {
                pattern := arg.subString(dir.length()+1, -1);
                if(quoted_string) {
                    return slist { pattern };
                }
                else {
                    return Directory.glob(dir, pattern, 0).select { !it.equals(dir.add("/.")) && !it.equals(dir.add("/..")) };
                }
            }
        }
        else {
            return slist { arg };
        }
    }

    def set_fl(fd:int, flags:int):static {
        value := fcntl(fd, F_GETFL, 0);

        value |= flags;

        fcntl(fd, F_SETFL, value);
    }

    def executeCommandWithGettingStderr(method_name:String, params:List<String>, pipe_data:String?) : static Command throws Exception
    {
        child2parent_write_fd := 0;
        child2parent_read_fd := 0;
        parent2child_write_fd := 0;
        parent2child_read_fd := 0;
        child2parent_read_fd_err := 0;
        child2parent_write_fd_err := 0;

        pipe(&parent2child_read_fd, &parent2child_write_fd);
        pipe(&child2parent_read_fd, &child2parent_write_fd);
        pipe(&child2parent_read_fd_err, &child2parent_write_fd_err);

        pid:pid_t = fork() {
            close(parent2child_write_fd);
            close(child2parent_read_fd);
            close(child2parent_read_fd_err);

            dup2(parent2child_read_fd, 0);
            dup2(child2parent_write_fd, 1);
            dup2(child2parent_write_fd_err, 2);

            close(parent2child_read_fd);
            close(child2parent_write_fd);
            close(child2parent_write_fd_err);

            setenv("COLUMNS", getmaxx().toString(), 1);
            setenv("LINES", getmaxy().toString(), 1);

            try {
                if(method_name.chars(0) == '/') {
                    execv(method_name, params);
                }
                elif(method_name.indexOf("./") == 0)
                {
                    execv(method_name, params);
                }
                else {
                    execvp(method_name, params);
                }
            } catch(e:Exception) {
                buffer := e.message.append("\n").toBuffer();
                System.write(2, buffer, buffer.len.to_ulong);
                exit(64);
            }
        }

        close(parent2child_read_fd);
        close(child2parent_write_fd);
        close(child2parent_write_fd_err);

        if(!pipe_data.identifyWith(null)) {
            buffer := pipe_data.toBuffer();
            System.write(parent2child_write_fd, buffer, buffer.len);
        }
        close(parent2child_write_fd);

        child_output:Buffer = B"";

        set_fl(child2parent_read_fd_err, O_NONBLOCK);
        
        while(true) {
            pipe_data := Buffer(8192.to_ulong);

            readed_byte := read(child2parent_read_fd, pipe_data, 8192.to_ulong);

            pipe_data_err := Buffer(8192.to_ulong);

            readed_byte_err := 0;

            try {
                readed_byte_err = read(child2parent_read_fd_err, pipe_data_err, 8192.to_ulong);
            } catch(e:Exception) {
                readed_byte_err = 0;
            }

            if(readed_byte <= 0 && readed_byte_err <= 0) {
                break;
            }

            child_output.append(pipe_data);
            child_output.append(pipe_data_err);
        }

        close(child2parent_read_fd);
        close(child2parent_read_fd_err);

        status: wait_status = 0;

        pid2:pid_t = waitpid(pid, &status, WUNTRACED);

        if(WEXITSTATUS(status) == 64) {
            throw Exception("Command not found");
        }

        return Command(child_output.toString(), WEXITSTATUS(status));
    }

    def executeCommand(method_name:String, params:List<String>, pipe_data:String?) : static Command throws Exception
    {
        child2parent_write_fd := 0;
        child2parent_read_fd := 0;
        parent2child_write_fd := 0;
        parent2child_read_fd := 0;
        child2parent_read_fd_err := 0;
        child2parent_write_fd_err := 0;

        pipe(&child2parent_read_fd, &child2parent_write_fd);
        pipe(&parent2child_read_fd, &parent2child_write_fd);
        pipe(&child2parent_read_fd_err, &child2parent_write_fd_err);

        pid:pid_t = fork() {
            close(parent2child_write_fd);
            close(child2parent_read_fd);
            close(child2parent_read_fd_err);

            dup2(parent2child_read_fd, 0);
            dup2(child2parent_write_fd, 1);
            dup2(child2parent_write_fd_err, 2);

            close(parent2child_read_fd);
            close(child2parent_write_fd);
            close(child2parent_write_fd_err);

            setenv("COLUMNS", getmaxx().toString(), 1);
            setenv("LINES", getmaxy().toString(), 1);

            try {
                if(method_name.chars(0) == '/') {
                    execv(method_name, params);
                }
                elif(method_name.indexOf("./") == 0)
                {
                    execv(method_name, params);
                }
                else {
                    execvp(method_name, params);
                }
            } catch(e:Exception) {
                buffer := e.message.append("\n").toBuffer();
                System.write(2, buffer, buffer.len);
                System.write(2, method_name.toBuffer(), method_name.length());
                System.write(2, "\n".toBuffer(), 1);
                exit(2);
            }
            exit(2);
        }

        close(parent2child_read_fd);
        close(child2parent_write_fd);
        close(child2parent_write_fd_err);

        if(!pipe_data.identifyWith(null)) {
            buffer := pipe_data.toBuffer();
            System.write(parent2child_write_fd, buffer, buffer.len);
        }
        close(parent2child_write_fd);

        child_output := B"";
        child_output_error := B"";

        set_fl(child2parent_read_fd_err, O_NONBLOCK);

        while(true) {
            pipe_data := Buffer(8192.to_ulong);
            readed_byte := read(child2parent_read_fd, pipe_data, 8192.to_ulong);

            pipe_data_err := Buffer(8192.to_ulong);

            readed_byte_err := 0;

            try {
                readed_byte_err = read(child2parent_read_fd_err, pipe_data_err, 8192.to_ulong);
            } catch(e:Exception) {
                readed_byte_err = 0;
            }

            if(readed_byte <= 0 && readed_byte_err <= 0) {
                break;
            }

            child_output.append(pipe_data);
            child_output_error.append(pipe_data_err);
        }

        close(child2parent_read_fd);
        close(child2parent_read_fd_err);

        status: wait_status = 0;

        pid2:pid_t = waitpid(pid, &status, WUNTRACED);

        if(WEXITSTATUS(status) == 64) {
            throw Exception("Command not found");
        }

        return Command(child_output.toString(), WEXITSTATUS(status), child_output_error.toString());
    }

    def executeCommandWithControllingTerminal(method_name:String, params:List<String>) : static Command throws Exception
    {
        pid:pid_t = fork() {
            pid:pid_t = getpid();

            setpgid(0, 0);
            tcsetpgrp(0, pid);

            setenv("COLUMNS", getmaxx().toString(), 1);
            setenv("LINES", getmaxy().toString(), 1);

            try {
                if(method_name.chars(0) == '/') {
                    execv(method_name, params);
                }
                elif(method_name.indexOf("./") == 0)
                {
                    execv(method_name, params);
                }
                else {
                    execvp(method_name, params);
                }
            } catch(e:Exception) {
                buffer := e.message.append("\n").toBuffer();
                System.write(2, buffer, buffer.len);
                System.write(2, method_name.toBuffer(), method_name.length());
                System.write(2, "\n".toBuffer(), 1);
                exit(64);
            }
        }

        setpgid(pid, pid);
        tcsetpgrp(0, pid);

        status: wait_status = 0;

        pid2:pid_t = waitpid(pid, &status, WUNTRACED);

        if(WEXITSTATUS(status) == 64) {
            throw Exception("Command not found");
        }

        if(WIFSTOPPED(status)) {
            rcode := WSTOPSIG(status) +128;
            title := method_name;

            terminfo := tcgetattr(0);

            job:Job = Job(title, pid, terminfo);

            Clover.jobs.add(job);

            setpgid(getpid(), getpid());
            tcsetpgrp(0, getpid());

            return Command("", rcode);
        }
        else {
            setpgid(getpid(), getpid());
            tcsetpgrp(0, getpid());

            return Command("", WEXITSTATUS(status));
        }

        return Command("", WEXITSTATUS(status));
    }

    def executeCommandWithControllingTerminalByPipe(method_name:String, params:List<String>, pipe_data:String): static Command throws Exception
    {
        parent2child_write_fd := 0;
        parent2child_read_fd := 0;

        pipe(&parent2child_read_fd, &parent2child_write_fd);

        pid:pid_t = fork() {
            close(parent2child_write_fd);

            pid:pid_t = getpid();

            setpgid(0, 0);
            tcsetpgrp(0, pid);

            setenv("COLUMNS", getmaxx().toString(), 1);
            setenv("LINES", getmaxy().toString(), 1);

            dup2(parent2child_read_fd, 0);
            close(parent2child_read_fd);

            try {
                if(method_name.chars(0) == '/') {
                    execv(method_name, params);
                }
                elif(method_name.indexOf("./") == 0)
                {
                    execv(method_name, params);
                }
                else {
                    execvp(method_name, params);
                }
            } catch(e:Exception) {
                buffer := e.message.append("\n").toBuffer();
                System.write(2, buffer, buffer.len.to_ulong);
#                exit(64);
            }
        }

        setpgid(pid, pid);
        tcsetpgrp(0, pid);

        close(parent2child_read_fd);

        if(!pipe_data.identifyWith(null)) {
            buffer := pipe_data.toBuffer();
            try {
                System.write(parent2child_write_fd, buffer, buffer.len);
            } catch(e:Exception) {
                kill(pid, SIGTERM);
            }
        }
        close(parent2child_write_fd);

        status: wait_status = 0;

        pid2:pid_t = waitpid(pid, &status, WUNTRACED);

        if(WEXITSTATUS(status) == 64) {
            throw Exception("Command not found");
        }

        if(WIFSTOPPED(status)) {
            rcode := WSTOPSIG(status) +128;
            title:String = method_name;

            terminfo := tcgetattr(0);

            job := Job(title, pid, terminfo);

            Clover.jobs.add(job);

            setpgid(getpid(), getpid());
            tcsetpgrp(0, getpid());

            return Command("", rcode);
        }
        else {
            setpgid(getpid(), getpid());
            tcsetpgrp(0, getpid());

            return Command("", WEXITSTATUS(status));
        }
    }

    def popen(command:String, rcode:pointer@int):static String throws Exception {
        result := "";
        fp:pointer@FILE = System.popen(command, "r");

        while(!feof(fp)) {
            buf := Buffer(BUFSIZ);
            fgets(buf, BUFSIZ, fp);
            result.append(buf.toString());
        }

        rcode->int = pclose(fp);

        return result;
    }

    def cd():static {
        path := p"\{getenv("HOME")}"
        path.chdir();
        setenv("PWD", getcwd(), 1);
    }

    def cd(path:String):static {
        path.toPath().chdir();
        setenv("PWD", getcwd(), 1);
    }

    def cd(arg:SortableList<String>):static {
        if(arg.length() > 0) {
            path := arg.items(0);
            Command.cd(path);
        }
    }
    
    def fg(job_num:int):static {
        if(job_num >= 0 && job_num < Clover.jobs.length()) {
            Clover.jobs.items(job_num).forground();
        }
    }
    
    def fg():static {
        Command.fg(0);
    }
    
    def jobs():static EqualableList<Job> {
        return Clover.jobs;
    }

    def toString():String {
        return self.data;
    }

    def equals(command:Command):bool {
        return self.data.equals(command.data);
    }

    def add(value:Command):Command {
        result := self.clone();
        result.data.append(value.data);
        return result;
    }

    def compare(command:Command): int {
        return self.data.compare(command.data);
    }

    def toBool():bool {
        return self.resultCode == 0;
    }

    def toBoolAndOutput(): bool {
        self.data.print();
        return self.resultCode == 0;
    }

    def getErrorOutput(): Command {
        return Command(self.error.toString(), self.resultCode);
    }

    def getOutputWithError(): Command {
        result := self.data.clone();
        result.append(self.error);
        return Command(result.toString(), self.resultCode);
    }

    def write(path:String, permission:mode_t): Command {
        f := File(path, O_CREAT|O_TRUNC|O_WRONLY, permission);

        buf := self.data.toBuffer();
        f.write(buf, buf.len);

        f.close();

        return self;
    }

    def write(path:String): Command {
        return self.write(path,0644);
    }

    def append(path:String, permission:mode_t): Command {
        f := File(path, O_CREAT|O_APPEND|O_WRONLY, permission);

        buf := self.data.toBuffer();
        f.write(buf, buf.len);

        f.close();

        return self;
    }

    def append(path:String): Command {
        return self.append(path,0644);
    }
}

inherit String
{
    def toCommand():Command {
        return Command(self,0);
    }
}


================================================
FILE: Container.clcl
================================================

interface IEqualable
{
    def equals(right:Self): bool;
    def toString(): String;
    def clone(): Self;
}

interface ISortable
{
    def compare(item:Self): int;
    def equals(right:Self): bool;
    def toString(): String;
    def clone(): Self;
    def add(right:Self):Self;
}

interface IIteratorable
{
    def compare(item:Self): int;
    def equals(right:Self): bool;
    def toString(): String;
    def clone(): Self;
    def add(right:Self):Self;
    def next(): Self;
    def prev(): Self;
}

interface IHashKey
{
    def getHashKey(): uint;
    def equals(right:Self): bool;
    def toString(): String;
    def clone(): Self;
}

module MEqualableArray
{
    def toString():String {
        if(self.items.length == 0) {
            return "earray {}";
        }

        result:String = "earray {";

        for(i:int = 0; i<self.items.length; i++) {
            result.append(self.items[i].toString());
            result.append(",");
        }

        result.replace(-1, '}');

        return result;
    }

    def equals(right:T[]): bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            return self.equals(right.toArray);
        }
    }

    def equals(right:WildCard): bool {
        return true;
    }

    def equals(right:Array<T>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            if(self.items.length != right.items.length) {
                return false;
            }

            for(i:int = 0; i<self.items.length; i++) {
                if(!self.items[i].equals(right.items[i])) {
                    return false;
                }
            }

            return true;
        }
    }

    def equals(right:EqualableArray<T>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            if(self.items.length != right.items.length) {
                return false;
            }

            for(i:int = 0; i<self.items.length; i++) {
                if(!self.items[i].equals(right.items[i])) {
                    return false;
                }
            }

            return true;
        }
    }
}

inherit Array<T:Object>
{
    def toString(): String {
        if(self.items.identifyWith(null)) {
            return "Null array";
        }
        else {
            result:String = "";
            result.append(self.items.length.toString);
            result.append(" length array of ");
            result.append(self.items.className());
            return result;
        }
    }
    def toEqualableArray():EqualableArray<IEqualable> throws Exception {
        result:EqualableArray<IEqualable>  = EqualableArray<IEqualable>(self.items.toAnonymous());

        for(i:int = 0; i<result.items.length; i++) {
            if(!(result.items[i] implements IEqualable)) {
                throw Exception("An elements doesn't implement IEqualable");
            }
        }

        return result;
    }

    def toSortableArray():SortableArray<ISortable> throws Exception {
        result:SortableArray<ISortable>  = SortableArray<ISortable>(self.items.toAnonymous());

        for(i:int = 0; i<result.items.length; i++) {
            if(!(result.items[i] implements ISortable)) {
                throw Exception("An elements doesn't implement ISortable");
            }
        }

        return result;
    }

    def toList(): List<T> {
        result:List<T> = List<T>();

        for(i:int = 0; i<self.items.length; i++) {
            result.add(self.items[i]);
        }

        return result;
    }
}

class EqualableArray <T:IEqualable>
{
    include MObjectBase;

    include MArray;
    include MEqualableArray;

    def toArray():Array<T> {
        return Array<T>(self.items.toAnonymous());
    }

    def toSortableArray():SortableArray<ISortable> throws Exception {
        result := SortableArray<ISortable>(self.items.toAnonymous());

        for(i:= 0; i<result.items.length; i++) {
            if(!(result.items[i] implements ISortable)) {
                throw Exception("An elements doesn't implement ISortable");
            }
        }

        return result;
    }

    def toEqualableList(): EqualableList<T> {
        result := EqualableList<T>();

        for(i:int = 0; i<self.items.length; i++) {
            result.add(self.items[i]);
        }

        return result;
    }
}

class SortableArray <T:ISortable>
{
    include MObjectBase;

    include MArray;
    include MEqualableArray;

    def equals(right:SortableArray<T>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            if(self.items.length != right.items.length) {
                return false;
            }

            for(i:int = 0; i<self.items.length; i++) {
                if(!self.items[i].equals(right.items[i])) {
                    return false;
                }
            }

            return true;
        }
    }

    def toArray():Array<T> {
        return Array<T>(self.items.toAnonymous());
    }

    def toEqualableArray():EqualableArray<T> {
        return EqualableArray<T>(self.items.toAnonymous());
    }

    def toSortableList(): SortableList<T> {
        result:SortableList<T> = SortableList<T>();

        for(i:int = 0; i<self.items.length; i++) {
            result.add(self.items[i]);
        }

        return result;
    }

    def quickSort(left:int, right:int, fun:lambda(T, T):int):SortableArray<T> {
        l_hold:int = left;
        r_hold:int = right;

        pivot:T = self.items[left];
        pivot_num:int = left;

        while(left < right) {
            while((fun(self.items[right], pivot) >= 0) && (left < right)) {
                right--;
            }

            if(left != right) {
                self.items[left] = self.items[right];
                left++;
            }

            while((fun(self.items[left], pivot) <= 0) && (left < right)) {
                left++;
            }

            if(left != right) {
                self.items[right] = self.items[left];
                right--;
            }
        }

        self.items[left] = pivot;

        pivot_num = left;

        left2:int = l_hold;
        right2:int = r_hold;

        if(left2 < pivot_num) {
            self.quickSort(left2, pivot_num-1, fun);
        }

        if(right2 > pivot_num) {
            self.quickSort(pivot_num+1, right2, fun);
        }

        return self;
    }

    def sort():SortableArray<T>  {
        return self.quickSort(0, self.length()-1, lambda(left:T, right:T):int { left.compare(right) });
    }
    def sort(fun:lambda(T,T):int):SortableArray<T>  {
        return self.quickSort(0, self.length()-1, fun);
    }

    def toString():String {
        if(self.items.length == 0) {
            return "sarray {}";
        }

        result:String = "sarray {";

        for(i:int = 0; i<self.items.length; i++) {
            result.append(self.items[i].toString());
            result.append(",");
        }

        result.replace(-1, '}');

        return result;
    }

    def compare(right:SortableArray<T>):int {
        if(self.length() == 0 && right.length() == 0) {
            return 0;
        }
        elif(self.length() == 0) {
            return -1;
        }
        elif(right.length() == 0) {
            return 1;
        }
        else {
            litem := items(0);
            ritem := right.items(0);

            if(litem == null && ritem == null) {
                return 0;
            }
            elif(litem == null) {
                return -1;
            }
            elif(ritem == null) {
                return 1;
            }
            else {
                return litem.compare(ritem);
            }
        }
    }
}

class ListItem <T:Object>
{
    include MObjectBase;

    item: T?;
    next: ListItem<T>?;
    prev: ListItem<T>?;

    def initialize() {
        self.item = null;
        self.next = null;
        self.prev = null;
    }

    def initialize(item:T?, prev:ListItem<T>?, next:ListItem<T>?) {
        self.item = item;
        self.prev = prev;
        self.next = next;
    }

    def clone(): ListItem<T> {
        result := ListItem<T>();

        result.item = self.item;
        result.prev = self.prev;
        result.next = self.next;

        return result;
    }
}

module MList
{
    head: ListItem<T>?;
    tail: ListItem<T>?;
    number: int;

    def initialize() {
        self.head = null;
        self.tail = null;
        self.number = 0;
    }

    def initialize(items:T[], num_elements:uint) {
        self.head = null;
        self.tail = null;
        self.number = 0;

        for(i := 0; i<num_elements; i++) {
            self.push(items[i]);
        }
    }

    def setValue(list:SELF<T>) {
        self.head = list.head;
        self.tail = list.tail;
        self.number = list.number;
    }

    def clone():SELF<T> {
        result:SELF<T> = SELF<T>();
        it := self.head;
        while(it != null) {
            result.push(it.item);
            it = it.next;
        }
        return result;
    }

    def length():int {
        return self.number;
    }

    def toString(): String {
        if(self.head == null) {
            return "Null list";
        }
        else {
            result := "";
            result.append(self.number.toString);
            result.append(" length list of ");
            result.append(self.head.item.className());
            return result;
        }
    }

    def toArray(): Array<T> {
        result := Array<T>(self.number);

        it := self.head;

        n := 0;
        while(it != null) {
            result.put(n, it.item);

            it = it.next;
            n++;
        }

        return result;
    }
    
    def items(index:int):T? {
        if(index < 0) {
            index += self.number;
        }

        if(index >= number/2) {
            it := self.tail;
            count := self.number-1;

            while(it != null) {
                if(count == index) {
                    return it.item
                }
                count--;

                it = it.prev;
            }
        }
        else {
            it := self.head;
            count := 0;

            while(it != null) {
                if(count == index) {
                    return it.item
                }
                count++;

                it = it.next;
            }
        }

        return null;
    }
    
    def clear(): SELF<T> {
        self.head = null;
        self.tail = null;
        self.number = 0;

        return self;
    }

    def push(item:T):SELF<T> {
        if(self.head == null) {
            self.head = ListItem<T>(item, null, null);
            self.tail = self.head;
        }
        else {
            new_item := ListItem<T>(item, self.tail, null);

            self.tail.next = new_item;
            self.tail = new_item;
        }

        self.number++;

        return self;
    }
    
    def iterator(index:int):ListItem<T>? {
        if(index < 0) {
            index += self.number;
        }
        
        if(index < 0 || index >= self.number) {
            return null;
        }
        
        it := self.head;
        
        n := 0;
        
        while(it != null) {
            if(index == n) {
                return it;
            }
            n++;

            it = it.next;
        }
        
        return null;
    }
        

    def push(list:SELF<T>):SELF<T> {
        it := list.head();

        while(it != null) {
            self.push(it.item);

            it = it.next;
        }

        return self;
    }

    def pop():T? {
        if(self.head == null) {
            return null;
        }
        else {
            new_tail := self.tail.prev;
            item := self.tail.item;

            if(new_tail == null) {
                self.head = null;
                self.tail = null;
                self.number = 0;

                return item;
            }
            else {
                new_tail.next = null;
                self.tail = new_tail;

                self.number--;

                return item;
            }
        }
    }

    def append(list:SELF<T>):SELF<T> {
        it := list.head;
        while(it != null) {
            self.push(it.item);

            it = it.next;
        }

        return self;
    }

    def add(item:T):SELF<T> {  # don't use this, instead of this, use push. This definition is my mistake
        if(self.head == null) {
            self.head = ListItem<T>(item, null, null);
            self.tail = self.head;
        }
        else {
            new_item := ListItem<T>(item, self.tail, null);

            self.tail.next = new_item;
            self.tail = new_item;
        }

        self.number++;

        return self;
    }

    def add(right:SELF<T>):SELF<T> {
        return push(right);
    }

    def shift():T? {
        if(self.head == null) {
            return null;
        }
        else {
            new_head := self.head.next;
            item := self.head.item;

            if(new_head == null) {
                self.head = null;
                self.tail = null;
                self.number = 0;

                return item;
            }
            else {
                new_head.prev = null;
                self.head = new_head;

                self.number--;

                return item;
            }
        }
    }

    def insert(index:int, item:T):SELF<T> {
        if(index < 0) {
            index += self.number + 1;
        }
        if(index < 0) {
            index = 0;
        }
        if(index > self.number) {
            index = self.number;
        }

        if(self.number == 0 || index == self.number) {
            self.push(item);
            return self;
        }

        if(index == 0) {
            new_item:ListItem<T> = ListItem<T>(item, null, self.head);
            self.head.prev = new_item;
            self.head = new_item;

            self.number++;
        }
        elif(index >= self.number/2) {
            it := self.tail;

            i := self.number-1;

            while(it != null) {
                if(i == index-1) {
                    new_item := ListItem<T>(item, it, it.next);
                    if(it.next != null) {
                        it.next.prev = new_item;
                    }
                    it.next = new_item;

                    self.number++;
                    break;
                }

                it = it.prev;
                i--;
            }
        }
        else {
            it := self.head;

            i := 0;

            while(it != null) {
                if(i == index-1) {
                    new_item := ListItem<T>(item, it, it.next);
                    if(it.next != null) {
                        it.next.prev = new_item;
                    }
                    it.next = new_item;

                    self.number++;
                    break;
                }

                it = it.next;
                i++;
            }
        }

        return self;
    }

    def insert(index:int, list:SELF<T>):SELF<T> {
        i := index;
        it := list.head;
        while(it != null) {
            self.insert(i, it.item);
            i++;

            it = it.next;
        }
        return self;
    }

    def deleteByID(item:T):SELF<T> {
        it := self.head;
        it2 := self.head;

        while(it != null) {
            if(it.item.ID() == item.ID()) {
                # one item is contained in list
                if(it == self.head && it == self.tail) {
                    self.head = null;
                    self.tail = null;
                    self.number = 0;
                }
                # two item is contained in list
                elif(it2 == self.head && it == self.tail) {
                    self.head = it2;
                    self.tail = it2;
                    it2.prev = null;
                    it2.next = null;
                    self.number = 1;
                }
                # other
                else {
                    if(it == self.head) {
                        self.head = self.head.next;
                        self.head.prev = null;
                        self.number--;
                    }
                    elif(it == self.tail) {
                        self.tail = self.tail.prev;
                        self.tail.next = null;
                        self.number--;
                    }
                    else {
                        it2.next = it.next;
                        it.next.prev = it2;
                        self.number--;
                    }
                }
                break;
            }
            
            it2 = it;
            it = it.next;
        }

        return self;
    }

    def deleteAt(index:int):SELF<T> {
        if(index < 0) {
            index += self.number;
        }

        if(self.number == 0) {
        }
        elif(self.number == 1) {
            if(index == 0) {
                self.head = null;
                self.tail = null;
                self.number = 0;
            }
        }
        elif(self.number == 2) {
            if(index == 0) {
                self.head = self.head.next;
                self.head.prev = null;
                self.head.next = null;
                self.tail = self.head;
                self.number = 1;
            }
            elif(index == 1) {
                self.tail = self.head;
                self.head.prev = null;
                self.head.next = null;
                self.number = 1;
            }
        }
        elif(index >= self.number / 2) {
            it := self.tail;
            it2 := self.tail;

            count := self.number-1;

            while(it != null) {
                if(count == index) {
                    if(it == self.tail) {
                        self.tail = self.tail.prev;
                        self.tail.next = null;
                        self.number--;
                    }
                    else {
                        it2.prev = it.prev;
                        it.prev.next = it2;
                        self.number--;
                    }
                    break;
                }

                count--;
                
                it2 = it;
                it = it.prev;
            }
        }
        else {
            it := self.head;
            it2 := self.head;

            count := 0;

            while(it != null) {
                if(count == index) {
                    if(it == self.head) {
                        self.head = self.head.next;
                        self.head.prev = null;
                        self.number--;
                    }
                    else {
                        it2.next = it.next;
                        it.next.prev = it2;
                        self.number--;
                    }
                    break;
                }

                count++;
                
                it2 = it;
                it = it.next;
            }
        }

        return self;
    }

    def each(block_:lambda(T)):SELF<T> {
        it := self.head;

        while(it != null) {
            try {
                block_(it.item);
            } catch(e:Exception) {
                if(e.message.equals("break")) {
                    break;
                }
            }
            it = it.next;
        }

        return self;
    }

    def eachReverse(block_:lambda(T)):SELF<T> {
        it := self.tail;

        while(it != null) {
            try {
                block_(it.item);
            } catch(e:Exception) {
                if(e.message.equals("break")) {
                    break;
                }
            }
            it = it.prev;
        }

        return self;
    }

    def replace(index:int, item:T):SELF<T> {
        if(index < 0) {
            index += self.number;
        }
        if(index < 0) {
            index = 0;
        }
        if(index >= self.number) {
            index = self.number-1;
        }

        if(index >= self.number/2) {
            it := self.tail;
            count := self.number-1;

            while(it != null) {
                if(count == index) {
                    it.item = item;
                    break;
                }
                count--;

                it = it.prev;
            }
        }
        else {
            it := self.head;
            count := 0;

            while(it != null) {
                if(count == index) {
                    it.item = item;
                    break;
                }
                count++;

                it = it.next;
            }
        }

        return self;
    }
    def sample():T {
        return self.items(System.rand() % self.number);
    }

    def deleteWithRange(start:int, end:int):SELF<T> {
        if(start < 0) {
            start += self.number;
        }
        if(end < 0) {
            end += self.number + 1;
        }
        if(start < 0) {
            start = 0;
        }
        if(end > self.number) {
            end = self.number;
        }

        if(start >= end || start >= self.number || end < 0) {
            return SELF<T>();
        }

        new_list := SELF<T>();

        it := self.head;
        count := 0;

        while(it != null) {
            if(count < start || count >= end) {
                new_list.push(it.item);
            }
            count++;
            it = it.next;
        }

        self.setValue(new_list);

        return self;
    }

    def multiply(n:int):SELF<T> {
        result := SELF<T>();

        for(i:= 0; i<n; i++) {
            result.append(self);
        }

        return result;
    }

    def multiplyWithSelf(n:int):SELF<T> {
        result := multiply(n);
        setValue(result);
        return self;
    }

    def select(block_:lambda(T):bool):SELF<T> {
        new_list := SELF<T>();

        it := self.head;

        while(it != null) {
            try {
                if(block_(it.item)) {
                    new_list.push(it.item);
                }
            } catch(e:Exception) {
                if(e.message.equals("break")) {
                    break;
                }
            }
            it = it.next;
        }

        return new_list;
    }

    def selectWithSelf(block_:lambda(T):bool):SELF<T> {
        result := select(block_);
        setValue(result);
        return self;
    }

    def subList(start:int, end:int):SELF<T> {
        if(start < 0) {
            start += self.number;
        }
        if(end < 0) {
            end += self.number + 1;
        }
        if(start < 0) {
            start = 0;
        }
        if(end > self.number) {
            end = self.number;
        }

        if(start >= end || start >= self.number || end < 0) {
            return SELF<T>();
        }

        new_list: SELF<T> = SELF<T>();

        it := self.head;
        count := 0;

        while(it != null) {
            if(count >= start && count < end) {
                new_list.push(it.item);
            }
            count++;
            it = it.next;
        }

        return new_list;
    }

    def subListWithSelf(start:int, end:int):SELF<T> {
        result := subList(start, end);
        self.setValue(result);
        return self;
    }

    def fill(start:int, end:int, item:T):SELF<T> {
        if(start < 0) {
            start += self.number;
        }
        if(end < 0) {
            end += self.number + 1;
        }
        if(start < 0) {
            start = 0;
        }
        if(end > self.number) {
            end = self.number;
        }

        if(start >= end || start >= self.number || end < 0) {
            return SELF<T>();
        }

        new_list := SELF<T>();

        it := self.head;
        count:= 0;

        while(it != null) {
            if(count < start || count >= end) {
                new_list.push(it.item);
            }
            else {
                new_list.push(item);
            }
            count++;
            it = it.next;
        }

        return new_list;
    }
    def fill(item:T):SELF<T> {
        return self.fill(0,-1,item);
    }
    def fillWithSelf(start:int, end:int, item:T):SELF<T> {
        result := fill(start, end, item);
        setValue(result);
        return result;
    }
    def fillWithSelf(item:T):SELF<T> {
        result := fill(item);
        setValue(result);
        return self;
    }

    def reverse():SELF<T> {
        result := SELF<T>();

        it := self.tail;

        while(it != null) {
            result.push(it.item);
            it = it.prev;
        }

        return result;
    }

    def reverseWithSelf():SELF<T> {
        result := reverse();
        self.setValue(result);
        return self;
    }

    def shuffle():SELF<T> {
        result := self.clone();

        for(i:=0; i<50; i++) {
            n := System.rand() % self.number;
            m := System.rand() % self.number;

            item := result.items(n);
            item2 := result.items(m);

            result.replace(m, item);
            result.replace(n, item2);
        }

        return result;
    }
    def shuffleWithSelf():SELF<T> {
        result := shuffle();
        self.setValue(result);
        return self;
    }

    def find(item:T): bool {
        it := self.head;

        while(it != null) {
            if(it.item == item) {
                return true;
            }
            it = it.next;
        }

        return false;
    }
}

module MEqualableList
{
    def equals(right:SELF<T>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            if(self.number != right.number) {
                return false;
            }
            for(i:=0; i<self.number; i++) {
                if(!self.items(i).equals(right.items(i))) {
                    return false;
                }
            }

            return true;
        }
    }

    def equals(right:WildCard): bool {
        return true;
    }

    def delete(item:T):SELF<T> {
        it:= self.head;
        it2:= self.head;

        while(it != null) {
            if(it.item.equals(item)) {
                # one item is contained in list
                if(it == self.head && it == self.tail) {
                    self.head = null;
                    self.tail = null;
                    self.number = 0;
                }
                # two item is contained in list
                elif(it2 == self.head && it == self.tail) {
                    self.head = it2;
                    self.tail = it2;
                    it2.prev = null;
                    it2.next = null;
                    self.number = 1;
                }
                # other
                else {
                    if(it == self.head) {
                        self.head = self.head.next;
                        self.head.prev = null;
                        self.number--;
                    }
                    elif(it == self.tail) {
                        self.tail = self.tail.prev;
                        self.tail.next = null;
                        self.number--;
                    }
                    else {
                        it2.next = it.next;
                        it.next.prev = it2;
                        self.number--;
                    }
                }
                break;
            }
            
            it2 = it;
            it = it.next;
        }

        return self;
    }

    def indexOf(item:T):int {
        result:int = 0;

        it := self.head;
        while(it != null) {
            if(it.item.equals(item)) {
                return result;
            }

            result++;

            it = it.next;
        }

        return -1;
    }
    def toString():String {
        if(self.number == 0) {
            return "elist {}";
        }

        result := "elist {";

        it := self.head;

        while(it != null) {
            result.append(it.item.toString());
            result.append(",");

            it = it.next;
        }

        result.replace(-1, '}');

        return result;
    }
    def join(separator:String):String {
        result := String("");
        it := self.head;

        while(it != null) {
            result.append(it.item.toString());
            it = it.next;

            if(it != null) {
                result.append(separator);
            }
        }

        return result;
    }

    def join():String {
        return self.join("");
    }

    def count(item:T):int {
        result := 0;

        it := self.head;

        while(it != null) {
            if(it.item.equals(item)) {
                result++;
            }

            it = it.next;
        }

        return result;
    }

    def indexOf(item:T):int {
        result := 0;
        it := self.head;

        while(it != null) {
            if(it.item.equals(item)) {
                return result;
            }
            result++;
            it = it.next;
        }

        return -1;
    }

    def uniq():SELF<T> {
        result := SELF<T>();

        it := self.head;

        if(self.head == null) {
            return result;
        }

        item_before := self.head.item;

        while(it != null) {
            if(it == self.head) {
                result.push(it.item);
            }
            else {
                if(it.item != null && item_before != null && !it.item.equals(item_before)) {
                    result.push(it.item);
                }
            }
            item_before = it.item;
            it = it.next;
        }

        return result;
    }
}

class List <T:Object>
{
    include MObjectBase;

    include MList;

    def <R:Object> map(trans:lambda(T):R): SELF<R> {
        result:SELF<R> = SELF<R>();

        it:ListItem<T>? = self.head;

        while(!it.identifyWith(null)) {
            try {
                result.push(trans(it.item));
            } catch(e:Exception) {
                if(e.message.equals("break")) {
                    break;
                }
            }

            it = it.next;
        }

        return result;
    }
}

class EqualableList<T:IEqualable>
{
    include MObjectBase;

    include MList;
    include MEqualableList;

    def <R:IEqualable> map(trans:lambda(T):R): SELF<R> {
        result:SELF<R> = SELF<R>();

        it:ListItem<T>? = self.head;

        while(!it.identifyWith(null)) {
            try {
                result.push(trans(it.item));
            } catch(e:Exception) {
                if(e.message.equals("break")) {
                    break;
                }
            }

            it = it.next;
        }

        return result;
    }

    def toList():List<T> throws Exception {
        result:List<T> = List<T>();

        it :ListItem<T>? = self.head;

        while(!it.identifyWith(null)) {
            item :T = it.item;

            result.push(item);

            it = it.next;
        }

        return result;
    }
}

class SortableList<T:ISortable>
{
    include MObjectBase;

    include MList;
    include MEqualableList;

    def clone():SortableList<T> {
        result := SortableList<T>();

        it := self.head;

        while(!it.identifyWith(null)) {
            item := it.item.clone();
            result.push(item);
            it = it.next;
        }

        return result;
    }

    def <R:ISortable> map(trans:lambda(T):R): SELF<R> {
        result:SELF<R> = SELF<R>();

        it:ListItem<T>? = self.head;

        while(!it.identifyWith(null)) {
            try {
                result.push(trans(it.item));
            } catch(e:Exception) {
                if(e.message.equals("break")) {
                    break;
                }
            }

            it = it.next;
        }

        return result;
    }

    def quickSort(list:SortableList<T>, left:int, right:int, fun:lambda(T, T):int) {
        l_hold:int = left;
        r_hold:int = right;

        pivot:T = list.items(left);
        pivot_num:int = left;

        while(left < right) {
            while((fun(list.items(right), pivot) >= 0) && (left < right)) {
                right--;
            }

            if(left != right) {
                list.replace(left, list.items(right));
                left++;
            }

            while((fun(list.items(left), pivot) <= 0) && (left < right)) {
                left++;
            }

            if(left != right) {
                list.replace(right, list.items(left));
                right--;
            }
        }

        list.replace(left, pivot);

        pivot_num = left;

        left = l_hold;
        right = r_hold;
        if(left < pivot_num) {
            self.quickSort(list, left, pivot_num-1, fun);
        }

        if(right > pivot_num) {
            self.quickSort(list, pivot_num+1, right, fun);
        }
    }

    def mergeList(left:SortableList<T>, right:SortableList<T>, fun:lambda(T,T):int):static SortableList<T> {
        list: SortableList<T> = SortableList<T>();

        it:ListItem<T>? = left.head;

        it2:ListItem<T>? = right.head;

        while(true) {
            if(fun(it.item, it2.item) <= 0) {
                list.push(it.item);

                it = it.next;
            }
            else {
                list.push(it2.item);

                it2 = it2.next;
            }

            if(it.identifyWith(null)) {
                if(!it2.identifyWith(null)) {
                    while(!it2.identifyWith(null)) {
                        list.push(it2.item);

                        it2 = it2.next;
                    }
                }
                break;
            }
            elif(it2.identifyWith(null)) {
                if(!it.identifyWith(null)) {
                    while(!it.identifyWith(null)) {
                        list.push(it.item);

                        it = it.next;
                    }
                }
                break;
            }
        }

        return list;
    }

    def mergeSort(fun:lambda(T,T):int):SortableList<T> {
        if(self.head.identifyWith(null)) {
            return self;
        }
        if(self.head.next.identifyWith(null)) {
            return self;
        }

        list1:SortableList<T> = SortableList<T>();
        list2:SortableList<T> = SortableList<T>();

        it:ListItem<T> = self.head;

        while(true) {
            list1.push(it.item);
            list2.push(it.next.item);

            if(it.next.next.identifyWith(null)) {
                break;
            }

            it = it.next.next;

            if(it.next.identifyWith(null)) {
                list1.push(it.item);
                break;
            }
        }

        return SortableList<T>.mergeList(list1.mergeSort(fun), list2.mergeSort(fun), fun);
    }

    def sort():SortableList<T> {
        return sort(lambda(left:T, right:T):int { left.compare(right) });
    }

    def sort(fun:lambda(T, T):int): SortableList<T> {
        list:SortableList<T> = self.mergeSort(fun);
        self.setValue(list);
        return self;
    }
    def toString():String {
        if(self.number == 0) {
            return "slist {}";
        }

        result:String = "slist {";

        it:ListItem<T>? = self.head;

        while(!it.identifyWith(null)) {
            result.append(it.item.toString());
            result.append(",");

            it = it.next;
        }

        result.replace(-1, '}');

        return result;
    }

    def sum():T throws Exception {
        if(self.head == null || self.number == 0) {
            throw Exception("Null pointer exception");
        }

        result := items(0).clone();

        n := 0;

        self.each {
            if(n > 0) {
                result = result.add(it);
            }
            n++;
        }

        return result;
    }

    def compare(right:SortableList<T>):int {
        if(self.length() == 0 && right.length() == 0) {
            return 0;
        }
        elif(self.length() == 0) {
            return -1;
        }
        elif(right.length() == 0) {
            return 1;
        }
        else {
            litem := items(0);
            ritem := right.items(0);

            if(litem == null && ritem == null) {
                return 0;
            }
            elif(litem == null) {
                return -1;
            }
            elif(ritem == null) {
                return 1;
            }
            else {
                return litem.compare(ritem);
            }
        }
    }

    def toList():List<T> throws Exception {
        result:List<T> = List<T>();

        it :ListItem<T>? = self.head;

        while(!it.identifyWith(null)) {
            item :T = it.item;

            result.push(item);

            it = it.next;
        }

        return result;
    }

    def toEqualableList():EqualableList<T> {
        result := EqualableList<T>();

        it :ListItem<T>? = self.head;

        while(!it.identifyWith(null)) {
            item :T = it.item;

            result.push(item);

            it = it.next;
        }

        return result;
    }
}

class HashItem <T:IHashKey, T2:IEqualable>
{
    include MObjectBase;

    key:T?;
    item:T2?;
    include MObjectBase;

    def initialize() {
        self.key = null;
        self.item = null;
    }

    def initialize(key:T, item:T2) {
        self.key = key;
        self.item = item;
    }

    def clone():HashItem<T,T2> {
        result := HashItem<T,T2>();

        if(!self.key.identifyWith(null) && !self.item.identifyWith(null)) {
            result.key = self.key.clone();
            result.item = self.item.clone();
        }

        return result;
    }
}

class Hash <T:IHashKey, T2:IEqualable>
{
    include MObjectBase;

    hashSizeDefault: static int;

    def initialize():static {
        Hash.hashSizeDefault = 128;
    }

    table: HashItem<T,T2>[]?;
    itemNumber: uint;
    tableSize: uint;

    def initialize() {
        self.table = HashItem<T,T2>[Hash.hashSizeDefault];
        self.tableSize = Hash.hashSizeDefault;
        self.itemNumber = 0;
    }

    def initialize(keys: T[], items:T2[], num_elements:uint) {
        hash_size:uint = num_elements * 2;

        self.table = HashItem<T,T2>[hash_size];
        self.tableSize = hash_size;
        self.itemNumber = num_elements;

        for(i:int =0; i<num_elements; i++) {
            self.put(keys[i], items[i]);
        }
    }
    
    def clone(): Hash<T,T2> {
        result := Hash<T,T2>();

        result.table = HashItem<T,T2>[self.tableSize];
        result.tableSize = self.tableSize;

        for(i:=0; i<self.table.length; i++) {
            if(!self.table[i].identifyWith(null)) {
                result.table[i] = self.table[i].clone();
            }
        }
        result.itemNumber = self.itemNumber;

        return result;
    }

    def equals(right:Hash<T,T2>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            if(self.itemNumber != right.itemNumber) {
                return false;
            }
            result:bool = true;
            self.each(closure(key:T, item:T2) {
                if(!self.containes(key, item)) {
                    result = false;
                    return;
                }
            });

            return result;
        }
    }

    def equals(right:WildCard):bool {
        return true;
    }

    def length(): int {
        return self.itemNumber;
    }
    
    def clear(): Hash<T,T2> {
        self.table = HashItem<T,T2>[Hash.hashSizeDefault];
        self.tableSize = Hash.hashSizeDefault;
        self.itemNumber = 0;

        return self;
    }

    def put(key:T, item:T2):Hash<T,T2> {
        if(self.itemNumber * 2 >= self.tableSize) {
            self.rehash();
        }

        hash_key:uint = key.getHashKey() % self.tableSize;
        n:uint = hash_key;

        while(true) {
            if(self.table[n].identifyWith(null)) {
                self.table[n] = HashItem<T, T2>(key,item);
                self.itemNumber++;
                break;
            }
            else {
                if(self.table[n].key.equals(key)) {
                    self.table[n].item = item;
                    break;
                }
            }

            n++;

            if(n == self.tableSize) {
                n = 0;
            }
            elif(n == hash_key) {
                self.rehash();
                self.put(key, item);
                break;
            }
        }

        return self;
    }

    def rehash() {
        table :HashItem<T,T2>[] = self.table;
        itemNumber :uint = self.itemNumber;

        self.tableSize *= 2;
        self.table = HashItem<T,T2>[self.tableSize];
        self.itemNumber = 0;

        for(i:int= 0; i<itemNumber; i++) {
            if(!table[i].identifyWith(null)) {
                self.put(self.table[i].key, self.table[i].item);
            }
        }
    }

    def get(key:T): T2? {
        hash_key:uint = key.getHashKey() % self.tableSize;

        n:uint = hash_key;

        while(true) {
            if(!self.table[n].identifyWith(null)) {
                if(self.table[n].key.equals(key)) {
                    return self.table[n].item;
                }
            }

            n++;

            if(n == self.tableSize) {
                n = 0;
            }
            elif(n == hash_key) {
                return null;
            }
        }
    }

    def getKey(item:T2):T? {
        for(i:uint =0; i<self.tableSize; i++) {
            if(!self.table[i].identifyWith(null)) {
                if(self.table[i].item.equals(item)) {
                    return self.table[i].key;
                }
            }
        }

        return null;
    }

    def containes(key:T, item:T2):bool {
        return self.get(key).equals(item);
    }

    def each(block_:lambda(T,T2)):Hash<T,T2> {
        for(i:uint =0; i<self.tableSize; i++) {
            if(!self.table[i].identifyWith(null)) {
                try {
                    block_(self.table[i].key, self.table[i].item);
                } catch(e:Exception) {
                    if(e.message.equals("break")) {
                        break;
                    }
                }
            }
        }

        return self;
    }

    def toString():String {
        if(self.itemNumber == 0) {
            return "hash {}";
        }

        result:String = "hash {";

        for(i:uint =0; i<self.tableSize; i++) {
            if(!self.table[i].identifyWith(null)) {
                result.append(self.table[i].key.toString());
                result.append(":");
                result.append(self.table[i].item.toString());
                result.append(",");
            }
        }

        result.replace(-1, '}');

        return result;
    }

    def <R:ISortable> map(trans:lambda(T,T2):R): SortableList<R> {
        result:SortableList<R> = SortableList<R>();

        for(i:uint =0; i<self.tableSize; i++) {
            if(self.table[i] != null) {
                try {
                    result.push(trans(self.table[i].key, self.table[i].item));
                } catch(e:Exception) {
                    if(e.message.equals("break")) {
                        break;
                    }
                }
            }
        }

        return result;
    }

    def selectKeys(block_:lambda(T):bool):Hash<T,T2> {
        var result = Hash<T, T2>();

        for(i:uint =0; i<self.tableSize; i++) {
            if(self.table[i] != null) {
                try {
                    block_(self.table[i].key).if { result.put(self.table[i].key, self.table[i].item) }
                } catch(e:Exception) {
                    if(e.message.equals("break")) {
                        break;
                    }
                }
            }
        }

        return result;
    }

    def selectValues(block_:lambda(T2):bool):Hash<T,T2> {
        var result = Hash<T, T2>();

        for(i:uint =0; i<self.tableSize; i++) {
            if(self.table[i] != null) {
                try {
                    block_(self.table[i].item).if { result.put(self.table[i].key, self.table[i].item) }
                } catch(e:Exception) {
                    if(e.message.equals("break")) {
                        break;
                    }
                }
            }
        }

        return result;
    }

    def put(right:Hash<T,T2>):Hash<T,T2> {
        for(i:uint =0; i<right.tableSize; i++) {
            if(!right.table[i].identifyWith(null)) {
                put(right.table[i].key, right.table[i].item);
            }
        }

        return self;
    }

    def add(right:Hash<T,T2>):Hash<T,T2> {
        result := self.clone();
        for(i:uint =0; i<right.tableSize; i++) {
            if(!right.table[i].identifyWith(null)) {
                result.put(right.table[i].key, right.table[i].item);
            }
        }

        return result;
    }
}

class Tuple1 <T:IEqualable>
{
    include MObjectBase;

    value1: T;

    def initialize() {}

    def initialize(value1:T) {
        self.value1 = value1;
    }

    def clone(): Tuple1<T> {
        result := Tuple1<T>();

        if(!self.value1.identifyWith(null)) {
            result.value1 = self.value1.clone();
        }

        return result;
    }

    def equals(right:Tuple1<T>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            return self.value1.equals(right.value1);
        }
    }

    def equals(right:WildCard): bool {
        return true;
    }

    def toString():String {
        return "tuple {".append(self.value1.toString()).append("}");
    }
}

class Tuple2 <T:IEqualable, T2:IEqualable>
{
    include MObjectBase;

    value1: T;
    value2: T2;

    def initialize() {}

    def initialize(value1:T, value2:T2) {
        self.value1 = value1;
        self.value2 = value2;
    }

    def clone(): Tuple2<T, T2> {
        result := Tuple2<T, T2>();

        if(!self.value1.identifyWith(null)) {
            result.value1 = self.value1.clone();
        }
        if(!self.value2.identifyWith(null)) {
            result.value2 = self.value2.clone();
        }

        return result;
    }

    def equals(right:Tuple2<T,T2>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            return self.value1.equals(right.value1) && self.value2.equals(right.value2);
        }
    }

    def equals(right:WildCard): bool {
        return true;
    }

    def toString():String {
        return "tuple {".append(self.value1.toString()).append(",").append(self.value2.toString()).append("}");
    }
}

class Tuple3 <T:IEqualable, T2:IEqualable, T3:IEqualable>
{
    include MObjectBase;

    value1: T;
    value2: T2;
    value3: T3;

    def initialize() {}

    def initialize(value1:T, value2:T2, value3:T3) {
        self.value1 = value1;
        self.value2 = value2;
        self.value3 = value3;
    }

    def clone(): Tuple3<T,T2,T3> {
        result := Tuple3<T,T2,T3>();

        if(!self.value1.identifyWith(null)) {
            result.value1 = self.value1.clone();
        }
        if(!self.value2.identifyWith(null)) {
            result.value2 = self.value2.clone();
        }
        if(!self.value3.identifyWith(null)) {
            result.value3 = self.value3.clone();
        }

        return result;
    }

    def equals(right:Tuple3<T,T2,T3>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            return self.value1.equals(right.value1) && self.value2.equals(right.value2) && self.value3.equals(right.value3);
        }
    }

    def equals(right:WildCard): bool {
        return true;
    }

    def toString():String {
        return "tuple {".append(self.value1.toString()).append(",").append(self.value2.toString()).append(",").append(self.value3.toString()).append("}");
    }
}

class Tuple4 <T:IEqualable, T2:IEqualable, T3:IEqualable, T4:IEqualable>
{
    include MObjectBase;

    value1: T;
    value2: T2;
    value3: T3;
    value4: T4;

    def initialize() {}

    def initialize(value1:T, value2:T2, value3:T3, value4:T4) {
        self.value1 = value1;
        self.value2 = value2;
        self.value3 = value3;
        self.value4 = value4;
    }

    def equals(right:Tuple4<T,T2,T3,T4>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            return self.value1.equals(right.value1) && self.value2.equals(right.value2) && self.value3.equals(right.value3) && self.value4.equals(right.value4);
        }
    }

    def clone(): Tuple4<T,T2,T3,T4> {
        result := Tuple4<T,T2,T3,T4>();

        if(!self.value1.identifyWith(null)) {
            result.value1 = self.value1.clone();
        }
        if(!self.value2.identifyWith(null)) {
            result.value2 = self.value2.clone();
        }
        if(!self.value3.identifyWith(null)) {
            result.value3 = self.value3.clone();
        }
        if(!self.value4.identifyWith(null)) {
            result.value4 = self.value4.clone();
        }

        return result;
    }

    def equals(right:WildCard): bool {
        return true;
    }
    def toString():String {
        return "tuple {".append(self.value1.toString()).append(",").append(self.value2.toString()).append(",").append(self.value3.toString()).append(",").append(self.value4.toString()).append("}");
    }
}

class Tuple5 <T:IEqualable, T2:IEqualable, T3:IEqualable, T4:IEqualable, T5:IEqualable>
{
    include MObjectBase;

    value1: T;
    value2: T2;
    value3: T3;
    value4: T4;
    value5: T5;

    def initialize() {}

    def initialize(value1:T, value2:T2, value3:T3, value4:T4, value5:T5) {
        self.value1 = value1;
        self.value2 = value2;
        self.value3 = value3;
        self.value4 = value4;
        self.value5 = value5;
    }

    def clone(): Tuple5<T,T2,T3,T4,T5> {
        result := Tuple5<T,T2,T3,T4,T5>();

        if(!self.value1.identifyWith(null)) {
            result.value1 = self.value1.clone();
        }
        if(!self.value2.identifyWith(null)) {
            result.value2 = self.value2.clone();
        }
        if(!self.value3.identifyWith(null)) {
            result.value3 = self.value3.clone();
        }
        if(!self.value4.identifyWith(null)) {
            result.value4 = self.value4.clone();
        }
        if(!self.value5.identifyWith(null)) {
            result.value5 = self.value5.clone();
        }

        return result;
    }

    def equals(right:Tuple5<T,T2,T3,T4,T5>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            return self.value1.equals(right.value1) && self.value2.equals(right.value2) && self.value3.equals(right.value3) && self.value4.equals(right.value4) && self.value5.equals(right.value5);
        }
    }
    def equals(right:WildCard): bool {
        return true;
    }
    def toString():String {
        return "tuple {".append(self.value1.toString()).append(",").append(self.value2.toString()).append(",").append(self.value3.toString()).append(",").append(self.value4.toString()).append(",").append(self.value5.toString()).append("}");
    }
}

class Tuple6 <T:IEqualable, T2:IEqualable, T3:IEqualable, T4:IEqualable, T5:IEqualable, T6:IEqualable>
{
    include MObjectBase;

    value1: T;
    value2: T2;
    value3: T3;
    value4: T4;
    value5: T5;
    value6: T6;

    def initialize() {}

    def initialize(value1:T, value2:T2, value3:T3, value4:T4, value5:T5, value6:T6) {
        self.value1 = value1;
        self.value2 = value2;
        self.value3 = value3;
        self.value4 = value4;
        self.value5 = value5;
        self.value6 = value6;
    }

    def clone(): Tuple6<T,T2,T3,T4,T5,T6> {
        result := Tuple6<T,T2,T3,T4,T5,T6>();

        if(!self.value1.identifyWith(null)) {
            result.value1 = self.value1.clone();
        }
        if(!self.value2.identifyWith(null)) {
            result.value2 = self.value2.clone();
        }
        if(!self.value3.identifyWith(null)) {
            result.value3 = self.value3.clone();
        }
        if(!self.value4.identifyWith(null)) {
            result.value4 = self.value4.clone();
        }
        if(!self.value5.identifyWith(null)) {
            result.value5 = self.value5.clone();
        }
        if(!self.value6.identifyWith(null)) {
            result.value6 = self.value6.clone();
        }

        return result;
    }

    def equals(right:Tuple6<T,T2,T3,T4,T5,T6>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            return self.value1.equals(right.value1) && self.value2.equals(right.value2) && self.value3.equals(right.value3) && self.value4.equals(right.value4) && self.value5.equals(right.value5) && self.value6.equals(right.value6);
        }
    }

    def equals(right:WildCard): bool {
        return true;
    }
    def toString():String {
        return "tuple {".append(self.value1.toString()).append(",").append(self.value2.toString()).append(",").append(self.value3.toString()).append(",").append(self.value4.toString()).append(",").append(self.value5.toString()).append(",").append(self.value6.toString()).append("}");
    }
}

class Tuple7 <T:IEqualable, T2:IEqualable, T3:IEqualable, T4:IEqualable, T5:IEqualable, T6:IEqualable, T7:IEqualable>
{
    include MObjectBase;

    value1: T;
    value2: T2;
    value3: T3;
    value4: T4;
    value5: T5;
    value6: T6;
    value7: T7;

    def initialize() {}

    def initialize(value1:T, value2:T2, value3:T3, value4:T4, value5:T5, value6:T6, value7:T7) {
        self.value1 = value1;
        self.value2 = value2;
        self.value3 = value3;
        self.value4 = value4;
        self.value5 = value5;
        self.value6 = value6;
        self.value7 = value7;
    }

    def clone(): Tuple7<T,T2,T3,T4,T5,T6,T7> {
        result := Tuple7<T,T2,T3,T4,T5,T6,T7>();

        if(!self.value1.identifyWith(null)) {
            result.value1 = self.value1.clone();
        }
        if(!self.value2.identifyWith(null)) {
            result.value2 = self.value2.clone();
        }
        if(!self.value3.identifyWith(null)) {
            result.value3 = self.value3.clone();
        }
        if(!self.value4.identifyWith(null)) {
            result.value4 = self.value4.clone();
        }
        if(!self.value5.identifyWith(null)) {
            result.value5 = self.value5.clone();
        }
        if(!self.value6.identifyWith(null)) {
            result.value6 = self.value6.clone();
        }
        if(!self.value7.identifyWith(null)) {
            result.value7 = self.value7.clone();
        }

        return result;
    }

    def equals(right:Tuple7<T,T2,T3,T4,T5,T6,T7>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            return self.value1.equals(right.value1) && self.value2.equals(right.value2) && self.value3.equals(right.value3) && self.value4.equals(right.value4) && self.value5.equals(right.value5) && self.value6.equals(right.value6) && self.value7.equals(right.value7);
        }
    }

    def equals(right:WildCard): bool {
        return true;
    }
    def toString():String {
        return "tuple {".append(self.value1.toString()).append(",").append(self.value2.toString()).append(",").append(self.value3.toString()).append(",").append(self.value4.toString()).append(",").append(self.value5.toString()).append(",").append(self.value6.toString()).append(",").append(self.value7.toString()).append("}");
    }
}

class Tuple8 <T:IEqualable, T2:IEqualable, T3:IEqualable, T4:IEqualable, T5:IEqualable, T6:IEqualable, T7:IEqualable, T8:IEqualable>
{
    include MObjectBase;

    value1: T;
    value2: T2;
    value3: T3;
    value4: T4;
    value5: T5;
    value6: T6;
    value7: T7;
    value8: T8;

    def initialize() {}

    def initialize(value1:T, value2:T2, value3:T3, value4:T4, value5:T5, value6:T6, value7:T7, value8:T8) {
        self.value1 = value1;
        self.value2 = value2;
        self.value3 = value3;
        self.value4 = value4;
        self.value5 = value5;
        self.value6 = value6;
        self.value7 = value7;
        self.value8 = value8;
    }

    def clone(): Tuple8<T,T2,T3,T4,T5,T6,T7,T8> {
        result := Tuple8<T,T2,T3,T4,T5,T6,T7,T8>();

        if(!self.value1.identifyWith(null)) {
            result.value1 = self.value1.clone();
        }
        if(!self.value2.identifyWith(null)) {
            result.value2 = self.value2.clone();
        }
        if(!self.value3.identifyWith(null)) {
            result.value3 = self.value3.clone();
        }
        if(!self.value4.identifyWith(null)) {
            result.value4 = self.value4.clone();
        }
        if(!self.value5.identifyWith(null)) {
            result.value5 = self.value5.clone();
        }
        if(!self.value6.identifyWith(null)) {
            result.value6 = self.value6.clone();
        }
        if(!self.value7.identifyWith(null)) {
            result.value7 = self.value7.clone();
        }
        if(!self.value8.identifyWith(null)) {
            result.value8 = self.value8.clone();
        }

        return result;
    }

    def equals(right:Tuple8<T,T2,T3,T4,T5,T6,T7,T8>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            return self.value1.equals(right.value1) && self.value2.equals(right.value2) && self.value3.equals(right.value3) && self.value4.equals(right.value4) && self.value5.equals(right.value5) && self.value6.equals(right.value6) && self.value7.equals(right.value7) && self.value8.equals(right.value8);
        }
    }
    def equals(right:WildCard): bool {
        return true;
    }
    def toString():String {
        return "tuple {".append(self.value1.toString()).append(",").append(self.value2.toString()).append(",").append(self.value3.toString()).append(",").append(self.value4.toString()).append(",").append(self.value5.toString()).append(",").append(self.value6.toString()).append(",").append(self.value7.toString()).append(",").append(self.value8.toString()).append("}");
    }
}

class Tuple9 <T:IEqualable, T2:IEqualable, T3:IEqualable, T4:IEqualable, T5:IEqualable, T6:IEqualable, T7:IEqualable, T8:IEqualable, T9:IEqualable>
{
    include MObjectBase;

    value1: T;
    value2: T2;
    value3: T3;
    value4: T4;
    value5: T5;
    value6: T6;
    value7: T7;
    value8: T8;
    value9: T9;

    def initialize() {}

    def initialize(value1:T, value2:T2, value3:T3, value4:T4, value5:T5, value6:T6, value7:T7, value8:T8, value9:T9) {
        self.value1 = value1;
        self.value2 = value2;
        self.value3 = value3;
        self.value4 = value4;
        self.value5 = value5;
        self.value6 = value6;
        self.value7 = value7;
        self.value8 = value8;
        self.value9 = value9;
    }

    def clone(): Tuple9<T,T2,T3,T4,T5,T6,T7,T8,T9> {
        result := Tuple9<T,T2,T3,T4,T5,T6,T7,T8,T9>();

        if(!self.value1.identifyWith(null)) {
            result.value1 = self.value1.clone();
        }
        if(!self.value2.identifyWith(null)) {
            result.value2 = self.value2.clone();
        }
        if(!self.value3.identifyWith(null)) {
            result.value3 = self.value3.clone();
        }
        if(!self.value4.identifyWith(null)) {
            result.value4 = self.value4.clone();
        }
        if(!self.value5.identifyWith(null)) {
            result.value5 = self.value5.clone();
        }
        if(!self.value6.identifyWith(null)) {
            result.value6 = self.value6.clone();
        }
        if(!self.value7.identifyWith(null)) {
            result.value7 = self.value7.clone();
        }
        if(!self.value8.identifyWith(null)) {
            result.value8 = self.value8.clone();
        }
        if(!self.value9.identifyWith(null)) {
            result.value9 = self.value9.clone();
        }

        return result;
    }

    def equals(right:Tuple9<T,T2,T3,T4,T5,T6,T7,T8,T9>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            return self.value1.equals(right.value1) && self.value2.equals(right.value2) && self.value3.equals(right.value3) && self.value4.equals(right.value4) && self.value5.equals(right.value5) && self.value6.equals(right.value6) && self.value7.equals(right.value7) && self.value8.equals(right.value8) && self.value9.equals(right.value9);
        }
    }
    def equals(right:WildCard): bool {
        return true;
    }
    def toString():String {
        return "tuple {".append(self.value1.toString()).append(",").append(self.value2.toString()).append(",").append(self.value3.toString()).append(",").append(self.value4.toString()).append(",").append(self.value5.toString()).append(",").append(self.value6.toString()).append(",").append(self.value7.toString()).append(",").append(self.value8.toString()).append(",").append(self.value9.toString()).append("}");
    }
}

class Tuple10 <T:IEqualable, T2:IEqualable, T3:IEqualable, T4:IEqualable, T5:IEqualable, T6:IEqualable, T7:IEqualable, T8:IEqualable, T9:IEqualable, T10:IEqualable>
{
    include MObjectBase;

    value1: T;
    value2: T2;
    value3: T3;
    value4: T4;
    value5: T5;
    value6: T6;
    value7: T7;
    value8: T8;
    value9: T9;
    value10: T10;

    def initialize() {}

    def initialize(value1:T, value2:T2, value3:T3, value4:T4, value5:T5, value6:T6, value7:T7, value8:T8, value9:T9, value10:T10) {
        self.value1 = value1;
        self.value2 = value2;
        self.value3 = value3;
        self.value4 = value4;
        self.value5 = value5;
        self.value6 = value6;
        self.value7 = value7;
        self.value8 = value8;
        self.value9 = value9;
        self.value10 = value10;
    }

    def clone(): Tuple10<T,T2,T3,T4,T5,T6,T7,T8,T9,T10> {
        result := Tuple10<T,T2,T3,T4,T5,T6,T7,T8,T9,T10>();

        if(!self.value1.identifyWith(null)) {
            result.value1 = self.value1.clone();
        }
        if(!self.value2.identifyWith(null)) {
            result.value2 = self.value2.clone();
        }
        if(!self.value3.identifyWith(null)) {
            result.value3 = self.value3.clone();
        }
        if(!self.value4.identifyWith(null)) {
            result.value4 = self.value4.clone();
        }
        if(!self.value5.identifyWith(null)) {
            result.value5 = self.value5.clone();
        }
        if(!self.value6.identifyWith(null)) {
            result.value6 = self.value6.clone();
        }
        if(!self.value7.identifyWith(null)) {
            result.value7 = self.value7.clone();
        }
        if(!self.value8.identifyWith(null)) {
            result.value8 = self.value8.clone();
        }
        if(!self.value9.identifyWith(null)) {
            result.value9 = self.value9.clone();
        }
        if(!self.value10.identifyWith(null)) {
            result.value10 = self.value10.clone();
        }

        return result;
    }

    def equals(right:Tuple10<T,T2,T3,T4,T5,T6,T7,T8,T9,T10>):bool {
        if(right.is("WildCard")) {
            return true;
        }
        else {
            return self.value1.equals(right.value1) && self.value2.equals(right.value2) && self.value3.equals(right.value3) && self.value4.equals(right.value4) && self.value5.equals(right.value5) && self.value6.equals(right.value6) && self.value7.equals(right.value7) && self.value8.equals(right.value8) && self.value9.equals(right.value9) && self.value10.equals(right.value10);
        }
    }
    def equals(right:WildCard): bool {
        return true;
    }
    def toString():String {
        return "tuple {".append(self.value1.toString()).append(",").append(self.value2.toString()).append(",").append(self.value3.toString()).append(",").append(self.value4.toString()).append(",").append(self.value5.toString()).append(",").append(self.value6.toString()).append(",").append(self.value7.toString()).append(",").append(self.value8.toString()).append(",").append(self.value9.toString()).append(",").append(self.value10.toString()).append("}");
    }
}

module MInclude
{
    def include(list:EqualableList<SELF>):bool {
        return list.indexOf(self) != -1;
    }
}

inherit Byte 
{
    include MInclude;
}

inherit UByte 
{
    include MInclude;
}

inherit Short 
{
    include MInclude;
}

inherit UShort 
{
    include MInclude;
}

inherit Integer 
{
    include MInclude;
}

inherit UInteger 
{
    include MInclude;
}

inherit Long 
{
    include MInclude;
}

inherit ULong 
{
    include MInclude;
}

inherit Float 
{
    include MInclude;
}

inherit Double
{
    include MInclude;
}

inherit Pointer
{
    include MInclude;
}

inherit Char
{
    include MInclude;
}

inherit Bool
{
    include MInclude;
}

inherit Global
{
    def printf(str:String, params:List<Object>): static {
        str2 := sprintf(str, params);
        System.print(str2);
    }
    def printf(str:String, params:EqualableList<IEqualable>): static {
        str2 := sprintf(str, params);
        System.print(str2);
    }
    def printf(str:String, params:SortableList<ISortable>): static {
        str2 := sprintf(str, params);
        System.print(str2);
    }
    def printfToError(str:String, params:List<Object>): static {
        str2 := sprintf(str, params);
        System.printToError(str2);
    }
    def printfToError(str:String, params:EqualableList<IEqualable>): static {
        str2 := sprintf(str, params);
        System.printToError(str2);
    }
    def printfToError(str:String, params:SortableList<ISortable>): static {
        str2 := sprintf(str, params);
        System.printToError(str2);
    }
    def sprintf(str:String, params:List<Object>): static String {
        return System.sprintf(str, params.toArray());
    }
    def sprintf(str:String, params:EqualableList<IEqualable>): static String {
        return System.sprintf(str, params.toArray());
    }
    def sprintf(str:String, params:SortableList<ISortable>): static String {
        return System.sprintf(str, params.toArray());
    }
}

inherit String 
{
    def match(regex_:regex, group_strings:SortableList<String>?):  bool {
        ovec_max:int = 16;
        ovec:PcreOVec = PcreOVec(ovec_max);

        buffer:Buffer = self.toBuffer();

        offset:int = 0;
        regex_result:int = pcre_exec(regex_, buffer, offset, ovec_max, ovec);

        ### match and no group strings ###
        if(regex_result == 1 || group_strings.identifyWith(null) && regex_result > 0) {
            return true;
        }
        ### group strings ###
        elif(regex_result > 1) {
            for(i:int = 1; i<regex_result; i++) {
                match_string:String = buffer.subBuffer(ovec.start[i], ovec.end[i]).toString();
                group_strings.add(match_string);
            }

            return true;
        }
        ### no match ###
        else {
            return false;
        }
    }

    def sub(regex_:regex, replace:String, group_strings:SortableList<String>?):  String {
        result: String = String();
        offset:int = 0;

        buffer:Buffer = self.toBuffer();
        ovec_max:int = 16;
        ovec:PcreOVec = PcreOVec(ovec_max);

        while(true) {
            regex_result:int = pcre_exec(regex_, buffer, offset, ovec_max, ovec);

            ### match and no group strings ###
            if(regex_result == 1 || group_strings.identifyWith(null) && regex_result > 0) {
                str:String = buffer.subBuffer(offset, ovec.start[0]).toString();
                result.append(str);
                result.append(replace);

                if(offset == ovec.end[0]) {
                    offset++;
                }
                else {
                    offset = ovec.end[0];
                }

                if(!regex_.global) {
                    str:String = buffer.subBuffer(offset, -1).toString();
                    result.append(str);
                    break;
                }
            }
            ### group strings ###
            elif(regex_result > 1) {
                str:String = buffer.subBuffer(offset, ovec.start[0]).toString();
                result.append(str);
                result.append(replace);

                if(offset == ovec.end[0]) {
                    offset++;
                }
                else {
                    offset = ovec.end[0];
                }

                if(!regex_.global) {
                    group_strings.clear();
                }

                for(i:int = 1; i<regex_result; i++) {
                    match_string:String = buffer.subBuffer(ovec.start[i], ovec.end[i]).toString();
                    group_strings.add(match_string);
                }

                if(!regex_.global) {
                    str:String = buffer.subBuffer(offset, -1).toString();
                    result.append(str);
                    break;
                }
            }
            ### no match ###
            else {
                str:String = buffer.subBuffer(offset, -1).toString();
                result.append(str);
                break;
            }
        }

        return result;
    }

    def sub(regex_:regex, replace:String):  String {
        return self.sub(regex_, replace, SortableList<String>());
    }


/*
    def sub(regex_:regex, group_strings:SortableList<String>?, replace_:lambda(String):String):  String 
    {
        result: String = String();
        offset:int = 0;

        buffer:Buffer = self.toBuffer();
        ovec_max:int = 16;
        ovec:PcreOVec = PcreOVec(ovec_max);

        while(true) {
            regex_result:int = pcre_exec(regex_, buffer, offset, ovec_max, ovec);

            ### match and no group strings ###
            if(regex_result == 1 || group_strings.identifyWith(null) && regex_result > 0) {
                str:String = buffer.subBuffer(offset, ovec.start[0]).toString();
                result.append(str);

                match_string:String = buffer.subBuffer(ovec.start[0], ovec.end[0]).toString();

                replace_string:String = replace_(match_string);
                result.append(replace_string);

                if(offset == ovec.end[0]) {
                    offset++;
                }
                else {
                    offset = ovec.end[0];
                }

                if(!regex_.global) {
                    str:String = buffer.subBuffer(offset, -1).toString();
                    result.append(str);
                    break;
                }
            }
            ### group strings ###
            elif(regex_result > 1) {
                str:String = buffer.subBuffer(offset, ovec.start[0]).toString();
                result.append(str);

                match_string:String = buffer.subBuffer(ovec.start[0], ovec.end[0]).toString();

                if(!regex_.global) {
                    group_strings.clear();
                }

                for(i:int = 1; i<regex_result; i++) {
                    match_string:String = buffer.subBuffer(ovec.start[i], ovec.end[i]).toString();
                    group_strings.add(match_string);
                }

                replace_string:String = replace_(match_string);
                result.append(replace_string);

                if(offset == ovec.end[0]) {
                    offset++;
                }
                else {
                    offset = ovec.end[0];
                }

                if(!regex_.global) {
                    str:String = buffer.subBuffer(offset, -1).toString();
                    result.append(str);
                    break;
                }
            }
            ### no match ###
            else {
                str:String = buffer.subBuffer(offset, -1).toString();
                result.append(str);
                break;
            }
        }

        return result;
    }
*/
    def sub(regex_:regex, group_strings:SortableList<String>?, replace_:lambda(String,SortableList<String>):String):  String 
    {
        result: String = String();
        offset:int = 0;

        buffer:Buffer = self.toBuffer();
        ovec_max:int = 16;
        ovec:PcreOVec = PcreOVec(ovec_max);

        while(true) {
            regex_result:int = pcre_exec(regex_, buffer, offset, ovec_max, ovec);

            ### match and no group strings ###
            if(regex_result == 1 || group_strings.identifyWith(null) && regex_result > 0) {
                str:String = buffer.subBuffer(offset, ovec.start[0]).toString();
                result.append(str);

                match_string:String = buffer.subBuffer(ovec.start[0], ovec.end[0]).toString();

                replace_string:String = replace_(match_string, SortableList<String>());
                result.append(replace_string);

                if(offset == ovec.end[0]) {
                    offset++;
                }
                else {
                    offset = ovec.end[0];
              
Download .txt
gitextract_2dc0dl64/

├── .gitattributes
├── .pc/
│   ├── .quilt_patches
│   ├── .quilt_series
│   ├── .version
│   ├── applied-patches
│   └── empty.patch/
│       ├── .timestamp
│       └── Makefile.in
├── .travis.yml
├── C.clcl
├── CGI.clcl
├── CHANGELOG
├── CLang.clcl
├── CLibrary.clcl
├── Command.clcl
├── Container.clcl
├── ExtensionClassTest.cl
├── ExtensionClassTest.clcl
├── ExtensionTest.c
├── ExtensionTest.h
├── File.clcl
├── Fundamental.clcl
├── JITTest.cl
├── JITTest.clcl
├── JITTest2.clcl
├── JS.jsclcl
├── LICENSE
├── Makefile.in
├── MyOwnLibrary.clcl
├── README.md
├── Range.clcl
├── Reflection.clcl
├── Socket.clcl
├── String.clcl
├── SystemCalls.clcl
├── TODO
├── Thread.clcl
├── a.cl
├── a.clcl
├── a.csv
├── a.jscl
├── a.ojscl
├── a.txt
├── aaa
├── all_build.sh
├── app-sample/
│   ├── mfiler5/
│   │   ├── Fundamental.clcl
│   │   ├── Makefile.in
│   │   ├── config.log
│   │   ├── config.status
│   │   ├── configure
│   │   ├── configure.in
│   │   ├── install.sh
│   │   ├── mf1app.clcl
│   │   ├── mf2win.clcl
│   │   ├── mf3isearch.clcl
│   │   ├── mf4vd.clcl
│   │   ├── mf5
│   │   ├── mfiler5.cl
│   │   └── update_mfiler5.sh
│   └── vicl/
│       ├── Fundamental.clcl
│       ├── Makefile.in
│       ├── README.md
│       ├── SKK-JISYO.L
│       ├── TODO
│       ├── a.c
│       ├── a.cl
│       ├── a.clcl
│       ├── aaa/
│       │   ├── aaa
│       │   └── bbb
│       ├── c.cl
│       ├── config.log
│       ├── config.status
│       ├── configure
│       ├── configure.in
│       ├── install.sh
│       ├── update_vicl.sh
│       ├── vicl
│       ├── vicl10VisualMode.clcl
│       ├── vicl11Undo.clcl
│       ├── vicl12grave.clcl
│       ├── vicl13dot.clcl
│       ├── vicl14Completion.clcl
│       ├── vicl15CCompletion.clcl
│       ├── vicl16VVisual.clcl
│       ├── vicl17Macro.clcl
│       ├── vicl18Range.clcl
│       ├── vicl19Signal.clcl
│       ├── vicl1App.clcl
│       ├── vicl20Backup.clcl
│       ├── vicl21Utf8.clcl
│       ├── vicl2Win.clcl
│       ├── vicl3InsertMode.clcl
│       ├── vicl4Edit.clcl
│       ├── vicl5Word.clcl
│       ├── vicl6Brace.clcl
│       ├── vicl7DirPane.clcl
│       ├── vicl8CommandMode.clcl
│       ├── vicl9SearchMode.clcl
│       ├── vicl_insert_file
│       ├── vicl_open_file
│       ├── viclone.cl
│       ├── viclone_insert_file.cl
│       └── viclone_open_file.cl
├── b.cl
├── b.clcl
├── b.txt
├── bbb
├── c.txt
├── code/
│   ├── AllocSize.clcl
│   ├── AndAndOrOrTest.clcl
│   ├── AnonymousTest.clcl
│   ├── AnonymousTest2.clcl
│   ├── ArrayTest.clcl
│   ├── ArrayTest2.cl
│   ├── ArrayTest2.clcl
│   ├── ArrayTest3.clcl
│   ├── ArrayTest4.clcl
│   ├── ArrayTest5.clcl
│   ├── BlockTest.clcl
│   ├── BlockTest2.clcl
│   ├── BlockTest3.clcl
│   ├── BlockTest4.clcl
│   ├── BlockTest5.clcl
│   ├── BlockVarTest.clcl
│   ├── BoolTest.clcl
│   ├── BufferTest.clcl
│   ├── ByteTest.clcl
│   ├── CArrayTest.clcl
│   ├── CFFI
│   ├── CFFI.bc
│   ├── CFFI.cl
│   ├── CFFI.ll
│   ├── CFFI.s
│   ├── CFFITest.clcl
│   ├── CGITest.clcl
│   ├── CStruct.c
│   ├── CStruct.h
│   ├── CStructTest.clcl
│   ├── CastTest.clcl
│   ├── CharTest.clcl
│   ├── ClassFieldAndFieldTest.clcl
│   ├── ClassMethodTest.clcl
│   ├── CloneTest.clcl
│   ├── ClosureTest.clcl
│   ├── CommandTest.clcl
│   ├── CommentTest.clcl
│   ├── DefaultMethodArgTest.clcl
│   ├── DelegateTest.clcl
│   ├── DependencyTest.clcl
│   ├── DirTest.clcl
│   ├── E.cl
│   ├── E.clcl
│   ├── EFTest.clcl
│   ├── EnumTest.clcl
│   ├── EqualableArrayTest.clcl
│   ├── FileTest.clcl
│   ├── FloatTest.clcl
│   ├── ForBlock.clcl
│   ├── FunTest.clcl
│   ├── GCMemoryTest.clcl
│   ├── GenericsTest.clcl
│   ├── GenericsTest2.clcl
│   ├── GenericsTest3.clcl
│   ├── GenericsTest4.clcl
│   ├── GenericsTestX.clcl
│   ├── HashTest.clcl
│   ├── HelloWorld.clcl
│   ├── HereDocument.clcl
│   ├── IncrementTest.clcl
│   ├── InheritClassA.clcl
│   ├── InheritTest.clcl
│   ├── InitializeTest.clcl
│   ├── IntegerTest.clcl
│   ├── InterfaceTest.clcl
│   ├── IsTest.clcl
│   ├── KotlinTest.clcl
│   ├── LambdaArrayTest.clcl
│   ├── ListTest.clcl
│   ├── ListTest2.clcl
│   ├── ListTest3.clcl
│   ├── MapTest.clcl
│   ├── MethodBlock.clcl
│   ├── MethodDynamicTest.clcl
│   ├── MethodDynamicTest2.clcl
│   ├── MethodGenericsTest.clcl
│   ├── MethodInternal.clcl
│   ├── MethodInternalTest.clcl
│   ├── MixinLayers.clcl
│   ├── MixinLayers2.clcl
│   ├── ModuleTest.clcl
│   ├── MultiLineString.cl
│   ├── NormalBlockTest.clcl
│   ├── NullTest.clcl
│   ├── NumberTest.clcl
│   ├── NumberTest2.clcl
│   ├── ObjectCast.clcl
│   ├── ObjectTest.clcl
│   ├── OmitBlockParamTest.clcl
│   ├── OperatorTest.clcl
│   ├── PatternMatchingTest.clcl
│   ├── Person.clcl
│   ├── Person.ojsclcl
│   ├── PointerTest.clcl
│   ├── PointerTest2.clcl
│   ├── PointerTest3.clcl
│   ├── PrintfTest.clcl
│   ├── QuetionOperator.clcl
│   ├── RangeTest.clcl
│   ├── ReflectionTest.clcl
│   ├── RegexTest.clcl
│   ├── ResultTest.clcl
│   ├── ResultTest2.clcl
│   ├── ResultTypeTest.clcl
│   ├── ReturnTest.clcl
│   ├── SelectTest.cl
│   ├── SelfClassTest.clcl
│   ├── SelfOmittedField.clcl
│   ├── SetterGetterTest.clcl
│   ├── SignalTest.clcl
│   ├── SocketTest.cl
│   ├── SocketTest.clcl
│   ├── SocketTestClient.cl
│   ├── SocketTestClientInet.cl
│   ├── SocketTestInet.cl
│   ├── SocketTestServer.cl
│   ├── SocketTestServerInet.cl
│   ├── SpecialFieldTest.clcl
│   ├── StackTest.clcl
│   ├── StringTest.clcl
│   ├── StringTest2.clcl
│   ├── StringTest3.clcl
│   ├── SystemCallTest.clcl
│   ├── SystemTest.clcl
│   ├── TestDep.clcl
│   ├── TimeTest.clcl
│   ├── TryTest.clcl
│   ├── TupleTest.clcl
│   ├── TypeDataTest.clcl
│   ├── TypeInference.clcl
│   ├── UnboxingTest.clcl
│   ├── UserObjectTest.clcl
│   ├── UserThrowTest.cl
│   ├── UserThrowTest.clcl
│   ├── VariablesTest.clcl
│   ├── VoidResultTest.clcl
│   ├── WhenTest.clcl
│   ├── anonymous.cl
│   ├── anonymous2.cl
│   ├── buffer.cl
│   ├── byte.cl
│   ├── carray.cl
│   ├── char.cl
│   ├── closure.cl
│   ├── command.cl
│   ├── cstruct_test.bc
│   ├── cstruct_test.cl
│   ├── cstruct_test.ll
│   ├── cstruct_test.s
│   ├── default_method_arg.cl
│   ├── delegate.cl
│   ├── delegate.clcl
│   ├── dependecy.cl
│   ├── dir.cl
│   ├── enum.cl
│   ├── equalable_array.cl
│   ├── equalable_array.clcl
│   ├── file.cl
│   ├── float.cl
│   ├── fun.cl
│   ├── generics4.cl
│   ├── getopt.cl
│   ├── getopt_long.cl
│   ├── getopt_long_only.cl
│   ├── hash.cl
│   ├── interface.cl
│   ├── interface.clcl
│   ├── is.cl
│   ├── js.jscl
│   ├── js.ojscl
│   ├── kotlin.cl
│   ├── kotlin.clcl
│   ├── list.cl
│   ├── list2.cl
│   ├── list3.cl
│   ├── main.cl
│   ├── method_block.cl
│   ├── method_generics.cl
│   ├── method_generics.clcl
│   ├── method_internal.cl
│   ├── null_test.cl
│   ├── num.ojscl
│   ├── number.cl
│   ├── number2.cl
│   ├── object.cl
│   ├── parser_test.cl
│   ├── pattern_matching.cl
│   ├── printf.cl
│   ├── reflection.cl
│   ├── result.cl
│   ├── result_type.cl
│   ├── result_type.clcl
│   ├── return.cl
│   ├── return.clcl
│   ├── setter_getter.cl
│   ├── string2.cl
│   ├── string3.cl
│   ├── string3.clcl
│   ├── system_test.cl
│   ├── thread.cl
│   ├── time.cl
│   ├── try.cl
│   ├── tuple.cl
│   ├── type_data.cl
│   ├── type_inference.cl
│   └── when.cl
├── compile-test-code.sh
├── config.h.in
├── configure
├── configure.in
├── d.txt
├── examples/
│   ├── Dep1.clcl
│   ├── Dep2.clcl
│   ├── Hello.cl
│   ├── Hello2.cl
│   ├── Hello2.clcl
│   ├── Makefile
│   ├── a.c
│   ├── dep_error.cl
│   └── fun.cl
├── ext/
│   └── hello.c
├── ext.cl
├── ext.clcl
├── home_build.sh
├── install.sh
├── install_deb.sh
├── llclover2
├── make_arm_el.sh
├── make_deb.sh
├── manual/
│   ├── Home-en.md
│   ├── Home.md
│   ├── Range-en.md
│   ├── Range.md
│   ├── _Footer.md
│   ├── _Sidebar.md
│   ├── anonymous-en.md
│   ├── anonymous.md
│   ├── buffer-en.md
│   ├── buffer.md
│   ├── changelog-en.md
│   ├── changelog.md
│   ├── clover-en.md
│   ├── clover.md
│   ├── collection-en.md
│   ├── collection.md
│   ├── command-en.md
│   ├── command.md
│   ├── conclusion-en.md
│   ├── conclusion.md
│   ├── conribution-en.md
│   ├── contribution.md
│   ├── diary-en.md
│   ├── diary.md
│   ├── directory-en.md
│   ├── directory.md
│   ├── extension-en.md
│   ├── extension.md
│   ├── feature-en.md
│   ├── feature.md
│   ├── file-en.md
│   ├── file.md
│   ├── global-en.md
│   ├── global.md
│   ├── lambda-en.md
│   ├── lambda.md
│   ├── libraries-en.md
│   ├── libraries.md
│   ├── object-en.md
│   ├── object.md
│   ├── path-en.md
│   ├── path.md
│   ├── pointer-en.md
│   ├── pointer.md
│   ├── reflection-en.md
│   ├── reflection.md
│   ├── regex-en.md
│   ├── regex.md
│   ├── string-en.md
│   ├── string.md
│   ├── syntax.md
│   ├── system-en.md
│   ├── system.md
│   ├── thread-en.md
│   ├── thread.md
│   ├── to_html.sh
│   ├── typing-en.md
│   ├── typing.md
│   ├── update_wiki.sh
│   ├── usage-en.md
│   ├── usage.md
│   ├── usage2-en.md
│   └── usage2.md
├── moveVarDecls.hs
├── output_of_pwd
├── src/
│   ├── a.c
│   ├── alignment.c
│   ├── array.c
│   ├── block.c
│   ├── bool.c
│   ├── buffer.c
│   ├── byte.c
│   ├── carray.c
│   ├── cast.c
│   ├── char.c
│   ├── class_clover.c
│   ├── class_clover_compile_time.c
│   ├── class_clover_runtime.c
│   ├── class_compiler.c
│   ├── class_system.c
│   ├── class_thread.c
│   ├── class_thread.o.localhost.13934.Fx3LJx
│   ├── clover2-buffer.h
│   ├── clover2-debug.h
│   ├── clover2-macros.h
│   ├── clover2-xfunc.h
│   ├── clover_to_clang.c
│   ├── clover_to_clang.o.localhost.14761.eyEh1h
│   ├── code.c
│   ├── common.h
│   ├── compiler.c
│   ├── constant.c
│   ├── debug.c
│   ├── exception.c
│   ├── float.c
│   ├── get_type.c
│   ├── hash.c
│   ├── heap.c
│   ├── integer.c
│   ├── interpreter.c
│   ├── js.c
│   ├── klass.c
│   ├── klass_compile_time.c
│   ├── list.c
│   ├── long.c
│   ├── main.c
│   ├── method_compiler.c
│   ├── module.c
│   ├── native_method.c
│   ├── node.c
│   ├── node_block.c
│   ├── node_block_type.c
│   ├── node_type.c
│   ├── object.c
│   ├── parser.
│   ├── parser.c
│   ├── pointer.c
│   ├── regex.c
│   ├── script.c
│   ├── script_ctime.c
│   ├── short.c
│   ├── stack.c
│   ├── string.c
│   ├── tuple.c
│   ├── type.c
│   ├── utf.c
│   ├── vm.c
│   ├── vtable.c
│   └── xfunc.c
├── sys.txt
├── tags
├── test_dir/
│   ├── a
│   ├── b
│   └── c
├── thread_debug.cl
├── update_clover.sh
├── version_up.cl
├── vm.c
├── z.cl
└── zzz.txt
Download .txt
SYMBOL INDEX (1277 symbols across 63 files)

FILE: ExtensionTest.c
  function getValue (line 5) | int getValue(int x, int y)
  function getValue2 (line 10) | long getValue2(long x, long y)

FILE: code/CStruct.c
  function fun (line 8) | void fun(struct CStruct data)
  function fun2 (line 15) | void fun2(char data[5])
  function fun3 (line 22) | void fun3(int a, int b)
  function fun4 (line 29) | void fun4(char data[3])
  function fun5 (line 36) | void fun5(struct CStruct data)
  function fun7 (line 48) | struct CStruct fun7()
  function fun8 (line 59) | void fun8(char* str)
  function fun9 (line 66) | int fun9(int x, int y)
  function fun10 (line 71) | int fun10(int x)
  function fun11 (line 76) | void fun11()
  function fun12 (line 81) | void fun12(char c)
  function fun13 (line 86) | void fun13(int* data)
  function fun14 (line 91) | void fun14(int data[3])
  function fun15 (line 96) | void fun15(char data[3])
  function fun16 (line 101) | void fun16(struct CStruct data)
  function fun17 (line 108) | void fun17(struct CStruct2 data)
  function fun18 (line 115) | void fun18()
  function fun19 (line 125) | struct CStruct2 fun19()
  function fun20 (line 137) | void fun20()

FILE: code/CStruct.h
  type CStruct (line 2) | struct CStruct {
  type CStruct (line 8) | struct CStruct
  type CStruct (line 12) | struct CStruct
  type CStruct (line 14) | struct CStruct
  type CStruct (line 38) | struct CStruct
  type CStruct (line 40) | struct CStruct
  type CStruct2 (line 42) | struct CStruct2 {
  type CStruct2 (line 56) | struct CStruct2
  type CStruct2 (line 72) | struct CStruct2
  type CStruct2 (line 76) | struct CStruct2

FILE: examples/a.c
  function main (line 3) | int main()

FILE: ext/hello.c
  function BOOL (line 3) | BOOL ExtTest_hello(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)

FILE: src/a.c
  function func (line 6) | int func() {

FILE: src/alignment.c
  function alignment (line 3) | void alignment(unsigned int* size)
  function alignment_pointer (line 8) | void alignment_pointer(char** p, char* head)

FILE: src/array.c
  function array_mark_fun (line 3) | void array_mark_fun(CLObject self, unsigned char* mark_flg)
  function free_array (line 18) | void free_array(CLObject self)
  function object_size (line 35) | static unsigned int object_size(sCLClass* klass, int array_num)
  function CLObject (line 48) | CLObject create_array_object(sCLClass* klass, int array_num, sVMInfo* info)

FILE: src/block.c
  function object_size (line 3) | static unsigned int object_size()
  function block_mark_fun (line 14) | void block_mark_fun(CLObject self, unsigned char* mark_flg)
  function free_block (line 26) | void free_block(CLObject self)
  function CLObject (line 34) | CLObject create_block_object(sByteCode* codes, sConst* constant, CLVALUE...

FILE: src/bool.c
  function CLObject (line 3) | CLObject create_bool(BOOL value, sVMInfo* info)

FILE: src/buffer.c
  function sBuf_init (line 10) | void sBuf_init(sBuf* self)
  function sBuf_clone (line 18) | void sBuf_clone(sBuf* self, sBuf* buf)
  function sBuf_append (line 28) | void sBuf_append(sBuf* self, void* str, size_t size)
  function sBuf_append_fast (line 48) | void sBuf_append_fast(sBuf* self, void* str, size_t size)
  function sBuf_append_char (line 76) | void sBuf_append_char(sBuf* self, char c)
  function sBuf_append_str (line 88) | void sBuf_append_str(sBuf* self, char* str)
  function sBuf_append_int (line 93) | void sBuf_append_int(sBuf* self, int value)
  function sBuf_append_long (line 98) | void sBuf_append_long(sBuf* self, long long value)

FILE: src/byte.c
  function CLObject (line 3) | CLObject create_byte(char value, sVMInfo* info)
  function CLObject (line 15) | CLObject create_ubyte(unsigned char value, sVMInfo* info)

FILE: src/carray.c
  function CLObject (line 3) | CLObject create_carray_object(char* type_name, sVMInfo* info)
  function CLObject (line 12) | CLObject create_equalable_carray_object(char* type_name, sVMInfo* info)
  function CLObject (line 21) | CLObject create_sortable_carray_object(char* type_name, sVMInfo* info)
  function CLObject (line 30) | CLObject create_carray_object_with_elements(int num_elements, CLObject* ...
  function BOOL (line 72) | BOOL initialize_carray_object(CLObject array_object, int num_elements, C...
  function CLObject (line 104) | CLObject create_equalable_carray_object_with_elements(int num_elements, ...
  function BOOL (line 146) | BOOL initialize_equalable_carray_object(CLObject array_object, int num_e...
  function CLObject (line 178) | CLObject create_sortable_carray_object_with_elements(int num_elements, C...
  function BOOL (line 220) | BOOL initialize_sortable_carray_object(CLObject array_object, int num_el...

FILE: src/cast.c
  function cast_right_type_to_byte (line 3) | void cast_right_type_to_byte(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_short (line 150) | void cast_right_type_to_short(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_int (line 294) | void cast_right_type_to_int(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_long (line 437) | void cast_right_type_to_long(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_ubyte (line 582) | void cast_right_type_to_ubyte(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_ushort (line 726) | void cast_right_type_to_ushort(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_uint (line 870) | void cast_right_type_to_uint(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_ulong (line 1013) | void cast_right_type_to_ulong(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_float (line 1157) | void cast_right_type_to_float(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_double (line 1292) | void cast_right_type_to_double(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_char (line 1427) | void cast_right_type_to_char(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_pointer (line 1568) | void cast_right_type_to_pointer(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_bool (line 1635) | void cast_right_type_to_bool(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_String (line 1780) | void cast_right_type_to_String(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_Byte (line 1864) | void cast_right_type_to_Byte(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_UByte (line 1948) | void cast_right_type_to_UByte(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_Short (line 2032) | void cast_right_type_to_Short(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_UShort (line 2116) | void cast_right_type_to_UShort(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_Integer (line 2200) | void cast_right_type_to_Integer(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_UInteger (line 2279) | void cast_right_type_to_UInteger(sNodeType** right_type, sCompileInfo* i...
  function cast_right_type_to_Long (line 2358) | void cast_right_type_to_Long(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_ULong (line 2437) | void cast_right_type_to_ULong(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_Float (line 2516) | void cast_right_type_to_Float(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_Double (line 2590) | void cast_right_type_to_Double(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_Pointer (line 2664) | void cast_right_type_to_Pointer(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_Char (line 2733) | void cast_right_type_to_Char(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_Bool (line 2812) | void cast_right_type_to_Bool(sNodeType** right_type, sCompileInfo* info)
  function cast_right_type_to_Array (line 2891) | void cast_right_type_to_Array(sNodeType** right_type, sCompileInfo* info)
  function cast_array_to_clang_array (line 2904) | void cast_array_to_clang_array(sNodeType* left_type, sNodeType** right_t...
  function cast_clang_array_to_clang_pointer (line 2913) | void cast_clang_array_to_clang_pointer(sNodeType* left_type, sNodeType**...
  function cast_right_type_to_left_type (line 2922) | void cast_right_type_to_left_type(sNodeType* left_type, sNodeType** righ...

FILE: src/char.c
  function CLObject (line 3) | CLObject create_char(wchar_t value, sVMInfo* info)

FILE: src/class_clover.c
  function BOOL (line 3) | BOOL Clover_load(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 32) | BOOL Clover_initialize_lang(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo*...
  function BOOL (line 76) | BOOL Clover_initialize_reflection(CLVALUE** stack_ptr, CLVALUE* lvar, sV...
  function BOOL (line 97) | BOOL Clover_getField(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 180) | BOOL Clover_getClassField(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 264) | BOOL Clover_getMethod(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 432) | BOOL Clover_getClassFlags(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 463) | BOOL Clover_getClassGenericsParamTypes(CLVALUE** stack_ptr, CLVALUE* lva...
  function BOOL (line 518) | BOOL Clover_getClassGenericsParamNames(CLVALUE** stack_ptr, CLVALUE* lva...
  function BOOL (line 574) | BOOL Clover_getNumFields(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 605) | BOOL Clover_getNumClassFields(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInf...
  function BOOL (line 636) | BOOL Clover_getNumMethods(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 667) | BOOL Clover_isLoadedClass(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 693) | BOOL Clover_isDefinedClass(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* ...
  function BOOL (line 719) | BOOL Clover_getAllClassName(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo*...
  function BOOL (line 766) | BOOL Clover_createObject(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 801) | BOOL Clover_createArray(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 836) | BOOL Clover_isTypedefedClass(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo...
  function BOOL (line 871) | BOOL Clover_gc(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 878) | BOOL Clover_compaction(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)

FILE: src/class_clover_compile_time.c
  function BOOL (line 3) | BOOL Clover_appendField(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 58) | BOOL Clover_appendClassField(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo...
  function BOOL (line 113) | BOOL Clover_declareMethod(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 272) | BOOL Clover_appendMethod(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 436) | BOOL Clover_appendMethod2(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 597) | BOOL Clover_appendClass(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)

FILE: src/class_clover_runtime.c
  function BOOL (line 3) | BOOL Clover_appendMethod(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9) | BOOL Clover_appendMethod2(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 15) | BOOL Clover_appendField(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 21) | BOOL Clover_appendClassField(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo...
  function BOOL (line 27) | BOOL Clover_appendClass(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 33) | BOOL Clover_declareMethod(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...

FILE: src/class_compiler.c
  function BOOL (line 4) | static BOOL skip_block(sParserInfo* info)
  function BOOL (line 101) | static BOOL parse_generics_params(sGenericsParamInfo* ginfo, sParserInfo...
  function BOOL (line 160) | static BOOL parse_class_name_and_attributes(char* class_name, int class_...
  function BOOL (line 253) | static BOOL parse_class_on_alloc_classes_phase(sParserInfo* info, sCompi...
  function BOOL (line 297) | static BOOL parse_word_with_dot(char* buf, int buf_size, sParserInfo* info)
  function BOOL (line 336) | static BOOL parse_throws_and_clibrary(sParserInfo* info, BOOL* throw_exi...
  function BOOL (line 389) | BOOL parse_method_name_and_params(char* method_name, int method_name_max...
  function BOOL (line 487) | static BOOL parse_field_attributes_and_type(BOOL* private_, BOOL* protec...
  function BOOL (line 560) | static BOOL field_delegation(sParserInfo* info, sCompileInfo* cinfo, sCL...
  function BOOL (line 640) | static BOOL setter_and_getter(sParserInfo* info, sCompileInfo* cinfo, sC...
  function BOOL (line 708) | static BOOL parse_methods_and_fields(sParserInfo* info, sCompileInfo* ci...
  function BOOL (line 985) | static BOOL parse_class_on_add_methods_and_fields(sParserInfo* info, sCo...
  function BOOL (line 1029) | static BOOL setter_and_getter_on_compile_time(sParserInfo* info, sCompil...
  function BOOL (line 1148) | static BOOL field_delegation_on_compile_time(sParserInfo* info, sCompile...
  function BOOL (line 1254) | BOOL parse_methods_and_fields_on_compile_time(sParserInfo* info, sCompil...
  function BOOL (line 1540) | static BOOL parse_class_on_compile_code(sParserInfo* info, sCompileInfo*...
  function BOOL (line 1584) | static BOOL parse_class(sParserInfo* info, sCompileInfo* cinfo, BOOL int...
  function BOOL (line 1648) | static BOOL parse_module(sParserInfo* info, sCompileInfo* cinfo)
  function BOOL (line 1722) | static BOOL search_for_include_file(char* file_name, char* include_file_...
  function BOOL (line 1765) | static BOOL include_file(sParserInfo* info, sCompileInfo* cinfo)
  function BOOL (line 1871) | static BOOL parse_class_source(sParserInfo* info, sCompileInfo* cinfo)
  function reset_method_index_on_compile_time (line 1978) | static void reset_method_index_on_compile_time()
  function BOOL (line 1995) | BOOL call_compile_time_script_method_on_declare()
  function BOOL (line 2029) | static BOOL eval_str(char* source, char* fname, sVarTable* lv_table, CLV...
  function BOOL (line 2133) | BOOL compile_class_source(char* fname, char* source)

FILE: src/class_system.c
  function BOOL (line 35) | BOOL System_exit(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 44) | BOOL System_assert(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function gc_memory_object_size (line 56) | static unsigned long long gc_memory_object_size(sCLClass* klass, int mem...
  function BOOL (line 73) | BOOL System_GC_malloc(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 103) | BOOL System_malloc(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 115) | BOOL System_calloc(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 128) | BOOL System_realloc(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 141) | BOOL System_free(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 150) | BOOL System_strlen(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 160) | BOOL System_strlen2(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 197) | BOOL System_strcpy(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 210) | BOOL System_memcpy(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 224) | BOOL System_memset(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 235) | BOOL System_memcmp(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 249) | BOOL System_strncpy(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 263) | BOOL System_strdup(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 275) | BOOL System_print(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 308) | BOOL System_println(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 345) | BOOL System_printToError(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 384) | BOOL System_printlnToError(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* ...
  function BOOL (line 423) | BOOL System_sleep(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 437) | BOOL System_pthread_mutex_init(CLVALUE** stack_ptr, CLVALUE* lvar, sVMIn...
  function BOOL (line 463) | BOOL System_pthread_mutex_lock(CLVALUE** stack_ptr, CLVALUE* lvar, sVMIn...
  function BOOL (line 495) | BOOL System_pthread_mutex_unlock(CLVALUE** stack_ptr, CLVALUE* lvar, sVM...
  function BOOL (line 527) | BOOL System_pthread_mutex_destroy(CLVALUE** stack_ptr, CLVALUE* lvar, sV...
  function BOOL (line 559) | BOOL System_pthread_mutex_trylock(CLVALUE** stack_ptr, CLVALUE* lvar, sV...
  function BOOL (line 586) | BOOL System_pthread_mutexattr_init(CLVALUE** stack_ptr, CLVALUE* lvar, s...
  function BOOL (line 605) | BOOL System_pthread_mutexattr_settype(CLVALUE** stack_ptr, CLVALUE* lvar...
  function BOOL (line 631) | BOOL System_pthread_mutexattr_destroy(CLVALUE** stack_ptr, CLVALUE* lvar...
  function BOOL (line 650) | BOOL System_pthread_mutexattr_gettype(CLVALUE** stack_ptr, CLVALUE* lvar...
  function BOOL (line 671) | BOOL System_pthread_cond_init(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInf...
  function BOOL (line 697) | BOOL System_pthread_cond_signal(CLVALUE** stack_ptr, CLVALUE* lvar, sVMI...
  function BOOL (line 721) | BOOL System_pthread_cond_broadcast(CLVALUE** stack_ptr, CLVALUE* lvar, s...
  function BOOL (line 745) | BOOL System_pthread_cond_wait(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInf...
  function BOOL (line 776) | BOOL System_pthread_cond_timedwait(CLVALUE** stack_ptr, CLVALUE* lvar, s...
  function BOOL (line 827) | BOOL System_pthread_cond_destroy(CLVALUE** stack_ptr, CLVALUE* lvar, sVM...
  function BOOL (line 859) | BOOL System_initialize_thread_system(CLVALUE** stack_ptr, CLVALUE* lvar,...
  function BOOL (line 880) | BOOL System_pcre_exec(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 958) | BOOL System_sprintf(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1229) | BOOL System_mbstowcs(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1279) | BOOL System_wcstombs(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1337) | BOOL System_atoi(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1362) | BOOL System_atof(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1387) | BOOL System_strtod(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1418) | BOOL System_strcmp(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1452) | BOOL System_strcasecmp(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1486) | BOOL System_strtol(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1520) | BOOL System_strtoul(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1554) | BOOL System_srand(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1567) | BOOL System_rand(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1578) | BOOL System_time(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1594) | BOOL System_open(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1629) | BOOL System_close(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1650) | BOOL System_initialize_string_system(CLVALUE** stack_ptr, CLVALUE* lvar,...
  function BOOL (line 1661) | BOOL System_initialize_file_system(CLVALUE** stack_ptr, CLVALUE* lvar, s...
  function BOOL (line 1782) | BOOL System_read(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1824) | BOOL System_write(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1863) | BOOL System_fcntl(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1888) | BOOL System_localtime(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1925) | BOOL System_mktime(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 1963) | BOOL System_stat(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2010) | BOOL System_lstat(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2057) | BOOL System_realpath(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2092) | BOOL System_dirname(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2119) | BOOL System_basename(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2146) | BOOL System_opendir(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2176) | BOOL System_readdir(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2206) | BOOL System_closedir(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2227) | BOOL System_initialize_command_system(CLVALUE** stack_ptr, CLVALUE* lvar...
  function BOOL (line 2460) | BOOL System_pipe(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2484) | BOOL System_fork(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2532) | BOOL System_dup2(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2552) | BOOL System_execvp(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2601) | BOOL System_execv(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2650) | BOOL System_waitpid(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2674) | BOOL System_WIFEXITED(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2689) | BOOL System_WEXITSTATUS(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2704) | BOOL System_WIFSIGNALED(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2719) | BOOL System_WTERMSIG(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2734) | BOOL System_WCOREDUMP(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2749) | BOOL System_WIFSTOPPED(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2764) | BOOL System_WSTOPSIG(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2779) | BOOL System_WIFCONTINUED(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2794) | BOOL System_getpid(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2805) | BOOL System_setpgid(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2824) | BOOL System_kill(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2844) | BOOL System_tcsetpgrp(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2866) | BOOL System_tcgetattr(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2905) | BOOL System_tcsetattr(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2935) | BOOL System_tcsendbreak(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2955) | BOOL System_tcdrain(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2973) | BOOL System_tcflush(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 2993) | BOOL System_tcflow(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3013) | BOOL System_cfmakeraw(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3034) | BOOL System_cfgetispeed(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3057) | BOOL System_cfgetospeed(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3080) | BOOL System_cfsetispeed(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3108) | BOOL System_cfsetospeed(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3136) | BOOL System_cfsetspeed(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3164) | BOOL System_chmod(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3192) | BOOL System_lchmod(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3225) | BOOL System_fchmod(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3245) | BOOL System_chown(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3275) | BOOL System_lchown(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3305) | BOOL System_fchown(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3327) | BOOL System_unlink(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3353) | BOOL System_access(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3378) | BOOL System_utime(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3412) | BOOL System_fnmatch(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3445) | BOOL System_link(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3480) | BOOL System_symlink(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3515) | BOOL System_readlink(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3548) | BOOL System_rename(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3583) | BOOL System_truncate(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3611) | BOOL System_ftruncate(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3631) | BOOL System_chdir(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3657) | BOOL System_fchdir(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3675) | BOOL System_rmdir(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3701) | BOOL System_mkdir(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3729) | BOOL System_clock_getres(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3759) | BOOL System_clock_gettime(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 3789) | BOOL System_clock_settime(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 3821) | BOOL System_system(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3850) | BOOL System_getenv(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3912) | BOOL System_setenv(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3949) | BOOL System_unsetenv(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 3975) | BOOL System_dlopen(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4006) | BOOL System_dlclose(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4027) | BOOL System_dlsym(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4058) | BOOL System_put_fun_to_hash_for_native_method(CLVALUE** stack_ptr, CLVAL...
  function BOOL (line 4088) | BOOL System_alarm(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4104) | BOOL System_dup(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4146) | BOOL System_execvpe(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4231) | BOOL System_fopen(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4268) | BOOL System_fclose(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4291) | BOOL System_fwrite(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4334) | BOOL System_fread(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4380) | BOOL System_feof(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4401) | BOOL System_fgetc(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4428) | BOOL System_fgets(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4486) | BOOL System_getchar(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4503) | BOOL System_ungetc(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4531) | BOOL System_getcwd(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4551) | BOOL System_getopt(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4617) | BOOL System_getopt_long(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4724) | BOOL System_getopt_long_only(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo...
  function BOOL (line 4831) | BOOL System_getppid(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4841) | BOOL System_setsid(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4856) | BOOL System_getsid(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4877) | BOOL System_setpgrp(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4892) | BOOL System_gettid(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 4902) | BOOL System_initialize_system_calls_system(CLVALUE** stack_ptr, CLVALUE*...
  function BOOL (line 5880) | BOOL System_popen(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 5918) | BOOL System_pclose(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 5934) | BOOL System_initialize_cgi_system(CLVALUE** stack_ptr, CLVALUE* lvar, sV...
  function BOOL (line 5960) | BOOL System_setlocale(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 5994) | BOOL System_flock(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6014) | BOOL System_fileno(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6036) | BOOL System_getbsize(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6068) | BOOL System_getuid(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6078) | BOOL System_geteuid(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6088) | BOOL System_getgid(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6098) | BOOL System_getegid(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6108) | BOOL System_isatty(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6124) | BOOL System_umask(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6140) | BOOL System_usleep(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6160) | BOOL System_nanosleep(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6203) | BOOL System_putenv(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6232) | BOOL System_setvbuf(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6262) | BOOL System_strncat(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6282) | BOOL System_strchr(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6300) | BOOL System_initialize_socket_system(CLVALUE** stack_ptr, CLVALUE* lvar,...
  function BOOL (line 6333) | BOOL System_socket(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6358) | BOOL System_connect(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6401) | BOOL System_bind(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6444) | BOOL System_bind2(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6487) | BOOL System_listen(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6507) | BOOL System_accept(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6543) | BOOL System_accept2(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6585) | BOOL System_inet_addr(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6609) | BOOL System_connect2(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function CLObject (line 6653) | static CLObject create_string_array_from_ppchar_nullterminated(char** ar...
  function CLObject (line 6691) | static CLObject create_h_addr_list_array_from_ppchar_nullterminated(char...
  function CLObject (line 6729) | static CLObject create_hostent_object(struct hostent* entry, sVMInfo* info)
  function BOOL (line 6773) | BOOL System_gethostbyaddr(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function CLObject (line 6806) | static CLObject create_servent_object(struct servent* entry, sVMInfo* info)
  function BOOL (line 6856) | BOOL System_gethostbyname(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 6887) | BOOL System_getservbyname(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 6921) | BOOL System_getservbyport(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 6954) | BOOL System_inet_ntoa(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 6986) | BOOL System_gethostname(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7007) | BOOL System_signal(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function class_system_init (line 7040) | void class_system_init()
  function signal_user_handler (line 7045) | void signal_user_handler(int signum)
  function BOOL (line 7078) | BOOL System_signal2(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7120) | BOOL fd_set_allocSize(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7128) | BOOL System_FD_ZERO(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7144) | BOOL System_FD_CLR(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7163) | BOOL System_FD_SET(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7182) | BOOL System_FD_ISSET(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7204) | BOOL System_select(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7267) | BOOL System_ioctl(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7292) | BOOL System_initscr(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7311) | BOOL System_endwin(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7323) | BOOL System_move(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7343) | BOOL System_printw(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7370) | BOOL System_refresh(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7382) | BOOL System_box(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7404) | BOOL System_isendwin(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7414) | BOOL System_clear(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7430) | BOOL System_erase(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7446) | BOOL System_idcok(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7460) | BOOL System_idlok(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7482) | BOOL System_clearok(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7501) | BOOL System_leaveok(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7520) | BOOL System_is_cleared(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7536) | BOOL System_is_idcok(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7552) | BOOL System_is_idlok(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7568) | BOOL System_is_immedok(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7584) | BOOL System_is_keypad(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7600) | BOOL System_is_leaveok(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7616) | BOOL System_is_nodelay(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7632) | BOOL System_is_notimeout(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7666) | BOOL System_is_scrollok(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7700) | BOOL System_is_syncok(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7716) | BOOL System_wgetparent(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7750) | BOOL System_wgetscrreg(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7775) | BOOL System_clrtobot(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7788) | BOOL System_wclrtobot(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7806) | BOOL System_werase(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7824) | BOOL System_clrtoeol(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7837) | BOOL System_resetty(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7850) | BOOL System_flash(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7863) | BOOL System_savetty(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7876) | BOOL System_reset_prog_mode(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo*...
  function BOOL (line 7889) | BOOL System_reset_shell_mode(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo...
  function BOOL (line 7903) | BOOL System_wclrtoeol(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7921) | BOOL System_getsyx(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7936) | BOOL System_setsyx(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7951) | BOOL System_curs_set(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 7972) | BOOL System_napms(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8000) | BOOL System_addch(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8018) | BOOL System_addstr(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8040) | BOOL System_start_color(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8054) | BOOL System_init_pair(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8077) | BOOL System_border(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8110) | BOOL System_wborder(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8145) | BOOL System_beep(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8159) | BOOL System_def_prog_mode(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 8173) | BOOL System_def_shell_mode(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* ...
  function BOOL (line 8189) | BOOL System_attron(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8207) | BOOL System_attroff(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8225) | BOOL System_attrset(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8243) | BOOL System_echo(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8256) | BOOL System_noecho(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8269) | BOOL System_cbreak(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8282) | BOOL System_nocbreak(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8295) | BOOL System_raw(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8308) | BOOL System_noraw(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8321) | BOOL System_nodelay(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8341) | BOOL System_getch(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8357) | BOOL System_newwin(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8384) | BOOL System_delwin(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8402) | BOOL System_mvwin(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8424) | BOOL System_wrefresh(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8442) | BOOL System_wclear(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8460) | BOOL System_touchwin(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8478) | BOOL System_keypad(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8498) | BOOL System_wmove(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8520) | BOOL System_wprintw(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8547) | BOOL System_getmaxx(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8558) | BOOL System_getmaxy(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8569) | BOOL System_setEscapeDelay(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* ...
  function BOOL (line 8587) | BOOL System_getEscapeDelay(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* ...
  function BOOL (line 8595) | BOOL System_isalpha(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8611) | BOOL System_isalnum(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8627) | BOOL System_iscntrl(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8643) | BOOL System_isdigit(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8659) | BOOL System_isgraph(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8675) | BOOL System_islower(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8691) | BOOL System_isprint(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8707) | BOOL System_ispunct(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8723) | BOOL System_isspace(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8739) | BOOL System_isupper(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8755) | BOOL System_isxdigit(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8771) | BOOL System_isascii(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8787) | BOOL System_isblank(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8803) | BOOL System_send(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8845) | BOOL System_sendto(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8906) | BOOL System_sendto2(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 8965) | BOOL System_recv(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9007) | BOOL System_recvfrom(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9068) | BOOL System_recvfrom2(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9127) | BOOL System_can_change_color(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo...
  function BOOL (line 9137) | BOOL System_has_colors(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9147) | BOOL System_init_color(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9170) | BOOL System_color_content(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* i...
  function BOOL (line 9193) | BOOL System_pair_content(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9223) | BOOL System_COLOR_PAIR(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9238) | BOOL System_PAIR_NUMBER(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9253) | BOOL System_attr_get(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9274) | BOOL System_wattr_get(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9297) | BOOL System_attr_set(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9318) | BOOL System_wattr_set(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9341) | BOOL System_attr_off(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9359) | BOOL System_wattr_off(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9379) | BOOL System_attr_on(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9399) | BOOL System_wattr_on(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9419) | BOOL System_wattroff(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9437) | BOOL System_wattron(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9456) | BOOL System_wattrset(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9475) | BOOL System_chgat(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9499) | BOOL System_wchgat(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9525) | BOOL System_mvchgat(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9553) | BOOL System_mvwchgat(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9583) | BOOL System_color_set(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9601) | BOOL System_wcolor_set(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9621) | BOOL System_standend(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9633) | BOOL System_wstandend(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9650) | BOOL System_standout(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9662) | BOOL System_wstandout(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9679) | BOOL System_bkgdset(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9692) | BOOL System_wbkgdset(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9707) | BOOL System_bkgd(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9726) | BOOL System_wbkgd(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9746) | BOOL System_getbkgd(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9762) | BOOL System_wgetch(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9780) | BOOL System_mvgetch(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9800) | BOOL System_mvwgetch(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9822) | BOOL System_ungetch(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9840) | BOOL System_has_key(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9856) | BOOL System_delay_output(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9874) | BOOL System_keyname(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9895) | BOOL System_unctrl(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9916) | BOOL System_filter(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9924) | BOOL System_nofilter(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9932) | BOOL System_delch(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9945) | BOOL System_wdelch(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9963) | BOOL System_mvdelch(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 9983) | BOOL System_mvwdelch(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 10005) | BOOL System_meta(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)

FILE: src/class_thread.c
  function pid_t (line 17) | pid_t gettid()
  function thread_init (line 22) | void thread_init()
  function thread_final (line 34) | void thread_final()
  function vm_mutex_on (line 44) | void vm_mutex_on()
  function vm_mutex_off (line 52) | void vm_mutex_off()
  function new_vm_mutex (line 60) | void new_vm_mutex()
  type sThreadFuncArg (line 64) | struct sThreadFuncArg {
  type sThreadFuncArg (line 80) | struct sThreadFuncArg
  function BOOL (line 192) | BOOL Thread_initialize_thread(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInf...
  function BOOL (line 248) | BOOL Thread_pthread_join(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInfo* info)
  function BOOL (line 278) | BOOL pthread_mutex_t_allocSize(CLVALUE** stack_ptr, CLVALUE* lvar, sVMIn...
  function BOOL (line 292) | BOOL pthread_cond_t_allocSize(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInf...

FILE: src/clover2-buffer.h
  type sBufStruct (line 7) | struct sBufStruct {
  type sBuf (line 13) | typedef struct sBufStruct sBuf;

FILE: src/clover_to_clang.c
  function ALLOC (line 4) | ALLOC wchar_t* string_object_to_wchar_array(CLObject string_object)
  function ALLOC (line 23) | ALLOC char* string_object_to_char_array(CLObject string_object)
  function NULLABLE (line 38) | NULLABLE CLVALUE* get_element_from_array(CLObject array, int index)
  function NULLABLE (line 51) | NULLABLE CLVALUE* get_element_from_Array(CLObject array, int index)
  function get_element_number_from_Array (line 62) | int get_element_number_from_Array(CLObject array)
  function get_value_from_Byte (line 75) | char get_value_from_Byte(CLObject object)
  function get_value_from_UByte (line 82) | unsigned char get_value_from_UByte(CLObject object)
  function get_value_from_Short (line 90) | short get_value_from_Short(CLObject object)
  function get_value_from_UShort (line 98) | unsigned short get_value_from_UShort(CLObject object)
  function get_value_from_Integer (line 106) | int get_value_from_Integer(CLObject object)
  function get_value_from_UInteger (line 114) | unsigned int get_value_from_UInteger(CLObject object)
  function clint64 (line 122) | clint64 get_value_from_Long(CLObject object)
  function get_value_from_ULong (line 130) | unsigned clint64 get_value_from_ULong(CLObject object)
  function wchar_t (line 138) | wchar_t get_value_from_Char(CLObject object)
  function get_value_from_Float (line 146) | float get_value_from_Float(CLObject object)
  function get_value_from_Double (line 154) | double get_value_from_Double(CLObject object)
  function BOOL (line 162) | BOOL get_value_from_Bool(CLObject object)
  function sCLClass (line 178) | sCLClass* get_class_from_object(CLObject object)
  function get_size_from_buffer_object (line 194) | size_t get_size_from_buffer_object(CLObject buffer)
  function ALLOC (line 202) | ALLOC CLObject* list_to_array(CLObject list, int* num_elements)
  function clover_termios_to_c_termios (line 225) | void clover_termios_to_c_termios(CLObject terminfo_object, struct termio...
  function c_termios_to_clover_termios (line 244) | void c_termios_to_clover_termios(struct termios* terminfo_value, CLObjec...
  function BOOL (line 263) | BOOL create_termios_object(CLObject* result, CLVALUE** stack_ptr, CLVALU...

FILE: src/code.c
  function sByteCode_init (line 5) | void sByteCode_init(sByteCode* code)
  function sByteCode_init_with_size (line 12) | void sByteCode_init_with_size(sByteCode* code, int size)
  function sByteCode_free (line 19) | void sByteCode_free(sByteCode* code)
  function sByteCode_clone (line 24) | void sByteCode_clone(sByteCode* self, sByteCode* code)
  function arrange_alignment (line 40) | static void arrange_alignment(sByteCode* code)
  function append_value_to_code (line 45) | void append_value_to_code(sByteCode* code, void* data, size_t size, BOOL...
  function append_opecode_to_code (line 66) | void append_opecode_to_code(sByteCode* code, unsigned int op, BOOL no_ou...
  function append_int_value_to_code (line 71) | void append_int_value_to_code(sByteCode* code, int value, BOOL no_output)
  function append_float_value_to_code (line 76) | void append_float_value_to_code(sByteCode* code, float value, BOOL no_ou...
  function append_long_value_to_code (line 81) | void append_long_value_to_code(sByteCode* code, clint64 value, BOOL no_o...
  function append_double_value_to_code (line 92) | void append_double_value_to_code(sByteCode* code, double value, BOOL no_...

FILE: src/common.h
  type CLObject (line 89) | typedef unsigned int CLObject;
  type CLVALUE (line 110) | typedef union CLVALUEUnion CLVALUE;
  type sByteCodeStruct (line 113) | struct sByteCodeStruct {
  type sByteCode (line 119) | typedef struct sByteCodeStruct sByteCode;
  type sConstStruct (line 133) | struct sConstStruct
  type sConst (line 140) | typedef struct sConstStruct sConst;
  type sCLStackStruct (line 159) | struct sCLStackStruct {
  type sCLStack (line 169) | typedef struct sCLStackStruct sCLStack;
  type sVMInfoStruct (line 178) | struct sVMInfoStruct
  type sVMInfoStruct (line 180) | struct sVMInfoStruct
  type sVMInfoStruct (line 181) | struct sVMInfoStruct
  type sVMInfoStruct (line 182) | struct sVMInfoStruct
  type sVMInfoStruct (line 183) | struct sVMInfoStruct
  type sVMInfoStruct (line 184) | struct sVMInfoStruct
  type sCLTypeStruct (line 200) | struct sCLTypeStruct
  type sCLBlockTypeStruct (line 202) | struct sCLBlockTypeStruct {
  type sCLBlockType (line 209) | typedef struct sCLBlockTypeStruct sCLBlockType;
  type sCLTypeStruct (line 211) | struct sCLTypeStruct {
  type sCLType (line 225) | typedef struct sCLTypeStruct sCLType;
  type sCLParamStruct (line 227) | struct sCLParamStruct {
  type sCLParam (line 235) | typedef struct sCLParamStruct sCLParam;
  type sVMInfoStruct (line 248) | struct sVMInfoStruct {
  type sVMInfo (line 313) | typedef struct sVMInfoStruct sVMInfo;
  type BOOL (line 315) | typedef BOOL (*fNativeMethod)(CLVALUE** stack_ptr, CLVALUE* lvar, sVMInf...
  type sCLMethodStruct (line 317) | struct sCLMethodStruct {
  type sCLMethod (line 347) | typedef struct sCLMethodStruct sCLMethod;
  type sCLFieldStruct (line 355) | struct sCLFieldStruct {
  type sCLBlockObjectStruct (line 374) | struct sCLBlockObjectStruct {
  type sCLBlockObject (line 382) | typedef struct sCLBlockObjectStruct sCLBlockObject;
  type sCLField (line 384) | typedef struct sCLFieldStruct sCLField;
  type sCLClassStruct (line 387) | struct sCLClassStruct {
  type sCLClass (line 451) | typedef struct sCLClassStruct sCLClass;
  type sClassTableStruct (line 485) | struct sClassTableStruct
  type sClassTable (line 495) | typedef struct sClassTableStruct sClassTable;
  type sNodeBlockTypeStruct (line 503) | struct sNodeBlockTypeStruct
  type sNodeTypeStruct (line 505) | struct sNodeTypeStruct {
  type sNodeType (line 518) | typedef struct sNodeTypeStruct sNodeType;
  type sParserInfoStruct (line 531) | struct sParserInfoStruct
  type sParserInfoStruct (line 541) | struct sParserInfoStruct
  type sParserInfoStruct (line 542) | struct sParserInfoStruct
  type sParserInfoStruct (line 543) | struct sParserInfoStruct
  type sCompileInfoStruct (line 553) | struct sCompileInfoStruct
  type sCompileInfoStruct (line 554) | struct sCompileInfoStruct
  type sCompileInfoStruct (line 555) | struct sCompileInfoStruct
  type sNodeBlockTypeStruct (line 561) | struct sNodeBlockTypeStruct {
  type sNodeBlockType (line 570) | typedef struct sNodeBlockTypeStruct sNodeBlockType;
  type sVarStruct (line 580) | struct sVarStruct {
  type sVar (line 590) | typedef struct sVarStruct sVar;
  type sVarTableStruct (line 594) | struct sVarTableStruct {
  type sVarTable (line 605) | typedef struct sVarTableStruct sVarTable;
  type sParserInfoStruct (line 619) | struct sParserInfoStruct
  type sGenericsParamInfoStruct (line 641) | struct sGenericsParamInfoStruct
  type sGenericsParamInfo (line 648) | typedef struct sGenericsParamInfoStruct sGenericsParamInfo;
  type sCompileInfoStruct (line 650) | struct sCompileInfoStruct
  type sParserInfoStruct (line 652) | struct sParserInfoStruct
  type sParserInfo (line 678) | typedef struct sParserInfoStruct sParserInfo;
  type sParserParamStruct (line 682) | struct sParserParamStruct
  type sParserParamStruct (line 683) | struct sParserParamStruct
  type sNodeBlockStruct (line 696) | struct sNodeBlockStruct
  type sNodeBlock (line 710) | typedef struct sNodeBlockStruct sNodeBlock;
  type eNodeType (line 723) | enum eNodeType { kNodeTypeOperand, kNodeTypeByteValue, kNodeTypeCByteVal...
  type eOperand (line 725) | enum eOperand { kOpAdd, kOpSub , kOpComplement, kOpLogicalDenial, kOpMul...
  type sParserParamStruct (line 727) | struct sParserParamStruct
  type sParserParam (line 735) | typedef struct sParserParamStruct sParserParam;
  type sNodeTreeStruct (line 737) | struct sNodeTreeStruct
  type sNodeTree (line 928) | typedef struct sNodeTreeStruct sNodeTree;
  type sCompileInfoStruct (line 930) | struct sCompileInfoStruct
  type sCompileInfo (line 961) | typedef struct sCompileInfoStruct sCompileInfo;
  type eOperand (line 977) | enum eOperand
  type sParserInfoStruct (line 2046) | struct sParserInfoStruct
  type sCLHeapMemStruct (line 2088) | struct sCLHeapMemStruct {
  type sCLHeapMem (line 2096) | typedef struct sCLHeapMemStruct sCLHeapMem;
  type sCLModuleStruct (line 2120) | struct sCLModuleStruct {
  type sCLModule (line 2128) | typedef struct sCLModuleStruct sCLModule;
  type sCLObjectStruct (line 2147) | struct sCLObjectStruct {
  type sCLObject (line 2161) | typedef struct sCLObjectStruct sCLObject;
  type sBlockObjectStruct (line 2181) | struct sBlockObjectStruct
  type sBlockObject (line 2198) | typedef struct sBlockObjectStruct sBlockObject;
  type sRegexObjectStruct (line 2206) | struct sRegexObjectStruct
  type sRegexObject (line 2224) | typedef struct sRegexObjectStruct sRegexObject;
  type termios (line 2654) | struct termios
  type termios (line 2655) | struct termios

FILE: src/compiler.c
  function compiler_init (line 3) | static void compiler_init(BOOL no_load_fudamental_classes)
  function clover2_init (line 20) | static void clover2_init()
  function clover2_final (line 33) | static void clover2_final()
  function compiler_final (line 46) | static void compiler_final()
  function BOOL (line 58) | static BOOL compiler(char* fname, BOOL js)
  function BOOL (line 94) | static BOOL jit_class_compiler(char* class_name)
  function BOOL (line 107) | static BOOL class_compiler(char* fname)
  function main (line 158) | int main(int argc, char** argv)

FILE: src/constant.c
  function sConst_init (line 6) | void sConst_init(sConst* self)
  function sConst_init_with_size (line 13) | void sConst_init_with_size(sConst* self, unsigned int size)
  function sConst_free (line 20) | void sConst_free(sConst* self)
  function sConst_clone (line 25) | void sConst_clone(sConst* self, sConst* constant)
  function arrange_alignment (line 34) | static void arrange_alignment(sConst* self)
  function sConst_append (line 39) | unsigned int sConst_append(sConst* self, void* data, int size, BOOL no_o...
  function append_int_value_to_constant_pool (line 74) | unsigned int append_int_value_to_constant_pool(sConst* constant, int n, ...
  function append_float_value_to_constant_pool (line 79) | unsigned int append_float_value_to_constant_pool(sConst* constant, float...
  function append_double_value_to_constant_pool (line 84) | unsigned int append_double_value_to_constant_pool(sConst* constant, doub...
  function append_str_to_constant_pool (line 89) | unsigned int append_str_to_constant_pool(sConst* constant, char* str, BO...
  function append_wstr_to_constant_pool (line 97) | unsigned int append_wstr_to_constant_pool(sConst* constant, char* str, B...
  function append_str_to_constant_pool_and_code (line 110) | void append_str_to_constant_pool_and_code(sConst* constant, sByteCode* c...
  function append_buffer_to_constant_pool_and_code (line 116) | void append_buffer_to_constant_pool_and_code(sConst* constant, sByteCode...

FILE: src/debug.c
  function ALLOC (line 10) | ALLOC void* xmalloc(size_t size)
  function ALLOC (line 24) | ALLOC char* xstrdup(char* str)
  function ALLOC (line 38) | ALLOC void* xrealloc(void* ptr, size_t size)
  function ALLOC (line 61) | ALLOC void* xcalloc(size_t count, size_t size)
  function xfree (line 75) | void xfree(void* ptr)

FILE: src/exception.c
  function entry_exception_object_with_class_name (line 3) | void entry_exception_object_with_class_name(CLVALUE** stack_ptr, CLVALUE...
  function entry_exception_object_with_class_name2 (line 65) | void entry_exception_object_with_class_name2(CLVALUE** stack_ptr, CLVALU...
  function entry_exception_object (line 119) | void entry_exception_object(CLObject exception, sVMInfo* info)

FILE: src/float.c
  function CLObject (line 3) | CLObject create_float(float value, sVMInfo* info)
  function CLObject (line 15) | CLObject create_double(double value, sVMInfo* info)

FILE: src/get_type.c
  function clover2_init (line 24) | static void clover2_init(BOOL js)
  function clover2_final (line 44) | static void clover2_final()
  function compiler_init (line 58) | static void compiler_init(BOOL no_load_fudamental_classes)
  function compiler_final (line 64) | static void compiler_final()
  function BOOL (line 70) | static BOOL get_type(char* class_name, char* source, char* fname, sVarTa...
  function tyclover_get_type (line 144) | static void tyclover_get_type(char* source_value, char* fname_object_val...
  function tyclover_print_local_variable (line 161) | static void tyclover_print_local_variable(char* source_value, char* fnam...
  function BOOL (line 190) | static BOOL is_shell_mode(char* source, char* fname, sVarTable* lv_table)
  function main (line 235) | int main(int argc, char** argv)

FILE: src/hash.c
  function CLObject (line 3) | CLObject create_hash_object(char* type_name, sVMInfo* info)
  function BOOL (line 12) | BOOL initialize_hash_object(CLObject hash_object, int num_elements, CLOb...

FILE: src/heap.c
  type sHeapPage_ (line 9) | struct sHeapPage_ {
  type sHeapPage (line 14) | typedef struct sHeapPage_ sHeapPage;
  type sHandle_ (line 53) | struct sHandle_ {
  type sHandle (line 63) | typedef struct sHandle_ sHandle;
  type sCLHeapManager_ (line 65) | struct sCLHeapManager_ {
  type sCLHeapManager (line 75) | typedef struct sCLHeapManager_ sCLHeapManager;
  function compaction (line 79) | void compaction()
  function heap_init (line 173) | void heap_init(int heap_size, int size_handles)
  function heap_final (line 204) | void heap_final()
  function sCLHeapMem (line 216) | sCLHeapMem* get_object_pointer(CLObject obj)
  function BOOL (line 226) | BOOL is_valid_object(CLObject obj)
  function free_handle (line 238) | static void free_handle(unsigned int handle_num)
  function call_finalizer (line 275) | static void call_finalizer(unsigned int handle_num)
  function inc_refference_count (line 301) | void inc_refference_count(CLObject obj, CLObject prev_obj, BOOL value_is...
  function dec_refference_count (line 305) | void dec_refference_count(CLObject obj, BOOL value_is_object)
  function free_global_stack_objects (line 309) | void free_global_stack_objects(sVMInfo* info, CLObject result_object, in...
  function mark_object (line 314) | void mark_object(CLObject obj, unsigned char* mark_flg)
  function mark_all_class_fields (line 343) | static void mark_all_class_fields(unsigned char* mark_flg)
  function mark_sighandlers (line 361) | static void mark_sighandlers(unsigned char* mark_flg)
  function mark (line 373) | static void mark(unsigned char* mark_flg)
  function free_objects (line 392) | static void free_objects(unsigned char* mark_flg)
  function free_malloced_memory (line 412) | static void free_malloced_memory()
  function delete_all_object (line 424) | static void delete_all_object()
  function mark_and_store_class_field (line 435) | void mark_and_store_class_field(sCLClass* klass, int field_index, CLVALU...
  function gc (line 452) | void gc(sVMInfo* info)
  function CLObject (line 474) | CLObject alloc_heap_mem(unsigned int size, sCLClass* klass, int array_nu...

FILE: src/integer.c
  function CLObject (line 3) | CLObject create_integer(int value, sVMInfo* info)
  function CLObject (line 16) | CLObject create_uinteger(unsigned int value, sVMInfo* info)

FILE: src/interpreter.c
  function mgetmaxx (line 25) | static int mgetmaxx()
  function mgetmaxy (line 33) | static int mgetmaxy()
  function display_candidates (line 41) | void display_candidates(char** candidates)
  function ALLOC (line 148) | static ALLOC char* cl_type_to_buffer(sCLType* cl_type, sCLClass* klass)
  function ALLOC (line 313) | static ALLOC char* line_buffer_from_head_to_cursor_point()
  function skip_paren (line 328) | static void skip_paren(char** p, char** head, char** comma, char** semi_...
  function skip_curly (line 412) | static void skip_curly(char** p, char** head, char** comma, char** semi_...
  function file_completion (line 627) | static void file_completion(char* line)
  function file_completion_command_line (line 767) | static void file_completion_command_line(char* text)
  function command_completion (line 908) | void command_completion()
  function get_class_names (line 1004) | void get_class_names(char** candidates, int *num_candidates, int max_can...
  function get_global_method_names (line 1018) | void get_global_method_names(char** candidates, int *num_candidates, int...
  function get_system_method_names (line 1063) | void get_system_method_names(char** candidates, int *num_candidates, int...
  function get_system_class_field_names (line 1107) | void get_system_class_field_names(char** candidates, int *num_candidates...
  function BOOL (line 1132) | static BOOL get_type(char* source, char* fname, sVarTable* lv_table, sNo...
  function BOOL (line 1194) | static BOOL is_shell_mode(char* source, char* fname, sVarTable* lv_table)
  function BOOL (line 1227) | static BOOL is_path_object(char* source, char* fname, sVarTable* lv_table)
  function local_variable_completion (line 1260) | static void local_variable_completion(char* exp, char** candidates, int ...
  function shellModeCompletion (line 1297) | void shellModeCompletion(char* line)
  function pathObjectCompletion (line 1405) | void pathObjectCompletion(char* line)
  function methodNameCompletion (line 1411) | void methodNameCompletion(char* line)
  function localVariableCompletion (line 1464) | void localVariableCompletion(char* line)
  function classNameCompletion (line 1486) | void classNameCompletion()
  function commandCompletion (line 1509) | void commandCompletion()
  function globalMethodCompletion (line 1514) | void globalMethodCompletion()
  function systemMethodCompletion (line 1530) | void systemMethodCompletion()
  function topLevelCompletion (line 1546) | void topLevelCompletion(char* line)
  function my_complete_internal (line 1572) | static int my_complete_internal(int count, int key)
  function BOOL (line 1662) | static BOOL name_sort(char* lfname, char* rfname)
  function BOOL (line 1673) | static BOOL quick_sort(int left, int right)
  function sort_candidates (line 1726) | void sort_candidates()
  function BOOL (line 2043) | static BOOL inputing_block_or_paren()
  function my_bind_cr (line 2108) | static int my_bind_cr(int count, int key)
  function my_bind_escape (line 2121) | static int my_bind_escape(int count , int key)
  function sig_int (line 2126) | static void sig_int()
  function set_signal_for_interpreter (line 2137) | static void set_signal_for_interpreter()
  function interpreter_init (line 2165) | static void interpreter_init()
  function interpreter_final (line 2174) | static void interpreter_final()
  function BOOL (line 2183) | static BOOL eval_str(char* source, char* fname, sVarTable* lv_table, CLV...
  function clover2_init (line 2298) | static void clover2_init()
  function clover2_final (line 2313) | static void clover2_final()
  function compiler_init (line 2327) | static void compiler_init(BOOL no_load_fudamental_classes)
  function compiler_final (line 2333) | static void compiler_final()
  function readline_insert_text (line 2352) | static void readline_insert_text(char* cmdline, int cursor_point)
  function readline_init_text (line 2363) | int readline_init_text()
  function main (line 2376) | int main(int argc, char** argv)

FILE: src/js.c
  function BOOL (line 6) | BOOL js_class_compiler(char* sname)
  function BOOL (line 315) | BOOL js_compiler(char* fname)
  function BOOL (line 509) | static BOOL search_for_js_class_file(char* class_name, char* class_file_...
  function load_js_class (line 543) | void load_js_class(char* class_name, sVMInfo* info)
  function load_js_fundamental_classes (line 619) | static void load_js_fundamental_classes(sVMInfo* info)
  function create_js_int_value (line 643) | int create_js_int_value(int value, sVMInfo* info)
  function create_js_null_value (line 651) | int create_js_null_value(sVMInfo* info)
  function create_js_string_value (line 659) | int create_js_string_value(char* value, sVMInfo* info)
  function create_js_value_from_souce (line 667) | int create_js_value_from_souce(char* source, sVMInfo* info)
  function js_err_msg (line 672) | void js_err_msg(sVMInfo* info, const char* msg, ...)
  function js_dec_stack_ptr (line 684) | void js_dec_stack_ptr(int index, sVMInfo* info)
  function print_inst (line 701) | void print_inst(char* str, sVMInfo* info)
  function show_js_stack (line 711) | void show_js_stack(sVMInfo* info)
  function BOOL (line 721) | static BOOL string_expression(char* str, int str_len, sBuf* buf, int* st...
  function BOOL (line 748) | BOOL invoke_js_method(sCLClass* klass, BOOL native, sBuf* native_codes, ...
  function BOOL (line 840) | BOOL js(sByteCode* code, sConst* constant, int var_num, int param_num, s...

FILE: src/klass.c
  function sClassTable (line 13) | static sClassTable* get_class_table(BOOL js)
  function sClassTable (line 23) | static sClassTable** get_head_class_table(BOOL js)
  function get_hash_key (line 33) | unsigned int get_hash_key(char* name, unsigned int max)
  function remove_class (line 45) | static void remove_class(char* class_name, BOOL js)
  function BOOL (line 98) | BOOL put_class_to_table(char* class_name, sCLClass* klass)
  function sCLClass (line 134) | sCLClass* get_class(char* class_name, BOOL js)
  function BOOL (line 165) | BOOL search_for_class_file(char* class_name, char* class_file_name, size...
  function BOOL (line 258) | BOOL read_from_file(char** p, void* buf, size_t size, char* head)
  function BOOL (line 269) | BOOL read_char_from_file(char** p, char* c)
  function BOOL (line 277) | BOOL read_int_from_file(char** p, int* n)
  function BOOL (line 285) | static BOOL read_long_from_file(char** p, clint64* n)
  function BOOL (line 293) | BOOL read_const_from_file(char** p, sConst* constant, char* head)
  function BOOL (line 312) | static BOOL read_cl_block_type_from_file(char** p, sCLBlockType** cl_blo...
  function BOOL (line 335) | static BOOL read_cl_type_from_file(char** p, sCLType** cl_type)
  function BOOL (line 393) | BOOL read_code_from_file(char** p, sByteCode* code, char* head)
  function BOOL (line 411) | static BOOL read_methods_from_file(char** p, sCLMethod** methods, int* n...
  function BOOL (line 579) | static BOOL read_fields_from_file(char** p, sCLField** fields, int* num_...
  function BOOL (line 630) | BOOL read_block_from_file(char** p, sCLBlockObject* block_object, char* ...
  function sCLClass (line 651) | static sCLClass* read_class_from_file(char* class_name, char** p, char* ...
  function BOOL (line 841) | BOOL create_virtual_method_table(sCLClass* klass)
  function sCLMethod (line 882) | sCLMethod* search_for_method_from_virtual_method_table(sCLClass* klass, ...
  function sCLClass (line 916) | sCLClass* get_class_with_load(char* class_name, BOOL js)
  function BOOL (line 927) | static BOOL ready_for_typedef(sCLClass* klass)
  function set_boxing_and_unboxing_class (line 946) | static void set_boxing_and_unboxing_class(char* primitive_class_name, ch...
  function BOOL (line 960) | BOOL read_file(char* fname, sBuf* source)
  function sCLClass (line 994) | sCLClass* load_class_from_class_file(char* class_name, char* class_file_...
  function BOOL (line 1084) | BOOL is_class_file_existance(char* class_name, int version, BOOL js)
  function sCLClass (line 1090) | sCLClass* load_class(char* class_name, int version, BOOL js)
  function sCLClass (line 1108) | sCLClass* alloc_class(char* class_name, BOOL primitive_, int generics_pa...
  function free_class (line 1198) | static void free_class(sCLClass* klass)
  function ALLOC (line 1253) | ALLOC sCLType* create_cl_type(sCLClass* klass, sCLClass* klass2)
  function free_cl_block_type (line 1262) | static void free_cl_block_type(sCLBlockType* block_type)
  function free_cl_type (line 1273) | void free_cl_type(sCLType* cl_type)
  function class_init (line 1285) | void class_init()
  function class_final (line 1415) | void class_final()
  function reset_js_load_class (line 1463) | void reset_js_load_class()
  function BOOL (line 1475) | BOOL is_valid_class(sCLClass* klass)

FILE: src/klass_compile_time.c
  function node_type_to_cl_type (line 4) | static void node_type_to_cl_type(sNodeType* node_type, ALLOC sCLType** c...
  function parser_param_to_cl_param (line 34) | static void parser_param_to_cl_param(sParserParam* param, sCLParam* type...
  function create_method_path (line 41) | static void create_method_path(char* result, int result_size, sCLMethod*...
  function create_method_name_and_params_for_js (line 85) | void create_method_name_and_params_for_js(char* result, int size_result,...
  function create_method_name_and_params (line 121) | void create_method_name_and_params(char* result, int size_result, sCLCla...
  function create_method_name_for_js (line 158) | void create_method_name_for_js(char* result, int size_result, sCLClass* ...
  function set_method_index_to_class (line 163) | void set_method_index_to_class(sCLClass* klass)
  function BOOL (line 273) | BOOL add_method_to_class(sCLClass* klass, char* method_name, sParserPara...
  function add_native_code_to_method (line 396) | void add_native_code_to_method(sCLMethod* method, sBuf* native_code)
  function add_block_object_to_class (line 402) | int add_block_object_to_class(sCLClass* klass, sByteCode codes, sConst c...
  function BOOL (line 426) | BOOL add_typedef_to_class(sCLClass* klass, char* class_name1, char* clas...
  function get_value_from_header (line 454) | static int get_value_from_header(char* header_path, char* field_name)
  function BOOL (line 476) | BOOL add_class_field_to_class(sCLClass* klass, char* name, BOOL private_...
  function add_code_to_method (line 504) | void add_code_to_method(sCLMethod* method, sByteCode* code, int var_num)
  function BOOL (line 510) | BOOL determine_method_generics_types(sNodeType* left_param, sNodeType* r...
  function BOOL (line 556) | static BOOL check_method_params(sCLMethod* method, sCLClass* klass, char...
  function sNodeType (line 595) | static sNodeType* get_method_genercs_from_method(sCLClass* klass, sCLMet...
  function search_for_method (line 612) | int search_for_method(sCLClass* klass, char* method_name, sNodeType** pa...
  function BOOL (line 649) | BOOL search_for_methods_from_method_name(int method_indexes[], int size_...
  function search_for_field (line 676) | int search_for_field(sCLClass* klass, char* field_name)
  function search_for_class_field (line 690) | int search_for_class_field(sCLClass* klass, char* field_name)
  function BOOL (line 704) | BOOL class_method_name_existance(sCLClass* klass, char* method_name)
  function BOOL (line 718) | BOOL none_class_method_name_existance(sCLClass* klass, char* method_name)
  function BOOL (line 732) | BOOL class_field_name_existance(sCLClass* klass, char* field_name)
  function BOOL (line 746) | BOOL field_name_existance(sCLClass* klass, char* field_name)
  function BOOL (line 760) | BOOL is_method_param_name(char* name)
  function BOOL (line 780) | static BOOL check_same_interface_of_two_methods(sCLMethod* method1, sCLC...
  function BOOL (line 831) | BOOL check_implemented_methods_for_interface(sCLClass* left_class, sCLCl...
  function append_const_to_buffer (line 872) | void append_const_to_buffer(sBuf* buf, sConst* constant)
  function append_cl_block_type (line 882) | static void append_cl_block_type(sBuf* buf, sCLBlockType* cl_block_type)
  function append_cl_type_to_buffer (line 893) | static void append_cl_type_to_buffer(sBuf* buf, sCLType* cl_type)
  function append_byte_codes_to_buffer (line 916) | void append_byte_codes_to_buffer(sBuf* buf, sByteCode* code)
  function append_methods_to_buffer (line 924) | static void append_methods_to_buffer(sBuf* buf, sCLMethod* methods, sCLC...
  function append_fields_to_buffer (line 977) | static void append_fields_to_buffer(sBuf* buf, sCLField* fields, int num...
  function append_block_to_buffer (line 995) | void append_block_to_buffer(sBuf* buf, sCLBlockObject* block_object)
  function write_class_to_buffer (line 1004) | static void write_class_to_buffer(sCLClass* klass, sBuf* buf)
  function BOOL (line 1050) | BOOL write_class_to_class_file(sCLClass* klass)
  function BOOL (line 1138) | BOOL write_all_modified_classes()
  function BOOL (line 1173) | BOOL add_field_to_class(sCLClass* klass, char* name, BOOL private_, BOOL...
  function BOOL (line 1199) | static BOOL type_name_to_cl_type(char** p, ALLOC sCLType** cl_type, sCLC...
  function BOOL (line 1311) | BOOL add_field_to_class_with_class_name(sCLClass* klass, char* name, BOO...
  function BOOL (line 1338) | BOOL add_class_field_to_class_with_class_name(sCLClass* klass, char* nam...

FILE: src/list.c
  function CLObject (line 3) | CLObject create_list_object(char* type_name, sVMInfo* info)
  function BOOL (line 12) | BOOL initialize_list_object(CLObject list_object, int num_elements, CLOb...
  function CLObject (line 47) | CLObject create_sortable_list_object(char* type_name, sVMInfo* info)
  function BOOL (line 56) | BOOL initialize_sortable_list_object(CLObject list_object, int num_eleme...
  function CLObject (line 91) | CLObject create_equalable_list_object(char* type_name, sVMInfo* info)
  function BOOL (line 100) | BOOL initialize_equalable_list_object(CLObject list_object, int num_elem...

FILE: src/long.c
  function CLObject (line 3) | CLObject create_long(clint64 value, sVMInfo* info)
  function CLObject (line 15) | CLObject create_ulong(unsigned clint64 value, sVMInfo* info)

FILE: src/main.c
  function clover2_init (line 5) | static void clover2_init(BOOL no_load_fudamental_classes)
  function clover2_final (line 23) | static void clover2_final()
  function set_signal (line 37) | static void set_signal()
  function main (line 58) | int main(int argc, char** argv, char* const * envp)

FILE: src/method_compiler.c
  function BOOL (line 3) | BOOL compile_method(sCLMethod* method, sParserParam* params, int num_par...

FILE: src/module.c
  function module_init (line 10) | void module_init()
  function BOOL (line 15) | static BOOL append_module_to_table(char* name, sCLModule* module)
  function sCLModule (line 50) | sCLModule* create_module(char* module_name, char* sname, int sline)
  function free_module (line 70) | static void free_module(sCLModule* self)
  function remove_module_from_table (line 77) | static void remove_module_from_table(char* module_name)
  function unload_module (line 110) | void unload_module(char* module_name)
  function module_final (line 115) | void module_final()
  function append_character_to_module (line 130) | void append_character_to_module(sCLModule* self, char c)
  function append_str_to_module (line 135) | void append_str_to_module(sCLModule* self, char* str)
  function sCLModule (line 140) | sCLModule* get_module(char* module_name)
  function BOOL (line 189) | static BOOL save_module_to_file(sCLModule* self)
  function BOOL (line 212) | static BOOL search_for_module_file_from_module_name(char* module_file, u...
  function BOOL (line 257) | BOOL load_module_from_file(ALLOC sCLModule** self, char* module_name)
  function write_all_modified_modules (line 362) | void write_all_modified_modules()
  function this_module_is_modified (line 381) | void this_module_is_modified(sCLModule* self)

FILE: src/native_method.c
  type sNativeMethodHashItem (line 5) | struct sNativeMethodHashItem {
  type sNativeMethodHashItem (line 11) | struct sNativeMethodHashItem
  function get_hash_key_for_native_method (line 13) | static unsigned int get_hash_key_for_native_method(char* path)
  function put_fun_to_hash_for_native_method (line 31) | void put_fun_to_hash_for_native_method(char* path, char* fun_name, fNati...
  function fNativeMethod (line 60) | fNativeMethod get_native_method(char* path, char** fun_name)
  type sNativeMethodStruct (line 94) | struct sNativeMethodStruct {
  type sNativeMethod (line 100) | typedef struct sNativeMethodStruct sNativeMethod;
  function native_method_init (line 491) | void native_method_init()
  function native_method_final (line 505) | void native_method_final()

FILE: src/node.c
  function init_nodes (line 8) | void init_nodes()
  function free_nodes (line 19) | void free_nodes()
  function get_var_size (line 117) | int get_var_size(sNodeType* var_type)
  function store_delegated_varialbe (line 170) | void store_delegated_varialbe(sNodeType* left_type, sNodeType* right_typ...
  function BOOL (line 201) | BOOL compile_params_method_default_value(sCLClass* klass, char* method_n...
  function BOOL (line 291) | static BOOL compile_params(sCLClass* klass, char* method_name, int* num_...
  function create_label_name (line 476) | static void create_label_name(char* prefix, char* result, size_t result_...
  function create_label_name2 (line 496) | static void create_label_name2(char* prefix, char* result, size_t result...
  function alloc_node (line 522) | static unsigned int alloc_node()
  function clone_node (line 535) | unsigned int clone_node(unsigned int node)
  function append_class_name_to_constant_pool_and_code (line 619) | void append_class_name_to_constant_pool_and_code(sCompileInfo* info, sCL...
  function append_type_name_to_constant_pool_and_code (line 627) | static void append_type_name_to_constant_pool_and_code(sCompileInfo* inf...
  function append_method_name_and_params_to_constant_pool_and_code (line 638) | static void append_method_name_and_params_to_constant_pool_and_code(sCom...
  function append_js_method_name_and_params_to_constant_pool_and_code (line 648) | static void append_js_method_name_and_params_to_constant_pool_and_code(s...
  function compile_err_msg (line 658) | void compile_err_msg(sCompileInfo* info, const char* msg, ...)
  function arrange_stack (line 672) | void arrange_stack(sCompileInfo* cinfo)
  function err_msg_for_method_not_found (line 694) | static void err_msg_for_method_not_found(sCLClass* klass, char* method_n...
  function sNodeTree_create_operand (line 708) | unsigned int sNodeTree_create_operand(enum eOperand operand, unsigned in...
  function BOOL (line 727) | static BOOL single_operator(sNodeType* type, int byte_operand, int ubyte...
  function BOOL (line 773) | static BOOL binary_operator(sNodeType* left_type, sNodeType* right_type,...
  function BOOL (line 941) | static BOOL binary_operator_for_bool(sNodeType* type, int bool_operand, ...
  function BOOL (line 954) | static BOOL compile_operand(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_and_and (line 1224) | unsigned int sNodeTree_create_and_and(unsigned int left_node, unsigned i...
  function BOOL (line 1242) | static BOOL compile_and_and(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_or_or (line 1420) | unsigned int sNodeTree_create_or_or(unsigned int left_node, unsigned int...
  function BOOL (line 1438) | static BOOL compile_or_or(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_byte_value (line 1620) | unsigned int sNodeTree_create_byte_value(char value, unsigned int left, ...
  function BOOL (line 1640) | static BOOL compile_byte_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_cbyte_value (line 1652) | unsigned int sNodeTree_create_cbyte_value(char value, unsigned int left,...
  function BOOL (line 1672) | static BOOL compile_cbyte_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_float_value (line 1738) | unsigned int sNodeTree_create_float_value(float value, unsigned int left...
  function BOOL (line 1756) | static BOOL compile_float_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_cfloat_value (line 1768) | unsigned int sNodeTree_create_cfloat_value(float value, unsigned int lef...
  function BOOL (line 1786) | static BOOL compile_cfloat_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_double_value (line 1852) | unsigned int sNodeTree_create_double_value(double value, unsigned int le...
  function BOOL (line 1870) | static BOOL compile_double_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_cdouble_value (line 1882) | unsigned int sNodeTree_create_cdouble_value(double value, unsigned int l...
  function BOOL (line 1900) | static BOOL compile_cdouble_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_ubyte_value (line 1966) | unsigned int sNodeTree_create_ubyte_value(unsigned char value, unsigned ...
  function BOOL (line 1986) | static BOOL compile_ubyte_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_cubyte_value (line 1998) | unsigned int sNodeTree_create_cubyte_value(unsigned char value, unsigned...
  function BOOL (line 2018) | static BOOL compile_cubyte_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_short_value (line 2084) | unsigned int sNodeTree_create_short_value(short value, unsigned int left...
  function BOOL (line 2104) | static BOOL compile_short_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_cshort_value (line 2116) | unsigned int sNodeTree_create_cshort_value(short value, unsigned int lef...
  function BOOL (line 2136) | static BOOL compile_cshort_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_ushort_value (line 2202) | unsigned int sNodeTree_create_ushort_value(unsigned short value, unsigne...
  function BOOL (line 2222) | static BOOL compile_ushort_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_cushort_value (line 2234) | unsigned int sNodeTree_create_cushort_value(unsigned short value, unsign...
  function BOOL (line 2254) | static BOOL compile_cushort_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_int_value (line 2320) | unsigned int sNodeTree_create_int_value(int value, unsigned int left, un...
  function BOOL (line 2340) | static BOOL compile_int_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_cint_value (line 2357) | unsigned int sNodeTree_create_cint_value(int value, unsigned int left, u...
  function BOOL (line 2377) | static BOOL compile_cint_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_uint_value (line 2443) | unsigned int sNodeTree_create_uint_value(unsigned int value, unsigned in...
  function BOOL (line 2463) | static BOOL compile_uint_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_cuint_value (line 2475) | unsigned int sNodeTree_create_cuint_value(unsigned int value, unsigned i...
  function BOOL (line 2495) | static BOOL compile_cuint_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_long_value (line 2562) | unsigned int sNodeTree_create_long_value(clint64 value, unsigned int lef...
  function BOOL (line 2582) | static BOOL compile_long_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_clong_value (line 2594) | unsigned int sNodeTree_create_clong_value(clint64 value, unsigned int le...
  function BOOL (line 2614) | static BOOL compile_clong_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_ulong_value (line 2680) | unsigned int sNodeTree_create_ulong_value(unsigned clint64 value, unsign...
  function BOOL (line 2700) | static BOOL compile_ulong_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_culong_value (line 2712) | unsigned int sNodeTree_create_culong_value(unsigned clint64 value, unsig...
  function BOOL (line 2732) | static BOOL compile_culong_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_store_variable (line 2799) | unsigned int sNodeTree_create_store_variable(char* var_name, sNodeType* ...
  function BOOL (line 2820) | static BOOL compile_store_variable(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_load_variable (line 2898) | unsigned int sNodeTree_create_load_variable(char* var_name, sParserInfo*...
  function BOOL (line 2918) | static BOOL compile_load_variable(unsigned int node, sCompileInfo* info)
  function sNodeTree_if_expression (line 2999) | unsigned int sNodeTree_if_expression(unsigned int expression_node, MANAG...
  function BOOL (line 3027) | static BOOL compile_if_expression(unsigned int node, sCompileInfo* info)
  function sNodeTree_when_expression (line 3453) | unsigned int sNodeTree_when_expression(unsigned int expression_node, uns...
  function BOOL (line 3491) | static BOOL compile_when_expression(unsigned int node, sCompileInfo* info)
  function sNodeTree_while_expression (line 4801) | unsigned int sNodeTree_while_expression(unsigned int expression_node, MA...
  function BOOL (line 4822) | static BOOL compile_while_expression(unsigned int node, sCompileInfo* info)
  function sNodeTree_for_expression (line 4974) | unsigned int sNodeTree_for_expression(unsigned int expression_node1, uns...
  function BOOL (line 4997) | static BOOL compile_for_expression(unsigned int node, sCompileInfo* info)
  function sNodeTree_break_expression (line 5190) | unsigned int sNodeTree_break_expression(sParserInfo* info)
  function BOOL (line 5208) | static BOOL compile_break_expression(unsigned int node, sCompileInfo* info)
  function sNodeTree_true_expression (line 5338) | unsigned int sNodeTree_true_expression(sParserInfo* info)
  function BOOL (line 5356) | static BOOL compile_true_expression(unsigned int node, sCompileInfo* info)
  function sNodeTree_false_expression (line 5367) | unsigned int sNodeTree_false_expression(sParserInfo* info)
  function BOOL (line 5385) | static BOOL compile_false_expression(unsigned int node, sCompileInfo* info)
  function sNodeTree_null_expression (line 5396) | unsigned int sNodeTree_null_expression(sParserInfo* info)
  function BOOL (line 5414) | static BOOL compile_null_expression(unsigned int node, sCompileInfo* info)
  function sNodeTree_wildcard_expression (line 5424) | unsigned int sNodeTree_wildcard_expression(sParserInfo* info)
  function BOOL (line 5442) | static BOOL compile_wildcard_expression(unsigned int node, sCompileInfo*...
  function sNodeTree_create_class_method_call (line 5461) | unsigned int sNodeTree_create_class_method_call(sNodeType* klass, char* ...
  function sNodeType (line 5488) | static sNodeType* get_generics_type_of_inner_class(sParserInfo* pinfo)
  function sNodeType (line 5506) | static sNodeType* get_methocs_generics_type(sParserInfo* info)
  function BOOL (line 5525) | static BOOL compile_class_method_call(unsigned int node, sCompileInfo* i...
  function sNodeTree_create_method_call (line 5667) | unsigned int sNodeTree_create_method_call(unsigned int object_node, char...
  type sCastMethods (line 5694) | struct sCastMethods {
  type sCastMethods (line 5699) | struct sCastMethods
  function BOOL (line 5716) | static BOOL call_normal_method(unsigned int node, sCompileInfo* info, sN...
  function boxing_before_method_call (line 6289) | void boxing_before_method_call(char* method_name, sCompileInfo* info, BO...
  function BOOL (line 6323) | static BOOL compile_method_call(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_new_operator (line 6590) | unsigned int sNodeTree_create_new_operator(sNodeType* node_type, unsigne...
  function BOOL (line 6614) | static BOOL compile_new_operator(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_return_expression (line 6937) | unsigned int sNodeTree_create_return_expression(unsigned int expression_...
  function BOOL (line 6955) | static BOOL compile_return_expression(unsigned int node, sCompileInfo* i...
  function sNodeTree_create_throw_expression (line 7077) | unsigned int sNodeTree_create_throw_expression(unsigned int expression_n...
  function BOOL (line 7095) | static BOOL compile_throw_expression(unsigned int node, sCompileInfo* info)
  function sNodeTree_try_expression (line 7143) | unsigned int sNodeTree_try_expression(MANAGED sNodeBlock* try_node_block...
  function BOOL (line 7165) | static BOOL compile_try_expression(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_fields (line 7242) | unsigned int sNodeTree_create_fields(char* name, unsigned int left_node,...
  function BOOL (line 7262) | static BOOL compile_load_field(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_assign_field (line 7514) | unsigned int sNodeTree_create_assign_field(char* var_name, unsigned int ...
  function BOOL (line 7534) | static BOOL compile_store_field(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_class_fields (line 7664) | unsigned int sNodeTree_create_class_fields(sCLClass* klass, char* name, ...
  function BOOL (line 7685) | static BOOL compile_load_class_field(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_assign_class_field (line 7729) | unsigned int sNodeTree_create_assign_class_field(sCLClass* klass, char* ...
  function BOOL (line 7750) | static BOOL compile_store_class_field(unsigned int node, sCompileInfo* i...
  function sNodeTree_create_store_value_to_pointer (line 7840) | unsigned int sNodeTree_create_store_value_to_pointer(unsigned int left_n...
  function BOOL (line 7858) | BOOL compile_store_value_to_pointer(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_load_value_from_pointer (line 7970) | unsigned int sNodeTree_create_load_value_from_pointer(unsigned int left_...
  function BOOL (line 7988) | BOOL compile_load_value_from_pointer(unsigned int node, sCompileInfo* info)
  function increment_operand_core (line 8068) | static void increment_operand_core(unsigned int node, sCompileInfo* info...
  function BOOL (line 8131) | static BOOL increment_operand_core_for_field(unsigned int node, sCompile...
  function BOOL (line 8224) | static BOOL increment_operand_core_for_class_field(unsigned int node, sC...
  function decrement_operand_core (line 8293) | static void decrement_operand_core(unsigned int node, sCompileInfo* info...
  function BOOL (line 8356) | static BOOL decrement_operand_core_for_field(unsigned int node, sCompile...
  function BOOL (line 8449) | static BOOL decrement_operand_core_for_class_field(unsigned int node, sC...
  function BOOL (line 8518) | BOOL sNodeTree_create_monadic_increment_operand(unsigned int right_node,...
  function BOOL (line 8536) | static BOOL compile_monadic_increment_operand(unsigned int node, sCompil...
  function BOOL (line 8751) | BOOL sNodeTree_create_monadic_decrement_operand(unsigned int right_node,...
  function BOOL (line 8769) | static BOOL compile_monadic_decrement_operand(unsigned int node, sCompil...
  function sNodeTree_create_load_array_element (line 8983) | unsigned int sNodeTree_create_load_array_element(unsigned int array, uns...
  function BOOL (line 9001) | static BOOL is_able_to_get_element_type(sNodeType* node_type)
  function BOOL (line 9006) | BOOL compile_load_array_element(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_store_array_element (line 9179) | unsigned int sNodeTree_create_store_array_element(unsigned int array, un...
  function BOOL (line 9197) | BOOL compile_store_array_element(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_character_value (line 9435) | unsigned int sNodeTree_create_character_value(wchar_t c, sParserInfo* info)
  function BOOL (line 9455) | BOOL compile_char_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_string_value (line 9469) | unsigned int sNodeTree_create_string_value(MANAGED char* value, sNodeBlo...
  function BOOL (line 9495) | BOOL compile_string_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_buffer_value (line 9584) | unsigned int sNodeTree_create_buffer_value(MANAGED char* value, int len,...
  function BOOL (line 9611) | BOOL compile_buffer_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_path_value (line 9712) | unsigned int sNodeTree_create_path_value(MANAGED char* value, int len, s...
  function BOOL (line 9739) | BOOL compile_path_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_c_string_value (line 9838) | unsigned int sNodeTree_create_c_string_value(MANAGED char* value, int le...
  function BOOL (line 9858) | BOOL compile_c_string_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_get_address (line 9872) | unsigned int sNodeTree_create_get_address(unsigned int rnode, sParserInf...
  function BOOL (line 9890) | BOOL compile_get_address(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_array_value (line 9994) | unsigned int sNodeTree_create_array_value(int num_elements, unsigned int...
  function BOOL (line 10015) | BOOL compile_array_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_carray_value (line 10065) | unsigned int sNodeTree_create_carray_value(int num_elements, unsigned in...
  function BOOL (line 10086) | static BOOL compile_carray_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_equalable_carray_value (line 10151) | unsigned int sNodeTree_create_equalable_carray_value(int num_elements, u...
  function BOOL (line 10172) | static BOOL compile_equalable_carray_value(unsigned int node, sCompileIn...
  function sNodeTree_create_sortable_carray_value (line 10244) | unsigned int sNodeTree_create_sortable_carray_value(int num_elements, un...
  function BOOL (line 10265) | static BOOL compile_sortable_carray_value(unsigned int node, sCompileInf...
  function sNodeTree_create_hash_value (line 10337) | unsigned int sNodeTree_create_hash_value(int num_elements, unsigned int ...
  function sNodeTree_create_list_value (line 10359) | unsigned int sNodeTree_create_list_value(int num_elements, unsigned int ...
  function BOOL (line 10380) | BOOL compile_list_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_equalable_list_value (line 10439) | unsigned int sNodeTree_create_equalable_list_value(int num_elements, uns...
  function BOOL (line 10460) | BOOL compile_equalable_list_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_sortable_list_value (line 10525) | unsigned int sNodeTree_create_sortable_list_value(int num_elements, unsi...
  function BOOL (line 10546) | BOOL compile_sortable_list_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_tuple_value (line 10611) | unsigned int sNodeTree_create_tuple_value(int num_elements, unsigned int...
  function BOOL (line 10632) | static BOOL compile_tuple_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_multiple_asignment (line 10690) | unsigned int sNodeTree_create_multiple_asignment(int num_elements, unsig...
  function BOOL (line 10711) | static BOOL compile_multiple_asignment(unsigned int node, sCompileInfo* ...
  function BOOL (line 11023) | BOOL compile_hash_value(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_block_object (line 11127) | unsigned int sNodeTree_create_block_object(sParserParam* params, int num...
  function BOOL (line 11160) | BOOL compile_block_object(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_function (line 11314) | unsigned int sNodeTree_create_function(char* fun_name, sParserParam* par...
  function BOOL (line 11345) | BOOL compile_function(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_normal_block (line 11742) | unsigned int sNodeTree_create_normal_block(MANAGED sNodeBlock* node_bloc...
  function BOOL (line 11762) | static BOOL compile_normal_block(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_block_call (line 11775) | unsigned int sNodeTree_create_block_call(unsigned int block, char* block...
  function BOOL (line 11801) | BOOL compile_block_call(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_regex (line 11904) | unsigned int sNodeTree_create_regex(MANAGED char* regex_str, BOOL global...
  function BOOL (line 11938) | static BOOL compile_regex(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_implements (line 12053) | unsigned int sNodeTree_create_implements(unsigned int lnode, char* inter...
  function BOOL (line 12073) | static BOOL compile_implements(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_inherit_call (line 12117) | unsigned int sNodeTree_create_inherit_call(int num_params, unsigned int ...
  function BOOL (line 12144) | static BOOL compile_inherit_call(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_range (line 12240) | unsigned int sNodeTree_create_range(unsigned int head, unsigned int tail...
  function BOOL (line 12258) | static BOOL compile_range(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_js_array (line 12389) | unsigned int sNodeTree_create_js_array(int num_elements, unsigned int li...
  function BOOL (line 12410) | BOOL compile_js_array(unsigned int node, sCompileInfo* info)
  function sNodeTree_create_require (line 12473) | unsigned int sNodeTree_create_require(char* class_name, char* file_name,...
  function BOOL (line 12494) | BOOL compile_require(unsigned int node, sCompileInfo* info)
  function show_node (line 12507) | void show_node(unsigned int node)
  function BOOL (line 12827) | BOOL compile(unsigned int node, sCompileInfo* info)
  function BOOL (line 13297) | BOOL check_node_is_variable(unsigned int node)
  function create_type_name_from_node_type (line 13302) | void create_type_name_from_node_type(char* type_name, int type_name_max,...

FILE: src/node_block.c
  function sNodeBlock (line 3) | sNodeBlock* sNodeBlock_alloc(BOOL clone)
  function sNodeBlock_free (line 24) | void sNodeBlock_free(sNodeBlock* block)
  function sNodeBlock (line 31) | sNodeBlock* sNodeBlock_clone(sNodeBlock* block)
  function append_node_to_node_block (line 56) | void append_node_to_node_block(sNodeBlock* node_block, unsigned int node)
  function BOOL (line 70) | BOOL parse_block(ALLOC sNodeBlock** node_block, sParserInfo* info, sVarT...
  function make_block_for_for_expresssion (line 190) | void make_block_for_for_expresssion(ALLOC sNodeBlock** node_block, sPars...
  function BOOL (line 198) | BOOL create_null_block(ALLOC sNodeBlock** node_block, sParserInfo* info,...
  function BOOL (line 224) | BOOL parse_question_operator_block(unsigned int object_node, int num_met...
  function BOOL (line 272) | BOOL compile_block(sNodeBlock* block, sCompileInfo* info, sNodeType* res...
  function BOOL (line 335) | BOOL compile_block_with_result(sNodeBlock* block, sCompileInfo* info)

FILE: src/node_block_type.c
  function init_node_block_types (line 10) | void init_node_block_types()
  function free_node_block_types (line 28) | void free_node_block_types()
  function sNodeBlockType (line 43) | sNodeBlockType* alloc_node_block_type()
  function ALLOC (line 68) | ALLOC sNodeBlockType* clone_node_block_type(sNodeBlockType* block)
  function BOOL (line 86) | BOOL substitution_posibility_for_node_block_type(sNodeBlockType* left_bl...

FILE: src/node_type.c
  function init_node_types (line 10) | void init_node_types()
  function free_node_types (line 28) | void free_node_types()
  function sNodeType (line 43) | sNodeType* alloc_node_type()
  function sNodeType (line 68) | sNodeType* clone_node_type(sNodeType* node_type)
  function sNodeType (line 95) | sNodeType* create_node_type_with_class_pointer(sCLClass* klass)
  function skip_spaces_for_parse_class_name (line 109) | static void skip_spaces_for_parse_class_name(char** p)
  function sNodeType (line 116) | static sNodeType* parse_class_name(char** p, char** p2, char* buf, BOOL js)
  function sNodeType (line 213) | sNodeType* create_node_type_with_class_name(char* class_name, BOOL js)
  function sNodeType (line 223) | sNodeType* create_node_type_with_generics_number(int generics_num, BOOL js)
  function sNodeType (line 232) | sNodeType* create_node_type_with_method_generics_number(int generics_num...
  function sNodeType (line 241) | sNodeType* create_node_type_from_cl_type(sCLType* cl_type, sCLClass* klass)
  function BOOL (line 280) | BOOL is_delegated_class(sNodeType* left_type, sNodeType* right_type)
  function BOOL (line 298) | BOOL substitution_posibility(sNodeType* left, sNodeType* right, sNodeTyp...
  function BOOL (line 457) | BOOL substitution_posibility_with_class_name(sNodeType* left, char* righ...
  function BOOL (line 462) | static BOOL is_numeric_type(sNodeType* type_)
  function BOOL (line 467) | BOOL no_cast_types_for_binary_operator(sNodeType* left_type, sNodeType* ...
  function BOOL (line 473) | static BOOL is_numeric_type_without_float(sNodeType* type_)
  function BOOL (line 478) | BOOL operand_posibility(sNodeType* left, sNodeType* right, char* op_string)
  function BOOL (line 505) | BOOL operand_posibility_with_class_name(sNodeType* left, char* right_cla...
  function BOOL (line 510) | BOOL type_identify(sNodeType* left, sNodeType* right)
  function BOOL (line 515) | BOOL type_identify_with_class_name(sNodeType* left, char* right_class_name)
  function BOOL (line 526) | BOOL class_identify_with_class_name(sCLClass* klass, char* class_name)
  function solve_self_for_node_type (line 536) | static void solve_self_for_node_type(sNodeType* node_type, ALLOC sNodeTy...
  function BOOL (line 562) | BOOL solve_generics_types_for_node_type(sNodeType* node_type, ALLOC sNod...
  function sNodeType (line 650) | sNodeType* create_generics_types_from_generics_params(sCLClass* klass)
  function solve_generics_for_variable_to_class (line 671) | void solve_generics_for_variable_to_class(sCLClass* klass, sCLClass** re...
  function solve_method_generics_for_variable_to_class (line 685) | void solve_method_generics_for_variable_to_class(sCLClass* klass, sCLCla...
  function solve_generics_for_variable (line 697) | void solve_generics_for_variable(sNodeType* generics_type, sNodeType** g...
  function BOOL (line 735) | BOOL is_exception_type(sNodeType* exception_type)
  function print_node_type (line 740) | void print_node_type(sNodeType* node_type)
  function BOOL (line 781) | BOOL cast_posibility(sNodeType* left_type, sNodeType* right_type)
  function BOOL (line 818) | BOOL boxing_posibility(sNodeType* left_type, sNodeType* right_type)
  function BOOL (line 837) | BOOL unboxing_posibility(sNodeType* left_type, sNodeType* right_type)
  function BOOL (line 851) | BOOL unboxig_posibility(sCLClass* klass)
  function boxing_to_lapper_type (line 856) | void boxing_to_lapper_type(sNodeType** type_)
  function boxing_to_lapper_class (line 863) | void boxing_to_lapper_class(sNodeType** type_, struct sCompileInfoStruct...
  function BOOL (line 886) | BOOL unboxing_to_primitive_type(sNodeType** left_type, struct sCompileIn...
  function make_boxing_type (line 895) | void make_boxing_type(sNodeType* type, sNodeType** result)

FILE: src/object.c
  function object_mark_fun (line 3) | void object_mark_fun(CLObject self, unsigned char* mark_flg)
  function BOOL (line 14) | BOOL free_object(CLObject self)
  function object_size (line 44) | static unsigned long long object_size(sCLClass* klass)
  function object_size2 (line 75) | static unsigned long long object_size2(int alloc_size)
  function CLObject (line 86) | CLObject create_object(sCLClass* klass, char* type, sVMInfo* info)
  function CLObject (line 108) | CLObject create_object2(sCLClass* klass, char* type, int alloc_size, sVM...
  function BOOL (line 128) | static BOOL check_same_interface_of_two_methods(sCLMethod* method1, sCLC...
  function BOOL (line 173) | static BOOL check_implemented_methods_for_interface_on_runtime(sCLClass*...
  function BOOL (line 200) | BOOL object_implements_interface(CLObject object, sCLClass* interface)

FILE: src/parser.c
  function parser_init (line 24) | void parser_init()
  function parser_final (line 137) | void parser_final()
  function BOOL (line 146) | static BOOL is_command_name(char* name)
  function parser_err_msg (line 158) | void parser_err_msg(sParserInfo* info, const char* msg, ...)
  function skip_spaces_and_lf (line 179) | void skip_spaces_and_lf(sParserInfo* info)
  function skip_spaces (line 186) | void skip_spaces(sParserInfo* info)
  function BOOL (line 194) | BOOL parse_word(char* buf, int buf_size, sParserInfo* info, BOOL print_o...
  function expect_next_character_with_one_forward (line 266) | void expect_next_character_with_one_forward(char* characters, sParserInf...
  function BOOL (line 291) | BOOL expect_next_character(char* characters, sParserInfo* info)
  function BOOL (line 346) | BOOL parse_simple_lambda_params(unsigned int* node, sParserInfo* info, B...
  function BOOL (line 411) | BOOL parse_method_params(int* num_params, unsigned int* params, sParserI...
  function BOOL (line 503) | static BOOL parse_command_param(sBuf* param, BOOL* quoted_string, sParse...
  function BOOL (line 587) | static BOOL parse_command_method_params(int* num_params, unsigned int* p...
  function BOOL (line 684) | static BOOL get_number(BOOL minus, unsigned int* node, sParserInfo* info)
  function BOOL (line 866) | static BOOL get_hex_number(unsigned int* node, sParserInfo* info)
  function BOOL (line 992) | static BOOL get_oct_number(unsigned int* node, sParserInfo* info)
  function BOOL (line 1115) | static BOOL if_expression(unsigned int* node, sParserInfo* info)
  function BOOL (line 1245) | static BOOL while_expression(unsigned int* node, sParserInfo* info)
  function BOOL (line 1286) | static BOOL for_expression(unsigned int* node, sParserInfo* info)
  function BOOL (line 1385) | static BOOL for_in_expression(unsigned int* node, sParserInfo* info)
  function BOOL (line 1479) | static BOOL when_expression(unsigned int* node, sParserInfo* info)
  function BOOL (line 1744) | static BOOL return_expression(unsigned int* node, sParserInfo* info)
  function BOOL (line 1773) | static BOOL new_expression(unsigned int* node, sParserInfo* info)
  function BOOL (line 1795) | static BOOL new_expression_for_js_value(unsigned int* node, unsigned int...
  function BOOL (line 1805) | static BOOL throw_expression(unsigned int* node, sParserInfo* info)
  function BOOL (line 1818) | static BOOL expect_next_word(char* word, sParserInfo* info)
  function BOOL (line 1834) | static BOOL parse_param(sParserParam* param, sParserInfo* info)
  function BOOL (line 1877) | BOOL parse_params(sParserParam* params, int* num_params, sParserInfo* in...
  function BOOL (line 1928) | BOOL parse_params_and_entry_to_lvtable(struct sParserParamStruct* params...
  function BOOL (line 1948) | static BOOL try_expression(unsigned int* node, sParserInfo* info)
  function BOOL (line 2014) | BOOL parse_class_type(sCLClass** klass, sParserInfo* info)
  function BOOL (line 2037) | BOOL parse_type(sNodeType** result_type, sParserInfo* info)
  function BOOL (line 2298) | BOOL parse_type_for_new(sNodeType** result_type, unsigned int* array_num...
  function BOOL (line 2505) | static BOOL is_assign_operator(sParserInfo* info)
  function BOOL (line 2521) | static BOOL assign_operator(unsigned int* node, sParserInfo* info, BOOL*...
  function after_assign_operator (line 2710) | void after_assign_operator(unsigned int* node, sParserInfo* info, BOOL p...
  function BOOL (line 2724) | static BOOL postposition_operator(unsigned int* node, sParserInfo* info,...
  function BOOL (line 3019) | BOOL parse_block_object(unsigned int* node, sParserInfo* info, BOOL lambda)
  function BOOL (line 3066) | static BOOL parse_var(unsigned int* node, sParserInfo* info, BOOL readonly)
  function BOOL (line 3129) | static BOOL parse_function(unsigned int* node, sParserInfo* info, BOOL l...
  function BOOL (line 3181) | static BOOL parse_normal_block(unsigned int* node, sParserInfo* info)
  function BOOL (line 3193) | static BOOL parse_js_array_value_or_hash_value(unsigned int* node, sPars...
  function BOOL (line 3295) | static BOOL parse_array_value_or_hash_value(unsigned int* node, sParserI...
  function BOOL (line 3388) | static BOOL parse_carray_value(unsigned int* node, sParserInfo* info, ch...
  function BOOL (line 3429) | static BOOL parse_equalable_carray_value(unsigned int* node, sParserInfo...
  function BOOL (line 3470) | static BOOL parse_sortable_carray_value(unsigned int* node, sParserInfo*...
  function BOOL (line 3511) | static BOOL parse_hash_value(unsigned int* node, sParserInfo* info, char...
  function BOOL (line 3561) | static BOOL parse_list_value(unsigned int* node, sParserInfo* info, char...
  function BOOL (line 3602) | static BOOL parse_equalable_list_value(unsigned int* node, sParserInfo* ...
  function BOOL (line 3643) | static BOOL parse_sortable_list_value(unsigned int* node, sParserInfo* i...
  function BOOL (line 3684) | static BOOL parse_js_array(unsigned int* node, sParserInfo* info, char t...
  function BOOL (line 3726) | static BOOL parse_tuple_value(unsigned int* node, sParserInfo* info, cha...
  function BOOL (line 3767) | BOOL parse_iniherit(unsigned int* node, sParserInfo* info)
  function BOOL (line 3781) | BOOL parse_unset(unsigned int* node, sParserInfo* info)
  function BOOL (line 3803) | static BOOL parse_string_expression(sNodeBlock** string_expressions, int...
  function BOOL (line 3823) | static BOOL remove_indent_for_multi_line_string(sBuf* value, int indent,...
  function BOOL (line 3847) | static BOOL parse_regex(unsigned int* node, sParserInfo* info)
  function BOOL (line 3957) | static BOOL expression_node(unsigned int* node, sParserInfo* info)
  function BOOL (line 6159) | static BOOL expression_monadic_operator(unsigned int* node, sParserInfo*...
  function BOOL (line 6248) | static BOOL expression_implements(unsigned int* node, sParserInfo* info)
  function BOOL (line 6280) | static BOOL expression_mult_div(unsigned int* node, sParserInfo* info)
  function BOOL (line 6347) | static BOOL expression_add_sub(unsigned int* node, sParserInfo* info)
  function BOOL (line 6398) | static BOOL expression_shift(unsigned int* node, sParserInfo* info)
  function BOOL (line 6449) | static BOOL expression_comparison_operator(unsigned int* node, sParserIn...
  function BOOL (line 6532) | static BOOL expression_comparison_equal_operator(unsigned int* node, sPa...
  function BOOL (line 6583) | static BOOL expression_and(unsigned int* node, sParserInfo* info)
  function BOOL (line 6618) | static BOOL expression_xor(unsigned int* node, sParserInfo* info)
  function BOOL (line 6653) | static BOOL expression_or(unsigned int* node, sParserInfo* info)
  function BOOL (line 6687) | static BOOL expression_and_and_or_or(unsigned int* node, sParserInfo* info)
  function BOOL (line 6737) | BOOL expression(unsigned int* node, sParserInfo* info)

FILE: src/pointer.c
  function CLObject (line 3) | CLObject create_pointer(char* value, sVMInfo* info)

FILE: src/regex.c
  function object_size (line 3) | static unsigned int object_size()
  function regex_free_fun (line 15) | void regex_free_fun(CLObject obj)
  function CLObject (line 23) | CLObject create_regex_object(char* regex, BOOL global, BOOL ignore_case,...
  function BOOL (line 58) | BOOL regex_equals(CLObject left, CLObject right)

FILE: src/script.c
  function script_init (line 7) | void script_init()
  function script_final (line 14) | void script_final()
  function add_block_object_to_script (line 28) | int add_block_object_to_script(sByteCode codes, sConst constant, int var...
  function add_block_object_to_script2 (line 53) | void add_block_object_to_script2(sCLBlockObject* block_object)
  function BOOL (line 69) | BOOL read_source(char* fname, sBuf* source)
  function BOOL (line 104) | BOOL eval_file(char* fname, int stack_size)

FILE: src/script_ctime.c
  function BOOL (line 3) | BOOL delete_comment(sBuf* source, sBuf* source2)
  function BOOL (line 109) | static BOOL write_code_and_constant_to_file(sByteCode* code, sConst* con...
  function BOOL (line 183) | BOOL compile_script(char* fname, char* source, BOOL js)

FILE: src/short.c
  function CLObject (line 3) | CLObject create_short(short value, sVMInfo* info)
  function CLObject (line 16) | CLObject create_ushort(unsigned short value, sVMInfo* info)

FILE: src/stack.c
  function create_global_stack_and_append_it_to_stack_list (line 5) | void create_global_stack_and_append_it_to_stack_list(sVMInfo* info)
  function free_global_stack (line 20) | void free_global_stack(sVMInfo* info)
  function push_value_to_global_stack (line 29) | void push_value_to_global_stack(CLVALUE value, sVMInfo* info)
  function push_object_to_global_stack (line 56) | void push_object_to_global_stack(CLObject obj, struct sVMInfoStruct* info)
  function CLVALUE (line 83) | CLVALUE pop_global_stack(sVMInfo* info)
  function stack_init (line 100) | void stack_init()
  function stack_final (line 107) | void stack_final()
  function sCLStack (line 118) | sCLStack* append_stack_to_stack_list(CLVALUE* stack_mem, CLVALUE** stack...
  function BOOL (line 145) | BOOL remove_stack_to_stack_list(sCLStack* stack)
  function BOOL (line 212) | BOOL check_variables_existance_on_stack(CLVALUE* stack, CLVALUE* stack_ptr)

FILE: src/string.c
  function CLObject (line 4) | CLObject create_string_object(char* str, sVMInfo* info)
  function CLObject (line 55) | CLObject create_buffer_object(char* buffer, size_t size, sVMInfo* info)
  function CLObject (line 79) | CLObject create_path_object(char* path, sVMInfo* info)

FILE: src/tuple.c
  function CLObject (line 3) | CLObject create_tuple_object(int num_elements, char* type_name, sVMInfo*...
  function BOOL (line 14) | BOOL initialize_tuple_object(CLObject tuple_object, int num_elements, CL...

FILE: src/type.c
  function sCLClass (line 3) | sCLClass* get_class_from_cl_type(sCLType* cl_type, sCLClass* klass)
  function BOOL (line 10) | BOOL is_void_type(sCLType* cl_type, sCLClass* klass)
  function cl_type_to_string_core (line 17) | static void cl_type_to_string_core(sCLType* cl_type, sCLClass* klass, sB...
  function ALLOC (line 63) | ALLOC char* cl_type_to_string(sCLType* cl_type, sCLClass* klass)
  function BOOL (line 73) | BOOL is_this_class_with_class_name(sCLClass* klass, char* class_name)

FILE: src/utf.c
  function utf8_index_to_utf32_index (line 3) | int utf8_index_to_utf32_index(char* str, int utf8_index)
  function utf32_index_to_utf8_index (line 44) | int utf32_index_to_utf8_index(char* str, int utf32_index)

FILE: src/vm.c
  function show_stack (line 8) | void show_stack(CLVALUE* stack, CLVALUE* stack_ptr)
  function reset_andand_oror (line 18) | static void reset_andand_oror(sVMInfo* info)
  function get_andand_oror_left_value (line 23) | int get_andand_oror_left_value(sVMInfo* info)
  function set_andand_oror_left_value (line 28) | void set_andand_oror_left_value(BOOL flag, sVMInfo* info)
  function get_andand_oror_right_value (line 33) | int get_andand_oror_right_value(sVMInfo* info)
  function set_andand_oror_right_value (line 38) | void set_andand_oror_right_value(BOOL flag, sVMInfo* info)
  function inc_andand_oror_array (line 43) | void inc_andand_oror_array(sVMInfo* info)
  function dec_andand_oror_array (line 53) | void dec_andand_oror_array(sVMInfo* info)
  function show_inst (line 63) | void show_inst(unsigned inst)
  function BOOL (line 740) | BOOL invoke_method(sCLClass* klass, sCLMethod* method, CLVALUE* stack, i...
  function BOOL (line 1253) | BOOL invoke_block(CLObject block_object, CLVALUE* stack, int var_num, in...
  function BOOL (line 1388) | static BOOL initialize_class(sCLClass* klass, BOOL compile_time)
  function BOOL (line 1436) | BOOL load_fundamental_classes_on_runtime_for_js()
  function BOOL (line 1467) | BOOL load_fundamental_classes_on_runtime()
  function set_free_fun_to_classes (line 1537) | void set_free_fun_to_classes()
  function BOOL (line 1549) | BOOL call_all_class_initializer()
  function BOOL (line 1571) | BOOL class_init_on_runtime_for_js()
  function BOOL (line 1585) | BOOL class_init_on_runtime()
  function BOOL (line 1599) | static BOOL finalize_class(sCLClass* klass)
  function callOnException (line 1634) | void callOnException(CLObject message, BOOL in_try, sVMInfo* info)
  function BOOL (line 1694) | BOOL call_finalize_method_on_free_object(sCLClass* klass, CLObject self)
  function BOOL (line 1733) | BOOL call_alloc_size_method(sCLClass* klass, unsigned long long* result)
  function class_final_on_runtime (line 1768) | void class_final_on_runtime()
  function sCLClass (line 1781) | sCLClass* get_class_with_load_and_initialize(char* class_name, BOOL js)
  function boxing_primitive_value_to_object (line 1804) | void boxing_primitive_value_to_object(CLVALUE object, CLVALUE* result, s...
  function Self_convertion_of_method_name_and_params (line 1891) | void Self_convertion_of_method_name_and_params(char* method_name_and_par...
  function BOOL (line 1953) | static BOOL string_expression(char* str, int str_len, sBuf* buf, int* st...
  function BOOL (line 1982) | BOOL vm(sByteCode* code, sConst* constant, CLVALUE* stack, int var_num, ...

FILE: src/vtable.c
  function init_vtable (line 5) | void init_vtable()
  function final_vtable (line 10) | void final_vtable()
  function sVarTable (line 25) | sVarTable* init_var_table()
  function sVarTable (line 37) | sVarTable* clone_var_table(sVarTable* lv_table)
  function restore_var_table (line 67) | void restore_var_table(sVarTable* left, sVarTable* right)
  function BOOL (line 108) | BOOL add_variable_to_table(sVarTable* table, char* name, sNodeType* type...
  function sVar (line 175) | sVar* get_variable_from_index(sVarTable* table, int index)
  function sVar (line 198) | static sVar* get_variable_from_this_table_only(sVarTable* table, char* n...
  function check_already_added_variable (line 228) | void check_already_added_variable(sVarTable* table, char* name, struct s...
  function sVar (line 239) | sVar* get_variable_from_table(sVarTable* table, char* name)
  function get_sum_of_parent_var_num (line 257) | static int get_sum_of_parent_var_num(sVarTable* table)
  function get_variable_index (line 270) | int get_variable_index(sVarTable* table, char* name)
  function get_var_num (line 287) | int get_var_num(sVarTable* table)
  function get_parent_var_num_of_sum (line 292) | int get_parent_var_num_of_sum(sVarTable* table)
  function sVarTable (line 297) | sVarTable* init_block_vtable(sVarTable* lv_table)
  function set_max_block_var_num (line 314) | void set_max_block_var_num(sVarTable* lv_table, sVarTable* old_table)
  function show_vtable (line 323) | void show_vtable(sVarTable* table)

FILE: src/xfunc.c
  function ALLOC (line 28) | ALLOC char* xwcstombs(wchar_t* wstr, int len)
Copy disabled (too large) Download .json
Condensed preview — 477 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (11,412K chars).
[
  {
    "path": ".gitattributes",
    "chars": 48,
    "preview": "* linguist-vendored\n*.c linguist-vendored=false\n"
  },
  {
    "path": ".pc/.quilt_patches",
    "chars": 15,
    "preview": "debian/patches\n"
  },
  {
    "path": ".pc/.quilt_series",
    "chars": 7,
    "preview": "series\n"
  },
  {
    "path": ".pc/.version",
    "chars": 2,
    "preview": "2\n"
  },
  {
    "path": ".pc/applied-patches",
    "chars": 24,
    "preview": "empty.patch\nempty.patch\n"
  },
  {
    "path": ".pc/empty.patch/.timestamp",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".pc/empty.patch/Makefile.in",
    "chars": 21458,
    "preview": "#######################################################\n# installed directories\n########################################"
  },
  {
    "path": ".travis.yml",
    "chars": 181,
    "preview": "language: c\nscript: sudo apt-get update && sudo apt install clang libpcre3-dev ctags -y && sudo ./configure --with-optim"
  },
  {
    "path": "C.clcl",
    "chars": 95,
    "preview": "class C version 1\n{\n    def puts(str:byte*):int;\n    def strcmp(str1:byte*, str2:byte*):int;\n}\n"
  },
  {
    "path": "CGI.clcl",
    "chars": 5248,
    "preview": "\ninherit System\n{\n    LC_ALL: static int;\n    LC_ADDRESS: static int;\n    LC_COLLATE: static int;\n    LC_CTYPE: static i"
  },
  {
    "path": "CHANGELOG",
    "chars": 43632,
    "preview": "\nversion 10.6.0\n\n    Correspond OSX(Intel, Homebrew)\n\nversion 10.5.7\n\n    Fixed String.insert(int, char) bug\n\nversion 10"
  },
  {
    "path": "CLang.clcl",
    "chars": 23286,
    "preview": "class CLangVariable\n{\n    var name:String;\n    var type:String;\n    var offset:int;\n\n    def initialize(name:String, typ"
  },
  {
    "path": "CLibrary.clcl",
    "chars": 77,
    "preview": "\ninherit System\n{\n    def strcmp(x:pointer, y:pointer): int from libc.so.6\n}\n"
  },
  {
    "path": "Command.clcl",
    "chars": 30995,
    "preview": "\ninherit System\n{\n    typedef wait_status int;\n    typedef wait_option int;\n    typedef tcflag_t int;\n    typedef cc_t b"
  },
  {
    "path": "Container.clcl",
    "chars": 84938,
    "preview": "\ninterface IEqualable\n{\n    def equals(right:Self): bool;\n    def toString(): String;\n    def clone(): Self;\n}\n\ninterfac"
  },
  {
    "path": "ExtensionClassTest.cl",
    "chars": 28,
    "preview": "ExtensionClassTest.main();\n\n"
  },
  {
    "path": "ExtensionClassTest.clcl",
    "chars": 885,
    "preview": "\nclass ExtensionClassTest\n{\n    ABC: static int from ExtensionTest.h\n\n    def getValue(x:int, y:int): int from libExtens"
  },
  {
    "path": "ExtensionTest.c",
    "chars": 350,
    "preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\nint getValue(int x, int y) \n{\n    return x + y;\n}\n\nlong getV"
  },
  {
    "path": "ExtensionTest.h",
    "chars": 75,
    "preview": "#ifndef EXTENSION_TEST_H\n#define EXTENSION_TEST_H\n\n#define ABC 123\n\n#endif\n"
  },
  {
    "path": "File.clcl",
    "chars": 25543,
    "preview": "\ninherit System\n{\n    typedef mode_t int;\n    typedef dev_t ulong;\n    typedef uid_t int;\n    typedef gid_t int;\n    typ"
  },
  {
    "path": "Fundamental.clcl",
    "chars": 26662,
    "preview": "\nmodule MObjectBase \n{\n    def map(block_:lambda(SELF):Anonymous?): Anonymous? {\n        return block_(self);\n    }\n    "
  },
  {
    "path": "JITTest.cl",
    "chars": 15,
    "preview": "JITTest.main()\n"
  },
  {
    "path": "JITTest.clcl",
    "chars": 2058,
    "preview": "class JITTestClassA {\n    value:int;\n\n    def initialize() {\n        value = 123;\n    }\n}\n\nclass JITTestException {\n    "
  },
  {
    "path": "JITTest2.clcl",
    "chars": 2883,
    "preview": "inherit JITTest\n{\n    def selector(): String {\n        result:String = \"\";\n\n        a := 0;\n\n        if(a == 0) {\n/*\n   "
  },
  {
    "path": "JS.jsclcl",
    "chars": 41770,
    "preview": "class System:js\n{\n    typedef Any Anonymous;\n\n    def println(obj:Anonymous):static native {\n        console.log(obj);\n "
  },
  {
    "path": "LICENSE",
    "chars": 18030,
    "preview": "clover Copyright (c) 2017 Daisuke Minato \n\n\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C"
  },
  {
    "path": "Makefile.in",
    "chars": 44020,
    "preview": "#######################################################\n# installed directories\n########################################"
  },
  {
    "path": "MyOwnLibrary.clcl",
    "chars": 592,
    "preview": "\ninherit SortableList<T:ISortable>\n{\n    def grep(reg:regex) {\n        self.each(closure(file_name:T) {\n            if(f"
  },
  {
    "path": "README.md",
    "chars": 7811,
    "preview": "# clover2 computer language\n\nこの言語はアプリケーションを作るタイプの言語ではないかもしれません。iclover2を使ってシェルとして使うといいと思います。\n\nversion 11.0.0\n\nサポートしている機能"
  },
  {
    "path": "Range.clcl",
    "chars": 3036,
    "preview": "\nclass Range<T:IIteratorable>\n{\n    include MObjectBase;\n\n    head:T;\n    tail:T;\n\n    def initialize() {}\n\n    def init"
  },
  {
    "path": "Reflection.clcl",
    "chars": 16886,
    "preview": "\nclass Field\n{\n    include MObjectBase;\n\n    flags:long;\n    name:String;\n    resultType:String;\n    #value:Anonymous;\n\n"
  },
  {
    "path": "Socket.clcl",
    "chars": 5806,
    "preview": "\nclass sockaddr\n{\n    include MObjectBase;\n\n    sa_family: int;\n    sa_data: String;\n\n    def initialize() {\n    }\n\n    "
  },
  {
    "path": "String.clcl",
    "chars": 20212,
    "preview": "\nclass PcreOVec\n{\n    include MObjectBase;\n\n    start:int[];\n    end:int[];\n\n    def initialize() {}\n\n    def initialize"
  },
  {
    "path": "SystemCalls.clcl",
    "chars": 25783,
    "preview": "\nclass getopt_long_option\n{\n    include MObjectBase;\n\n    name:String;\n    has_arg:int;\n    flag:pointer@int;\n    val_:i"
  },
  {
    "path": "TODO",
    "chars": 213,
    "preview": "\nスタックの値オーバーフローしてたらコンパイル時にエラーをだす。\n\nC FFI グローバル変数\n\nC FFI グローバル変数、pointer, struct, arrayの3つが動かない。\n\npointer終わった。\n\n配列のランダムアクセ"
  },
  {
    "path": "Thread.clcl",
    "chars": 5076,
    "preview": "\nclass pthread_mutex_t \n{\n    include MObjectBase;\n\n    def initialize() {}\n    def allocSize(): static native size_t;\n\n"
  },
  {
    "path": "a.cl",
    "chars": 46,
    "preview": "if(true) {\n    ls -al\n}\nelse {\n    hostname\n}\n"
  },
  {
    "path": "a.clcl",
    "chars": 262,
    "preview": "class ClassB {\n    params:List<Integer>;\n    \n    def initialize() {\n        params = list { 1, 2, 3 };\n    }\n}\n\n\nclass "
  },
  {
    "path": "a.csv",
    "chars": 23,
    "preview": "A\\,A\\,A,B\\,B\\,B,C\\+C\\+C"
  },
  {
    "path": "a.jscl",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "a.txt",
    "chars": 10,
    "preview": "ABCDEFGHI\n"
  },
  {
    "path": "aaa",
    "chars": 1714,
    "preview": "src/class_system.c:7014:5: error: use of undeclared identifier 'sighandler_t'\n    sighandler_t handler_value = (sighandl"
  },
  {
    "path": "all_build.sh",
    "chars": 80,
    "preview": "./configure --with-optimize --with-interpreter\nmake\nsudo make install\nmake test\n"
  },
  {
    "path": "app-sample/mfiler5/Fundamental.clcl",
    "chars": 235,
    "preview": "\ninherit Clover \n{\n    def onException(message:String, in_try:bool):static {\n        if(!in_try) {\n            if(MFiler"
  },
  {
    "path": "app-sample/mfiler5/Makefile.in",
    "chars": 2839,
    "preview": "#######################################################\n# installed directories\n########################################"
  },
  {
    "path": "app-sample/mfiler5/config.log",
    "chars": 13621,
    "preview": "This file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mis"
  },
  {
    "path": "app-sample/mfiler5/config.status",
    "chars": 24886,
    "preview": "#! /bin/sh\n# Generated by configure.\n# Run this file to recreate the current configuration.\n# Compiler output produced b"
  },
  {
    "path": "app-sample/mfiler5/configure",
    "chars": 138537,
    "preview": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.69.\n#\n#\n# C"
  },
  {
    "path": "app-sample/mfiler5/configure.in",
    "chars": 2944,
    "preview": "AC_INIT(mfiler5.cl)\n\nAC_PROG_CC\nAC_PROG_INSTALL\nAC_C_BIGENDIAN\n\nif test $prefix = NONE\nthen\n    myprefix=/usr/local\nelse"
  },
  {
    "path": "app-sample/mfiler5/install.sh",
    "chars": 2187,
    "preview": "#! /bin/sh\n\n#\n# install - install a program, script, or datafile\n# This comes from X11R5; it is not part of GNU.\n#\n# $XC"
  },
  {
    "path": "app-sample/mfiler5/mf1app.clcl",
    "chars": 854,
    "preview": "\nclass MFiler5 version 1 {\n    var endOfAplication:bool;\n    var keyEvents: lambda[](MFiler5, int, int);\n    var running"
  },
  {
    "path": "app-sample/mfiler5/mf2win.clcl",
    "chars": 7942,
    "preview": "\nclass MFiler5 version 2 {\n    var spaceString: String;\n    var dirPath: String;\n    var files:SortableList<String>;\n   "
  },
  {
    "path": "app-sample/mfiler5/mf3isearch.clcl",
    "chars": 1924,
    "preview": "class MFiler5 version 3 {\n    var isearchString:String;\n    var isearchMode:bool;\n\n    def initialize():dynamic {\n      "
  },
  {
    "path": "app-sample/mfiler5/mf4vd.clcl",
    "chars": 1290,
    "preview": "class MFiler5 version 4 {\n    def initialize():dynamic {\n        inherit();\n        \n        keyEvents['g'.to_int] = lam"
  },
  {
    "path": "app-sample/mfiler5/mf5",
    "chars": 119,
    "preview": "#!/bin/bash\n\nexport LD_LIBRARY_PATH=$HOME/.clover2/mfiler5/:$LD_LIBRARY_PATH\nclover2 ~/.clover2/mfiler5/mfiler5.ocl $@\n"
  },
  {
    "path": "app-sample/mfiler5/mfiler5.cl",
    "chars": 16,
    "preview": "MFiler5.main();\n"
  },
  {
    "path": "app-sample/mfiler5/update_mfiler5.sh",
    "chars": 213,
    "preview": "#!/bin/bash\n\nif [ -e Makefile ]\nthen\n    make distclean\nfi\nif [ ! -e Makefile ]\nthen\n    git add .\n    git commit \n    g"
  },
  {
    "path": "app-sample/vicl/Fundamental.clcl",
    "chars": 235,
    "preview": "\ninherit Clover \n{\n    def onException(message:String, in_try:bool):static {\n        if(!in_try) {\n            if(ViClon"
  },
  {
    "path": "app-sample/vicl/Makefile.in",
    "chars": 5325,
    "preview": "#######################################################\n# installed directories\n########################################"
  },
  {
    "path": "app-sample/vicl/README.md",
    "chars": 200,
    "preview": "# vicl\n\nVi Clone by Clover2.\n\nThis is under constructing. I recommended that you use this for Clover2 test sources.\n\n* I"
  },
  {
    "path": "app-sample/vicl/SKK-JISYO.L",
    "chars": 2821804,
    "preview": ";; -*- mode: fundamental; coding: euc-jp -*-\n;; Large size dictionary for SKK system\n;; Copyright (C) 1988-1995, 1997, "
  },
  {
    "path": "app-sample/vicl/TODO",
    "chars": 164,
    "preview": "画面の最後の列でoや入力がおかしい\n画面の最後の列でAがおかしい\n\n.の繰返し\n\n/入力時にC-w\n\nヴィジュアルモード中に/で検索\n\nsearch mode utf-8\nsearch mode in visual mode\n\nビィジュアル"
  },
  {
    "path": "app-sample/vicl/a.c",
    "chars": 28,
    "preview": "\n#ifdef A_BLINKC\naaaaa\naaaaa"
  },
  {
    "path": "app-sample/vicl/a.cl",
    "chars": 111,
    "preview": "a := { 1, 2, 3 }\n\nit := a.iterator(2);\nwhile(it != null) {\n    println(it.item.toString());\n    it = it.next;\n}"
  },
  {
    "path": "app-sample/vicl/a.clcl",
    "chars": 91,
    "preview": "class ClassA {\n    def initialize() {\n    }\n    \n    def method() {\n        Clover.\n    }\n}"
  },
  {
    "path": "app-sample/vicl/aaa/aaa",
    "chars": 4,
    "preview": "aaaa"
  },
  {
    "path": "app-sample/vicl/aaa/bbb",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "app-sample/vicl/c.cl",
    "chars": 8,
    "preview": "Clover.\n"
  },
  {
    "path": "app-sample/vicl/config.log",
    "chars": 8330,
    "preview": "This file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mis"
  },
  {
    "path": "app-sample/vicl/config.status",
    "chars": 24492,
    "preview": "#! /bin/sh\n# Generated by configure.\n# Run this file to recreate the current configuration.\n# Compiler output produced b"
  },
  {
    "path": "app-sample/vicl/configure",
    "chars": 118262,
    "preview": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.69.\n#\n#\n# C"
  },
  {
    "path": "app-sample/vicl/configure.in",
    "chars": 3235,
    "preview": "AC_INIT(viclone.cl)\n\nAC_PROG_INSTALL\n\nif test $prefix = NONE\nthen\n    myprefix=/usr/local\nelse\n    myprefix=$prefix\nfi\n\n"
  },
  {
    "path": "app-sample/vicl/install.sh",
    "chars": 2187,
    "preview": "#! /bin/sh\n\n#\n# install - install a program, script, or datafile\n# This comes from X11R5; it is not part of GNU.\n#\n# $XC"
  },
  {
    "path": "app-sample/vicl/update_vicl.sh",
    "chars": 210,
    "preview": "#!/bin/bash\n\nif [ -e Makefile ]\nthen\n    make distclean\nfi\nif [ ! -e Makefile ]\nthen\n    git add .\n    git commit \n    g"
  },
  {
    "path": "app-sample/vicl/vicl",
    "chars": 129,
    "preview": "#!/bin/bash\n\nexport TERMUX=1\nexport LD_LIBRARY_PATH=$HOME/.clover2/vicl/:$LD_LIBRARY_PATH\nclover2 ~/.clover2/vicl/viclon"
  },
  {
    "path": "app-sample/vicl/vicl10VisualMode.clcl",
    "chars": 13466,
    "preview": "\nclass ViCloneWindow version 6\n{\n    var visualModeStart:int;\n    var visualModeEnd:int;\n    var visualMode:bool\n\n    de"
  },
  {
    "path": "app-sample/vicl/vicl11Undo.clcl",
    "chars": 2108,
    "preview": "\nclass ViCloneWindow version 7\n{\n    var undoTexts:SortableList<SortableList<String>>;\n    var undoIndex:int;\n    var un"
  },
  {
    "path": "app-sample/vicl/vicl12grave.clcl",
    "chars": 1674,
    "preview": "\nclass ViCloneWindow version 8\n{\n    graveCursorPosition:int[];\n    numGraveCursorPosition: int;\n    savedCursorPosition"
  },
  {
    "path": "app-sample/vicl/vicl13dot.clcl",
    "chars": 3856,
    "preview": "\nclass ViClone version 13\n{\n    lastKey: int;\n    lastKey2: int;\n    lastInsertedTextPos: Tuple2<Integer, Integer>;\n    "
  },
  {
    "path": "app-sample/vicl/vicl14Completion.clcl",
    "chars": 29004,
    "preview": "\nclass ViClone version 14\n{\n    completionCommandNames:SortableList<String>;\n\n    def initialize():dynamic {\n        inh"
  },
  {
    "path": "app-sample/vicl/vicl15CCompletion.clcl",
    "chars": 1641,
    "preview": "\nclass ViCloneWindow version 9\n{\n    ccompletionCandidates: SortableList<String>;\n    \n    def getCMacros():SortableList"
  },
  {
    "path": "app-sample/vicl/vicl16VVisual.clcl",
    "chars": 9378,
    "preview": "\nclass ViCloneWindow version 10\n{\n    var vvisualModeStart:int;\n    var vvisualModeStartX:int;\n    var vvisualModeEnd:in"
  },
  {
    "path": "app-sample/vicl/vicl17Macro.clcl",
    "chars": 4730,
    "preview": "\nclass ViClone version17 {\n    var macro: EqualableList<Tuple2<Integer,Integer>>[];\n    var macroKey: int;\n    var macro"
  },
  {
    "path": "app-sample/vicl/vicl18Range.clcl",
    "chars": 11100,
    "preview": "\nclass ViCloneWindow version 11\n{\n    var rangeModeStart:int;\n    var rangeModeStartX:int;\n    var rangeMode:bool\n\n    d"
  },
  {
    "path": "app-sample/vicl/vicl19Signal.clcl",
    "chars": 4211,
    "preview": "\nclass ViClone version 19\n{\n    def initialize():dynamic {\n        inherit();\n\n        block:lambda(int) = lambda(signum"
  },
  {
    "path": "app-sample/vicl/vicl1App.clcl",
    "chars": 1681,
    "preview": "\nclass ViClone version 1\n{\n    var endOfAplication:bool;\n    var keyEvents: lambda[](ViClone, int, int);\n    var mode: i"
  },
  {
    "path": "app-sample/vicl/vicl20Backup.clcl",
    "chars": 1060,
    "preview": "\nclass ViCloneWindow version 12\n{\n    var tmpFilePath:String;\n\n    def initialize(fname:String, dir_path:String, win_pos"
  },
  {
    "path": "app-sample/vicl/vicl21Utf8.clcl",
    "chars": 106582,
    "preview": "class ViCloneWindow version 13\n{\n    def realPosToViewPos(y:int, x:int): dynamic Tuple2<Integer, Integer> {\n        for("
  },
  {
    "path": "app-sample/vicl/vicl2Win.clcl",
    "chars": 11147,
    "preview": "\nclass ViCloneWindow version 1\n{\n    var cursorX:int;\n    var cursorY:int;\n    var scrollTopX:int;\n    var scrollTopY:in"
  },
  {
    "path": "app-sample/vicl/vicl3InsertMode.clcl",
    "chars": 11074,
    "preview": "\nclass ViCloneWindow version 2\n{\n    def addUndoText(): dynamic {}\n    def clearUndoText():dynamic {}\n\n    var modifiedT"
  },
  {
    "path": "app-sample/vicl/vicl4Edit.clcl",
    "chars": 6138,
    "preview": "\nclass ViCloneWindow version 3\n{\n    def findChar(key:char): Tuple2<Integer, Integer> \n    {\n        y := getRealPosY();"
  },
  {
    "path": "app-sample/vicl/vicl5Word.clcl",
    "chars": 10851,
    "preview": "\nclass ViClone version 5\n{\n    def forwardWord(offset:int=0):dynamic Tuple2<Integer, Integer>\n    {\n        real_pos_x :"
  },
  {
    "path": "app-sample/vicl/vicl6Brace.clcl",
    "chars": 4451,
    "preview": "\nclass ViCloneWindow version 4\n{\n    def getCursorChar(): char {\n        line := visibleTexts.items(cursorY);\n\n        i"
  },
  {
    "path": "app-sample/vicl/vicl7DirPane.clcl",
    "chars": 20611,
    "preview": "class ViCloneWindow version 5\n{\n    def rehashCCompletion():dynamic {}\n    \n    def initialize(fname:String, dir_path:St"
  },
  {
    "path": "app-sample/vicl/vicl8CommandMode.clcl",
    "chars": 14549,
    "preview": "\nclass ViClone version 8\n{\n    var statusLineInCommandMode:String;\n\n    def initialize():dynamic {\n        inherit();\n\n "
  },
  {
    "path": "app-sample/vicl/vicl9SearchMode.clcl",
    "chars": 5821,
    "preview": "\nclass ViClone version 9\n{\n    statusLineInSearchMode:String;\n    searchMode:int;\n\n    enum { SEARCHMODE_NORMAL, SEARCHM"
  },
  {
    "path": "app-sample/vicl/vicl_insert_file",
    "chars": 125,
    "preview": "#!/bin/bash\n\nexport LD_LIBRARY_PATH=$HOME/.clover2/vicl/:$LD_LIBRARY_PATH\nclover2 ~/.clover2/vicl/viclone_insert_file.oc"
  },
  {
    "path": "app-sample/vicl/vicl_open_file",
    "chars": 123,
    "preview": "#!/bin/bash\n\nexport LD_LIBRARY_PATH=$HOME/.clover2/vicl/:$LD_LIBRARY_PATH\nclover2 ~/.clover2/vicl/viclone_open_file.ocl "
  },
  {
    "path": "app-sample/vicl/viclone.cl",
    "chars": 16,
    "preview": "ViClone.main();\n"
  },
  {
    "path": "app-sample/vicl/viclone_insert_file.cl",
    "chars": 392,
    "preview": "if(Clover.ARGC != 3) {\n    println(\"Invalid argment\");\n    exit(2);\n}\n\nsockfd := socket(AF_UNIX, SOCK_STREAM, 0);\n\naddre"
  },
  {
    "path": "app-sample/vicl/viclone_open_file.cl",
    "chars": 408,
    "preview": "if(Clover.ARGC != 4) {\n    println(\"Invalid argment\");\n    exit(2);\n}\n\nsockfd := socket(AF_UNIX, SOCK_STREAM, 0);\n\naddre"
  },
  {
    "path": "b.cl",
    "chars": 81,
    "preview": "println(\"AAA\");\ndef fun():int {\n    return 1+1;\n}\n\nfun().toString().println();\n\n\n"
  },
  {
    "path": "b.clcl",
    "chars": 122,
    "preview": "class InvokePuts\n{\n    def method():static {\n        a := C.puts(C\"HELLO C FFI\");\n        a.toString().println();\n    }\n"
  },
  {
    "path": "b.txt",
    "chars": 12,
    "preview": "aaa\nbbb\nccc\n"
  },
  {
    "path": "bbb",
    "chars": 60179,
    "preview": "thread id 30289 mutex count 1 vm inst 18 Thread.thread_func\nthread id 30289 mutex count 1 vm inst 32 Thread.thread_func\n"
  },
  {
    "path": "c.txt",
    "chars": 8,
    "preview": "abc\ndef\n"
  },
  {
    "path": "code/AllocSize.clcl",
    "chars": 550,
    "preview": "\nclass AllocSizeClass\n{\n    def initialize() {\n    }\n\n    def allocSize():static ulong {\n        return 128;\n    }\n\n    "
  },
  {
    "path": "code/AndAndOrOrTest.clcl",
    "chars": 2208,
    "preview": "class AndAndOrOrTest \n{\n    def method1():static bool {\n        return true;\n    }\n\n    def method2():static bool {\n    "
  },
  {
    "path": "code/AnonymousTest.clcl",
    "chars": 207,
    "preview": "\nclass AnonymousTest {\n    def main(): static {\n        a:Anonymous = 3;\n\n        n:int = 0;\n        a.times(closure() {"
  },
  {
    "path": "code/AnonymousTest2.clcl",
    "chars": 835,
    "preview": "class AnonymousTest2 {\n    def main():static {\n        a:Anonymous = new Integer(3);\n\n        Clover.test(\"Anonymous tes"
  },
  {
    "path": "code/ArrayTest.clcl",
    "chars": 436,
    "preview": "class ArrayTest {\n    def main():static {\n        a:int[] = new int[10]();\n\n        a[1] = 100;\n        a[2] = 200;\n\npri"
  },
  {
    "path": "code/ArrayTest2.cl",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "code/ArrayTest2.clcl",
    "chars": 247,
    "preview": "class ArrayTest2 {\n    def main():static {\n        a:int[] = [ 1,2,3 ];\n\n        Clover.test(\"array test1\", a[0] == 1 &&"
  },
  {
    "path": "code/ArrayTest3.clcl",
    "chars": 487,
    "preview": "\nclass ArrayTest3 \n{\n    def main():static {\n        a:Array<Integer> = [1, 2, 3].toArray;\n\n        Clover.test(\"array3 "
  },
  {
    "path": "code/ArrayTest4.clcl",
    "chars": 637,
    "preview": "\nclass ArrayTest4Class {\n    value: int[];\n    value2: int;\n\n    def initialize() {\n        self.value = new int[3]();\n "
  },
  {
    "path": "code/ArrayTest5.clcl",
    "chars": 641,
    "preview": "class ArrayTest5 {\n    def main():static {\n        Clover.test(\"Array test\", [ 1,2,3 ].toEqualableArray().equals([1,2,3]"
  },
  {
    "path": "code/BlockTest.clcl",
    "chars": 882,
    "preview": "class BlockTest {\n    def initialize() {}\n    def main(): static {\n        a:lambda(int,int):int = lambda(value1:int, va"
  },
  {
    "path": "code/BlockTest2.clcl",
    "chars": 518,
    "preview": "\nclass BlockTestClass {\n    block_object: lambda(int, int):int;\n\n    def initialize() {\n        b:int = 1;\n\n        self"
  },
  {
    "path": "code/BlockTest3.clcl",
    "chars": 411,
    "preview": "\nclass LabmdaTest {\n    value: lambda(int, int):int;\n\n    def initialize() {\n        self.value = lambda(a:int, b:int):i"
  },
  {
    "path": "code/BlockTest4.clcl",
    "chars": 775,
    "preview": "class BlockTest4 {\n    def main():static {\n        a:=0;\n        3.times() {\n            a++;\n        }\n\n        Clover."
  },
  {
    "path": "code/BlockTest5.clcl",
    "chars": 824,
    "preview": "class BlockTest5\n{\n    def initialize() {}\n    def method() {\n        c := 0;\n        slist{1,2,3}.each {\n            c "
  },
  {
    "path": "code/BlockVarTest.clcl",
    "chars": 913,
    "preview": "class BlockVarTest\n{\n    def main():static {\n        a:int = 1;\n\n        System.assert(a == 1);\n\n        if(true) {\n    "
  },
  {
    "path": "code/BoolTest.clcl",
    "chars": 209,
    "preview": "class BoolTest\n{\n    def main():static {\n        var a = 1;\n\n        true.if { a = 2 }\n\n        Clover.test(\"Bool test\","
  },
  {
    "path": "code/BufferTest.clcl",
    "chars": 15423,
    "preview": "\nclass CLNodeType\n{\n    typeName:String;\n    genericsTypes:CLNodeType[];\n    numGenericsTypes: int;\n\n    def initialize("
  },
  {
    "path": "code/ByteTest.clcl",
    "chars": 314,
    "preview": "\nclass ByteTest {\n    def main():static {\n        B\"ABC\".chars(0) == 'A';\n        Clover.test(\"byte test\", B\"ABC\".chars("
  },
  {
    "path": "code/CArrayTest.clcl",
    "chars": 121,
    "preview": "class CArrayTest {\n    def main():static {\n        Clover.test(\"carray test1\", array { 1, 2, 3 }.items(1) == 2);\n    }\n}"
  },
  {
    "path": "code/CFFI.cl",
    "chars": 17,
    "preview": "CFFITest.main();\n"
  },
  {
    "path": "code/CFFI.ll",
    "chars": 10412,
    "preview": "; ModuleID = 'code/CFFI.bc'\nsource_filename = \"Module code/CFFI.ocl\"\n\n@gSigInt = external global i32\n@gCodeData = global"
  },
  {
    "path": "code/CFFI.s",
    "chars": 3688,
    "preview": "\t.text\n\t.file\t\"CFFI.ocl\"\n\t.globl\tclover2_main            // -- Begin function clover2_main\n\t.p2align\t2\n\t.type\tclover2_ma"
  },
  {
    "path": "code/CFFITest.clcl",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "code/CGITest.clcl",
    "chars": 1217,
    "preview": "class CGITest\n{\n    def main():static {\n        a := \"aaa+:c&\";\n\n        Clover.test(\"CGI test1\", a.quotedString().equal"
  },
  {
    "path": "code/CStruct.c",
    "chars": 2191,
    "preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <assert.h>\n#include \"CStruct.h\"\n\nint gVar;\n\nvoid fun(struct CStruct data"
  },
  {
    "path": "code/CStruct.h",
    "chars": 1039,
    "preview": "\nstruct CStruct {\n    char a;\n    int b;\n    long c;\n};\n\nextern void fun(struct CStruct data);\nextern void fun2(char dat"
  },
  {
    "path": "code/CStructTest.clcl",
    "chars": 4418,
    "preview": "__BEGIN__\nCLang.include(\"code/CStruct.h\");\n__END__\nstruct CFFIStruct : 16 {\n    a:long:0;\n    b:long:8;\n}\n\n/*\nclass CFFI"
  },
  {
    "path": "code/CastTest.clcl",
    "chars": 470,
    "preview": "class CastTest {\n    def main():static {\n        Clover.test(\"cast test1\", 255.to_byte == -1)\n        Clover.test(\"cast "
  },
  {
    "path": "code/CharTest.clcl",
    "chars": 966,
    "preview": "class CharTest {\n    def main():static {\n        x:char = 'A';\n\n        System.assert(x == 'A');\n\n        x++;\n\n        "
  },
  {
    "path": "code/ClassFieldAndFieldTest.clcl",
    "chars": 1331,
    "preview": "class ClassFieldAndFieldTest\n{\n    a:int;\n    b:static int;\n\n    def initialize() {}\n\n    def method() {\n        a = 123"
  },
  {
    "path": "code/ClassMethodTest.clcl",
    "chars": 139,
    "preview": "class ClassMethodTestA\n{\n    def method():static int {\n        return 1 * 3;\n    }\n\n    def method2() {\n        a := met"
  },
  {
    "path": "code/CloneTest.clcl",
    "chars": 4356,
    "preview": "class CloneTest\n{\n    value: int;\n    value2:String[];\n    value3:lambda(int)[];\n    value4:Hash<String,Integer>;\n    va"
  },
  {
    "path": "code/ClosureTest.clcl",
    "chars": 2859,
    "preview": "class ClosureTestB {\n    def method1(block:lambda(int,int):int):static int {\n        a:int = 111;\n        return block(a"
  },
  {
    "path": "code/CommandTest.clcl",
    "chars": 218,
    "preview": "class CommandTest {\n    def main():static {\n#        Command.ls(\"-al\").grep(\"clcl\").less();\n#        Command.pwd().less("
  },
  {
    "path": "code/CommentTest.clcl",
    "chars": 377,
    "preview": "class CommentTest\n{\n    def main(): static {\n        Clover.test(\"comment test\", '#' == '#');\n        Clover.test(\"comme"
  },
  {
    "path": "code/DefaultMethodArgTest.clcl",
    "chars": 909,
    "preview": "class DefaultMethodArgTest\n{\n    def initialize() {\n    }\n\n    def method(a:int, b:int = 1):int {\n        return a + b;\n"
  },
  {
    "path": "code/DelegateTest.clcl",
    "chars": 1311,
    "preview": "\nclass DelegateClassA\n{\n    a:int;\n\n    def initialize() {\n        self.a = 123;\n    }\n\n    def show() {\n        println"
  },
  {
    "path": "code/DependencyTest.clcl",
    "chars": 120,
    "preview": "\nclass DependencyTest {\n    def main():static {\n        Clover.test(\"dependency test\", TestDep.hello() == 234);\n    }\n}\n"
  },
  {
    "path": "code/DirTest.clcl",
    "chars": 496,
    "preview": "\nclass DirTest {\n    def main():static {\n        dir:Directory = new Directory(\"test_dir\");\n\n        entries:SortableLis"
  },
  {
    "path": "code/E.cl",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "code/E.clcl",
    "chars": 550,
    "preview": "\n# E.clcl\ninterface E {\n    def eval():int;\n}\n\nclass EInt {\n    i:int\n    def initialize(i:int) {\n        self.i = i\n   "
  },
  {
    "path": "code/EFTest.clcl",
    "chars": 1215,
    "preview": "class EFTest {\n    def initialize() {\n    }\n\n    def main() {\n        def ef(e:E):int {\n            if (e.is(\"EInt\")) {\n"
  },
  {
    "path": "code/EnumTest.clcl",
    "chars": 329,
    "preview": "class EnumTest\n{\n    enum {\n        Value1, Value2, Value3\n    }\n\n    enum {\n        BValue1, BValue2, BValue3\n    }\n\n  "
  },
  {
    "path": "code/EqualableArrayTest.clcl",
    "chars": 550,
    "preview": "\nclass EqualableClassA \n{\n    def initialize() {\n    }\n}\n\nclass EqualableArrayTest {\n    def main():static {\n        a :"
  },
  {
    "path": "code/FileTest.clcl",
    "chars": 2315,
    "preview": "class FileTest {\n    def main():static {\n        f := new File(\"a.txt\", O_RDONLY, 0);\n        buf := f.read(4.to_ulong)\n"
  },
  {
    "path": "code/FloatTest.clcl",
    "chars": 149,
    "preview": "class FloatTest {\n    def main():static {\n        Clover.test(\"float test1\", 1.1f == 1.1f);\n        Clover.test(\"double "
  },
  {
    "path": "code/ForBlock.clcl",
    "chars": 338,
    "preview": "class ForBlock {\n    def main():static {\n        for(i:=0; i<5; i++) {\n            println(\"AAA\");\n        }\n        for"
  },
  {
    "path": "code/FunTest.clcl",
    "chars": 178,
    "preview": "\nclass FunTest {\n    def main(): static {\n        def fun(a:int, b:int):int {\n            return a + b;\n        }\n\n     "
  },
  {
    "path": "code/GCMemoryTest.clcl",
    "chars": 251,
    "preview": "class GCMemoryTest\n{\n    def main():static {\n        obj := GC_malloc(1024);\n\n        p := obj.memory;\n        memcpy(p,"
  },
  {
    "path": "code/GenericsTest.clcl",
    "chars": 1290,
    "preview": "\ninterface GenericsInterface {\n    def method(a:int):int;\n}\n\nclass GenericsTestClass {\n    def initialize() {\n    }\n\n   "
  },
  {
    "path": "code/GenericsTest2.clcl",
    "chars": 801,
    "preview": "\ninterface GInterface\n{\n    def method(a:int, b:int):int;\n}\n\nclass GItem <T:Object, T2:GInterface>\n{\n    value: T;\n    v"
  },
  {
    "path": "code/GenericsTest3.clcl",
    "chars": 887,
    "preview": "\ninterface IGenericsTest3\n{\n    def method(): int;\n}\n\nclass GenericsTest3ClassA \n{\n    def initialize() {\n    }\n    def "
  },
  {
    "path": "code/GenericsTest4.clcl",
    "chars": 140,
    "preview": "class GenericsTest4 {\n    def main():static {\n#e:EqualableList<Integer> = equalable_list {1,2,3}.map() {|n:Integer| n.to"
  },
  {
    "path": "code/GenericsTestX.clcl",
    "chars": 180,
    "preview": "class GenericsTestX\n{\n    field:EqualableList<EqualableList<String>>;\n\n    def initialize() {\n        a := \"AAA\";\n#     "
  },
  {
    "path": "code/HashTest.clcl",
    "chars": 1781,
    "preview": "class HashTest {\n    def main():static {\n        a:Hash<String, Integer> = new Hash<String, Integer>();\n\n        a.put(\""
  },
  {
    "path": "code/HelloWorld.clcl",
    "chars": 90,
    "preview": "class HelloWorld {\n    def main():static {\n        System.print(\"HELLO WORLD\\n\");\n    }\n}\n"
  },
  {
    "path": "code/HereDocument.clcl",
    "chars": 393,
    "preview": "class HereDocument\n{\n    def main(): static {\n        result := \"\";\n\n        result.append(\n            \"\"\"\n            "
  },
  {
    "path": "code/IncrementTest.clcl",
    "chars": 1698,
    "preview": "\nclass IncrementOperandTest {\n    a:int;\n    b:int\n    c:long\n\n    def initialize() {\n        self.a = 111;\n        self"
  },
  {
    "path": "code/InheritClassA.clcl",
    "chars": 181,
    "preview": "class InheritClassA\n{\n    value: int;\n\n    def initialize(value:int) {\n        self.value = value;\n    }\n\n    def method"
  },
  {
    "path": "code/InheritTest.clcl",
    "chars": 292,
    "preview": "include \"code/InheritClassA.clcl\"\n\nclass InheritClassA\n{\n    def method(value:int):int {\n        return inherit(value);\n"
  },
  {
    "path": "code/InitializeTest.clcl",
    "chars": 537,
    "preview": "class InitializeAndFinalizeTest {\n    a:static pointer;\n    b:pointer;\n\n    def initialize() {\n        b = malloc(1);\n  "
  },
  {
    "path": "code/IntegerTest.clcl",
    "chars": 1153,
    "preview": "\n\nclass IntegerTest \n{\n    def main():static {\n        a:Integer = new Integer(123);\n\n        Clover.test(\"Integer test\""
  },
  {
    "path": "code/InterfaceTest.clcl",
    "chars": 473,
    "preview": "\ninterface ITest {\n    def method(a:int):int;\n}\n\nclass InterfaceTestClass {\n    def initialize() {\n    }\n    def method("
  },
  {
    "path": "code/IsTest.clcl",
    "chars": 306,
    "preview": "class IsTest {\n    def main(): static {\n        a:Anonymous = \"AAA\";\n\n        if(a.is(\"Integer\")) {\n            Clover.t"
  },
  {
    "path": "code/KotlinTest.clcl",
    "chars": 995,
    "preview": "\nclass KotlinTest\n{\n    def initialize() {\n    }\n\n    def method2():bool {\n        self2 := \"ABC\";\n        str := \"ABC\";"
  },
  {
    "path": "code/LambdaArrayTest.clcl",
    "chars": 732,
    "preview": "class LambdaArrayTest\n{\n    def main(): static {\n        c:lambda[]?(int):int = null;\n\n        a:lambda[](int):int = new"
  },
  {
    "path": "code/ListTest.clcl",
    "chars": 2322,
    "preview": "class ListTest {\n    def main():static {\n        a:EqualableList<String> = new EqualableList<String>();\n\n        a.add(\""
  },
  {
    "path": "code/ListTest2.clcl",
    "chars": 3692,
    "preview": "class ListTest2 {\n    def main(): static {\n        Clover.test(\"List2 test1\", equalable_list {1,2,3}.indexOf(2) == 1);\n "
  },
  {
    "path": "code/ListTest3.clcl",
    "chars": 1034,
    "preview": "class ListTest3 {\n    def main(): static {\n        list { 1, 2, 3 }\n            .map(lambda(n:Integer):Anonymous { retur"
  },
  {
    "path": "code/MapTest.clcl",
    "chars": 668,
    "preview": "class MapTest\n{\n    def main() : static {\n        Clover.test(\"map teat\", slist {1,2,3}.map { it.toString() }.equals(sli"
  },
  {
    "path": "code/MethodBlock.clcl",
    "chars": 932,
    "preview": "class MethodBlock {\n    var scrollTopY:int;\n    var scrollTopX:int;\n    var cursorX:int;\n    var cursorY:int;\n    var te"
  },
  {
    "path": "code/MethodDynamicTest.clcl",
    "chars": 726,
    "preview": "class DynamicMethodTest\n{\n    table: Hash<String, Integer>;\n    table2: static Hash<String, Integer>;\n\n    str:String;\n\n"
  },
  {
    "path": "code/MethodDynamicTest2.clcl",
    "chars": 288,
    "preview": "\ninherit DynamicMethodTest\n{\n    def initialize(a:String): dynamic {\n        str = a.clone();\n        str.append(\"X\");\n "
  },
  {
    "path": "code/MethodGenericsTest.clcl",
    "chars": 1966,
    "preview": "\ninterface MethodGenericsInteface \n{\n    def append(a:Self):Self;\n}\n\nclass MethodGenericsInteger\n{\n    field:int;\n\n    d"
  },
  {
    "path": "code/MethodInternal.clcl",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "code/MethodInternalTest.clcl",
    "chars": 884,
    "preview": "\nclass MethodInternal\n{\n    field:int;\n\n    def initialize() {\n        field = 234;\n    }\n\n    def method():int {\n      "
  },
  {
    "path": "code/MixinLayers.clcl",
    "chars": 96,
    "preview": "class MixinLayersTest version 1\n{\n    var a:int;\n\n    def initialize() {\n        a = 1;\n    }\n}\n"
  },
  {
    "path": "code/MixinLayers2.clcl",
    "chars": 245,
    "preview": "\nclass MixinLayersTest version 2\n{\n    var b:int;\n\n    def initialize() {\n        inherit();\n\n        b = 2;\n    }\n\n    "
  },
  {
    "path": "code/ModuleTest.clcl",
    "chars": 475,
    "preview": "\nmodule MModuleTest {\n    def method(): int {\n        return 123;\n    }\n    def method2():int {\n        return self.fiel"
  },
  {
    "path": "code/MultiLineString.cl",
    "chars": 390,
    "preview": "print(\"\"\"\n      HELLO\n      HELLO\n      HELLO\n      \"\"\");\n\nClover.test(\"Multi Line String\", \"Hello World!\nHello World!\nH"
  },
  {
    "path": "code/NormalBlockTest.clcl",
    "chars": 246,
    "preview": "class NormalBlockTest {\n    def main():static {\n        a:=1;\n\n        {\n            b:=2;\n\n            Clover.test(\"tes"
  },
  {
    "path": "code/NullTest.clcl",
    "chars": 773,
    "preview": "class NullTest {\n    def main():static {\n        a:String? = null;\n\n        Clover.test(\"null test1\", a.identifyWith(nul"
  },
  {
    "path": "code/NumberTest.clcl",
    "chars": 149,
    "preview": "\nclass NumberTest {\n    def main():static {\n        Clover.test(\"number test1\", 0xff == 255);\n        Clover.test(\"numbe"
  },
  {
    "path": "code/NumberTest2.clcl",
    "chars": 879,
    "preview": "\nclass NumberTest2 {\n    def main():static {\n        a:Float = 1.0F;\n\n        Clover.test(\"Float test\", a.equals(1.0F));"
  },
  {
    "path": "code/ObjectCast.clcl",
    "chars": 2649,
    "preview": "class ObjectCast {\n    def main():static {\n        a:Object = slist { \"AAA\", \"BBB\", \"CCC\" };\n\n        b:SortableList<Str"
  },
  {
    "path": "code/ObjectTest.clcl",
    "chars": 1316,
    "preview": "\nclass ObjectTest {\n    def initialize() {}\n    def throwException(): int throws Exception {\n        throw Exception(\"AA"
  },
  {
    "path": "code/OmitBlockParamTest.clcl",
    "chars": 447,
    "preview": "\nclass OmitBlockParamTest\n{\n    def initialize() {}\n    def method():SortableList<String> {\n        a := SortableList<St"
  },
  {
    "path": "code/OperatorTest.clcl",
    "chars": 1681,
    "preview": "class OpClass {\n    value:int;\n    value2: static int;\n\n    def initialize(value:int) {\n        self.value = value;\n    "
  },
  {
    "path": "code/PatternMatchingTest.clcl",
    "chars": 2256,
    "preview": "class PatternMatchingTest\n{\n    value1: int;\n    value2: String;\n\n    def initialize(value1:int, value2:String) {\n      "
  },
  {
    "path": "code/Person.clcl",
    "chars": 1037,
    "preview": "interface InterfaceTest:js\n{\n    def equals(item:Self): bool;\n}\n\nclass Person: js\n{\n    var name:String;\n    var age:Num"
  },
  {
    "path": "code/PointerTest.clcl",
    "chars": 559,
    "preview": "class PointerTest\n{\n    def main():static {\n        a:pointer = System.malloc(123.to_ulong);\n\n        a->int = 123;\n    "
  },
  {
    "path": "code/PointerTest2.clcl",
    "chars": 1481,
    "preview": "class PointerClassB\n{\n    var_:int;\n\n    def initialize(var_:int) {\n        self.var_ = var_;\n    }\n}\n\nclass PointerClas"
  },
  {
    "path": "code/PointerTest3.clcl",
    "chars": 3545,
    "preview": "class PointerTest3\n{\n    var value:Buffer;\n    var value2: static Buffer;\n\n    def initialize() {}\n\n    def main(): stat"
  }
]

// ... and 277 more files (download for full content)

About this extraction

This page contains the full source code of the ab25cq/clover2 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 477 files (7.2 MB), approximately 1.9M tokens, and a symbol index with 1277 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!