// utf-8

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

______________________________________________
P	T	W	TYP: TASK
______________________________________________

bugs:
6	3	2.0	BUG: wrong error line no. after string literals with "\" line concatenation
4	2	2.0	BUG: fullpath("xy/z/") should require dir "z/" exists
2	4	0.5	BUG: main.cp: restore tty settings also on error exit.
1	5	0.2	BUG: internal: duplicate/delete proc's: Lock/Unlock NameHandles


major changes:
9	5	1.8	NEW: sema: global semaphor for synchronization between different scripts, e.g. cgi scripts
9	10	0.9	NEW: text[..] = ...
9	20	0.4	NEW: list[..] = ...
3	15	0.3	NEW: switch .. case .. default .. then
			MOD: no general automatic type casting
3			NEW: catch signals, e.g. ctrl-c
			MOD: option for long double numbers
			NEW: <list>[<text>]   opt. syntax for:   <list>.@<text>
			MOD: allow/require instruction syntax at place of instruction ((prob: 0 arg or 1++ args with '*'))
			MOD: <list>.<name>  	=>  allow reserved names after '.'
			MOD: <text>[-10 to -5]	=>  negative numbers from right ?
			MOD: proc foo(*){}  	=>  foo( a=22, b=33)  =>  assign names to '*' arguments  =>  similar to obj-C


the hook list:
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
3			NEW: wort für introspection, zb. version usw.
			NEW: access to own file name&path for scripts ((word for introspection))
			MOD: wenn bei fehlermeldungen die proc angegeben wird, den ganzen pfad bis excl. globals angeben


execute:
			MOD: call [#number,] ... as instruction: print result
			MOD: execute(): sys: set stderr to stderr_stream => enable redirection of stderr e.g. to file
			MOD: eval, sys, exec, call: nur als function  ((sobald functions als instructions ohne klammern gehen))
			MOD: include <fname> nur als instruction
			NEW: exec external_cmd asynchronously fully connected via pipes
			MOD: redirect stderr to stderr stream for ExecCmd()  -> rework of std stream handling required
			NEW: require "library:version"


files, streams, urls:
			MOD: link(): from/to utf8 ?
			MOD: in dir: flags[1] immer l für links
			MOD: exists file|dir|link: true, auch wenn falscher typ  <=> 'new' won't work
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
			MOD: dir: name list items to filename --> exists file ( dir("/usr/bin").vipsi )
			MOD: file(): opt. 2nd parameter to specify encoding
			IMP: count file/dir/env   w/o reading the whole file...
			MOD: pwd: convert broken utf8 path components to latin1, escape non-printables
4			NEW: ioctl() um Stream.error zu lesen, setzen, löschen
			MOD: dir "..." list no .filenames except if a match pattern is given, which may be "*"
1	2	0.5	IMP: Stream::SetWindowSize()
			NEW: convert file <fname> from|to <encoding>


convert:
			MOD: syntax: encode|decode(text,type) == convert(text to|from type)
			MOD: syntax: encode v_ref to idf; decode v_ref from idf; a=encode(str to idf); a=decode(str from idf)
			MOD: operator 'to' and 'from' ???
			NEW: MIME, BASE64, uuencode/decode, BinHex, quoted printable
			NEW: checksums, e.g. MD5, crc
			NEW: encryption/decryption, e.g. RSA
			MOD: chained: convert text to idf [to idf] [...]
			MOD: freeze/melt with convert to|from ice (and zip, gzip, zip2 usw.)

various:
			IMP: utf-8.cp: ucs4_char_to_upper/lower(): handle characters beyond UCS-2
			IMP: replace text,number,number  ((auto-conversion))
			IMP: replace <list>,old,new; (also function)
			NEW: replace file <fname>,old,new; (also function: not required)
			MOD: replace <text|list>, <list_old>, <list_new>

			NEW: typeof [value|file name]
			NEW: letter qualifiers: isletter, isdigit, ..  or:  is letter, is digit ?
			NEW: operator 'is' for classification:  <url> is file; <value> is text; <char> is letter

			MOD: string(text,options)			optional options: disass procs, quote|escape strings
			CHK: test: number == eval(string(number))  ??
			NEW: eval: quick test for simple literals

			MOD: number literals with more than 40 characters: String::NumVal()
			MOD: number literal 'abcdefghi' bis 8 stellen
			MOD: swap, shuffle, sort, rsort: move no names
			MOD: swap, shuffle, sort, rsort: optional paramater: names_too = 0|1
			MOD: match(text,liste[,opt])
			MOD: error on NaN; maybe: silent error (w/o exception, just create errorstr)
			NEW: join(list,sep)  as opposed to split()
5			NEW: errorstr, SetError or the like; e.g. word "error" which can be read and written like a var
			MOD: a?b:c  if called with accept_novalue then accept no value for b and c
			MOD: proc idf ( a, *, b ) { .. }  =>  '*' also not at end
5		??	NEW: quotedstr, unquotedstr, escapedstr, unescapedstr, toutf8str, fromutf8str
			MOD: list expansion also for comparisons and boolean operators
			MOD: ~ and ! for lists
			NEW: constants inf and nan -> eval etc. can re-read lists which contained them


internal:
1	3	0.3	MOD: tGKauf etc.  =>  tGKauf.dist  =>  faster skipping in proc definition and pruning operators
			MOD: handling of trailing NULLs in lists
			MOD: String(utf8str): String.Len() = strlen(utf8str)  =>  7bit ascii (or bogus latin-1) => fast copy
			MOD: convert from tabX is very slow
			MOD: replace is very slow for long texts and lots of replacements
			MOD: tokenize -> reorder -> optimize -> flat forth-style execution with stack and heap
				 => appl level dispatcher, save/reload entire state
			MOD: Trennung von Name und Wert; Variable = { *name, *wert, type }; Wert = { ref_cnt, Datum };
				 solves BUG: crash: deleting a variable in use: var a; proc bummer() { del a }; a=bummer();
				 solves BUG: wrong result:  refvar(x) op sideeffect(x)  or  fu(refvar(x),sideeffect(x))
			NEW: cache tokenized scripts in cache folder


cgi:
			MOD: in cgi-mode run as user = "owner of script" (not user apache) => prevent common exploits
			NEW: chroot basedir for cgi scripts for all file system calls
			NEW: start for cgi without script => vipsi shell with forms		((security?))
4	2	2.0	BUG: VScript::GetCGIArguments(): %ab auch für var-namen auswerten!
			NEW: option in prefs to disallow sys and exec

shell:
			MOD: globals: rework shell immediate instruction "globals"
			NEW: autocompletion of idfs and filenames in shell				((how? callback()?))
			NEW: <ctrl-left> and <ctrl+right> in command line  				((how?? i dont get the code!))
			NEW: help: instruction 'help'


platforms:
6	2	3.0	IMP: SystemIO.cp: VolumeFree() for _SOLARIS
8	4	2.0	IMP: VolumeFlags() for _LINUX und _SOLARIS
5	5	1.0	IMP: os_utilities.h: SysLoad() for systems without getloadavg()
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


install:
			NEW: test for gnutar, use gnutar for tar


documentation:



think over again:
			MOD: var: "var xyz" for an existing xyz should set it to 0.0 	((??really??!!))
			NEW: shell immediate command "mkdir"     			useful?
			MOD: call <name> ( args )
			MOD: sys <name> (args)
			MOD: exec <name> (args)
			MOD: %%VARNAME%% replacements in «..» strings?
			NEW: \ für Integerdivision?							((scheiß idee, den quoting char zu nehmen))
			MOD: put #tty: über nl immer auf stdout schalten  	((how: wrap at eol ohne 'nl' ?!?))
			NEW: postfix operators kB, MB and GB  				((1000 or 1024??))
			MOD: end foo(), return foo()  -->  accept void
			NEW: "proc(){..}"()  =>  compile and execute
			NEW: adate filename, cdate filename					useful?
			MOD: function inkeystr(#5)  or  function variants of get and getchar -> var a = get#5; ((ambiguous))
			MOD: var <variable> = <value>: create <variable> after evaluating <value>  ((req: reorder))
			MOD: operator=: create target as late as possible => a={}; a[1]=a[5]=a[3]=a; => a={{},*,{},*,{}}  ((req: reorder))


big chunks:
8	99	0.1	NEW: GUI
9	99	0.1	NEW: port to Windows
2	99	0.1	NEW: threads
5	99	0.1	NEW: debugger
















