// utf-8 P = priority: 1..9 T = estimated time [hours] W = weighted priority: P/T ______________________________________________ P T W TYP: TASK ______________________________________________ BUG: cgi file arguments { filename="", data="" } are "" and type locked if not present (--> zsam.cgi) zasm.cgi: if !exists src.filename || !exists src.data var src = { filename="", data="" } then TODO: sys( namestr, arglist ) --> zasm.cgi ??? mit gcc 4.0 gibts in Compile() Fehler: source_stack / target_stack mismatch mit gcc 3.3 ok BUG: bus error: openout#l,destdir#"log.txt" wenn destdir n.ex. BUG: bus error: sys ... und var x=sys(..) BUG: bus error: openout#l,"/pub/Develop/K1-Computer/Software/Mxxxxxxxxcode/mc/main_out/" ohne vorher put "..." BUG: string() --> named components with reserved names must be quoted! --> e.g. { @"sin"=2 } IMP: sys nimmt keine argument-LISTE! IMP: [==|!=] sollte auch mit elementen unterschiedlichen typs funktionieren BUG: exists Symbol(t).items.@w -> sagt "procedure required" wenn ….@w n.ex. BAD: datestr(mtime)[to 16] => [] refers to mtime! BAD: dir(...)[..] => dito BUG: trap: proc FOO(){ FOO ##= {1} } => terminate called after throwing an instance of 'InternalError' what(): in file "var.cp" line 1221: TRAP: IsNoList() BUG: proc x(){ var c="" ... c++ } => error refers to calling line "not a number" and is suppressed if it says log "" or s.th. else NEW: typeof MOD: man sollte nach . wirklich nicht auf keywords testen und meckern. MOD: del xx[a to b] sollte gehen BUG: convert to tab4: anzahl tabs manchmal 1 zu wenig BUG: errmsg: internal error. token = "prio" 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 BUG: cgi: method=post without any arguments => error: premature end of script ((vs. 0.9.1)) BUG: SystemIO.cp: GetVolumeInfo(): BSD (OSX): CDs/DVDs werden nicht angezeigt ((vs. 0.9.1)) BUG: shootout.BinaryTree: check += BottomUpTree(i, depth).Check() --> Check() doesn't find item Link BUG: return locals --> crash: var.cp in line 1187: TRAP: q.type_or_data_locked() && (q.data_is_locked() || q.get_type()!=isNumber ) 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: [] opt. syntax for: .@ MOD: allow/require instruction syntax at place of instruction ((prob: 0 arg or 1++ args with '*')) MOD: [-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 -> update real process env 1 6 0.2 NEW: prefs: assignment to prefs -> update user prefs file 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 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 from|to 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 ,old,new; (also function) NEW: replace file ,old,new; (also function: not required) MOD: replace , , NEW: typeof [value|file name] NEW: letter qualifiers: isletter, isdigit, .. or: is letter, is digit ? NEW: operator 'is' for classification: is file; is text; 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: usage of wspace around operators: don't split +++ in ++ and +; xyz++ is post, ++xyz is pre => if a ++a then will work MOD: a[*] = b[3 to 10] * c; a[2 to 3,i]; a[*,2]; usw. MOD: swap 2-dim lists: transpose matrix 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 by default, but optional parameter: names_too = 0|1 MOD: match(text,liste[,opt]) MOD: error on NaN; maybe: silent error (w/o exception, just create errorstr) 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 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: and 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: putback 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 ( args ) MOD: sys (args) MOD: exec (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 = : create after evaluating ((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