// utf-8

P = priority: 1..9
T = estimated time [hours]
W = weighted priority: P/T

______________________________________________
P	T	W	TYP: TASK
______________________________________________

bugs:
5	5	1.0	BUG: String::NumVal(): number literals with more than 40 characters
2	4	0.5	BUG: main.cp: restore tty settings also on error exit.  ((how??))
			BUG: log(n,m): n cannot be an expression!?!
			BUG: in VScript::GetCGIArguments(): %ab auch für var-namen auswerten!
            BUG: wrong error line no. after string literals with "\" line concatenation
			BUG: MacOSX: unix/file_utilities.cp: FullPath("n.ex.file") bogus results after cd; FullPath(".") ok
			BUG: pwd does not print trailing "/" for dir
			BUG: fullpath("xy/z/") sollte auch bei n.ex. "z/" den trailing "/" erhalten

missing implementations:
6	2	3.0	IMP: SystemIO.cp: VolumeFree() for _SOLARIS
8	4	2.0	IMP: VolumeFlags() for _LINUX und _SOLARIS
2	2	1.0	IMP: utf-8.cp: ucs4_char_to_upper/lower(): handle characters beyond UCS-2
1	2	0.5	IMP: Stream::SetWindowSize()
2	5	0.4	IMP: SystemIO.cp: ReadDirectory(): _NON_BSD: check for read-only device
2	5	0.4	IMP: SystemIO.cp: ReadDirectory(): _NON_BSD: mount flags
2	5	0.4	IMP: SystemIO.cp: ReadDirectory(): _NON_BSD: file system owner
			IMP: os_utilities.h: SysLoad() for Debian and others without getloadavg()

internal changes:
5	5	1.0	NEW: token profiling in Value() and Execute()  =>  sorting of handlers for cpu cache optimization
8	10	0.9	MOD: Var.name as pointer for space conservation ((lots of unnamed variables in arrays!!))
			MOD: tGKauf etc.  =>  tGKauf.dist  =>  faster skipping in proc definition and pruning operators

visible changes:
9	5	1.8	NEW: sema: kind of global semaphor for synchronization of different scripts (e.g. cgi scripts)
9	10	0.9	NEW: text[..] = ...
3	5	0.6	NEW: encode/decode: MIME
9	20	0.4	NEW: list[..] = ...
5	10	0.5	NEW: encode/decode: calculate misc. checksums, e.g. MD5, crc
5	40	0.1	NEW: encode/decode: encryption/decryption, e.g. RSA
3	15	0.3	NEW: switch .. case .. default .. then
3	6	0.5	NEW: env:   assignment to env
2	6	0.3	NEW: prefs: cmd and fn to access preferences from script: "prefs" or "conf" or similar
1	6	0.2	NEW: prefs: assignment to prefs
			IMP: &&= and ||= : pruning
			MOD: call [#number,] ... as instruction: print result
			MOD: [new][var] var_ref = proc(..){..}
			IMP: edit var_ref
			NEW: typeof [value|file name]
			MOD: execute(): sys: set stderr to stderr_stream => enable redirection of stderr e.g. to file
			MOD: rename convert to encode/decode:  encode|decode(text,type) == convert(text to|from type)
			NEW: encode/decode BASE64, uuencode/decode, BinHex, quoted printable
			MOD: handling of trailing NULLs in lists
			IMP: replace <list>, ...
			IMP: replace text,number,number  ((auto-conversion))
			MOD: line edit: editlastitem => pg_dn should present an empty input line
			NEW: "proc(){..}"()  =>  compile and execute
			NEW: letter qualifiers: isletter, isnumber, ..
			IMP: exists link "name"
			IMP: a = link "name"
			NEW: convert file "name" from|to encoding
			IMP: new|var this.<name>; also: 'locals' and 'globals'; also; proc
			NEW: operator 'is' for classification:  <url> is file; <value> is text; <char> is letter
			MOD: wenn bei fehlermeldungen die proc angegeben wird, den ganzen pfad bis excl. globals angeben
			NEW: islink <text>

big chunks:
4	8	0.5	NEW: cache tokenized scripts in cache folder
2	10	0.2	MOD: use kio's malloc for new/delete
4	40	0.1	MOD: class Var { usagecnt, name, data }  => -parent, -index, +usage_count
8	99	0.1	NEW: GUI interface
9	99	0.1	NEW: port to Windows
2	99	0.1	NEW: threads
5	99	0.1	NEW: debugger

ideas/unsorted:
				 shuffle(list)
				 spacestr(count[,pattern])
				 join(list)  as opposed to split()
				 convert from tabX is very slow
9			NEW: non-blocking file i/o, ioctl()
			MOD: wildcard in open, close, cd
9			NEW: sockets, ftp, http, smtp, tcp, udp, etc.
9			NEW: pipes
9			NEW: word to change encoding for stream
3			NEW: catch signals, e.g. ctrl-c
4			NEW: ioctl() um Stream.error zu lesen, setzen, löschen
5			NEW: errorstr, SetError or the like; e.g. word "error" which can be read and written like a var
3			NEW: wort für introspection, zb. version usw.
			NEW: exec external_cmd asynchronously fully connected via pipes
			NEW: access to own file name&path for scripts ((word for introspection))
			MOD: a?b:c  if called with accept_novalue then accept no value for b and c
			NEW: proc:  function to define a proc; e.g.: var a = proc(){return 77}  or  in list definitions
			MOD: freeze/melt with convert to|from ice (and zip, gzip, zip2 usw.)
			MOD: globals: rework instruction globals
			MOD: var: "var xyz" for an existing xyz should set it to 0.0 ((??really??!!))
			NEW: count file filename  and  count dir  dirname   w/o reading the whole file...
			MOD: replace <list>, <text>, <text>  and  replace <text|list>, <list1>, <list2>
			MOD: redirect stderr to stderr stream for ExecCmd()  -> rework of std stream handling required
			NEW: tonumber or similar: conversion of text to number expecting a single number literal, e.g. "1.23" not "1+2"
			MOD: substr(text,n1[,n2]): 2nd index optional as in midstr()
			MOD: a_str[-10 to -5]  =>  negative numbers from right ?
			MOD: in cgi-mode run as user = "owner of script" (not user apache) => prevent common exploits
			MOD: proc idf ( a, *, b ) { .. }  =>  '*' also not at end
			MOD: proc foo(*){}  =>  foo( a=22, b=33)  =>  assign names to '*' arguments  =>  similar to obj-C
			MOD: option for long double numbers
			MOD: dir: name list items to filename --> exists file ( dir("/usr/bin").vipsi )

more ideas:
		??	NEW: adate filename, cdate filename
		??	NEW: autocompletion of idfs and filenames in shell
5		??	NEW: quotedstr, unquotedstr, escapedstr, unescapedstr, toutf8str, fromutf8str
		??	MOD: function inkeystr(#5)  or  function variants of get and getchar -> var a = get#5; ((ambiguous))
0		??	MOD: conversions with encode/decode: encode v_ref to idf; decode v_ref from idf; a=encode(str to idf); a=decode(str from idf)
			NEW: instruction 'help'
			MOD: dir "..." list no .filenames except if a match pattern is given
			MOD: convert text to idf [to idf] [...]
			MOD: find(<list>,<text>)
			MOD: mylist.name	=> allow reserved names after '.'
			MOD: %%VARNAME%% replacements in «..» strings?
			MOD: ~ and ! for lists
			MOD: file(): opt. 2nd parameter to specify encoding
			NEW: start for cgi without script => show env listing
			MOD: String(utf8str): String.Len() = strlen(utf8str)  =>  7bit ascii (or bogus latin-1) => fast copy

documentation:
			DOC: shell editor: error indication, history, colors,
			DOC: colors, and color examples
			DOC: split
			DOC: file name [=|#=] string
			DOC: include: now also function: included file now may return a result: var a = include filename
			DOC: call: was: exec; now also instruction:  call filename, argument, ...
			DOC: sys:  now also instruction
			DOC: eval: now also instruction
			DOC: installation
			DOC: preferences
			DOC: elif
			DOC: prio of monadic operators/prefixes ++, --, +, -, !, ~, @ in regard to following [] () or .
			DOC: try … else … then
			DOC: return values for shell script, cgi-script, sys, call and include
			DOC: String literals: «...» and across <nl>
			DOC: replaced instructions 'words', 'info', 'globals', 'pwd', 'dir' and 'cd' by shell commands
			DOC: shell command: 'env' to print beautified env data
			DOC: shell command: 'quit' / 'exit' / 'end' to quit vipsi
			DOC: function: 'this' to explicitly refer to proc.parent  (object, locals of enclosing proc)
			DOC: function: 'locals' to refer to local variables (instead of relying on the list's name)
			DOC: function: 'words'
			DOC: function: 'info "token"'
			DOC: findvar: scope of names; globals; locals; this.

planned for version > 1.0:

3			MOD: Execute(), Value(): operator=(): create target as late as possible => a={}; a[1]=a[5]=a[3]=a; => a={{},*,{},*,{}}
3			MOD: tNEW, tVAR: create target as late as possible.
3			MOD: tVAR: assume "target does not exist" even if it already exists => var a=a reads always a from outer context

			vip code interpreter with tokenize, reorder -> forth-style vip code with stack and heap
			will solve the following problems

			BUG: crash: deleting a variable in use: var a; proc bummer() { del a }; a=bummer();

			BUG: wrong result:  refvar(x) op sideeffect(x)  or  fu(refvar(x),sideeffect(x))













