package proxy; use diagnostics; use strict; use run_program; use common; use log; use c; sub main { my ($prefix, $in) = @_; my $proxy_cfg = {}; my $config_file = "$prefix/usr/lib/wgetrc"; # grab current config foreach (cat_($config_file)) { /http_proxy = (http:.*):(\d+)/ and ($proxy_cfg->{http_url}, $proxy_cfg->{http_port}) = ($1, $2); /ftp_proxy = (ftp:.*):(\d+)/ and ($proxy_cfg->{ftp_url}, $proxy_cfg->{ftp_port}) = ($1, $2); /http_user = (.*)/ and ($proxy_cfg->{login}) = $1; if (/http_passwd = (.*)/) { ($proxy_cfg->{passwd}) = $1; ($proxy_cfg->{passwd2}) = $1; } } begin: $::isWizard = 1; $::Wizard_no_previous = 1; $in->ask_okcancel(_("Proxy configuration"), _("Welcome to the proxy configuration utility.\n\nHere, you'll be able to set up your http and ftp proxies\nwith or without login and password\n" ), 1); # http proxy step_http_proxy: undef $::Wizard_no_previous; $proxy_cfg->{http_url} ||= "http://www.proxy.com/"; $in->ask_from(_("Proxy configuration"), _("Please fill in the http proxy informations\nLeave it blank if you don't want an http proxy"), [ { label => _("URL"), val => \$proxy_cfg->{http_url} }, { label => _("port"), val => \$proxy_cfg->{http_port} } ], complete => sub { if ($proxy_cfg->{http_url} && $proxy_cfg->{http_url} !~ /^http:/) { $in->ask_warn('', _("Url should begin with 'http:'")); return (1,0); } if ($proxy_cfg->{http_port} && $proxy_cfg->{http_port} !~ /^\d+$/) { $in->ask_warn('', _("The port part should be numeric")); return (1,1); } 0; } ) or goto begin; # ftp proxy step_ftp_proxy: $proxy_cfg->{ftp_url} ||= "ftp://ftp.proxy.com/"; $in->ask_from(_("Proxy configuration"), _("Please fill in the ftp proxy informations\nLeave it blank if you don't want an ftp proxy"), [ { label => _("URL"), val => \$proxy_cfg->{ftp_url} }, { label => _("port"), val => \$proxy_cfg->{ftp_port} } ], complete => sub { if ($proxy_cfg->{ftp_url} && $proxy_cfg->{ftp_url} !~ /^ftp:/) { $in->ask_warn('', _("Url should begin with 'ftp:'")); return (1,0); } if ($proxy_cfg->{ftp_port} && $proxy_cfg->{ftp_port} !~ /^\d+$/) { $in->ask_warn('', _("The port part should be numeric")); return (1,1); } 0; } ) or goto step_http_proxy; # proxy login/passwd step_login: $in->ask_from(_("Proxy configuration"), _("Please enter proxy login and password, if any.\nLeave it blank if you don't want login/passwd"), [ { label => _("login"), val => \$proxy_cfg->{login} }, { label => _("password"), val => \$proxy_cfg->{passwd}, hidden => 1 }, { label => _("re-type password"), val => \$proxy_cfg->{passwd2}, hidden => 1 } ], complete => sub { if ($proxy_cfg->{passwd} ne $proxy_cfg->{passwd2}) { $in->ask_warn('', _("The passwords don't match. Try again!")); return(1,1); } 0; } ) or goto step_ftp_proxy; # save config substInFile { s/^(http|ftp)_proxy.*\n//; eof and $_ .= "http_proxy = $proxy_cfg->{http_url}:$proxy_cfg->{http_port} ftp_proxy = $proxy_cfg->{ftp_url}:$proxy_cfg->{ftp_port}\n"; } $config_file; $proxy_cfg->{login} and substInFile { s/^http_(user|passwd).*\n//; eof and $_ .= "http_user = $proxy_cfg->{login} http_passwd = $proxy_cfg->{passwd}\n" } $config_file; log::l("[drakproxy] Installation complete, exiting\n"); } #--------------------------------------------- # WONDERFULL pad #--------------------------------------------- 1; esignWork'>user/animtim/designWork</option> <option value='user/colin/rescue-systemd'>user/colin/rescue-systemd</option> <option value='user/ennael/mga6'>user/ennael/mga6</option> <option value='user/erwan/bug-13680'>user/erwan/bug-13680</option> <option value='user/jibz/aarch64'>user/jibz/aarch64</option> <option value='user/martinw/mga6'>user/martinw/mga6</option> <option value='user/pterjan/arm64'>user/pterjan/arm64</option> </select> <input type='submit' value='switch'/></form></td></tr> <tr><td class='sub'>Mageia Installer and base platform for many utilities</td><td class='sub right'>Thierry Vignaud [tv]</td></tr></table> <table class='tabs'><tr><td> <a href='/software/drakx/?h=drakx-installer-images-2.88'>summary</a><a href='/software/drakx/refs/?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>refs</a><a href='/software/drakx/log/?h=drakx-installer-images-2.88'>log</a><a href='/software/drakx/tree/?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>tree</a><a class='active' href='/software/drakx/commit/?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>commit</a><a href='/software/drakx/diff/?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>diff</a><a href='/software/drakx/stats/?h=drakx-installer-images-2.88'>stats</a></td><td class='form'><form class='right' method='get' action='/software/drakx/log/'> <input type='hidden' name='h' value='drakx-installer-images-2.88'/><input type='hidden' name='id' value='98a18b797c63ea9baab31768ed720ad32c0004e8'/><select name='qt'> <option value='grep'>log msg</option> <option value='author'>author</option> <option value='committer'>committer</option> <option value='range'>range</option> </select> <input class='txt' type='search' size='10' name='q' value=''/> <input type='submit' value='search'/> </form> </td></tr></table> <div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='h' value='drakx-installer-images-2.88'/><input type='hidden' name='id' value='98a18b797c63ea9baab31768ed720ad32c0004e8'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><table summary='commit info' class='commit-info'> <tr><th>author</th><td>Guillaume Cottenceau <gc@mandriva.com></td><td class='right'>2001-05-14 21:47:42 +0000</td></tr> <tr><th>committer</th><td>Guillaume Cottenceau <gc@mandriva.com></td><td class='right'>2001-05-14 21:47:42 +0000</td></tr> <tr><th>commit</th><td colspan='2' class='sha1'><a href='/software/drakx/commit/?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>98a18b797c63ea9baab31768ed720ad32c0004e8</a> (<a href='/software/drakx/patch/?id=98a18b797c63ea9baab31768ed720ad32c0004e8'>patch</a>)</td></tr> <tr><th>tree</th><td colspan='2' class='sha1'><a href='/software/drakx/tree/?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>2d8b0d9e845b332060ac668a429ef65ca4c47ed1</a></td></tr> <tr><th>parent</th><td colspan='2' class='sha1'><a href='/software/drakx/commit/?h=drakx-installer-images-2.88&id=12cf594c688f3bc3e0b26d35305d5d6db7036fc4'>12cf594c688f3bc3e0b26d35305d5d6db7036fc4</a> (<a href='/software/drakx/diff/?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8&id2=12cf594c688f3bc3e0b26d35305d5d6db7036fc4'>diff</a>)</td></tr><tr><th>download</th><td colspan='2' class='sha1'><a href='/software/drakx/snapshot/drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar'>drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar</a><br/><a href='/software/drakx/snapshot/drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar.gz'>drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar.gz</a><br/><a href='/software/drakx/snapshot/drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar.bz2'>drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar.bz2</a><br/><a href='/software/drakx/snapshot/drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar.xz'>drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar.xz</a><br/><a href='/software/drakx/snapshot/drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.zip'>drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.zip</a><br/></td></tr></table> <div class='commit-subject'>i can compile slang and newt with dietlibc now</div><div class='commit-msg'></div><div class='diffstat-header'><a href='/software/drakx/diff/?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>Diffstat</a></div><table summary='diffstat' class='diffstat'><tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/software/drakx/diff/mdk-stage1/Makefile?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/Makefile</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/software/drakx/diff/mdk-stage1/newt-frontend.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt-frontend.c</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/Makefile?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/Makefile</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/button.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/button.c</a></td><td class='right'>190</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/buttonbar.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/buttonbar.c</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/checkbox.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/checkbox.c</a></td><td class='right'>290</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.8%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/checkboxtree.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/checkboxtree.c</a></td><td class='right'>714</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/entry.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/entry.c</a></td><td class='right'>376</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.2%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/form.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/form.c</a></td><td class='right'>712</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.2%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/grid.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/grid.c</a></td><td class='right'>389</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.0%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/label.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/label.c</a></td><td class='right'>81</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/listbox.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/listbox.c</a></td><td class='right'>752</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 86.4%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/newt.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/newt.c</a></td><td class='right'>672</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.9%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/newt.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/newt.h</a></td><td class='right'>362</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.5%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/newt_pr.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/newt_pr.h</a></td><td class='right'>82</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/scale.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/scale.c</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/scrollbar.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/scrollbar.c</a></td><td class='right'>124</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/textbox.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/textbox.c</a></td><td class='right'>409</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.6%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/windows.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/windows.c</a></td><td class='right'>275</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.0%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/Makefile?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/Makefile</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/_slang.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/_slang.h</a></td><td class='right'>743</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 86.6%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/config.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/config.h</a></td><td class='right'>163</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/jdmacros.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/jdmacros.h</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/keywhash.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/keywhash.c</a></td><td class='right'>190</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sl-feat.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sl-feat.h</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slang.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slang.c</a></td><td class='right'>5547</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 100.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 0.0%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slang.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slang.h</a></td><td class='right'>1930</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 34.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 65.2%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slarith.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarith.c</a></td><td class='right'>1656</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 29.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 70.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slarith.inc?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarith.inc</a></td><td class='right'>783</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 14.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 85.9%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slarray.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarray.c</a></td><td class='right'>3139</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 56.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 43.4%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slarrfun.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarrfun.c</a></td><td class='right'>464</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.6%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slarrfun.inc?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarrfun.inc</a></td><td class='right'>257</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slarrmis.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarrmis.c</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slassoc.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slassoc.c</a></td><td class='right'>713</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slbstr.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slbstr.c</a></td><td class='right'>615</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 11.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 88.9%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slclass.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slclass.c</a></td><td class='right'>1391</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 25.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 74.9%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slcmd.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcmd.c</a></td><td class='right'>351</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.7%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slcmplex.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcmplex.c</a></td><td class='right'>1142</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 20.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 79.4%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slcompat.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcompat.c</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slcurses.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcurses.c</a></td><td class='right'>972</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 17.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 82.5%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slcurses.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcurses.h</a></td><td class='right'>353</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.6%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sldisply.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sldisply.c</a></td><td class='right'>2596</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 46.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 53.2%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slerr.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slerr.c</a></td><td class='right'>181</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.7%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slerrno.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slerrno.c</a></td><td class='right'>219</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slgetkey.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slgetkey.c</a></td><td class='right'>306</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.5%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slimport.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slimport.c</a></td><td class='right'>281</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.9%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slinclud.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slinclud.h</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slintall.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slintall.c</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slistruc.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slistruc.c</a></td><td class='right'>218</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slkeymap.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slkeymap.c</a></td><td class='right'>596</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 89.3%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slkeypad.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slkeypad.c</a></td><td class='right'>163</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sllimits.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sllimits.h</a></td><td class='right'>64</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmalloc.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmalloc.c</a></td><td class='right'>165</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.0%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmath.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmath.c</a></td><td class='right'>565</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 89.8%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmemchr.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemchr.c</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmemcmp.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemcmp.c</a></td><td class='right'>76</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmemcpy.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemcpy.c</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmemset.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemset.c</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmisc.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmisc.c</a></td><td class='right'>330</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slnspace.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slnspace.c</a></td><td class='right'>242</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.6%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slospath.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slospath.c</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slpack.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slpack.c</a></td><td class='right'>785</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 14.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 85.8%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slparse.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slparse.c</a></td><td class='right'>1970</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 35.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 64.5%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slpath.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slpath.c</a></td><td class='right'>344</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.8%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slposdir.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slposdir.c</a></td><td class='right'>1057</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 19.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 80.9%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slposio.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slposio.c</a></td><td class='right'>568</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 89.8%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slprepr.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slprepr.c</a></td><td class='right'>427</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.3%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slproc.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slproc.c</a></td><td class='right'>155</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.2%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slregexp.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slregexp.c</a></td><td class='right'>935</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 16.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 83.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slrline.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slrline.c</a></td><td class='right'>836</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 15.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 84.9%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slscanf.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slscanf.c</a></td><td class='right'>718</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slscroll.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slscroll.c</a></td><td class='right'>450</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.9%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slsearch.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slsearch.c</a></td><td class='right'>239</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.7%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slsignal.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slsignal.c</a></td><td class='right'>336</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.9%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slsmg.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slsmg.c</a></td><td class='right'>1584</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 28.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 71.4%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slstd.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstd.c</a></td><td class='right'>724</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 86.9%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slstdio.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstdio.c</a></td><td class='right'>1050</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 18.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 81.1%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slstring.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstring.c</a></td><td class='right'>546</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 90.2%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slstrops.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstrops.c</a></td><td class='right'>1686</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 30.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 69.6%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slstruct.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstruct.c</a></td><td class='right'>932</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 16.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 83.2%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sltermin.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltermin.c</a></td><td class='right'>1155</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 20.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 79.2%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sltime.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltime.c</a></td><td class='right'>310</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.4%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sltoken.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltoken.c</a></td><td class='right'>1702</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 30.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 69.3%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sltypes.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltypes.c</a></td><td class='right'>966</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 17.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 82.6%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slutty.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slutty.c</a></td><td class='right'>596</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 89.3%;'/></tr></table></td></tr> <tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slxstrng.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slxstrng.c</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr> </table><div class='diffstat-summary'>86 files changed, 52622 insertions, 13 deletions</div><table summary='diff' class='diff'><tr><td><div class='head'>diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile<br/>index 9a3ecae43..96eade486 100644<br/>--- a/<a href='/software/drakx/tree/mdk-stage1/Makefile?h=drakx-installer-images-2.88&id=12cf594c688f3bc3e0b26d35305d5d6db7036fc4'>mdk-stage1/Makefile</a><br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/Makefile?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/Makefile</a></div><div class='hunk'>@@ -47,22 +47,17 @@ INITOBJS = $(subst .c,.o,$(INITSRC))</div><div class='ctx'> </div><div class='ctx'> #- frontends</div><div class='ctx'> NEWT_FRONTEND_SRC = newt-frontend.c</div><div class='del'>-NEWT_FRONTEND_LIBS = /usr/lib/libnewt.a /usr/lib/libslang.a</div><div class='add'>+GLIBC_NEWT_FRONTEND_LIBS = newt/libnewt.a slang/libslang.a</div><div class='add'>+DIETLIBC_NEWT_FRONTEND_LIBS = $(subst .a,-DIET.a,$(GLIBC_NEWT_FRONTEND_LIBS))</div><div class='ctx'> </div><div class='ctx'> STDIO_FRONTEND_SRC = stdio-frontend.c</div><div class='del'>-STDIO_FRONTEND_LIBS =</div><div class='add'>+GLIBC_STDIO_FRONTEND_LIBS =</div><div class='add'>+DIETLIBC_STDIO_FRONTEND_LIBS =</div><div class='ctx'> </div><div class='ctx'> </div><div class='ctx'> FRONTEND_OBJS = $(subst .c,.o,$($(F)_FRONTEND_SRC))</div><div class='del'>-FRONTEND_LIBS = $($(F)_FRONTEND_LIBS)</div><div class='ctx'> </div><div class='del'>-FRONTEND_LINK = $(FRONTEND_OBJS) $(FRONTEND_LIBS)</div><div class='del'>-</div><div class='del'>-ifeq (DIETLIBC, $(L))</div><div class='del'>-ifeq (NEWT, $(F))</div><div class='del'>-FRONTEND_LINK = $(subst .c,.o,$(STDIO_FRONTEND_SRC)) $(STDIO_FRONTEND_LIBS)</div><div class='del'>-endif</div><div class='del'>-endif</div><div class='add'>+FRONTEND_LINK = $(FRONTEND_OBJS) $($(L)_$(F)_FRONTEND_LIBS)</div><div class='ctx'> </div><div class='ctx'> ifeq (i386, $(ARCH))</div><div class='ctx'> INSMOD = insmod-busybox</div><div class='hunk'>@@ -71,7 +66,7 @@ INSMOD = insmod-modutils</div><div class='ctx'> endif</div><div class='ctx'> </div><div class='ctx'> GLIBC_STAGE1_OWN_LIBS = $(INSMOD)/libinsmod.a mar/libmar.a bzlib/libbzlib.a</div><div class='del'>-DIETLIBC_STAGE1_OWN_LIBS = $(INSMOD)/libinsmod-DIET.a mar/libmar-DIET.a bzlib/libbzlib-DIET.a</div><div class='add'>+DIETLIBC_STAGE1_OWN_LIBS = $(subst .a,-DIET.a,$(GLIBC_STAGE1_OWN_LIBS))</div><div class='ctx'> STAGE1_OWN_LIBS = $($(L)_STAGE1_OWN_LIBS)</div><div class='ctx'> </div><div class='ctx'> </div><div class='hunk'>@@ -125,7 +120,7 @@ BINS += stage1-cdrom stage1-disk stage1-network</div><div class='ctx'> endif</div><div class='ctx'> </div><div class='ctx'> </div><div class='del'>-DIRS = dietlibc mar pci-resource bzlib $(INSMOD)</div><div class='add'>+DIRS = dietlibc mar pci-resource bzlib $(INSMOD) slang newt</div><div class='ctx'> ifeq (i386,$(ARCH))</div><div class='ctx'> DIRS += pcmcia</div><div class='ctx'> endif</div><div class='head'>diff --git a/mdk-stage1/newt-frontend.c b/mdk-stage1/newt-frontend.c<br/>index 85f56ec10..867a6d7f1 100644<br/>--- a/<a href='/software/drakx/tree/mdk-stage1/newt-frontend.c?h=drakx-installer-images-2.88&id=12cf594c688f3bc3e0b26d35305d5d6db7036fc4'>mdk-stage1/newt-frontend.c</a><br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt-frontend.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt-frontend.c</a></div><div class='hunk'>@@ -33,7 +33,7 @@</div><div class='ctx'> #include <sys/time.h></div><div class='ctx'> #include "stage1.h"</div><div class='ctx'> #include "log.h"</div><div class='del'>-#include "newt.h"</div><div class='add'>+#include "newt/newt.h"</div><div class='ctx'> </div><div class='ctx'> #include "frontend.h"</div><div class='ctx'> </div><div class='head'>diff --git a/mdk-stage1/newt/Makefile b/mdk-stage1/newt/Makefile<br/>new file mode 100644<br/>index 000000000..c4e6a7207<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/Makefile?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/Makefile</a></div><div class='hunk'>@@ -0,0 +1,49 @@</div><div class='add'>+ #******************************************************************************</div><div class='add'>+ #</div><div class='add'>+ # Guillaume Cottenceau (gc@mandrakesoft.com)</div><div class='add'>+ #</div><div class='add'>+ # Copyright 2000 MandrakeSoft</div><div class='add'>+ #</div><div class='add'>+ # This software may be freely redistributed under the terms of the GNU</div><div class='add'>+ # public license.</div><div class='add'>+ #</div><div class='add'>+ # You should have received a copy of the GNU General Public License</div><div class='add'>+ # along with this program; if not, write to the Free Software</div><div class='add'>+ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.</div><div class='add'>+ #</div><div class='add'>+ #*****************************************************************************</div><div class='add'>+</div><div class='add'>+top_dir = ..</div><div class='add'>+</div><div class='add'>+include $(top_dir)/Makefile.common</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+all: libnewt.a libnewt-DIET.a</div><div class='add'>+</div><div class='add'>+clean:</div><div class='add'>+ rm -f *.o *.a</div><div class='add'>+</div><div class='add'>+FLAGS = -Wall -Werror -Os -fomit-frame-pointer -DVERSION=\"0.50.19\" -c</div><div class='add'>+</div><div class='add'>+INCS = -I../slang</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+OBJS = newt.o button.o form.o checkbox.o entry.o label.o listbox.o scrollbar.o textbox.o scale.o grid.o windows.o buttonbar.o checkboxtree.o</div><div class='add'>+OBJS-DIET = $(subst .o,-DIET.o,$(OBJS))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+libnewt.a: $(OBJS)</div><div class='add'>+ ar -cru $@ $^</div><div class='add'>+ ranlib $@</div><div class='add'>+</div><div class='add'>+libnewt-DIET.a: $(OBJS-DIET)</div><div class='add'>+ ar -cru $@ $^</div><div class='add'>+ ranlib $@</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+$(OBJS): %.o: %.c</div><div class='add'>+ gcc $(FLAGS) $(GLIBC_INCLUDES) $(INCS) -c $< -o $@</div><div class='add'>+</div><div class='add'>+$(OBJS-DIET): %-DIET.o: %.c</div><div class='add'>+ gcc $(FLAGS) $(DIETLIBC_INCLUDES) $(INCS) -c $< -o $@</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/newt/button.c b/mdk-stage1/newt/button.c<br/>new file mode 100644<br/>index 000000000..1ff360dc5<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/button.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/button.c</a></div><div class='hunk'>@@ -0,0 +1,190 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct button {</div><div class='add'>+ char * text;</div><div class='add'>+ int compact;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void buttonDrawIt(newtComponent co, int active, int pushed);</div><div class='add'>+static void buttonDrawText(newtComponent co, int active, int pushed);</div><div class='add'>+</div><div class='add'>+static void buttonDraw(newtComponent c);</div><div class='add'>+static void buttonDestroy(newtComponent co);</div><div class='add'>+static struct eventResult buttonEvent(newtComponent c,</div><div class='add'>+ struct event ev);</div><div class='add'>+static void buttonPlace(newtComponent co, int newLeft, int newTop);</div><div class='add'>+</div><div class='add'>+static struct componentOps buttonOps = {</div><div class='add'>+ buttonDraw,</div><div class='add'>+ buttonEvent,</div><div class='add'>+ buttonDestroy,</div><div class='add'>+ buttonPlace,</div><div class='add'>+ newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+static newtComponent createButton(int left, int row, const char * text, int compact) {</div><div class='add'>+ newtComponent co;</div><div class='add'>+ struct button * bu;</div><div class='add'>+</div><div class='add'>+ co = malloc(sizeof(*co));</div><div class='add'>+ bu = malloc(sizeof(struct button));</div><div class='add'>+ co->data = bu;</div><div class='add'>+</div><div class='add'>+ bu->text = strdup(text);</div><div class='add'>+ bu->compact = compact;</div><div class='add'>+ co->ops = &buttonOps;</div><div class='add'>+</div><div class='add'>+ if (bu->compact) {</div><div class='add'>+ co->height = 1;</div><div class='add'>+ co->width = strlen(text) + 3;</div><div class='add'>+ } else {</div><div class='add'>+ co->height = 4;</div><div class='add'>+ co->width = strlen(text) + 5;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ co->top = row;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+ co->isMapped = 0;</div><div class='add'>+</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+</div><div class='add'>+ return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtCompactButton(int left, int row, const char * text) {</div><div class='add'>+ return createButton(left, row, text, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtButton(int left, int row, const char * text) {</div><div class='add'>+ return createButton(left, row, text, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void buttonDestroy(newtComponent co) {</div><div class='add'>+ struct button * bu = co->data;</div><div class='add'>+</div><div class='add'>+ free(bu->text);</div><div class='add'>+ free(bu);</div><div class='add'>+ free(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void buttonPlace(newtComponent co, int newLeft, int newTop) {</div><div class='add'>+ co->top = newTop;</div><div class='add'>+ co->left = newLeft;</div><div class='add'>+</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void buttonDraw(newtComponent co) {</div><div class='add'>+ buttonDrawIt(co, 0, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void buttonDrawIt(newtComponent co, int active, int pushed) {</div><div class='add'>+ struct button * bu = co->data;</div><div class='add'>+</div><div class='add'>+ if (!co->isMapped) return;</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_BUTTON);</div><div class='add'>+</div><div class='add'>+ if (bu->compact) {</div><div class='add'>+ if (active)</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_COMPACTBUTTON);</div><div class='add'>+ else</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_BUTTON);</div><div class='add'>+ newtGotorc(co->top+ pushed, co->left + 1 + pushed);</div><div class='add'>+ SLsmg_write_char('<');</div><div class='add'>+ SLsmg_write_string(bu->text);</div><div class='add'>+ SLsmg_write_char('>');</div><div class='add'>+ } else {</div><div class='add'>+ if (pushed) {</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_BUTTON);</div><div class='add'>+ newtDrawBox(co->left + 1, co->top + 1, co->width - 1, 3, 0);</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_WINDOW);</div><div class='add'>+ newtClearBox(co->left, co->top, co->width, 1);</div><div class='add'>+ newtClearBox(co->left, co->top, 1, co->height);</div><div class='add'>+ } else {</div><div class='add'>+ newtDrawBox(co->left, co->top, co->width - 1, 3, 1);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ buttonDrawText(co, active, pushed);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void buttonDrawText(newtComponent co, int active, int pushed) {</div><div class='add'>+ struct button * bu = co->data;</div><div class='add'>+</div><div class='add'>+ if (pushed) pushed = 1;</div><div class='add'>+</div><div class='add'>+ if (active)</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_ACTBUTTON);</div><div class='add'>+ else</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_BUTTON);</div><div class='add'>+</div><div class='add'>+ newtGotorc(co->top + 1 + pushed, co->left + 1 + pushed);</div><div class='add'>+ SLsmg_write_char(' ');</div><div class='add'>+ SLsmg_write_string(bu->text);</div><div class='add'>+ SLsmg_write_char(' ');</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult buttonEvent(newtComponent co,</div><div class='add'>+ struct event ev) {</div><div class='add'>+ struct eventResult er;</div><div class='add'>+ struct button * bu = co->data;</div><div class='add'>+</div><div class='add'>+ if (ev.when == EV_NORMAL) {</div><div class='add'>+ switch (ev.event) {</div><div class='add'>+ case EV_FOCUS:</div><div class='add'>+ buttonDrawIt(co, 1, 0);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EV_UNFOCUS:</div><div class='add'>+ buttonDrawIt(co, 0, 0);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EV_KEYPRESS:</div><div class='add'>+ if (ev.u.key == ' ' || ev.u.key == '\r') {</div><div class='add'>+ if (!bu->compact) {</div><div class='add'>+ /* look pushed */</div><div class='add'>+ buttonDrawIt(co, 1, 1);</div><div class='add'>+ newtRefresh();</div><div class='add'>+ newtDelay(150000);</div><div class='add'>+ buttonDrawIt(co, 1, 0);</div><div class='add'>+ newtRefresh();</div><div class='add'>+ newtDelay(150000);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ er.result = ER_EXITFORM;</div><div class='add'>+ } else</div><div class='add'>+ er.result = ER_IGNORED;</div><div class='add'>+ break;</div><div class='add'>+ case EV_MOUSE:</div><div class='add'>+ if (ev.u.mouse.type == MOUSE_BUTTON_DOWN &&</div><div class='add'>+ co->top <= ev.u.mouse.y &&</div><div class='add'>+ co->top + co->height - !bu->compact > ev.u.mouse.y &&</div><div class='add'>+ co->left <= ev.u.mouse.x &&</div><div class='add'>+ co->left + co->width - !bu->compact > ev.u.mouse.x) {</div><div class='add'>+ if (!bu->compact) {</div><div class='add'>+ buttonDrawIt(co, 1, 1);</div><div class='add'>+ newtRefresh();</div><div class='add'>+ newtDelay(150000);</div><div class='add'>+ buttonDrawIt(co, 1, 0);</div><div class='add'>+ newtRefresh();</div><div class='add'>+ newtDelay(150000);</div><div class='add'>+ }</div><div class='add'>+ er.result = ER_EXITFORM;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ } else</div><div class='add'>+ er.result = ER_IGNORED;</div><div class='add'>+</div><div class='add'>+ return er;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/buttonbar.c b/mdk-stage1/newt/buttonbar.c<br/>new file mode 100644<br/>index 000000000..45473c9d2<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/buttonbar.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/buttonbar.c</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#include <stdarg.h></div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+</div><div class='add'>+/* if they try and pack more then 50 buttons, screw 'em */</div><div class='add'>+newtGrid newtButtonBarv(char * button1, newtComponent * b1comp, va_list args) {</div><div class='add'>+ newtGrid grid;</div><div class='add'>+ struct buttonInfo {</div><div class='add'>+ char * name;</div><div class='add'>+ newtComponent * compPtr;</div><div class='add'>+ } buttons[50];</div><div class='add'>+ int num;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ buttons[0].name = button1, buttons[0].compPtr = b1comp, num = 1;</div><div class='add'>+ while (1) {</div><div class='add'>+ buttons[num].name = va_arg(args, char *);</div><div class='add'>+ if (!buttons[num].name) break;</div><div class='add'>+ buttons[num].compPtr = va_arg(args, newtComponent *);</div><div class='add'>+ num++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ grid = newtCreateGrid(num, 1);</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < num; i++) {</div><div class='add'>+ *buttons[i].compPtr = newtButton(-1, -1, buttons[i].name);</div><div class='add'>+ newtGridSetField(grid, i, 0, NEWT_GRID_COMPONENT, </div><div class='add'>+ *buttons[i].compPtr,</div><div class='add'>+ num ? 1 : 0, 0, 0, 0, 0, 0);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtButtonBar(char * button1, newtComponent * b1comp, ...) {</div><div class='add'>+ va_list args;</div><div class='add'>+ newtGrid grid;</div><div class='add'>+</div><div class='add'>+ va_start(args, b1comp);</div><div class='add'>+</div><div class='add'>+ grid = newtButtonBarv(button1, b1comp, args);</div><div class='add'>+</div><div class='add'>+ va_end(args);</div><div class='add'>+ </div><div class='add'>+ return grid;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/checkbox.c b/mdk-stage1/newt/checkbox.c<br/>new file mode 100644<br/>index 000000000..eee514c98<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/checkbox.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/checkbox.c</a></div><div class='hunk'>@@ -0,0 +1,290 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+enum type { CHECK, RADIO };</div><div class='add'>+</div><div class='add'>+struct checkbox {</div><div class='add'>+ char * text;</div><div class='add'>+ char * seq;</div><div class='add'>+ char * result;</div><div class='add'>+ newtComponent prevButton, lastButton;</div><div class='add'>+ enum type type;</div><div class='add'>+ char value;</div><div class='add'>+ int active, inactive;</div><div class='add'>+ const void * data;</div><div class='add'>+ int flags;</div><div class='add'>+ int hasFocus;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void makeActive(newtComponent co);</div><div class='add'>+</div><div class='add'>+static void cbDraw(newtComponent c);</div><div class='add'>+static void cbDestroy(newtComponent co);</div><div class='add'>+struct eventResult cbEvent(newtComponent co, struct event ev);</div><div class='add'>+</div><div class='add'>+static struct componentOps cbOps = {</div><div class='add'>+ cbDraw,</div><div class='add'>+ cbEvent,</div><div class='add'>+ cbDestroy,</div><div class='add'>+ newtDefaultPlaceHandler,</div><div class='add'>+ newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+newtComponent newtRadiobutton(int left, int top, const char * text, int isDefault,</div><div class='add'>+ newtComponent prevButton) {</div><div class='add'>+ newtComponent co;</div><div class='add'>+ newtComponent curr;</div><div class='add'>+ struct checkbox * rb;</div><div class='add'>+ char initialValue;</div><div class='add'>+</div><div class='add'>+ if (isDefault)</div><div class='add'>+ initialValue = '*';</div><div class='add'>+ else</div><div class='add'>+ initialValue = ' ';</div><div class='add'>+</div><div class='add'>+ co = newtCheckbox(left, top, text, initialValue, " *", NULL);</div><div class='add'>+ rb = co->data;</div><div class='add'>+ rb->type = RADIO;</div><div class='add'>+</div><div class='add'>+ rb->prevButton = prevButton;</div><div class='add'>+</div><div class='add'>+ for (curr = co; curr; curr = rb->prevButton) {</div><div class='add'>+ rb = curr->data;</div><div class='add'>+ rb->lastButton = co;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtRadioGetCurrent(newtComponent setMember) {</div><div class='add'>+ struct checkbox * rb = setMember->data;</div><div class='add'>+</div><div class='add'>+ setMember = rb->lastButton;</div><div class='add'>+ rb = setMember->data;</div><div class='add'>+</div><div class='add'>+ while (rb && rb->value != '*') {</div><div class='add'>+ setMember = rb->prevButton;</div><div class='add'>+ if (!setMember)</div><div class='add'>+ return NULL;</div><div class='add'>+ rb = setMember->data;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return setMember;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char newtCheckboxGetValue(newtComponent co) {</div><div class='add'>+ struct checkbox * cb = co->data;</div><div class='add'>+</div><div class='add'>+ return cb->value;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCheckboxSetValue(newtComponent co, char value) {</div><div class='add'>+ struct checkbox * cb = co->data;</div><div class='add'>+</div><div class='add'>+ *cb->result = value;</div><div class='add'>+ cbDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtCheckbox(int left, int top, const char * text, char defValue,</div><div class='add'>+ const char * seq, char * result) {</div><div class='add'>+ newtComponent co;</div><div class='add'>+ struct checkbox * cb;</div><div class='add'>+</div><div class='add'>+ if (!seq) seq = " *";</div><div class='add'>+</div><div class='add'>+ co = malloc(sizeof(*co));</div><div class='add'>+ cb = malloc(sizeof(struct checkbox));</div><div class='add'>+ co->data = cb;</div><div class='add'>+ cb->flags = 0;</div><div class='add'>+ if (result)</div><div class='add'>+ cb->result = result;</div><div class='add'>+ else</div><div class='add'>+ cb->result = &cb->value;</div><div class='add'>+</div><div class='add'>+ cb->text = strdup(text);</div><div class='add'>+ cb->seq = strdup(seq);</div><div class='add'>+ cb->type = CHECK;</div><div class='add'>+ cb->hasFocus = 0;</div><div class='add'>+ cb->inactive = COLORSET_CHECKBOX;</div><div class='add'>+ cb->active = COLORSET_ACTCHECKBOX;</div><div class='add'>+ defValue ? (*cb->result = defValue) : (*cb->result = cb->seq[0]);</div><div class='add'>+</div><div class='add'>+ co->ops = &cbOps;</div><div class='add'>+</div><div class='add'>+ co->callback = NULL;</div><div class='add'>+ co->height = 1;</div><div class='add'>+ co->width = strlen(text) + 4;</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+</div><div class='add'>+ return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCheckboxSetFlags(newtComponent co, int flags, enum newtFlagsSense sense) {</div><div class='add'>+ struct checkbox * cb = co->data;</div><div class='add'>+ int row, col;</div><div class='add'>+</div><div class='add'>+ cb->flags = newtSetFlags(cb->flags, flags, sense);</div><div class='add'>+</div><div class='add'>+ if (!(cb->flags & NEWT_FLAG_DISABLED))</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+ else</div><div class='add'>+ co->takesFocus = 0;</div><div class='add'>+</div><div class='add'>+ newtGetrc(&row, &col);</div><div class='add'>+ cbDraw(co);</div><div class='add'>+ newtGotorc(row, col);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void cbDraw(newtComponent c) {</div><div class='add'>+ struct checkbox * cb = c->data;</div><div class='add'>+</div><div class='add'>+ if (c->top == -1 || !c->isMapped) return;</div><div class='add'>+</div><div class='add'>+ if (cb->flags & NEWT_FLAG_DISABLED) {</div><div class='add'>+ cb->inactive = NEWT_COLORSET_DISENTRY;</div><div class='add'>+ cb->active = NEWT_COLORSET_DISENTRY;</div><div class='add'>+ } else {</div><div class='add'>+ cb->inactive = COLORSET_CHECKBOX;</div><div class='add'>+ cb->active = COLORSET_ACTCHECKBOX;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(cb->inactive);</div><div class='add'>+</div><div class='add'>+ newtGotorc(c->top, c->left);</div><div class='add'>+</div><div class='add'>+ switch (cb->type) {</div><div class='add'>+ case RADIO:</div><div class='add'>+ SLsmg_write_string("( ) ");</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case CHECK:</div><div class='add'>+ SLsmg_write_string("[ ] ");</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLsmg_write_string(cb->text);</div><div class='add'>+</div><div class='add'>+ if (cb->hasFocus)</div><div class='add'>+ SLsmg_set_color(cb->active);</div><div class='add'>+</div><div class='add'>+ newtGotorc(c->top, c->left + 1);</div><div class='add'>+ SLsmg_write_char(*cb->result);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void cbDestroy(newtComponent co) {</div><div class='add'>+ struct checkbox * cb = co->data;</div><div class='add'>+</div><div class='add'>+ free(cb->text);</div><div class='add'>+ free(cb->seq);</div><div class='add'>+ free(cb);</div><div class='add'>+ free(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct eventResult cbEvent(newtComponent co, struct event ev) {</div><div class='add'>+ struct checkbox * cb = co->data;</div><div class='add'>+ struct eventResult er;</div><div class='add'>+ const char * cur;</div><div class='add'>+</div><div class='add'>+ if (ev.when == EV_NORMAL) {</div><div class='add'>+ switch (ev.event) {</div><div class='add'>+ case EV_FOCUS:</div><div class='add'>+ cb->hasFocus = 1;</div><div class='add'>+ cbDraw(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EV_UNFOCUS:</div><div class='add'>+ cb->hasFocus = 0;</div><div class='add'>+ cbDraw(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EV_KEYPRESS:</div><div class='add'>+ if (ev.u.key == ' ') {</div><div class='add'>+ if (cb->type == RADIO) {</div><div class='add'>+ makeActive(co);</div><div class='add'>+ } else if (cb->type == CHECK) {</div><div class='add'>+ cur = strchr(cb->seq, *cb->result);</div><div class='add'>+ if (!cur)</div><div class='add'>+ *cb->result = *cb->seq;</div><div class='add'>+ else {</div><div class='add'>+ cur++;</div><div class='add'>+ if (! *cur)</div><div class='add'>+ *cb->result = *cb->seq;</div><div class='add'>+ else</div><div class='add'>+ *cb->result = *cur;</div><div class='add'>+ }</div><div class='add'>+ cbDraw(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+</div><div class='add'>+ if (co->callback)</div><div class='add'>+ co->callback(co, co->callbackData);</div><div class='add'>+ } else {</div><div class='add'>+ er.result = ER_IGNORED;</div><div class='add'>+ }</div><div class='add'>+ } else if(ev.u.key == NEWT_KEY_ENTER) {</div><div class='add'>+ er.result = ER_IGNORED;</div><div class='add'>+ } else {</div><div class='add'>+ er.result = ER_IGNORED;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case EV_MOUSE:</div><div class='add'>+ if (ev.u.mouse.type == MOUSE_BUTTON_DOWN) {</div><div class='add'>+ if (cb->type == RADIO) {</div><div class='add'>+ makeActive(co);</div><div class='add'>+ } else if (cb->type == CHECK) {</div><div class='add'>+ cur = strchr(cb->seq, *cb->result);</div><div class='add'>+ if (!cur)</div><div class='add'>+ *cb->result = *cb->seq;</div><div class='add'>+ else {</div><div class='add'>+ cur++;</div><div class='add'>+ if (! *cur)</div><div class='add'>+ *cb->result = *cb->seq;</div><div class='add'>+ else</div><div class='add'>+ *cb->result = *cur;</div><div class='add'>+ }</div><div class='add'>+ cbDraw(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+</div><div class='add'>+ if (co->callback)</div><div class='add'>+ co->callback(co, co->callbackData);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ } else</div><div class='add'>+ er.result = ER_IGNORED;</div><div class='add'>+</div><div class='add'>+ return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void makeActive(newtComponent co) {</div><div class='add'>+ struct checkbox * cb = co->data;</div><div class='add'>+ struct checkbox * rb;</div><div class='add'>+ newtComponent curr;</div><div class='add'>+</div><div class='add'>+ /* find the one that's turned off */</div><div class='add'>+ curr = cb->lastButton;</div><div class='add'>+ rb = curr->data;</div><div class='add'>+ while (curr && rb->value == rb->seq[0]) {</div><div class='add'>+ curr = rb->prevButton;</div><div class='add'>+ if (curr) rb = curr->data;</div><div class='add'>+ }</div><div class='add'>+ if (curr) {</div><div class='add'>+ rb->value = rb->seq[0];</div><div class='add'>+ cbDraw(curr);</div><div class='add'>+ }</div><div class='add'>+ cb->value = cb->seq[1];</div><div class='add'>+ cbDraw(co);</div><div class='add'>+</div><div class='add'>+ if (co->callback)</div><div class='add'>+ co->callback(co, co->callbackData);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/checkboxtree.c b/mdk-stage1/newt/checkboxtree.c<br/>new file mode 100644<br/>index 000000000..b56bd1e9f<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/checkboxtree.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/checkboxtree.c</a></div><div class='hunk'>@@ -0,0 +1,714 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct items {</div><div class='add'>+ char * text;</div><div class='add'>+ const void *data;</div><div class='add'>+ unsigned char selected;</div><div class='add'>+ struct items *next;</div><div class='add'>+ struct items *prev;</div><div class='add'>+ struct items *branch;</div><div class='add'>+ int flags;</div><div class='add'>+ int depth;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct CheckboxTree {</div><div class='add'>+ newtComponent sb;</div><div class='add'>+ int curWidth; /* size of text w/o scrollbar or border*/</div><div class='add'>+ int curHeight; /* size of text w/o border */</div><div class='add'>+ struct items * itemlist;</div><div class='add'>+ struct items ** flatList, ** currItem, ** firstItem;</div><div class='add'>+ int flatCount;</div><div class='add'>+ int flags;</div><div class='add'>+ int pad;</div><div class='add'>+ char * seq;</div><div class='add'>+ char * result;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void ctDraw(newtComponent c);</div><div class='add'>+static void ctDestroy(newtComponent co);</div><div class='add'>+static void ctPlace(newtComponent co, int newLeft, int newTop);</div><div class='add'>+struct eventResult ctEvent(newtComponent co, struct event ev);</div><div class='add'>+static void ctMapped(newtComponent co, int isMapped);</div><div class='add'>+static struct items * findItem(struct items * items, const void * data);</div><div class='add'>+static void buildFlatList(newtComponent co);</div><div class='add'>+static void doBuildFlatList(struct CheckboxTree * ct, struct items * item);</div><div class='add'>+enum countWhat { COUNT_EXPOSED=0, COUNT_SELECTED=1 };</div><div class='add'>+static int countItems(struct items * item, enum countWhat justExposed);</div><div class='add'>+</div><div class='add'>+static struct componentOps ctOps = {</div><div class='add'>+ ctDraw,</div><div class='add'>+ ctEvent,</div><div class='add'>+ ctDestroy,</div><div class='add'>+ ctPlace,</div><div class='add'>+ ctMapped,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+static int countItems(struct items * item, enum countWhat what) {</div><div class='add'>+ int count = 0;</div><div class='add'>+</div><div class='add'>+ while (item) {</div><div class='add'>+ if ((!item->branch && item->selected == what) || (what == COUNT_EXPOSED))</div><div class='add'>+ count++;</div><div class='add'>+ if (item->branch || (what == COUNT_EXPOSED && item->selected))</div><div class='add'>+ count += countItems(item->branch, what);</div><div class='add'>+ item = item->next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void doBuildFlatList(struct CheckboxTree * ct, struct items * item) {</div><div class='add'>+ while (item) {</div><div class='add'>+ ct->flatList[ct->flatCount++] = item;</div><div class='add'>+ if (item->branch && item->selected) doBuildFlatList(ct, item->branch);</div><div class='add'>+ item = item->next;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void buildFlatList(newtComponent co) {</div><div class='add'>+ struct CheckboxTree * ct = co->data;</div><div class='add'>+</div><div class='add'>+ if (ct->flatList) free(ct->flatList);</div><div class='add'>+ ct->flatCount = countItems(ct->itemlist, COUNT_EXPOSED);</div><div class='add'>+</div><div class='add'>+ ct->flatList = malloc(sizeof(*ct->flatList) * (ct->flatCount+1));</div><div class='add'>+ ct->flatCount = 0;</div><div class='add'>+ doBuildFlatList(ct, ct->itemlist);</div><div class='add'>+ ct->flatList[ct->flatCount] = NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtCheckboxTreeAddItem(newtComponent co, </div><div class='add'>+ const char * text, const void * data,</div><div class='add'>+ int flags, int index, ...) {</div><div class='add'>+ va_list argList;</div><div class='add'>+ int numIndexes;</div><div class='add'>+ int * indexes;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ va_start(argList, index);</div><div class='add'>+ numIndexes = 0;</div><div class='add'>+ i = index;</div><div class='add'>+ while (i != NEWT_ARG_LAST) {</div><div class='add'>+ numIndexes++;</div><div class='add'>+ i = va_arg(argList, int);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ va_end(argList);</div><div class='add'>+</div><div class='add'>+ indexes = alloca(sizeof(*indexes) * (numIndexes + 1));</div><div class='add'>+ va_start(argList, index);</div><div class='add'>+ numIndexes = 0;</div><div class='add'>+ i = index;</div><div class='add'>+ va_start(argList, index);</div><div class='add'>+ while (i != NEWT_ARG_LAST) {</div><div class='add'>+ indexes[numIndexes++] = i;</div><div class='add'>+ i = va_arg(argList, int);</div><div class='add'>+ }</div><div class='add'>+ va_end(argList);</div><div class='add'>+</div><div class='add'>+ indexes[numIndexes++] = NEWT_ARG_LAST;</div><div class='add'>+</div><div class='add'>+ return newtCheckboxTreeAddArray(co, text, data, flags, indexes);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int doFindItemPath(struct items * items, void * data, int * path, </div><div class='add'>+ int * len) {</div><div class='add'>+ int where = 0;</div><div class='add'>+</div><div class='add'>+ while (items) {</div><div class='add'>+ if (items->data == data) {</div><div class='add'>+ if (path) path[items->depth] = where;</div><div class='add'>+ if (len) *len = items->depth + 1;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (items->branch && doFindItemPath(items->branch, data, path, len)) {</div><div class='add'>+ if (path) path[items->depth] = where;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ items = items->next;</div><div class='add'>+ where++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int * newtCheckboxTreeFindItem(newtComponent co, void * data) {</div><div class='add'>+ int len;</div><div class='add'>+ int * path;</div><div class='add'>+ struct CheckboxTree * ct = co->data;</div><div class='add'>+</div><div class='add'>+ if (!doFindItemPath(ct->itemlist, data, NULL, &len)) return NULL;</div><div class='add'>+</div><div class='add'>+ path = malloc(sizeof(*path) * (len + 1));</div><div class='add'>+ doFindItemPath(ct->itemlist, data, path, NULL);</div><div class='add'>+ path[len] = NEWT_ARG_LAST;</div><div class='add'>+</div><div class='add'>+ return path;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtCheckboxTreeAddArray(newtComponent co, </div><div class='add'>+ const char * text, const void * data,</div><div class='add'>+ int flags, int * indexes) {</div><div class='add'>+ struct items * curList, * newNode, * item = NULL;</div><div class='add'>+ struct items ** listPtr = NULL;</div><div class='add'>+ int i, index, numIndexes;</div><div class='add'>+ struct CheckboxTree * ct = co->data;</div><div class='add'>+</div><div class='add'>+ numIndexes = 0;</div><div class='add'>+ while (indexes[numIndexes] != NEWT_ARG_LAST) numIndexes++;</div><div class='add'>+</div><div class='add'>+ if (!ct->itemlist) {</div><div class='add'>+ if (numIndexes > 1) return -1;</div><div class='add'>+</div><div class='add'>+ ct->itemlist = malloc(sizeof(*ct->itemlist));</div><div class='add'>+ item = ct->itemlist;</div><div class='add'>+ item->prev = NULL;</div><div class='add'>+ item->next = NULL;</div><div class='add'>+ } else {</div><div class='add'>+ curList = ct->itemlist;</div><div class='add'>+ listPtr = &ct->itemlist;</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ index = indexes[i];</div><div class='add'>+ while (i < numIndexes) {</div><div class='add'>+ item = curList;</div><div class='add'>+</div><div class='add'>+ if (index == NEWT_ARG_APPEND) {</div><div class='add'>+ item = NULL;</div><div class='add'>+ } else {</div><div class='add'>+ while (index && item) </div><div class='add'>+ item = item->next, index--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ i++;</div><div class='add'>+ if (i < numIndexes) {</div><div class='add'>+ curList = item->branch;</div><div class='add'>+ listPtr = &item->branch;</div><div class='add'>+ if (!curList && (i + 1 != numIndexes)) return -1;</div><div class='add'>+</div><div class='add'>+ index = indexes[i];</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (!curList) { /* create a new branch */</div><div class='add'>+ item = malloc(sizeof(*curList->prev));</div><div class='add'>+ item->next = item->prev = NULL;</div><div class='add'>+ *listPtr = item;</div><div class='add'>+ } else if (!item) { /* append to end */</div><div class='add'>+ item = curList;</div><div class='add'>+ while (item->next) item = item->next;</div><div class='add'>+ item->next = malloc(sizeof(*curList->prev));</div><div class='add'>+ item->next->prev = item;</div><div class='add'>+ item = item->next;</div><div class='add'>+ item->next = NULL;</div><div class='add'>+ } else { </div><div class='add'>+ newNode = malloc(sizeof(*newNode));</div><div class='add'>+ newNode->prev = item->prev;</div><div class='add'>+ newNode->next = item;</div><div class='add'>+</div><div class='add'>+ if (item->prev) item->prev->next = newNode;</div><div class='add'>+ item->prev = newNode;</div><div class='add'>+ item = newNode;</div><div class='add'>+ if (!item->prev) *listPtr = item;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ item->text = strdup(text);</div><div class='add'>+ item->data = data;</div><div class='add'>+ if (flags & NEWT_FLAG_SELECTED) {</div><div class='add'>+ item->selected = 1;</div><div class='add'>+ } else {</div><div class='add'>+ item->selected = 0;</div><div class='add'>+ }</div><div class='add'>+ item->flags = flags;</div><div class='add'>+ item->branch = NULL;</div><div class='add'>+ item->depth = numIndexes - 1;</div><div class='add'>+</div><div class='add'>+ i = 4 + (3 * item->depth);</div><div class='add'>+</div><div class='add'>+ if ((strlen(text) + i + ct->pad) > co->width) {</div><div class='add'>+ co->width = strlen(text) + i + ct->pad;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct items * findItem(struct items * items, const void * data) {</div><div class='add'>+ struct items * i;</div><div class='add'>+</div><div class='add'>+ while (items) {</div><div class='add'>+ if (items->data == data) return items;</div><div class='add'>+ if (items->branch) {</div><div class='add'>+ i = findItem(items->branch, data);</div><div class='add'>+ if (i) return i;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ items = items->next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void listSelected(struct items * items, int * num, const void ** list, int seqindex) {</div><div class='add'>+ while (items) {</div><div class='add'>+ if ((seqindex ? items->selected==seqindex : items->selected) && !items->branch)</div><div class='add'>+ list[(*num)++] = (void *) items->data;</div><div class='add'>+ if (items->branch)</div><div class='add'>+ listSelected(items->branch, num, list, seqindex);</div><div class='add'>+ items = items->next;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+const void ** newtCheckboxTreeGetSelection(newtComponent co, int *numitems)</div><div class='add'>+{</div><div class='add'>+ return newtCheckboxTreeGetMultiSelection(co, numitems, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+const void ** newtCheckboxTreeGetMultiSelection(newtComponent co, int *numitems, char seqnum)</div><div class='add'>+{</div><div class='add'>+ struct CheckboxTree * ct;</div><div class='add'>+ const void **retval;</div><div class='add'>+ int seqindex=0;</div><div class='add'>+</div><div class='add'>+ if(!co || !numitems) return NULL;</div><div class='add'>+</div><div class='add'>+ ct = co->data;</div><div class='add'>+ </div><div class='add'>+ if (seqnum) {</div><div class='add'>+ while( ct->seq[seqindex] && ( ct->seq[seqindex] != seqnum )) seqindex++;</div><div class='add'>+ } else {</div><div class='add'>+ seqindex = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *numitems = countItems(ct->itemlist, (seqindex ? seqindex : COUNT_SELECTED));</div><div class='add'>+ if (!*numitems) return NULL;</div><div class='add'>+ </div><div class='add'>+ retval = malloc(*numitems * sizeof(void *));</div><div class='add'>+ *numitems = 0;</div><div class='add'>+ listSelected(ct->itemlist, numitems, retval, seqindex);</div><div class='add'>+</div><div class='add'>+ return retval;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtCheckboxTree(int left, int top, int height, int flags) {</div><div class='add'>+ return newtCheckboxTreeMulti(left, top, height, NULL, flags);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtCheckboxTreeMulti(int left, int top, int height, char *seq, int flags) {</div><div class='add'>+ newtComponent co;</div><div class='add'>+ struct CheckboxTree * ct;</div><div class='add'>+</div><div class='add'>+ co = malloc(sizeof(*co));</div><div class='add'>+ ct = malloc(sizeof(struct CheckboxTree));</div><div class='add'>+ co->callback = NULL;</div><div class='add'>+ co->data = ct;</div><div class='add'>+ co->ops = &ctOps;</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+ co->height = height;</div><div class='add'>+ co->width = 0;</div><div class='add'>+ co->isMapped = 0;</div><div class='add'>+ ct->itemlist = NULL;</div><div class='add'>+ ct->firstItem = NULL;</div><div class='add'>+ ct->currItem = NULL;</div><div class='add'>+ ct->flatList = NULL;</div><div class='add'>+ if (seq)</div><div class='add'>+ ct->seq = strdup(seq);</div><div class='add'>+ else</div><div class='add'>+ ct->seq = strdup(" *");</div><div class='add'>+ if (flags & NEWT_FLAG_SCROLL) {</div><div class='add'>+ ct->sb = newtVerticalScrollbar(left, top, height,</div><div class='add'>+ COLORSET_LISTBOX, COLORSET_ACTLISTBOX);</div><div class='add'>+ ct->pad = 2;</div><div class='add'>+ } else {</div><div class='add'>+ ct->sb = NULL;</div><div class='add'>+ ct->pad = 0;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void ctMapped(newtComponent co, int isMapped) {</div><div class='add'>+ struct CheckboxTree * ct = co->data;</div><div class='add'>+</div><div class='add'>+ co->isMapped = isMapped;</div><div class='add'>+ if (ct->sb)</div><div class='add'>+ ct->sb->ops->mapped(ct->sb, isMapped);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void ctPlace(newtComponent co, int newLeft, int newTop) {</div><div class='add'>+ struct CheckboxTree * ct = co->data;</div><div class='add'>+</div><div class='add'>+ co->top = newTop;</div><div class='add'>+ co->left = newLeft;</div><div class='add'>+</div><div class='add'>+ if (ct->sb)</div><div class='add'>+ ct->sb->ops->place(ct->sb, co->left + co->width - 1, co->top);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int ctSetItem(newtComponent co, struct items *item, enum newtFlagsSense sense)</div><div class='add'>+{</div><div class='add'>+ struct CheckboxTree * ct = co->data;</div><div class='add'>+ struct items * currItem;</div><div class='add'>+ struct items * firstItem;</div><div class='add'>+ </div><div class='add'>+ if (!item)</div><div class='add'>+ return 1;</div><div class='add'>+ </div><div class='add'>+ switch(sense) {</div><div class='add'>+ case NEWT_FLAGS_RESET:</div><div class='add'>+ item->selected = 0;</div><div class='add'>+ break;</div><div class='add'>+ case NEWT_FLAGS_SET:</div><div class='add'>+ item->selected = 1;</div><div class='add'>+ break;</div><div class='add'>+ case NEWT_FLAGS_TOGGLE:</div><div class='add'>+ if (item->branch)</div><div class='add'>+ item->selected = !item->selected;</div><div class='add'>+ else {</div><div class='add'>+ item->selected++;</div><div class='add'>+ if (item->selected==strlen(ct->seq))</div><div class='add'>+ item->selected = 0;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (item->branch) {</div><div class='add'>+ currItem = *ct->currItem;</div><div class='add'>+ firstItem = *ct->firstItem;</div><div class='add'>+</div><div class='add'>+ buildFlatList(co);</div><div class='add'>+</div><div class='add'>+ ct->currItem = ct->flatList;</div><div class='add'>+ while (*ct->currItem != currItem) ct->currItem++;</div><div class='add'>+</div><div class='add'>+ ct->firstItem = ct->flatList;</div><div class='add'>+ if (ct->flatCount > co->height) {</div><div class='add'>+ struct items ** last = ct->flatList + ct->flatCount - co->height;</div><div class='add'>+ while (*ct->firstItem != firstItem && ct->firstItem != last)</div><div class='add'>+ ct->firstItem++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void ctSetItems(struct items *item, int selected)</div><div class='add'>+{</div><div class='add'>+ for (; item; item = item->next) {</div><div class='add'>+ if (!item->branch)</div><div class='add'>+ item->selected = selected;</div><div class='add'>+ else</div><div class='add'>+ ctSetItems(item->branch, selected);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void ctDraw(newtComponent co) {</div><div class='add'>+ struct CheckboxTree * ct = co->data;</div><div class='add'>+ struct items ** item; </div><div class='add'>+ int i, j;</div><div class='add'>+ char * spaces = NULL;</div><div class='add'>+ int currRow = -1;</div><div class='add'>+</div><div class='add'>+ if (!co->isMapped) return ;</div><div class='add'>+</div><div class='add'>+ if (!ct->firstItem) {</div><div class='add'>+ buildFlatList(co);</div><div class='add'>+ ct->firstItem = ct->currItem = ct->flatList;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ item = ct->firstItem;</div><div class='add'>+ </div><div class='add'>+ i = 0;</div><div class='add'>+ while (*item && i < co->height) {</div><div class='add'>+ newtGotorc(co->top + i, co->left);</div><div class='add'>+ if (*item == *ct->currItem) {</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX);</div><div class='add'>+ currRow = co->top + i;</div><div class='add'>+ } else</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_LISTBOX);</div><div class='add'>+</div><div class='add'>+ for (j = 0; j < (*item)->depth; j++)</div><div class='add'>+ SLsmg_write_string(" ");</div><div class='add'>+</div><div class='add'>+ if ((*item)->branch) {</div><div class='add'>+ if ((*item)->selected) </div><div class='add'>+ SLsmg_write_string("<-> ");</div><div class='add'>+ else</div><div class='add'>+ SLsmg_write_string("<+> ");</div><div class='add'>+ } else {</div><div class='add'>+ char tmp[5];</div><div class='add'>+ snprintf(tmp,5,"[%c] ",ct->seq[(*item)->selected]);</div><div class='add'>+ SLsmg_write_string(tmp);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLsmg_write_nstring((*item)->text, co->width - 4 - </div><div class='add'>+ (3 * (*item)->depth));</div><div class='add'>+ item++;</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* There could be empty lines left (i.e. if the user closes an expanded</div><div class='add'>+ list which is the last thing in the tree, and whose elements are</div><div class='add'>+ displayed at the bottom of the screen */</div><div class='add'>+ if (i < co->height) {</div><div class='add'>+ spaces = alloca(co->width);</div><div class='add'>+ memset(spaces, ' ', co->width);</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_LISTBOX);</div><div class='add'>+ }</div><div class='add'>+ while (i < co->height) {</div><div class='add'>+ newtGotorc(co->top + i, co->left);</div><div class='add'>+ SLsmg_write_nstring(spaces, co->width);</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if(ct->sb) {</div><div class='add'>+ newtScrollbarSet(ct->sb, ct->currItem - ct->flatList, </div><div class='add'>+ ct->flatCount - 1);</div><div class='add'>+ ct->sb->ops->draw(ct->sb);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ newtGotorc(currRow, co->left + 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void ctDestroy(newtComponent co) {</div><div class='add'>+ struct CheckboxTree * ct = co->data;</div><div class='add'>+ struct items * item, * nextitem;</div><div class='add'>+</div><div class='add'>+ nextitem = item = ct->itemlist;</div><div class='add'>+</div><div class='add'>+ while (item != NULL) {</div><div class='add'>+ nextitem = item->next;</div><div class='add'>+ free(item->text);</div><div class='add'>+ free(item);</div><div class='add'>+ item = nextitem;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ free(ct->seq);</div><div class='add'>+ free(ct);</div><div class='add'>+ free(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct eventResult ctEvent(newtComponent co, struct event ev) {</div><div class='add'>+ struct CheckboxTree * ct = co->data;</div><div class='add'>+ struct eventResult er;</div><div class='add'>+ struct items ** listEnd, ** lastItem;</div><div class='add'>+ int key, selnum = 1;</div><div class='add'>+</div><div class='add'>+ er.result = ER_IGNORED;</div><div class='add'>+</div><div class='add'>+ if(ev.when == EV_EARLY || ev.when == EV_LATE) {</div><div class='add'>+ return er;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ switch(ev.event) {</div><div class='add'>+ case EV_KEYPRESS:</div><div class='add'>+ key = ev.u.key;</div><div class='add'>+ if (key == (char) key && key != ' ') {</div><div class='add'>+ for (selnum = 0; ct->seq[selnum]; selnum++)</div><div class='add'>+ if (key == ct->seq[selnum])</div><div class='add'>+ break;</div><div class='add'>+ if (!ct->seq[selnum])</div><div class='add'>+ switch (key) {</div><div class='add'>+ case '-': selnum = 0; break;</div><div class='add'>+ case '+':</div><div class='add'>+ case '*': selnum = 1; break;</div><div class='add'>+ }</div><div class='add'>+ if (ct->seq[selnum])</div><div class='add'>+ key = '*';</div><div class='add'>+ }</div><div class='add'>+ switch(key) {</div><div class='add'>+ case ' ':</div><div class='add'>+ case NEWT_KEY_ENTER:</div><div class='add'>+ ctSetItem(co, *ct->currItem, NEWT_FLAGS_TOGGLE);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ if (!(*ct->currItem)->branch || (*ct->currItem)->selected)</div><div class='add'>+ key = NEWT_KEY_DOWN;</div><div class='add'>+ else</div><div class='add'>+ key = '*';</div><div class='add'>+ break;</div><div class='add'>+ case '*':</div><div class='add'>+ if ((*ct->currItem)->branch) {</div><div class='add'>+ ctSetItems((*ct->currItem)->branch, selnum);</div><div class='add'>+ if (!(*ct->currItem)->selected)</div><div class='add'>+ key = NEWT_KEY_DOWN;</div><div class='add'>+ } else {</div><div class='add'>+ (*ct->currItem)->selected = selnum;</div><div class='add'>+ key = NEWT_KEY_DOWN;</div><div class='add'>+ }</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ switch (key) {</div><div class='add'>+ case '*':</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+ return er;</div><div class='add'>+ case NEWT_KEY_HOME:</div><div class='add'>+ ct->currItem = ct->flatList;</div><div class='add'>+ ct->firstItem = ct->flatList;</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ return er;</div><div class='add'>+ case NEWT_KEY_END:</div><div class='add'>+ ct->currItem = ct->flatList + ct->flatCount - 1;</div><div class='add'>+ if (ct->flatCount <= co->height)</div><div class='add'>+ ct->firstItem = ct->flatList;</div><div class='add'>+ else</div><div class='add'>+ ct->firstItem = ct->flatList + ct->flatCount - co->height;</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ return er;</div><div class='add'>+ case NEWT_KEY_DOWN:</div><div class='add'>+ if (ev.u.key != NEWT_KEY_DOWN) {</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+ if (strlen(ct->seq) != 2) {</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ return er;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ if ((ct->currItem - ct->flatList + 1) < ct->flatCount) {</div><div class='add'>+ ct->currItem++;</div><div class='add'>+</div><div class='add'>+ if (ct->currItem - ct->firstItem >= co->height) </div><div class='add'>+ ct->firstItem++;</div><div class='add'>+</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ } else if (ev.u.key != NEWT_KEY_DOWN)</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ return er;</div><div class='add'>+ case NEWT_KEY_UP:</div><div class='add'>+ if (ct->currItem != ct->flatList) {</div><div class='add'>+ ct->currItem--;</div><div class='add'>+</div><div class='add'>+ if (ct->currItem < ct->firstItem)</div><div class='add'>+ ct->firstItem = ct->currItem;</div><div class='add'>+ </div><div class='add'>+ ctDraw(co);</div><div class='add'>+ }</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+ return er;</div><div class='add'>+ case NEWT_KEY_PGUP:</div><div class='add'>+ if (ct->firstItem - co->height < ct->flatList) {</div><div class='add'>+ ct->firstItem = ct->currItem = ct->flatList;</div><div class='add'>+ } else {</div><div class='add'>+ ct->currItem -= co->height;</div><div class='add'>+ ct->firstItem -= co->height;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ return er;</div><div class='add'>+ case NEWT_KEY_PGDN:</div><div class='add'>+ listEnd = ct->flatList + ct->flatCount - 1;</div><div class='add'>+ lastItem = ct->firstItem + co->height - 1;</div><div class='add'>+</div><div class='add'>+ if (lastItem + co->height > listEnd) {</div><div class='add'>+ ct->firstItem = listEnd - co->height + 1;</div><div class='add'>+ ct->currItem = listEnd;</div><div class='add'>+ } else {</div><div class='add'>+ ct->currItem += co->height;</div><div class='add'>+ ct->firstItem += co->height;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ return er;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EV_FOCUS:</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case EV_UNFOCUS:</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+ default:</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+const void * newtCheckboxTreeGetCurrent(newtComponent co) {</div><div class='add'>+ struct CheckboxTree * ct = co->data;</div><div class='add'>+</div><div class='add'>+ if (!ct->currItem) return NULL;</div><div class='add'>+ return (*ct->currItem)->data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCheckboxTreeSetEntry(newtComponent co, const void * data, const char * text)</div><div class='add'>+{</div><div class='add'>+ struct CheckboxTree * ct;</div><div class='add'>+ struct items * item;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if (!co) return;</div><div class='add'>+ ct = co->data;</div><div class='add'>+ item = findItem(ct->itemlist, data);</div><div class='add'>+ if (!item) return;</div><div class='add'>+</div><div class='add'>+ free(item->text);</div><div class='add'>+ item->text = strdup(text);</div><div class='add'>+</div><div class='add'>+ i = 4 + (3 * item->depth);</div><div class='add'>+</div><div class='add'>+ if ((strlen(text) + i + ct->pad) > co->width) {</div><div class='add'>+ co->width = strlen(text) + i + ct->pad;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ctDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char newtCheckboxTreeGetEntryValue(newtComponent co, const void * data)</div><div class='add'>+{</div><div class='add'>+ struct CheckboxTree * ct;</div><div class='add'>+ struct items * item;</div><div class='add'>+</div><div class='add'>+ if (!co) return -1;</div><div class='add'>+ ct = co->data;</div><div class='add'>+ item = findItem(ct->itemlist, data);</div><div class='add'>+ if (!item) return -1;</div><div class='add'>+ if (item->branch)</div><div class='add'>+ return item->selected ? NEWT_CHECKBOXTREE_EXPANDED : NEWT_CHECKBOXTREE_COLLAPSED;</div><div class='add'>+ else</div><div class='add'>+ return ct->seq[item->selected];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCheckboxTreeSetEntryValue(newtComponent co, const void * data, char value)</div><div class='add'>+{</div><div class='add'>+ struct CheckboxTree * ct;</div><div class='add'>+ struct items * item;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if (!co) return;</div><div class='add'>+ ct = co->data;</div><div class='add'>+ item = findItem(ct->itemlist, data);</div><div class='add'>+ if (!item || item->branch) return;</div><div class='add'>+</div><div class='add'>+ for(i = 0; ct->seq[i]; i++)</div><div class='add'>+ if (value == ct->seq[i])</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ if (!ct->seq[i]) return;</div><div class='add'>+ item->selected = i;</div><div class='add'>+</div><div class='add'>+ ctDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/newt/entry.c b/mdk-stage1/newt/entry.c<br/>new file mode 100644<br/>index 000000000..154edba71<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/entry.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/entry.c</a></div><div class='hunk'>@@ -0,0 +1,376 @@</div><div class='add'>+#include <ctype.h></div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct entry {</div><div class='add'>+ int flags;</div><div class='add'>+ char * buf;</div><div class='add'>+ char ** resultPtr;</div><div class='add'>+ int bufAlloced;</div><div class='add'>+ int bufUsed; /* amount of the buffer that's been used */</div><div class='add'>+ int cursorPosition; /* cursor *in the string* on on screen */</div><div class='add'>+ int firstChar; /* first character position being shown */</div><div class='add'>+ newtEntryFilter filter;</div><div class='add'>+ void * filterData;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void entryDraw(newtComponent co);</div><div class='add'>+static void entryDestroy(newtComponent co);</div><div class='add'>+static struct eventResult entryEvent(newtComponent co,</div><div class='add'>+ struct event ev);</div><div class='add'>+</div><div class='add'>+static struct eventResult entryHandleKey(newtComponent co, int key);</div><div class='add'>+</div><div class='add'>+static struct componentOps entryOps = {</div><div class='add'>+ entryDraw,</div><div class='add'>+ entryEvent,</div><div class='add'>+ entryDestroy,</div><div class='add'>+ newtDefaultPlaceHandler,</div><div class='add'>+ newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+void newtEntrySet(newtComponent co, const char * value, int cursorAtEnd) {</div><div class='add'>+ struct entry * en = co->data;</div><div class='add'>+</div><div class='add'>+ if ((strlen(value) + 1) > (unsigned int)en->bufAlloced) {</div><div class='add'>+ free(en->buf);</div><div class='add'>+ en->bufAlloced = strlen(value) + 1;</div><div class='add'>+ en->buf = malloc(en->bufAlloced);</div><div class='add'>+ if (en->resultPtr) *en->resultPtr = en->buf;</div><div class='add'>+ }</div><div class='add'>+ memset(en->buf, 0, en->bufAlloced); /* clear the buffer */</div><div class='add'>+ strcpy(en->buf, value);</div><div class='add'>+ en->bufUsed = strlen(value);</div><div class='add'>+ en->firstChar = 0;</div><div class='add'>+ if (cursorAtEnd)</div><div class='add'>+ en->cursorPosition = en->bufUsed;</div><div class='add'>+ else</div><div class='add'>+ en->cursorPosition = 0;</div><div class='add'>+</div><div class='add'>+ entryDraw(co);</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+newtComponent newtEntry(int left, int top, const char * initialValue, int width,</div><div class='add'>+ char ** resultPtr, int flags) {</div><div class='add'>+ newtComponent co;</div><div class='add'>+ struct entry * en;</div><div class='add'>+</div><div class='add'>+ co = malloc(sizeof(*co));</div><div class='add'>+ en = malloc(sizeof(struct entry));</div><div class='add'>+ co->data = en;</div><div class='add'>+</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->height = 1;</div><div class='add'>+ co->width = width;</div><div class='add'>+ co->isMapped = 0;</div><div class='add'>+ co->callback = NULL;</div><div class='add'>+</div><div class='add'>+ co->ops = &entryOps;</div><div class='add'>+</div><div class='add'>+ en->flags = flags;</div><div class='add'>+ en->cursorPosition = 0;</div><div class='add'>+ en->firstChar = 0;</div><div class='add'>+ en->bufUsed = 0;</div><div class='add'>+ en->bufAlloced = width + 1;</div><div class='add'>+ en->filter = NULL;</div><div class='add'>+</div><div class='add'>+ if (!(en->flags & NEWT_FLAG_DISABLED))</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+ else</div><div class='add'>+ co->takesFocus = 0;</div><div class='add'>+</div><div class='add'>+ if (initialValue && strlen(initialValue) > (unsigned int)width) {</div><div class='add'>+ en->bufAlloced = strlen(initialValue) + 1;</div><div class='add'>+ }</div><div class='add'>+ en->buf = malloc(en->bufAlloced);</div><div class='add'>+ en->resultPtr = resultPtr;</div><div class='add'>+ if (en->resultPtr) *en->resultPtr = en->buf;</div><div class='add'>+</div><div class='add'>+ memset(en->buf, 0, en->bufAlloced);</div><div class='add'>+ if (initialValue) {</div><div class='add'>+ strcpy(en->buf, initialValue);</div><div class='add'>+ en->bufUsed = strlen(initialValue);</div><div class='add'>+ en->cursorPosition = en->bufUsed;</div><div class='add'>+ } else {</div><div class='add'>+ *en->buf = '\0';</div><div class='add'>+ en->bufUsed = 0;</div><div class='add'>+ en->cursorPosition = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void entryDraw(newtComponent co) {</div><div class='add'>+ struct entry * en = co->data;</div><div class='add'>+ int i;</div><div class='add'>+ char * chptr;</div><div class='add'>+ int len;</div><div class='add'>+</div><div class='add'>+ if (!co->isMapped) return;</div><div class='add'>+</div><div class='add'>+ if (en->flags & NEWT_FLAG_DISABLED)</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_DISENTRY);</div><div class='add'>+ else</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_ENTRY);</div><div class='add'>+</div><div class='add'>+ if (en->flags & NEWT_FLAG_HIDDEN) {</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+ for (i = 0; i < co->width; i++)</div><div class='add'>+ SLsmg_write_char('_');</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+</div><div class='add'>+ if (en->cursorPosition < en->firstChar) {</div><div class='add'>+ /* scroll to the left */</div><div class='add'>+ en->firstChar = en->cursorPosition;</div><div class='add'>+ } else if ((en->firstChar + co->width) <= en->cursorPosition) {</div><div class='add'>+ /* scroll to the right */</div><div class='add'>+ en->firstChar = en->cursorPosition - co->width + 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ chptr = en->buf + en->firstChar;</div><div class='add'>+</div><div class='add'>+ if (en->flags & NEWT_FLAG_PASSWORD) {</div><div class='add'>+ char *tmpptr, *p;</div><div class='add'>+</div><div class='add'>+ tmpptr = alloca(strlen(chptr+2));</div><div class='add'>+ strcpy(tmpptr, chptr);</div><div class='add'>+ for (p = tmpptr; *p; p++)</div><div class='add'>+ *p = '*';</div><div class='add'>+ chptr = tmpptr;</div><div class='add'>+ } </div><div class='add'>+</div><div class='add'>+ len = strlen(chptr);</div><div class='add'>+</div><div class='add'>+ if (len <= co->width) {</div><div class='add'>+ i = len;</div><div class='add'>+ SLsmg_write_string(chptr);</div><div class='add'>+ while (i < co->width) {</div><div class='add'>+ SLsmg_write_char('_');</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+ } else {</div><div class='add'>+ SLsmg_write_nstring(chptr, co->width);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (en->flags & NEWT_FLAG_HIDDEN)</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+ else</div><div class='add'>+ newtGotorc(co->top, co->left + (en->cursorPosition - en->firstChar));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtEntrySetFlags(newtComponent co, int flags, enum newtFlagsSense sense) {</div><div class='add'>+ struct entry * en = co->data;</div><div class='add'>+ int row, col;</div><div class='add'>+</div><div class='add'>+ en->flags = newtSetFlags(en->flags, flags, sense);</div><div class='add'>+</div><div class='add'>+ if (!(en->flags & NEWT_FLAG_DISABLED))</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+ else</div><div class='add'>+ co->takesFocus = 0;</div><div class='add'>+</div><div class='add'>+ newtGetrc(&row, &col);</div><div class='add'>+ entryDraw(co);</div><div class='add'>+ newtGotorc(row, col);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void entryDestroy(newtComponent co) {</div><div class='add'>+ struct entry * en = co->data;</div><div class='add'>+</div><div class='add'>+ free(en->buf);</div><div class='add'>+ free(en);</div><div class='add'>+ free(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult entryEvent(newtComponent co,</div><div class='add'>+ struct event ev) {</div><div class='add'>+ struct entry * en = co->data;</div><div class='add'>+ struct eventResult er;</div><div class='add'>+ int ch;</div><div class='add'>+</div><div class='add'>+ if (ev.when == EV_NORMAL) {</div><div class='add'>+ switch (ev.event) {</div><div class='add'>+ case EV_FOCUS:</div><div class='add'>+ newtCursorOn();</div><div class='add'>+ if (en->flags & NEWT_FLAG_HIDDEN)</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+ else</div><div class='add'>+ newtGotorc(co->top, co->left +</div><div class='add'>+ (en->cursorPosition - en->firstChar));</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EV_UNFOCUS:</div><div class='add'>+ newtCursorOff();</div><div class='add'>+ newtGotorc(0, 0);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ if (co->callback)</div><div class='add'>+ co->callback(co, co->callbackData);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EV_KEYPRESS:</div><div class='add'>+ ch = ev.u.key;</div><div class='add'>+ if (en->filter)</div><div class='add'>+ ch = en->filter(co, en->filterData, ch, en->cursorPosition);</div><div class='add'>+ if (ch) er = entryHandleKey(co, ch);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EV_MOUSE:</div><div class='add'>+ if ((ev.u.mouse.type == MOUSE_BUTTON_DOWN) &&</div><div class='add'>+ (en->flags ^ NEWT_FLAG_HIDDEN)) {</div><div class='add'>+ if (strlen(en->buf) >= ev.u.mouse.x - co->left) {</div><div class='add'>+ en->cursorPosition = ev.u.mouse.x - co->left;</div><div class='add'>+ newtGotorc(co->top,</div><div class='add'>+ co->left +(en->cursorPosition - en->firstChar));</div><div class='add'>+ } else {</div><div class='add'>+ en->cursorPosition = strlen(en->buf);</div><div class='add'>+ newtGotorc(co->top,</div><div class='add'>+ co->left +(en->cursorPosition - en->firstChar));</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ } else</div><div class='add'>+ er.result = ER_IGNORED;</div><div class='add'>+</div><div class='add'>+ return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult entryHandleKey(newtComponent co, int key) {</div><div class='add'>+ struct entry * en = co->data;</div><div class='add'>+ struct eventResult er;</div><div class='add'>+ char * chptr, * insPoint;</div><div class='add'>+</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ switch (key) {</div><div class='add'>+ case '\r': /* Return */</div><div class='add'>+ if (en->flags & NEWT_FLAG_RETURNEXIT) {</div><div class='add'>+ er.result = ER_EXITFORM;</div><div class='add'>+ } else {</div><div class='add'>+ er.result = ER_NEXTCOMP;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '\001': /* ^A */</div><div class='add'>+ case NEWT_KEY_HOME:</div><div class='add'>+ en->cursorPosition = 0;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '\005': /* ^E */</div><div class='add'>+ case NEWT_KEY_END:</div><div class='add'>+ en->cursorPosition = en->bufUsed;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '\013': /* ^K */</div><div class='add'>+ en->bufUsed = en->cursorPosition;</div><div class='add'>+ memset(en->buf + en->bufUsed, 0, en->bufAlloced - en->bufUsed);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '\002': /* ^B */</div><div class='add'>+ case NEWT_KEY_LEFT:</div><div class='add'>+ if (en->cursorPosition)</div><div class='add'>+ en->cursorPosition--;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '\004':</div><div class='add'>+ case NEWT_KEY_DELETE:</div><div class='add'>+ chptr = en->buf + en->cursorPosition;</div><div class='add'>+ if (*chptr) {</div><div class='add'>+ chptr++;</div><div class='add'>+ while (*chptr) {</div><div class='add'>+ *(chptr - 1) = *chptr;</div><div class='add'>+ chptr++;</div><div class='add'>+ }</div><div class='add'>+ *(chptr - 1) = '\0';</div><div class='add'>+ en->bufUsed--;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_BKSPC:</div><div class='add'>+ if (en->cursorPosition) {</div><div class='add'>+ /* if this isn't true, there's nothing to erase */</div><div class='add'>+ chptr = en->buf + en->cursorPosition;</div><div class='add'>+ en->bufUsed--;</div><div class='add'>+ en->cursorPosition--;</div><div class='add'>+ while (*chptr) {</div><div class='add'>+ *(chptr - 1) = *chptr;</div><div class='add'>+ chptr++;</div><div class='add'>+ }</div><div class='add'>+ *(chptr - 1) = '\0';</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '\006': /* ^B */</div><div class='add'>+ case NEWT_KEY_RIGHT:</div><div class='add'>+ if (en->cursorPosition < en->bufUsed)</div><div class='add'>+ en->cursorPosition++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ if ((key >= 0x20 && key <= 0x7e) || (key >= 0xa0 && key <= 0xff)) {</div><div class='add'>+ if (!(en->flags & NEWT_FLAG_SCROLL) && en->bufUsed >= co->width) {</div><div class='add'>+ SLtt_beep();</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((en->bufUsed + 1) == en->bufAlloced) {</div><div class='add'>+ en->bufAlloced += 20;</div><div class='add'>+ en->buf = realloc(en->buf, en->bufAlloced);</div><div class='add'>+ if (en->resultPtr) *en->resultPtr = en->buf;</div><div class='add'>+ memset(en->buf + en->bufUsed + 1, 0, 20);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (en->cursorPosition == en->bufUsed) {</div><div class='add'>+ en->bufUsed++;</div><div class='add'>+ } else {</div><div class='add'>+ /* insert the new character */</div><div class='add'>+</div><div class='add'>+ /* chptr is the last character in the string */</div><div class='add'>+ chptr = (en->buf + en->bufUsed) - 1;</div><div class='add'>+ if ((en->bufUsed + 1) == en->bufAlloced) {</div><div class='add'>+ /* this string fills the buffer, so clip it */</div><div class='add'>+ chptr--;</div><div class='add'>+ } else</div><div class='add'>+ en->bufUsed++;</div><div class='add'>+</div><div class='add'>+ insPoint = en->buf + en->cursorPosition;</div><div class='add'>+</div><div class='add'>+ while (chptr >= insPoint) {</div><div class='add'>+ *(chptr + 1) = *chptr;</div><div class='add'>+ chptr--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ en->buf[en->cursorPosition++] = key;</div><div class='add'>+ } else {</div><div class='add'>+ er.result = ER_IGNORED;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ entryDraw(co);</div><div class='add'>+</div><div class='add'>+ return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char * newtEntryGetValue(newtComponent co) {</div><div class='add'>+ struct entry * en = co->data;</div><div class='add'>+</div><div class='add'>+ return en->buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtEntrySetFilter(newtComponent co, newtEntryFilter filter, void * data) {</div><div class='add'>+ struct entry * en = co->data;</div><div class='add'>+ en->filter = filter;</div><div class='add'>+ en->filterData = data;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/form.c b/mdk-stage1/newt/form.c<br/>new file mode 100644<br/>index 000000000..4ad465e38<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/form.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/form.c</a></div><div class='hunk'>@@ -0,0 +1,712 @@</div><div class='add'>+#include <unistd.h></div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdarg.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <sys/time.h></div><div class='add'>+#include <sys/types.h></div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/****************************************************************************</div><div class='add'>+ These forms handle vertical scrolling of components with a height of 1</div><div class='add'>+</div><div class='add'>+ Horizontal scrolling won't work, and scrolling large widgets will fail</div><div class='add'>+ miserably. It shouldn't be too hard to fix either of those if anyone</div><div class='add'>+ cares to. I only use scrolling for listboxes and text boxes though so</div><div class='add'>+ I didn't bother.</div><div class='add'>+*****************************************************************************/</div><div class='add'>+</div><div class='add'>+struct element {</div><div class='add'>+ int top, left; /* Actual, not virtual. These are translated */</div><div class='add'>+ newtComponent co; /* into actual through vertOffset */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct fdInfo {</div><div class='add'>+ int fd;</div><div class='add'>+ int flags;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct form {</div><div class='add'>+ int numCompsAlloced;</div><div class='add'>+ struct element * elements;</div><div class='add'>+ int numComps;</div><div class='add'>+ int currComp;</div><div class='add'>+ int fixedHeight;</div><div class='add'>+ int flags;</div><div class='add'>+ int vertOffset;</div><div class='add'>+ newtComponent vertBar, exitComp;</div><div class='add'>+ const char * help;</div><div class='add'>+ int numRows;</div><div class='add'>+ int * hotKeys;</div><div class='add'>+ int numHotKeys;</div><div class='add'>+ int background;</div><div class='add'>+ int beenSet;</div><div class='add'>+ int numFds;</div><div class='add'>+ struct fdInfo * fds;</div><div class='add'>+ int maxFd;</div><div class='add'>+ int timer; /* in milliseconds */</div><div class='add'>+ struct timeval lastTimeout;</div><div class='add'>+ void * helpTag;</div><div class='add'>+ newtCallback helpCb;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void gotoComponent(struct form * form, int newComp);</div><div class='add'>+static struct eventResult formEvent(newtComponent co, struct event ev);</div><div class='add'>+static struct eventResult sendEvent(newtComponent comp, struct event ev);</div><div class='add'>+static void formPlace(newtComponent co, int left, int top);</div><div class='add'>+</div><div class='add'>+/* Global, ick */</div><div class='add'>+static newtCallback helpCallback;</div><div class='add'>+</div><div class='add'>+/* this isn't static as grid.c tests against it to find forms */</div><div class='add'>+struct componentOps formOps = {</div><div class='add'>+ newtDrawForm,</div><div class='add'>+ formEvent,</div><div class='add'>+ newtFormDestroy,</div><div class='add'>+ formPlace,</div><div class='add'>+ newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+static inline int componentFits(newtComponent co, int compNum) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+ struct element * el = form->elements + compNum;</div><div class='add'>+</div><div class='add'>+ if ((co->top + form->vertOffset) > el->top) return 0;</div><div class='add'>+ if ((co->top + form->vertOffset + co->height) <</div><div class='add'>+ (el->top + el->co->height)) return 0;</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtForm(newtComponent vertBar, void * help, int flags) {</div><div class='add'>+ newtComponent co;</div><div class='add'>+ struct form * form;</div><div class='add'>+</div><div class='add'>+ co = malloc(sizeof(*co));</div><div class='add'>+ form = malloc(sizeof(*form));</div><div class='add'>+ co->data = form;</div><div class='add'>+ co->width = 0;</div><div class='add'>+ co->height = 0;</div><div class='add'>+ co->top = -1;</div><div class='add'>+ co->left = -1;</div><div class='add'>+ co->isMapped = 0;</div><div class='add'>+</div><div class='add'>+ co->takesFocus = 0; /* we may have 0 components */</div><div class='add'>+ co->ops = &formOps;</div><div class='add'>+</div><div class='add'>+ form->help = help;</div><div class='add'>+ form->flags = flags;</div><div class='add'>+ form->numCompsAlloced = 5;</div><div class='add'>+ form->numComps = 0;</div><div class='add'>+ form->currComp = -1;</div><div class='add'>+ form->vertOffset = 0;</div><div class='add'>+ form->fixedHeight = 0;</div><div class='add'>+ form->numRows = 0;</div><div class='add'>+ form->numFds = 0;</div><div class='add'>+ form->maxFd = 0;</div><div class='add'>+ form->fds = NULL;</div><div class='add'>+ form->beenSet = 0;</div><div class='add'>+ form->elements = malloc(sizeof(*(form->elements)) * form->numCompsAlloced);</div><div class='add'>+</div><div class='add'>+ form->background = COLORSET_WINDOW;</div><div class='add'>+ form->hotKeys = malloc(sizeof(int));</div><div class='add'>+ form->numHotKeys = 0;</div><div class='add'>+ form->timer = 0;</div><div class='add'>+ form->lastTimeout.tv_sec = form->lastTimeout.tv_usec = 0;</div><div class='add'>+ if (!(form->flags & NEWT_FLAG_NOF12)) {</div><div class='add'>+ newtFormAddHotKey(co, NEWT_KEY_F12);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (vertBar)</div><div class='add'>+ form->vertBar = vertBar;</div><div class='add'>+ else</div><div class='add'>+ form->vertBar = NULL;</div><div class='add'>+</div><div class='add'>+ form->helpTag = help;</div><div class='add'>+ form->helpCb = helpCallback;</div><div class='add'>+</div><div class='add'>+ return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtFormGetCurrent(newtComponent co) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+</div><div class='add'>+ return form->elements[form->currComp].co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormSetCurrent(newtComponent co, newtComponent subco) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+ int i, new;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < form->numComps; i++) {</div><div class='add'>+ if (form->elements[i].co == subco) break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (form->elements[i].co != subco) return;</div><div class='add'>+ new = i;</div><div class='add'>+</div><div class='add'>+ if (co->isMapped && !componentFits(co, new)) {</div><div class='add'>+ gotoComponent(form, -1);</div><div class='add'>+ form->vertOffset = form->elements[new].top - co->top - 1;</div><div class='add'>+ if (form->vertOffset > (form->numRows - co->height))</div><div class='add'>+ form->vertOffset = form->numRows - co->height;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ gotoComponent(form, new);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormSetTimer(newtComponent co, int millisecs) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+</div><div class='add'>+ form->timer = millisecs;</div><div class='add'>+ form->lastTimeout.tv_usec = 0;</div><div class='add'>+ form->lastTimeout.tv_sec = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormSetHeight(newtComponent co, int height) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+</div><div class='add'>+ form->fixedHeight = 1;</div><div class='add'>+ co->height = height;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormSetWidth(newtComponent co, int width) {</div><div class='add'>+ co->width = width;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormAddComponent(newtComponent co, newtComponent newco) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+</div><div class='add'>+ if (form->numCompsAlloced == form->numComps) {</div><div class='add'>+ form->numCompsAlloced += 5;</div><div class='add'>+ form->elements = realloc(form->elements,</div><div class='add'>+ sizeof(*(form->elements)) * form->numCompsAlloced);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* we grab real values for these a bit later */</div><div class='add'>+ form->elements[form->numComps].left = -2;</div><div class='add'>+ form->elements[form->numComps].top = -2;</div><div class='add'>+ form->elements[form->numComps].co = newco;</div><div class='add'>+</div><div class='add'>+ if (newco->takesFocus && form->currComp == -1)</div><div class='add'>+ form->currComp = form->numComps;</div><div class='add'>+</div><div class='add'>+ form->numComps++;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormAddComponents(newtComponent co, ...) {</div><div class='add'>+ va_list ap;</div><div class='add'>+ newtComponent subco;</div><div class='add'>+</div><div class='add'>+ va_start(ap, co);</div><div class='add'>+</div><div class='add'>+ while ((subco = va_arg(ap, newtComponent)))</div><div class='add'>+ newtFormAddComponent(co, subco);</div><div class='add'>+</div><div class='add'>+ va_end(ap);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void formPlace(newtComponent co, int left, int top) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+ int vertDelta, horizDelta;</div><div class='add'>+ struct element * el;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ newtFormSetSize(co);</div><div class='add'>+</div><div class='add'>+ vertDelta = top - co->top;</div><div class='add'>+ horizDelta = left - co->left;</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->left = left;</div><div class='add'>+</div><div class='add'>+ for (i = 0, el = form->elements; i < form->numComps; i++, el++) {</div><div class='add'>+ el->co->top += vertDelta;</div><div class='add'>+ el->top += vertDelta;</div><div class='add'>+ el->co->left += horizDelta;</div><div class='add'>+ el->left += horizDelta;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtDrawForm(newtComponent co) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+ struct element * el;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ newtFormSetSize(co);</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(form->background);</div><div class='add'>+ newtClearBox(co->left, co->top, co->width, co->height);</div><div class='add'>+ for (i = 0, el = form->elements; i < form->numComps; i++, el++) {</div><div class='add'>+ /* the scrollbar *always* fits somewhere */</div><div class='add'>+ if (el->co == form->vertBar) {</div><div class='add'>+ el->co->ops->mapped(el->co, 1);</div><div class='add'>+ el->co->ops->draw(el->co);</div><div class='add'>+ } else {</div><div class='add'>+ /* only draw it if it'll fit on the screen vertically */</div><div class='add'>+ if (componentFits(co, i)) {</div><div class='add'>+ el->co->top = el->top - form->vertOffset;</div><div class='add'>+ el->co->ops->mapped(el->co, 1);</div><div class='add'>+ el->co->ops->draw(el->co);</div><div class='add'>+ } else {</div><div class='add'>+ el->co->ops->mapped(el->co, 0);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (form->vertBar)</div><div class='add'>+ newtScrollbarSet(form->vertBar, form->vertOffset,</div><div class='add'>+ form->numRows - co->height);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult formEvent(newtComponent co, struct event ev) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+ newtComponent subco = form->elements[form->currComp].co;</div><div class='add'>+ int new, wrap = 0;</div><div class='add'>+ struct eventResult er;</div><div class='add'>+ int dir = 0, page = 0;</div><div class='add'>+ int i, num, found;</div><div class='add'>+ struct element * el;</div><div class='add'>+</div><div class='add'>+ er.result = ER_IGNORED;</div><div class='add'>+ if (!form->numComps) return er;</div><div class='add'>+</div><div class='add'>+ subco = form->elements[form->currComp].co;</div><div class='add'>+</div><div class='add'>+ switch (ev.when) {</div><div class='add'>+ case EV_EARLY:</div><div class='add'>+ if (ev.event == EV_KEYPRESS) {</div><div class='add'>+ if (ev.u.key == NEWT_KEY_TAB) {</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ dir = 1;</div><div class='add'>+ wrap = 1;</div><div class='add'>+ } else if (ev.u.key == NEWT_KEY_UNTAB) {</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ dir = -1;</div><div class='add'>+ wrap = 1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (form->numComps) {</div><div class='add'>+ i = form->currComp;</div><div class='add'>+ num = 0;</div><div class='add'>+ while (er.result == ER_IGNORED && num != form->numComps ) {</div><div class='add'>+ er = form->elements[i].co->ops->event(form->elements[i].co, ev);</div><div class='add'>+</div><div class='add'>+ num++;</div><div class='add'>+ i++;</div><div class='add'>+ if (i == form->numComps) i = 0;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EV_NORMAL:</div><div class='add'>+ if (ev.event == EV_MOUSE) {</div><div class='add'>+ found = 0;</div><div class='add'>+ for (i = 0, el = form->elements; i < form->numComps; i++, el++) {</div><div class='add'>+ if ((el->co->top <= ev.u.mouse.y) &&</div><div class='add'>+ (el->co->top + el->co->height > ev.u.mouse.y) &&</div><div class='add'>+ (el->co->left <= ev.u.mouse.x) &&</div><div class='add'>+ (el->co->left + el->co->width > ev.u.mouse.x)) {</div><div class='add'>+ found = 1;</div><div class='add'>+ if (el->co->takesFocus) {</div><div class='add'>+ gotoComponent(form, i);</div><div class='add'>+ subco = form->elements[form->currComp].co;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ /* If we did not find a co to send this event to, we</div><div class='add'>+ should just swallow the event here. */</div><div class='add'>+ }</div><div class='add'>+ if (!found) {</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+</div><div class='add'>+ return er;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ er = subco->ops->event(subco, ev);</div><div class='add'>+ switch (er.result) {</div><div class='add'>+ case ER_NEXTCOMP:</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ dir = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case ER_EXITFORM:</div><div class='add'>+ form->exitComp = subco;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EV_LATE:</div><div class='add'>+ er = subco->ops->event(subco, ev);</div><div class='add'>+</div><div class='add'>+ if (er.result == ER_IGNORED) {</div><div class='add'>+ switch (ev.u.key) {</div><div class='add'>+ case NEWT_KEY_UP:</div><div class='add'>+ case NEWT_KEY_LEFT:</div><div class='add'>+ case NEWT_KEY_BKSPC:</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ dir = -1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_DOWN:</div><div class='add'>+ case NEWT_KEY_RIGHT:</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ dir = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_PGUP:</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ dir = -1;</div><div class='add'>+ page = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_PGDN:</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ dir = 1;</div><div class='add'>+ page = 1;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (dir) {</div><div class='add'>+ new = form->currComp;</div><div class='add'>+</div><div class='add'>+ if (page) {</div><div class='add'>+ new += dir * co->height;</div><div class='add'>+ if (new < 0)</div><div class='add'>+ new = 0;</div><div class='add'>+ else if (new >= form->numComps)</div><div class='add'>+ new = (form->numComps - 1);</div><div class='add'>+</div><div class='add'>+ while (!form->elements[new].co->takesFocus)</div><div class='add'>+ new = new - dir;</div><div class='add'>+ } else {</div><div class='add'>+ do {</div><div class='add'>+ new += dir;</div><div class='add'>+</div><div class='add'>+ if (wrap) {</div><div class='add'>+ if (new < 0)</div><div class='add'>+ new = form->numComps - 1;</div><div class='add'>+ else if (new >= form->numComps)</div><div class='add'>+ new = 0;</div><div class='add'>+ } else if (new < 0 || new >= form->numComps)</div><div class='add'>+ return er;</div><div class='add'>+ } while (!form->elements[new].co->takesFocus);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* make sure this component is visible */</div><div class='add'>+ if (!componentFits(co, new)) {</div><div class='add'>+ gotoComponent(form, -1);</div><div class='add'>+</div><div class='add'>+ if (dir < 0) {</div><div class='add'>+ /* make the new component the first one */</div><div class='add'>+ form->vertOffset = form->elements[new].top - co->top;</div><div class='add'>+ } else {</div><div class='add'>+ /* make the new component the last one */</div><div class='add'>+ form->vertOffset = (form->elements[new].top +</div><div class='add'>+ form->elements[new].co->height) -</div><div class='add'>+ (co->top + co->height);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (form->vertOffset < 0) form->vertOffset = 0;</div><div class='add'>+ if (form->vertOffset > (form->numRows - co->height))</div><div class='add'>+ form->vertOffset = form->numRows - co->height;</div><div class='add'>+</div><div class='add'>+ newtDrawForm(co);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ gotoComponent(form, new);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* this also destroys all of the components on the form */</div><div class='add'>+void newtFormDestroy(newtComponent co) {</div><div class='add'>+ newtComponent subco;</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ /* first, destroy all of the components */</div><div class='add'>+ for (i = 0; i < form->numComps; i++) {</div><div class='add'>+ subco = form->elements[i].co;</div><div class='add'>+ if (subco->ops->destroy) {</div><div class='add'>+ subco->ops->destroy(subco);</div><div class='add'>+ } else {</div><div class='add'>+ if (subco->data) free(subco->data);</div><div class='add'>+ free(subco);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (form->hotKeys) free(form->hotKeys);</div><div class='add'>+</div><div class='add'>+ free(form->elements);</div><div class='add'>+ free(form);</div><div class='add'>+ free(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtRunForm(newtComponent co) {</div><div class='add'>+ struct newtExitStruct es;</div><div class='add'>+</div><div class='add'>+ newtFormRun(co, &es);</div><div class='add'>+ if (es.reason == NEWT_EXIT_HOTKEY) {</div><div class='add'>+ if (es.u.key == NEWT_KEY_F12) {</div><div class='add'>+ es.reason = NEWT_EXIT_COMPONENT;</div><div class='add'>+ es.u.co = co;</div><div class='add'>+ } else {</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return es.u.co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormAddHotKey(newtComponent co, int key) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+</div><div class='add'>+ form->numHotKeys++;</div><div class='add'>+ form->hotKeys = realloc(form->hotKeys, sizeof(int) * form->numHotKeys);</div><div class='add'>+ form->hotKeys[form->numHotKeys - 1] = key;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormSetSize(newtComponent co) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+ int delta, i;</div><div class='add'>+ struct element * el;</div><div class='add'>+</div><div class='add'>+ if (form->beenSet) return;</div><div class='add'>+</div><div class='add'>+ form->beenSet = 1;</div><div class='add'>+</div><div class='add'>+ if (!form->numComps) return;</div><div class='add'>+</div><div class='add'>+ co->width = 0;</div><div class='add'>+ if (!form->fixedHeight) co->height = 0;</div><div class='add'>+</div><div class='add'>+ co->top = form->elements[0].co->top;</div><div class='add'>+ co->left = form->elements[0].co->left;</div><div class='add'>+ for (i = 0, el = form->elements; i < form->numComps; i++, el++) {</div><div class='add'>+ if (el->co->ops == &formOps)</div><div class='add'>+ newtFormSetSize(el->co);</div><div class='add'>+</div><div class='add'>+ el->left = el->co->left;</div><div class='add'>+ el->top = el->co->top;</div><div class='add'>+</div><div class='add'>+ if (co->left > el->co->left) {</div><div class='add'>+ delta = co->left - el->co->left;</div><div class='add'>+ co->left -= delta;</div><div class='add'>+ co->width += delta;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (co->top > el->co->top) {</div><div class='add'>+ delta = co->top - el->co->top;</div><div class='add'>+ co->top -= delta;</div><div class='add'>+ if (!form->fixedHeight)</div><div class='add'>+ co->height += delta;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((co->left + co->width) < (el->co->left + el->co->width))</div><div class='add'>+ co->width = (el->co->left + el->co->width) - co->left;</div><div class='add'>+</div><div class='add'>+ if (!form->fixedHeight) {</div><div class='add'>+ if ((co->top + co->height) < (el->co->top + el->co->height))</div><div class='add'>+ co->height = (el->co->top + el->co->height) - co->top;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((el->co->top + el->co->height - co->top) > form->numRows) {</div><div class='add'>+ form->numRows = el->co->top + el->co->height - co->top;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormRun(newtComponent co, struct newtExitStruct * es) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+ struct event ev;</div><div class='add'>+ struct eventResult er;</div><div class='add'>+ int key, i, max;</div><div class='add'>+ int done = 0;</div><div class='add'>+ fd_set readSet, writeSet;</div><div class='add'>+ struct timeval nextTimeout, now, timeout;</div><div class='add'>+</div><div class='add'>+ newtFormSetSize(co);</div><div class='add'>+ /* draw all of the components */</div><div class='add'>+ newtDrawForm(co);</div><div class='add'>+</div><div class='add'>+ if (form->currComp == -1) {</div><div class='add'>+ gotoComponent(form, 0);</div><div class='add'>+ } else</div><div class='add'>+ gotoComponent(form, form->currComp);</div><div class='add'>+</div><div class='add'>+ while (!done) {</div><div class='add'>+ newtRefresh();</div><div class='add'>+</div><div class='add'>+ FD_ZERO(&readSet);</div><div class='add'>+ FD_ZERO(&writeSet);</div><div class='add'>+ FD_SET(0, &readSet);</div><div class='add'>+ max = form->maxFd;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < form->numFds; i++) {</div><div class='add'>+ if (form->fds[i].flags & NEWT_FD_READ)</div><div class='add'>+ FD_SET(form->fds[i].fd, &readSet);</div><div class='add'>+ if (form->fds[i].flags & NEWT_FD_WRITE)</div><div class='add'>+ FD_SET(form->fds[i].fd, &writeSet);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (form->timer) {</div><div class='add'>+ /* Calculate when we next need to return with a timeout. Do</div><div class='add'>+ this inside the loop in case a callback resets the timer. */</div><div class='add'>+ if (!form->lastTimeout.tv_sec && !form->lastTimeout.tv_usec)</div><div class='add'>+ gettimeofday(&form->lastTimeout, NULL);</div><div class='add'>+</div><div class='add'>+ nextTimeout.tv_sec = form->lastTimeout.tv_sec + </div><div class='add'>+ (form->timer / 1000);</div><div class='add'>+ nextTimeout.tv_usec = form->lastTimeout.tv_usec + </div><div class='add'>+ (form->timer % 1000) * 1000;</div><div class='add'>+</div><div class='add'>+ gettimeofday(&now, 0);</div><div class='add'>+</div><div class='add'>+ if (now.tv_sec > nextTimeout.tv_sec) {</div><div class='add'>+ timeout.tv_sec = timeout.tv_usec = 0;</div><div class='add'>+ } else if (now.tv_sec == nextTimeout.tv_sec) {</div><div class='add'>+ timeout.tv_sec = 0;</div><div class='add'>+ if (now.tv_usec > nextTimeout.tv_usec)</div><div class='add'>+ timeout.tv_usec = 0;</div><div class='add'>+ else</div><div class='add'>+ timeout.tv_usec = nextTimeout.tv_usec - now.tv_usec;</div><div class='add'>+ } else if (now.tv_sec < nextTimeout.tv_sec) {</div><div class='add'>+ timeout.tv_sec = nextTimeout.tv_sec - now.tv_sec;</div><div class='add'>+ if (now.tv_usec > nextTimeout.tv_usec)</div><div class='add'>+ timeout.tv_sec--,</div><div class='add'>+ timeout.tv_usec = nextTimeout.tv_usec + 1000000 -</div><div class='add'>+ now.tv_usec;</div><div class='add'>+ else </div><div class='add'>+ timeout.tv_usec = nextTimeout.tv_usec - now.tv_usec;</div><div class='add'>+ }</div><div class='add'>+ } else {</div><div class='add'>+ timeout.tv_sec = timeout.tv_usec = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ i = select(max + 1, &readSet, &writeSet, NULL, </div><div class='add'>+ form->timer ? &timeout : NULL);</div><div class='add'>+ if (i < 0) continue; /* ?? What should we do here? */</div><div class='add'>+</div><div class='add'>+ if (i == 0) {</div><div class='add'>+ done = 1;</div><div class='add'>+ es->reason = NEWT_EXIT_TIMER;</div><div class='add'>+ gettimeofday(&form->lastTimeout, NULL);</div><div class='add'>+ } else</div><div class='add'>+ {</div><div class='add'>+ if (FD_ISSET(0, &readSet)) {</div><div class='add'>+</div><div class='add'>+ key = newtGetKey();</div><div class='add'>+</div><div class='add'>+ if (key == NEWT_KEY_RESIZE) {</div><div class='add'>+ /* newtResizeScreen(1); */</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < form->numHotKeys; i++) {</div><div class='add'>+ if (form->hotKeys[i] == key) {</div><div class='add'>+ es->reason = NEWT_EXIT_HOTKEY;</div><div class='add'>+ es->u.key = key;</div><div class='add'>+ done = 1;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (key == NEWT_KEY_F1 && form->helpTag && form->helpCb)</div><div class='add'>+ form->helpCb(co, form->helpTag);</div><div class='add'>+</div><div class='add'>+ if (!done) {</div><div class='add'>+ ev.event = EV_KEYPRESS;</div><div class='add'>+ ev.u.key = key;</div><div class='add'>+</div><div class='add'>+ er = sendEvent(co, ev);</div><div class='add'>+</div><div class='add'>+ if (er.result == ER_EXITFORM) {</div><div class='add'>+ done = 1;</div><div class='add'>+ es->reason = NEWT_EXIT_COMPONENT;</div><div class='add'>+ es->u.co = form->exitComp;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ } else {</div><div class='add'>+ es->reason = NEWT_EXIT_FDREADY;</div><div class='add'>+ done = 1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ newtRefresh();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult sendEvent(newtComponent co, struct event ev) {</div><div class='add'>+ struct eventResult er;</div><div class='add'>+</div><div class='add'>+ ev.when = EV_EARLY;</div><div class='add'>+ er = co->ops->event(co, ev);</div><div class='add'>+</div><div class='add'>+ if (er.result == ER_IGNORED) {</div><div class='add'>+ ev.when = EV_NORMAL;</div><div class='add'>+ er = co->ops->event(co, ev);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (er.result == ER_IGNORED) {</div><div class='add'>+ ev.when = EV_LATE;</div><div class='add'>+ er = co->ops->event(co, ev);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void gotoComponent(struct form * form, int newComp) {</div><div class='add'>+ struct event ev;</div><div class='add'>+</div><div class='add'>+ if (form->currComp != -1) {</div><div class='add'>+ ev.event = EV_UNFOCUS;</div><div class='add'>+ sendEvent(form->elements[form->currComp].co, ev);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ form->currComp = newComp;</div><div class='add'>+</div><div class='add'>+ if (form->currComp != -1) {</div><div class='add'>+ ev.event = EV_FOCUS;</div><div class='add'>+ ev.when = EV_NORMAL;</div><div class='add'>+ sendEvent(form->elements[form->currComp].co, ev);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtComponentAddCallback(newtComponent co, newtCallback f, void * data) {</div><div class='add'>+ co->callback = f;</div><div class='add'>+ co->callbackData = data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtComponentTakesFocus(newtComponent co, int val) {</div><div class='add'>+ co->takesFocus = val;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormSetBackground(newtComponent co, int color) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+</div><div class='add'>+ form->background = color;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormWatchFd(newtComponent co, int fd, int fdFlags) {</div><div class='add'>+ struct form * form = co->data;</div><div class='add'>+</div><div class='add'>+ form->fds = realloc(form->fds, (form->numFds + 1) * sizeof(*form->fds));</div><div class='add'>+ form->fds[form->numFds].fd = fd;</div><div class='add'>+ form->fds[form->numFds++].flags = fdFlags;</div><div class='add'>+ if (form->maxFd < fd) form->maxFd = fd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtSetHelpCallback(newtCallback cb) {</div><div class='add'>+ helpCallback = cb;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/grid.c b/mdk-stage1/newt/grid.c<br/>new file mode 100644<br/>index 000000000..433011396<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/grid.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/grid.c</a></div><div class='hunk'>@@ -0,0 +1,389 @@</div><div class='add'>+#include <alloca.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct gridField {</div><div class='add'>+ enum newtGridElement type;</div><div class='add'>+ union {</div><div class='add'>+ newtGrid grid;</div><div class='add'>+ newtComponent co;</div><div class='add'>+ } u;</div><div class='add'>+ int padLeft, padTop, padRight, padBottom;</div><div class='add'>+ int anchor;</div><div class='add'>+ int flags;</div><div class='add'>+}; </div><div class='add'>+</div><div class='add'>+struct grid_s {</div><div class='add'>+ int rows, cols;</div><div class='add'>+ int width, height; /* totals, -1 means unknown */</div><div class='add'>+ struct gridField ** fields;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* this is a bit of a hack */</div><div class='add'>+extern struct componentOps formOps[];</div><div class='add'>+</div><div class='add'>+newtGrid newtCreateGrid(int cols, int rows) {</div><div class='add'>+ newtGrid grid;</div><div class='add'>+</div><div class='add'>+ grid = malloc(sizeof(*grid));</div><div class='add'>+ grid->rows = rows;</div><div class='add'>+ grid->cols = cols;</div><div class='add'>+</div><div class='add'>+ grid->fields = malloc(sizeof(*grid->fields) * cols);</div><div class='add'>+ while (cols--) {</div><div class='add'>+ grid->fields[cols] = malloc(sizeof(**(grid->fields)) * rows);</div><div class='add'>+ memset(grid->fields[cols], 0, sizeof(**(grid->fields)) * rows);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ grid->width = grid->height = -1;</div><div class='add'>+</div><div class='add'>+ return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridSetField(newtGrid grid, int col, int row, </div><div class='add'>+ enum newtGridElement type, void * val, int padLeft,</div><div class='add'>+ int padTop, int padRight, int padBottom, int anchor,</div><div class='add'>+ int flags) {</div><div class='add'>+ struct gridField * field = &grid->fields[col][row];</div><div class='add'>+</div><div class='add'>+ if (field->type == NEWT_GRID_SUBGRID) </div><div class='add'>+ newtGridFree(field->u.grid, 1);</div><div class='add'>+</div><div class='add'>+ field->type = type;</div><div class='add'>+ field->u.co = (void *) val;</div><div class='add'>+</div><div class='add'>+ field->padLeft = padLeft;</div><div class='add'>+ field->padRight = padRight;</div><div class='add'>+ field->padTop = padTop;</div><div class='add'>+ field->padBottom = padBottom;</div><div class='add'>+ field->anchor = anchor;</div><div class='add'>+ field->flags = flags;</div><div class='add'>+</div><div class='add'>+ grid->width = grid->height = -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void distSpace(int extra, int items, int * list) {</div><div class='add'>+ int all, some, i;</div><div class='add'>+</div><div class='add'>+ all = extra / items;</div><div class='add'>+ some = extra % items;</div><div class='add'>+ for (i = 0; i < items; i++) {</div><div class='add'>+ list[i] += all;</div><div class='add'>+ if (some) {</div><div class='add'>+ list[i]++;</div><div class='add'>+ some--;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void shuffleGrid(newtGrid grid, int left, int top, int set) {</div><div class='add'>+ struct gridField * field;</div><div class='add'>+ int row, col;</div><div class='add'>+ int i, j;</div><div class='add'>+ int minWidth, minHeight;</div><div class='add'>+ int * widths, * heights;</div><div class='add'>+ int thisLeft, thisTop;</div><div class='add'>+ int x, y, remx, remy;</div><div class='add'>+</div><div class='add'>+ widths = alloca(sizeof(*widths) * grid->cols);</div><div class='add'>+ memset(widths, 0, sizeof(*widths) * grid->cols);</div><div class='add'>+ heights = alloca(sizeof(*heights) * grid->rows);</div><div class='add'>+ memset(heights, 0, sizeof(*heights) * grid->rows);</div><div class='add'>+</div><div class='add'>+ minWidth = 0;</div><div class='add'>+ for (row = 0; row < grid->rows; row++) {</div><div class='add'>+ i = 0;</div><div class='add'>+ for (col = 0; col < grid->cols; col++) {</div><div class='add'>+ field = &grid->fields[col][row];</div><div class='add'>+ if (field->type == NEWT_GRID_SUBGRID) {</div><div class='add'>+ /* we'll have to redo this later */</div><div class='add'>+ if (field->u.grid->width == -1) </div><div class='add'>+ shuffleGrid(field->u.grid, left, top, 0);</div><div class='add'>+ j = field->u.grid->width;</div><div class='add'>+ } else if (field->type == NEWT_GRID_COMPONENT) {</div><div class='add'>+ if (field->u.co->ops == formOps)</div><div class='add'>+ newtFormSetSize(field->u.co);</div><div class='add'>+ j = field->u.co->width;</div><div class='add'>+ } else </div><div class='add'>+ j = 0;</div><div class='add'>+</div><div class='add'>+ j += field->padLeft + field->padRight;</div><div class='add'>+</div><div class='add'>+ if (j > widths[col]) widths[col] = j;</div><div class='add'>+ i += widths[col];</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (i > minWidth) minWidth = i;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ minHeight = 0;</div><div class='add'>+ for (col = 0; col < grid->cols; col++) {</div><div class='add'>+ i = 0;</div><div class='add'>+ for (row = 0; row < grid->rows; row++) {</div><div class='add'>+ field = &grid->fields[col][row];</div><div class='add'>+ if (field->type == NEWT_GRID_SUBGRID) {</div><div class='add'>+ /* we'll have to redo this later */</div><div class='add'>+ if (field->u.grid->height == -1) </div><div class='add'>+ shuffleGrid(field->u.grid, 0, 0, 0);</div><div class='add'>+ j = field->u.grid->height;</div><div class='add'>+ } else if (field->type == NEWT_GRID_COMPONENT){</div><div class='add'>+ j = field->u.co->height;</div><div class='add'>+ } else </div><div class='add'>+ j = 0;</div><div class='add'>+</div><div class='add'>+ j += field->padTop + field->padBottom;</div><div class='add'>+</div><div class='add'>+ if (j > heights[row]) heights[row] = j;</div><div class='add'>+ i += heights[row];</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (i > minHeight) minHeight = i;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* this catches the -1 case */</div><div class='add'>+ if (grid->width < minWidth) grid->width = minWidth; /* ack! */</div><div class='add'>+ if (grid->height < minHeight) grid->height = minHeight; /* ditto! */</div><div class='add'>+</div><div class='add'>+ if (!set) return;</div><div class='add'>+</div><div class='add'>+ distSpace(grid->width - minWidth, grid->cols, widths);</div><div class='add'>+ distSpace(grid->height - minHeight, grid->rows, heights);</div><div class='add'>+</div><div class='add'>+ thisTop = top;</div><div class='add'>+ for (row = 0; row < grid->rows; row++) {</div><div class='add'>+ i = 0;</div><div class='add'>+ thisLeft = left;</div><div class='add'>+ for (col = 0; col < grid->cols; col++) {</div><div class='add'>+ field = &grid->fields[col][row];</div><div class='add'>+</div><div class='add'>+ if (field->type == NEWT_GRID_EMPTY) continue;</div><div class='add'>+</div><div class='add'>+ x = thisLeft + field->padLeft;</div><div class='add'>+ remx = widths[col] - field->padLeft - field->padRight;</div><div class='add'>+ y = thisTop + field->padTop;</div><div class='add'>+ remy = heights[row] - field->padTop - field->padBottom;</div><div class='add'>+</div><div class='add'>+ if (field->type == NEWT_GRID_SUBGRID) {</div><div class='add'>+ remx -= field->u.grid->width;</div><div class='add'>+ remy -= field->u.grid->height;</div><div class='add'>+ } else if (field->type == NEWT_GRID_COMPONENT) {</div><div class='add'>+ remx -= field->u.co->width;</div><div class='add'>+ remy -= field->u.co->height;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (!(field->flags & NEWT_GRID_FLAG_GROWX)) {</div><div class='add'>+ if (field->anchor & NEWT_ANCHOR_RIGHT)</div><div class='add'>+ x += remx;</div><div class='add'>+ else if (!(field->anchor & NEWT_ANCHOR_LEFT))</div><div class='add'>+ x += (remx / 2);</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (!(field->flags & NEWT_GRID_FLAG_GROWY)) {</div><div class='add'>+ if (field->anchor & NEWT_ANCHOR_BOTTOM)</div><div class='add'>+ y += remx;</div><div class='add'>+ else if (!(field->anchor & NEWT_ANCHOR_TOP))</div><div class='add'>+ y += (remy / 2);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (field->type == NEWT_GRID_SUBGRID) {</div><div class='add'>+ if (field->flags & NEWT_GRID_FLAG_GROWX)</div><div class='add'>+ field->u.grid->width = widths[col] - field->padLeft </div><div class='add'>+ - field->padRight;</div><div class='add'>+ if (field->flags & NEWT_GRID_FLAG_GROWY)</div><div class='add'>+ field->u.grid->height = heights[col] - field->padTop</div><div class='add'>+ - field->padBottom;</div><div class='add'>+</div><div class='add'>+ shuffleGrid(field->u.grid, x, y, 1);</div><div class='add'>+ } else if (field->type == NEWT_GRID_COMPONENT) {</div><div class='add'>+ field->u.co->ops->place(field->u.co, x, y);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ thisLeft += widths[col];</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ thisTop += heights[row];</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridPlace(newtGrid grid, int left, int top) {</div><div class='add'>+ shuffleGrid(grid, left, top, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridFree(newtGrid grid, int recurse) {</div><div class='add'>+ int row, col;</div><div class='add'>+</div><div class='add'>+ for (col = 0; col < grid->cols; col++) {</div><div class='add'>+ if (recurse) {</div><div class='add'>+ for (row = 0; row < grid->rows; row++) {</div><div class='add'>+ if (grid->fields[col][row].type == NEWT_GRID_SUBGRID)</div><div class='add'>+ newtGridFree(grid->fields[col][row].u.grid, 1);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ free(grid->fields[col]);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ free(grid->fields);</div><div class='add'>+ free(grid);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridGetSize(newtGrid grid, int * width, int * height) {</div><div class='add'>+ if (grid->width == -1 || grid->height == -1) {</div><div class='add'>+ grid->width = grid->height = -1;</div><div class='add'>+ shuffleGrid(grid, 0, 0, 1);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *width = grid->width;</div><div class='add'>+ *height = grid->height;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridWrappedWindow(newtGrid grid, char * title) {</div><div class='add'>+ int width, height, offset = 0;</div><div class='add'>+</div><div class='add'>+ newtGridGetSize(grid, &width, &height);</div><div class='add'>+ if (width < strlen(title) + 2) {</div><div class='add'>+ offset = ((strlen(title) + 2) - width) / 2; </div><div class='add'>+ width = strlen(title) + 2;</div><div class='add'>+ }</div><div class='add'>+ newtCenteredWindow(width + 2, height + 2, title);</div><div class='add'>+ newtGridPlace(grid, 1 + offset, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridWrappedWindowAt(newtGrid grid, char * title, int left, int top) {</div><div class='add'>+ int width, height;</div><div class='add'>+</div><div class='add'>+ newtGridGetSize(grid, &width, &height);</div><div class='add'>+ newtOpenWindow(left, top, width + 2, height + 2, title);</div><div class='add'>+ newtGridPlace(grid, 1, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridAddComponentsToForm(newtGrid grid, newtComponent form, </div><div class='add'>+ int recurse) {</div><div class='add'>+ int row, col;</div><div class='add'>+</div><div class='add'>+ for (col = 0; col < grid->cols; col++) {</div><div class='add'>+ for (row = 0; row < grid->rows; row++) {</div><div class='add'>+ if (grid->fields[col][row].type == NEWT_GRID_SUBGRID && recurse)</div><div class='add'>+ newtGridAddComponentsToForm(grid->fields[col][row].u.grid,</div><div class='add'>+ form, 1);</div><div class='add'>+ else if (grid->fields[col][row].type == NEWT_GRID_COMPONENT)</div><div class='add'>+ newtFormAddComponent(form, grid->fields[col][row].u.co);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* this handles up to 50 items */</div><div class='add'>+static newtGrid stackem(int isVert, enum newtGridElement type1, void * what1,</div><div class='add'>+ va_list args, int close) {</div><div class='add'>+ struct item {</div><div class='add'>+ enum newtGridElement type;</div><div class='add'>+ void * what;</div><div class='add'>+ } items[50];</div><div class='add'>+ int i, num;</div><div class='add'>+ newtGrid grid;</div><div class='add'>+ </div><div class='add'>+ items[0].type = type1, items[0].what = what1, num = 1;</div><div class='add'>+ while (1) {</div><div class='add'>+ items[num].type = va_arg(args, enum newtGridElement);</div><div class='add'>+ if (items[num].type == NEWT_GRID_EMPTY) break;</div><div class='add'>+</div><div class='add'>+ items[num].what = va_arg(args, void *);</div><div class='add'>+ num++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ grid = newtCreateGrid(isVert ? 1 : num, isVert ? num : 1);</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < num; i++) {</div><div class='add'>+ newtGridSetField(grid, isVert ? 0 : i, isVert ? i : 0, </div><div class='add'>+ items[i].type, items[i].what,</div><div class='add'>+ close ? 0 : (i ? (isVert ? 0 : 1) : 0),</div><div class='add'>+ close ? 0 : (i ? (isVert ? 1 : 0) : 0), 0, 0, 0, 0);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtGridHCloseStacked(enum newtGridElement type1, void * what1, ...) {</div><div class='add'>+ va_list args;</div><div class='add'>+ newtGrid grid;</div><div class='add'>+</div><div class='add'>+ va_start(args, what1);</div><div class='add'>+</div><div class='add'>+ grid = stackem(0, type1, what1, args, 1);</div><div class='add'>+</div><div class='add'>+ va_start(args, what1);</div><div class='add'>+</div><div class='add'>+ return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtGridVCloseStacked(enum newtGridElement type1, void * what1, ...) {</div><div class='add'>+ va_list args;</div><div class='add'>+ newtGrid grid;</div><div class='add'>+</div><div class='add'>+ va_start(args, what1);</div><div class='add'>+</div><div class='add'>+ grid = stackem(1, type1, what1, args, 1);</div><div class='add'>+</div><div class='add'>+ va_start(args, what1);</div><div class='add'>+</div><div class='add'>+ return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtGridVStacked(enum newtGridElement type1, void * what1, ...) {</div><div class='add'>+ va_list args;</div><div class='add'>+ newtGrid grid;</div><div class='add'>+</div><div class='add'>+ va_start(args, what1);</div><div class='add'>+</div><div class='add'>+ grid = stackem(1, type1, what1, args, 0);</div><div class='add'>+</div><div class='add'>+ va_start(args, what1);</div><div class='add'>+</div><div class='add'>+ return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtGridHStacked(enum newtGridElement type1, void * what1, ...) {</div><div class='add'>+ va_list args;</div><div class='add'>+ newtGrid grid;</div><div class='add'>+</div><div class='add'>+ va_start(args, what1);</div><div class='add'>+</div><div class='add'>+ grid = stackem(0, type1, what1, args, 0);</div><div class='add'>+</div><div class='add'>+ va_start(args, what1);</div><div class='add'>+</div><div class='add'>+ return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtGridBasicWindow(newtComponent text, newtGrid middle,</div><div class='add'>+ newtGrid buttons) {</div><div class='add'>+ newtGrid grid;</div><div class='add'>+</div><div class='add'>+ grid = newtCreateGrid(1, 3);</div><div class='add'>+ newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, text,</div><div class='add'>+ 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);</div><div class='add'>+ newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, middle,</div><div class='add'>+ 0, 1, 0, 0, 0, 0);</div><div class='add'>+ newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttons,</div><div class='add'>+ 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX);</div><div class='add'>+</div><div class='add'>+ return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtGridSimpleWindow(newtComponent text, newtComponent middle,</div><div class='add'>+ newtGrid buttons) {</div><div class='add'>+ newtGrid grid;</div><div class='add'>+</div><div class='add'>+ grid = newtCreateGrid(1, 3);</div><div class='add'>+ newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, text,</div><div class='add'>+ 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);</div><div class='add'>+ newtGridSetField(grid, 0, 1, NEWT_GRID_COMPONENT, middle,</div><div class='add'>+ 0, 1, 0, 0, 0, 0);</div><div class='add'>+ newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttons,</div><div class='add'>+ 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX);</div><div class='add'>+</div><div class='add'>+ return grid;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/label.c b/mdk-stage1/newt/label.c<br/>new file mode 100644<br/>index 000000000..f1a9cebbf<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/label.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/label.c</a></div><div class='hunk'>@@ -0,0 +1,81 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct label {</div><div class='add'>+ char * text;</div><div class='add'>+ int length;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void labelDraw(newtComponent co);</div><div class='add'>+static void labelDestroy(newtComponent co);</div><div class='add'>+</div><div class='add'>+static struct componentOps labelOps = {</div><div class='add'>+ labelDraw,</div><div class='add'>+ newtDefaultEventHandler,</div><div class='add'>+ labelDestroy,</div><div class='add'>+ newtDefaultPlaceHandler,</div><div class='add'>+ newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+newtComponent newtLabel(int left, int top, const char * text) {</div><div class='add'>+ newtComponent co;</div><div class='add'>+ struct label * la;</div><div class='add'>+</div><div class='add'>+ co = malloc(sizeof(*co));</div><div class='add'>+ la = malloc(sizeof(struct label));</div><div class='add'>+ co->data = la;</div><div class='add'>+</div><div class='add'>+ co->ops = &labelOps;</div><div class='add'>+</div><div class='add'>+ co->height = 1;</div><div class='add'>+ co->width = strlen(text);</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->takesFocus = 0;</div><div class='add'>+</div><div class='add'>+ la->length = strlen(text);</div><div class='add'>+ la->text = strdup(text);</div><div class='add'>+</div><div class='add'>+ return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtLabelSetText(newtComponent co, const char * text) {</div><div class='add'>+ int newLength;</div><div class='add'>+ struct label * la = co->data;</div><div class='add'>+</div><div class='add'>+ newLength = strlen(text);</div><div class='add'>+ if (newLength <= la->length) {</div><div class='add'>+ memset(la->text, ' ', la->length);</div><div class='add'>+ memcpy(la->text, text, newLength);</div><div class='add'>+ } else {</div><div class='add'>+ free(la->text);</div><div class='add'>+ la->text = strdup(text);</div><div class='add'>+ la->length = newLength;</div><div class='add'>+ co->width = newLength;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ labelDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void labelDraw(newtComponent co) {</div><div class='add'>+ struct label * la = co->data;</div><div class='add'>+</div><div class='add'>+ if (co->isMapped == -1) return;</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(COLORSET_LABEL);</div><div class='add'>+</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+ SLsmg_write_string(la->text);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void labelDestroy(newtComponent co) {</div><div class='add'>+ struct label * la = co->data;</div><div class='add'>+</div><div class='add'>+ free(la->text);</div><div class='add'>+ free(la);</div><div class='add'>+ free(co);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/listbox.c b/mdk-stage1/newt/listbox.c<br/>new file mode 100644<br/>index 000000000..ef276aeb4<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/listbox.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/listbox.c</a></div><div class='hunk'>@@ -0,0 +1,752 @@</div><div class='add'>+/* This goofed-up box whacked into shape by Elliot Lee <sopwith@cuc.edu></div><div class='add'>+ (from the original listbox by Erik Troan <ewt@redhat.com>)</div><div class='add'>+ and contributed to newt for use under the LGPL license.</div><div class='add'>+ Copyright (C) 1996, 1997 Elliot Lee */</div><div class='add'>+</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdio.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+#include <ctype.h></div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* Linked list of items in the listbox */</div><div class='add'>+struct items {</div><div class='add'>+ char * text;</div><div class='add'>+ const void *data;</div><div class='add'>+ unsigned char isSelected;</div><div class='add'>+ struct items *next;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Holds all the relevant information for this listbox */</div><div class='add'>+struct listbox {</div><div class='add'>+ newtComponent sb; /* Scrollbar on right side of listbox */</div><div class='add'>+ int curWidth; /* size of text w/o scrollbar or border*/</div><div class='add'>+ int curHeight; /* size of text w/o border */</div><div class='add'>+ int sbAdjust;</div><div class='add'>+ int bdxAdjust, bdyAdjust;</div><div class='add'>+ int numItems, numSelected;</div><div class='add'>+ int userHasSetWidth;</div><div class='add'>+ int currItem, startShowItem; /* startShowItem is the first item displayed</div><div class='add'>+ on the screen */</div><div class='add'>+ int isActive; /* If we handle key events all the time, it seems</div><div class='add'>+ to do things even when they are supposed to be for</div><div class='add'>+ another button/whatever */</div><div class='add'>+ struct items *boxItems;</div><div class='add'>+ int grow;</div><div class='add'>+ int flags; /* flags for this listbox, right now just</div><div class='add'>+ NEWT_FLAG_RETURNEXIT */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void listboxDraw(newtComponent co);</div><div class='add'>+static void listboxDestroy(newtComponent co);</div><div class='add'>+static struct eventResult listboxEvent(newtComponent co, struct event ev);</div><div class='add'>+static void newtListboxRealSetCurrent(newtComponent co);</div><div class='add'>+static void listboxPlace(newtComponent co, int newLeft, int newTop);</div><div class='add'>+static inline void updateWidth(newtComponent co, struct listbox * li,</div><div class='add'>+ int maxField);</div><div class='add'>+static void listboxMapped(newtComponent co, int isMapped);</div><div class='add'>+</div><div class='add'>+static struct componentOps listboxOps = {</div><div class='add'>+ listboxDraw,</div><div class='add'>+ listboxEvent,</div><div class='add'>+ listboxDestroy,</div><div class='add'>+ listboxPlace,</div><div class='add'>+ listboxMapped,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void listboxMapped(newtComponent co, int isMapped) {</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+</div><div class='add'>+ co->isMapped = isMapped;</div><div class='add'>+ if (li->sb)</div><div class='add'>+ li->sb->ops->mapped(li->sb, isMapped);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void listboxPlace(newtComponent co, int newLeft, int newTop) {</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+</div><div class='add'>+ co->top = newTop;</div><div class='add'>+ co->left = newLeft;</div><div class='add'>+</div><div class='add'>+ if (li->sb)</div><div class='add'>+ li->sb->ops->place(li->sb, co->left + co->width - li->bdxAdjust - 1,</div><div class='add'>+ co->top);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtListbox(int left, int top, int height, int flags) {</div><div class='add'>+ newtComponent co, sb;</div><div class='add'>+ struct listbox * li;</div><div class='add'>+</div><div class='add'>+ if (!(co = malloc(sizeof(*co))))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ if (!(li = malloc(sizeof(struct listbox)))) {</div><div class='add'>+ free(co);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ li->boxItems = NULL;</div><div class='add'>+ li->numItems = 0;</div><div class='add'>+ li->currItem = 0;</div><div class='add'>+ li->numSelected = 0;</div><div class='add'>+ li->isActive = 0;</div><div class='add'>+ li->userHasSetWidth = 0;</div><div class='add'>+ li->startShowItem = 0;</div><div class='add'>+ li->sbAdjust = 0;</div><div class='add'>+ li->bdxAdjust = 0;</div><div class='add'>+ li->bdyAdjust = 0;</div><div class='add'>+ li->flags = flags & (NEWT_FLAG_RETURNEXIT | NEWT_FLAG_BORDER |</div><div class='add'>+ NEWT_FLAG_MULTIPLE);</div><div class='add'>+</div><div class='add'>+ if (li->flags & NEWT_FLAG_BORDER) {</div><div class='add'>+ li->bdxAdjust = 2;</div><div class='add'>+ li->bdyAdjust = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ co->height = height;</div><div class='add'>+ li->curHeight = co->height - (2 * li->bdyAdjust);</div><div class='add'>+</div><div class='add'>+ if (height) {</div><div class='add'>+ li->grow = 0;</div><div class='add'>+ if (flags & NEWT_FLAG_SCROLL) {</div><div class='add'>+ sb = newtVerticalScrollbar(left, top + li->bdyAdjust,</div><div class='add'>+ li->curHeight,</div><div class='add'>+ COLORSET_LISTBOX, COLORSET_ACTLISTBOX);</div><div class='add'>+ li->sbAdjust = 3;</div><div class='add'>+ } else {</div><div class='add'>+ sb = NULL;</div><div class='add'>+ }</div><div class='add'>+ } else {</div><div class='add'>+ li->grow = 1;</div><div class='add'>+ sb = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ li->sb = sb;</div><div class='add'>+ co->data = li;</div><div class='add'>+ co->isMapped = 0;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->ops = &listboxOps;</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+ co->callback = NULL;</div><div class='add'>+</div><div class='add'>+ updateWidth(co, li, 5);</div><div class='add'>+</div><div class='add'>+ return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void updateWidth(newtComponent co, struct listbox * li,</div><div class='add'>+ int maxField) {</div><div class='add'>+ li->curWidth = maxField;</div><div class='add'>+ co->width = li->curWidth + li->sbAdjust + 2 * li->bdxAdjust;</div><div class='add'>+</div><div class='add'>+ if (li->sb)</div><div class='add'>+ li->sb->left = co->left + co->width - li->bdxAdjust - 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxSetCurrentByKey(newtComponent co, void * key) {</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+ struct items * item;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ item = li->boxItems, i = 0;</div><div class='add'>+ while (item && item->data != key)</div><div class='add'>+ item = item->next, i++;</div><div class='add'>+</div><div class='add'>+ if (item)</div><div class='add'>+ newtListboxSetCurrent(co, i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxSetCurrent(newtComponent co, int num)</div><div class='add'>+{</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+</div><div class='add'>+ if (num >= li->numItems)</div><div class='add'>+ li->currItem = li->numItems - 1;</div><div class='add'>+ else if (num < 0)</div><div class='add'>+ li->currItem = 0;</div><div class='add'>+ else</div><div class='add'>+ li->currItem = num;</div><div class='add'>+</div><div class='add'>+ if (li->currItem < li->startShowItem)</div><div class='add'>+ li->startShowItem = li->currItem;</div><div class='add'>+ else if (li->currItem - li->startShowItem > li->curHeight - 1)</div><div class='add'>+ li->startShowItem = li->currItem - li->curHeight + 1;</div><div class='add'>+ if (li->startShowItem + li->curHeight > li->numItems)</div><div class='add'>+ li->startShowItem = li->numItems - li->curHeight;</div><div class='add'>+ if(li->startShowItem < 0)</div><div class='add'>+ li->startShowItem = 0;</div><div class='add'>+</div><div class='add'>+ newtListboxRealSetCurrent(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void newtListboxRealSetCurrent(newtComponent co)</div><div class='add'>+{</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+</div><div class='add'>+ if(li->sb)</div><div class='add'>+ newtScrollbarSet(li->sb, li->currItem + 1, li->numItems);</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxSetWidth(newtComponent co, int width) {</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+</div><div class='add'>+ co->width = width;</div><div class='add'>+ li->curWidth = co->width - li->sbAdjust - 2 * li->bdxAdjust;</div><div class='add'>+ li->userHasSetWidth = 1;</div><div class='add'>+ if (li->sb) li->sb->left = co->width + co->left - 1;</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void * newtListboxGetCurrent(newtComponent co) {</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+ int i;</div><div class='add'>+ struct items *item;</div><div class='add'>+</div><div class='add'>+ for(i = 0, item = li->boxItems; item != NULL && i < li->currItem;</div><div class='add'>+ i++, item = item->next);</div><div class='add'>+</div><div class='add'>+ if (item)</div><div class='add'>+ return (void *)item->data;</div><div class='add'>+ else</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxSelectItem(newtComponent co, const void * key,</div><div class='add'>+ enum newtFlagsSense sense)</div><div class='add'>+{</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+ int i;</div><div class='add'>+ struct items * item;</div><div class='add'>+</div><div class='add'>+ item = li->boxItems, i = 0;</div><div class='add'>+ while (item && item->data != key)</div><div class='add'>+ item = item->next, i++;</div><div class='add'>+</div><div class='add'>+ if (!item) return;</div><div class='add'>+</div><div class='add'>+ if (item->isSelected)</div><div class='add'>+ li->numSelected--;</div><div class='add'>+</div><div class='add'>+ switch(sense) {</div><div class='add'>+ case NEWT_FLAGS_RESET:</div><div class='add'>+ item->isSelected = 0; break;</div><div class='add'>+ case NEWT_FLAGS_SET:</div><div class='add'>+ item->isSelected = 1; break;</div><div class='add'>+ case NEWT_FLAGS_TOGGLE:</div><div class='add'>+ item->isSelected = !item->isSelected;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (item->isSelected)</div><div class='add'>+ li->numSelected++;</div><div class='add'>+</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxClearSelection(newtComponent co)</div><div class='add'>+{</div><div class='add'>+ struct items *item;</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+</div><div class='add'>+ for(item = li->boxItems; item != NULL;</div><div class='add'>+ item = item->next)</div><div class='add'>+ item->isSelected = 0;</div><div class='add'>+ li->numSelected = 0;</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Free the returned array after use, but NOT the values in the array */</div><div class='add'>+void ** newtListboxGetSelection(newtComponent co, int *numitems)</div><div class='add'>+{</div><div class='add'>+ struct listbox * li;</div><div class='add'>+ int i;</div><div class='add'>+ void **retval;</div><div class='add'>+ struct items *item;</div><div class='add'>+</div><div class='add'>+ if(!co || !numitems) return NULL;</div><div class='add'>+</div><div class='add'>+ li = co->data;</div><div class='add'>+ if(!li || !li->numSelected) return NULL;</div><div class='add'>+</div><div class='add'>+ retval = malloc(li->numSelected * sizeof(void *));</div><div class='add'>+ for(i = 0, item = li->boxItems; item != NULL;</div><div class='add'>+ item = item->next)</div><div class='add'>+ if(item->isSelected)</div><div class='add'>+ retval[i++] = (void *)item->data;</div><div class='add'>+ *numitems = li->numSelected;</div><div class='add'>+ return retval;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxSetEntry(newtComponent co, int num, const char * text) {</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+ int i;</div><div class='add'>+ struct items *item;</div><div class='add'>+</div><div class='add'>+ for(i = 0, item = li->boxItems; item != NULL && i < num;</div><div class='add'>+ i++, item = item->next);</div><div class='add'>+</div><div class='add'>+ if(!item)</div><div class='add'>+ return;</div><div class='add'>+ else {</div><div class='add'>+ free(item->text);</div><div class='add'>+ item->text = strdup(text);</div><div class='add'>+ }</div><div class='add'>+ if (li->userHasSetWidth == 0 && strlen(text) > li->curWidth) {</div><div class='add'>+ updateWidth(co, li, strlen(text));</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (num >= li->startShowItem && num <= li->startShowItem + co->height)</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxSetData(newtComponent co, int num, void * data) {</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+ int i;</div><div class='add'>+ struct items *item;</div><div class='add'>+</div><div class='add'>+ for(i = 0, item = li->boxItems; item != NULL && i < num;</div><div class='add'>+ i++, item = item->next);</div><div class='add'>+</div><div class='add'>+ item->data = data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtListboxAppendEntry(newtComponent co, const char * text,</div><div class='add'>+ const void * data) {</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+ struct items *item;</div><div class='add'>+</div><div class='add'>+ if(li->boxItems) {</div><div class='add'>+ for (item = li->boxItems; item->next != NULL; item = item->next);</div><div class='add'>+</div><div class='add'>+ item = item->next = malloc(sizeof(struct items));</div><div class='add'>+ } else {</div><div class='add'>+ item = li->boxItems = malloc(sizeof(struct items));</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (!li->userHasSetWidth && text && (strlen(text) > li->curWidth))</div><div class='add'>+ updateWidth(co, li, strlen(text));</div><div class='add'>+</div><div class='add'>+ item->text = strdup(text); item->data = data; item->next = NULL;</div><div class='add'>+ item->isSelected = 0;</div><div class='add'>+</div><div class='add'>+ if (li->grow)</div><div class='add'>+ co->height++, li->curHeight++;</div><div class='add'>+ li->numItems++;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtListboxInsertEntry(newtComponent co, const char * text,</div><div class='add'>+ const void * data, void * key) {</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+ struct items *item, *t;</div><div class='add'>+</div><div class='add'>+ if (li->boxItems) {</div><div class='add'>+ if (key) {</div><div class='add'>+ item = li->boxItems;</div><div class='add'>+ while (item && item->data != key) item = item->next;</div><div class='add'>+</div><div class='add'>+ if (!item) return 1;</div><div class='add'>+</div><div class='add'>+ t = item->next;</div><div class='add'>+ item = item->next = malloc(sizeof(struct items));</div><div class='add'>+ item->next = t;</div><div class='add'>+ } else {</div><div class='add'>+ t = li->boxItems;</div><div class='add'>+ item = li->boxItems = malloc(sizeof(struct items));</div><div class='add'>+ item->next = t;</div><div class='add'>+ }</div><div class='add'>+ } else if (key) {</div><div class='add'>+ return 1;</div><div class='add'>+ } else {</div><div class='add'>+ item = li->boxItems = malloc(sizeof(struct items));</div><div class='add'>+ item->next = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (!li->userHasSetWidth && text && (strlen(text) > li->curWidth))</div><div class='add'>+ updateWidth(co, li, strlen(text));</div><div class='add'>+</div><div class='add'>+ item->text = strdup(text?text:"(null)"); item->data = data;</div><div class='add'>+ item->isSelected = 0;</div><div class='add'>+</div><div class='add'>+ if (li->sb)</div><div class='add'>+ li->sb->left = co->left + co->width - li->bdxAdjust - 1;</div><div class='add'>+ li->numItems++;</div><div class='add'>+</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtListboxDeleteEntry(newtComponent co, void * key) {</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+ int widest = 0, t;</div><div class='add'>+ struct items *item, *item2 = NULL;</div><div class='add'>+ int num;</div><div class='add'>+</div><div class='add'>+ if (li->boxItems == NULL || li->numItems <= 0)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ num = 0;</div><div class='add'>+</div><div class='add'>+ item2 = NULL, item = li->boxItems;</div><div class='add'>+ while (item && item->data != key) {</div><div class='add'>+ item2 = item;</div><div class='add'>+ item = item->next;</div><div class='add'>+ num++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (!item)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (item2)</div><div class='add'>+ item2->next = item->next;</div><div class='add'>+ else</div><div class='add'>+ li->boxItems = item->next;</div><div class='add'>+</div><div class='add'>+ free(item->text);</div><div class='add'>+ free(item);</div><div class='add'>+ li->numItems--;</div><div class='add'>+</div><div class='add'>+ if (!li->userHasSetWidth) {</div><div class='add'>+ widest = 0;</div><div class='add'>+ for (item = li->boxItems; item != NULL; item = item->next)</div><div class='add'>+ if ((t = strlen(item->text)) > widest) widest = t;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (li->currItem >= num)</div><div class='add'>+ li->currItem--;</div><div class='add'>+</div><div class='add'>+ if (!li->userHasSetWidth) {</div><div class='add'>+ updateWidth(co, li, widest);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxClear(newtComponent co)</div><div class='add'>+{</div><div class='add'>+ struct listbox * li;</div><div class='add'>+ struct items *anitem, *nextitem;</div><div class='add'>+ if(co == NULL || (li = co->data) == NULL)</div><div class='add'>+ return;</div><div class='add'>+ for(anitem = li->boxItems; anitem != NULL; anitem = nextitem) {</div><div class='add'>+ nextitem = anitem->next;</div><div class='add'>+ free(anitem->text);</div><div class='add'>+ free(anitem);</div><div class='add'>+ }</div><div class='add'>+ li->numItems = li->numSelected = li->currItem = li->startShowItem = 0;</div><div class='add'>+ li->boxItems = NULL;</div><div class='add'>+ if (!li->userHasSetWidth)</div><div class='add'>+ updateWidth(co, li, 5);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* If you don't want to get back the text, pass in NULL for the ptr-ptr. Same</div><div class='add'>+ goes for the data. */</div><div class='add'>+void newtListboxGetEntry(newtComponent co, int num, char **text, void **data) {</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+ int i;</div><div class='add'>+ struct items *item;</div><div class='add'>+</div><div class='add'>+ if (!li->boxItems || num >= li->numItems) {</div><div class='add'>+ if(text)</div><div class='add'>+ *text = NULL;</div><div class='add'>+ if(data)</div><div class='add'>+ *data = NULL;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ item = li->boxItems;</div><div class='add'>+ while (item && i < num) {</div><div class='add'>+ i++, item = item->next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (item) {</div><div class='add'>+ if (text)</div><div class='add'>+ *text = item->text;</div><div class='add'>+ if (data)</div><div class='add'>+ *data = (void *)item->data;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void listboxDraw(newtComponent co)</div><div class='add'>+{</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+ struct items *item;</div><div class='add'>+ int i, j;</div><div class='add'>+</div><div class='add'>+ if (!co->isMapped) return ;</div><div class='add'>+</div><div class='add'>+ if(li->flags & NEWT_FLAG_BORDER) {</div><div class='add'>+ if(li->isActive)</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX);</div><div class='add'>+ else</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_LISTBOX);</div><div class='add'>+</div><div class='add'>+ newtDrawBox(co->left, co->top, co->width, co->height, 0);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if(li->sb)</div><div class='add'>+ li->sb->ops->draw(li->sb);</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_LISTBOX);</div><div class='add'>+</div><div class='add'>+ for(i = 0, item = li->boxItems; item != NULL && i < li->startShowItem;</div><div class='add'>+ i++, item = item->next);</div><div class='add'>+</div><div class='add'>+ j = i;</div><div class='add'>+</div><div class='add'>+ for (i = 0; item != NULL && i < li->curHeight; i++, item = item->next) {</div><div class='add'>+ if (!item->text) continue;</div><div class='add'>+</div><div class='add'>+ newtGotorc(co->top + i + li->bdyAdjust, co->left + li->bdxAdjust);</div><div class='add'>+ if(j + i == li->currItem) {</div><div class='add'>+ if(item->isSelected)</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_ACTSELLISTBOX);</div><div class='add'>+ else</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX);</div><div class='add'>+ } else if(item->isSelected)</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_SELLISTBOX);</div><div class='add'>+ else</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_LISTBOX);</div><div class='add'>+</div><div class='add'>+ SLsmg_write_nstring(item->text, li->curWidth);</div><div class='add'>+</div><div class='add'>+ }</div><div class='add'>+ newtGotorc(co->top + (li->currItem - li->startShowItem), co->left);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult listboxEvent(newtComponent co, struct event ev) {</div><div class='add'>+ struct eventResult er;</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+ struct items *item;</div><div class='add'>+ int i;</div><div class='add'>+ </div><div class='add'>+ er.result = ER_IGNORED;</div><div class='add'>+</div><div class='add'>+ if(ev.when == EV_EARLY || ev.when == EV_LATE) {</div><div class='add'>+ return er;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ switch(ev.event) {</div><div class='add'>+ case EV_KEYPRESS:</div><div class='add'>+ if (!li->isActive) break;</div><div class='add'>+</div><div class='add'>+ switch(ev.u.key) {</div><div class='add'>+ case ' ':</div><div class='add'>+ if(!(li->flags & NEWT_FLAG_MULTIPLE)) break;</div><div class='add'>+ newtListboxSelectItem(co, li->boxItems[li->currItem].data,</div><div class='add'>+ NEWT_FLAGS_TOGGLE);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ /* We don't break here, because it is cool to be able to</div><div class='add'>+ hold space to select a bunch of items in a list at once */</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_DOWN:</div><div class='add'>+ if(li->numItems <= 0) break;</div><div class='add'>+ if(li->currItem < li->numItems - 1) {</div><div class='add'>+ li->currItem++;</div><div class='add'>+ if(li->currItem > (li->startShowItem + li->curHeight - 1)) {</div><div class='add'>+ li->startShowItem = li->currItem - li->curHeight + 1;</div><div class='add'>+ if(li->startShowItem + li->curHeight > li->numItems)</div><div class='add'>+ li->startShowItem = li->numItems - li->curHeight;</div><div class='add'>+ }</div><div class='add'>+ if(li->sb)</div><div class='add'>+ newtScrollbarSet(li->sb, li->currItem + 1, li->numItems);</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ }</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_ENTER:</div><div class='add'>+ if(li->numItems <= 0) break;</div><div class='add'>+ if(li->flags & NEWT_FLAG_RETURNEXIT)</div><div class='add'>+ er.result = ER_EXITFORM;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_UP:</div><div class='add'>+ if(li->numItems <= 0) break;</div><div class='add'>+ if(li->currItem > 0) {</div><div class='add'>+ li->currItem--;</div><div class='add'>+ if(li->currItem < li->startShowItem)</div><div class='add'>+ li->startShowItem = li->currItem;</div><div class='add'>+ if(li->sb)</div><div class='add'>+ newtScrollbarSet(li->sb, li->currItem + 1, li->numItems);</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ }</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_PGUP:</div><div class='add'>+ if(li->numItems <= 0) break;</div><div class='add'>+ li->startShowItem -= li->curHeight - 1;</div><div class='add'>+ if(li->startShowItem < 0)</div><div class='add'>+ li->startShowItem = 0;</div><div class='add'>+ li->currItem -= li->curHeight - 1;</div><div class='add'>+ if(li->currItem < 0)</div><div class='add'>+ li->currItem = 0;</div><div class='add'>+ newtListboxRealSetCurrent(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_PGDN:</div><div class='add'>+ if(li->numItems <= 0) break;</div><div class='add'>+ li->startShowItem += li->curHeight;</div><div class='add'>+ if(li->startShowItem > (li->numItems - li->curHeight)) {</div><div class='add'>+ li->startShowItem = li->numItems - li->curHeight;</div><div class='add'>+ }</div><div class='add'>+ li->currItem += li->curHeight;</div><div class='add'>+ if(li->currItem >= li->numItems) {</div><div class='add'>+ li->currItem = li->numItems - 1;</div><div class='add'>+ }</div><div class='add'>+ newtListboxRealSetCurrent(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_HOME:</div><div class='add'>+ if(li->numItems <= 0) break;</div><div class='add'>+ newtListboxSetCurrent(co, 0);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_END:</div><div class='add'>+ if(li->numItems <= 0) break;</div><div class='add'>+ li->startShowItem = li->numItems - li->curHeight;</div><div class='add'>+ if(li->startShowItem < 0)</div><div class='add'>+ li->startShowItem = 0;</div><div class='add'>+ li->currItem = li->numItems - 1;</div><div class='add'>+ newtListboxRealSetCurrent(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+ default:</div><div class='add'>+ if (li->numItems <= 0) break;</div><div class='add'>+ if (ev.u.key < NEWT_KEY_EXTRA_BASE && isalpha(ev.u.key)) {</div><div class='add'>+ for(i = 0, item = li->boxItems; item != NULL &&</div><div class='add'>+ i < li->currItem; i++, item = item->next);</div><div class='add'>+</div><div class='add'>+ if (item && item->text && (toupper(*item->text) == toupper(ev.u.key))) {</div><div class='add'>+ item = item->next;</div><div class='add'>+ i++;</div><div class='add'>+ } else { </div><div class='add'>+ item = li->boxItems;</div><div class='add'>+ i = 0;</div><div class='add'>+ }</div><div class='add'>+ while (item && item->text &&</div><div class='add'>+ toupper(*item->text) != toupper(ev.u.key)) {</div><div class='add'>+ item = item->next;</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+ if (item) {</div><div class='add'>+ li->currItem = i;</div><div class='add'>+ if(li->currItem < li->startShowItem ||</div><div class='add'>+ li->currItem > li->startShowItem)</div><div class='add'>+ li->startShowItem =</div><div class='add'>+ li->currItem > li->numItems - li->curHeight ?</div><div class='add'>+ li->startShowItem = li->numItems - li->curHeight :</div><div class='add'>+ li->currItem;</div><div class='add'>+ if(li->sb)</div><div class='add'>+ newtScrollbarSet(li->sb, li->currItem + 1, li->numItems);</div><div class='add'>+ newtListboxRealSetCurrent(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EV_FOCUS:</div><div class='add'>+ li->isActive = 1;</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EV_UNFOCUS:</div><div class='add'>+ li->isActive = 0;</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EV_MOUSE:</div><div class='add'>+ /* if this mouse click was within the listbox, make the current</div><div class='add'>+ item the item clicked on. */</div><div class='add'>+ /* Up scroll arrow */</div><div class='add'>+ if (li->sb &&</div><div class='add'>+ ev.u.mouse.x == co->left + co->width - li->bdxAdjust - 1 &&</div><div class='add'>+ ev.u.mouse.y == co->top + li->bdyAdjust) {</div><div class='add'>+ if(li->numItems <= 0) break;</div><div class='add'>+ if(li->currItem > 0) {</div><div class='add'>+ li->currItem--;</div><div class='add'>+ if(li->currItem < li->startShowItem)</div><div class='add'>+ li->startShowItem = li->currItem;</div><div class='add'>+ if(li->sb)</div><div class='add'>+ newtScrollbarSet(li->sb, li->currItem + 1, li->numItems);</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ }</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ /* Down scroll arrow */</div><div class='add'>+ if (li->sb &&</div><div class='add'>+ ev.u.mouse.x == co->left + co->width - li->bdxAdjust - 1 &&</div><div class='add'>+ ev.u.mouse.y == co->top + co->height - li->bdyAdjust - 1) {</div><div class='add'>+ if(li->numItems <= 0) break;</div><div class='add'>+ if(li->currItem < li->numItems - 1) {</div><div class='add'>+ li->currItem++;</div><div class='add'>+ if(li->currItem > (li->startShowItem + li->curHeight - 1)) {</div><div class='add'>+ li->startShowItem = li->currItem - li->curHeight + 1;</div><div class='add'>+ if(li->startShowItem + li->curHeight > li->numItems)</div><div class='add'>+ li->startShowItem = li->numItems - li->curHeight;</div><div class='add'>+ }</div><div class='add'>+ if(li->sb)</div><div class='add'>+ newtScrollbarSet(li->sb, li->currItem + 1, li->numItems);</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ }</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ if ((ev.u.mouse.y >= co->top + li->bdyAdjust) &&</div><div class='add'>+ (ev.u.mouse.y <= co->top + co->height - (li->bdyAdjust * 2)) &&</div><div class='add'>+ (ev.u.mouse.x >= co->left + li->bdxAdjust) &&</div><div class='add'>+ (ev.u.mouse.x <= co->left + co->width + (li->bdxAdjust * 2))) {</div><div class='add'>+ li->currItem = li->startShowItem +</div><div class='add'>+ (ev.u.mouse.y - li->bdyAdjust - co->top);</div><div class='add'>+ newtListboxRealSetCurrent(co);</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->callbackData);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void listboxDestroy(newtComponent co) {</div><div class='add'>+ struct listbox * li = co->data;</div><div class='add'>+ struct items * item, * nextitem;</div><div class='add'>+</div><div class='add'>+ nextitem = item = li->boxItems;</div><div class='add'>+</div><div class='add'>+ while (item != NULL) {</div><div class='add'>+ nextitem = item->next;</div><div class='add'>+ free(item->text);</div><div class='add'>+ free(item);</div><div class='add'>+ item = nextitem;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (li->sb) li->sb->ops->destroy(li->sb);</div><div class='add'>+</div><div class='add'>+ free(li);</div><div class='add'>+ free(co);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/newt.c b/mdk-stage1/newt/newt.c<br/>new file mode 100644<br/>index 000000000..1cfe3ac93<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/newt.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/newt.c</a></div><div class='hunk'>@@ -0,0 +1,672 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdio.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+#include <sys/signal.h></div><div class='add'>+#include <sys/time.h></div><div class='add'>+#include <sys/types.h></div><div class='add'>+#include <termios.h></div><div class='add'>+#include <unistd.h></div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct Window {</div><div class='add'>+ int height, width, top, left;</div><div class='add'>+ short * buffer;</div><div class='add'>+ char * title;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct keymap {</div><div class='add'>+ char * str;</div><div class='add'>+ int code;</div><div class='add'>+ char * tc;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static struct Window windowStack[20];</div><div class='add'>+static struct Window * currentWindow = NULL;</div><div class='add'>+</div><div class='add'>+static char * helplineStack[20];</div><div class='add'>+static char ** currentHelpline = NULL;</div><div class='add'>+</div><div class='add'>+static int cursorRow, cursorCol;</div><div class='add'>+static int needResize;</div><div class='add'>+static int cursorOn = 1;</div><div class='add'>+</div><div class='add'>+static const char * defaultHelpLine =</div><div class='add'>+" <Tab>/<Alt-Tab> between elements | <Space> selects | <F12> next screen"</div><div class='add'>+;</div><div class='add'>+</div><div class='add'>+const struct newtColors newtDefaultColorPalette = {</div><div class='add'>+ "cyan", "black", /* root fg, bg */</div><div class='add'>+ "black", "blue", /* border fg, bg */</div><div class='add'>+ "white", "blue", /* window fg, bg */</div><div class='add'>+ "white", "black", /* shadow fg, bg */</div><div class='add'>+ "white", "blue", /* title fg, bg */</div><div class='add'>+ "black", "cyan", /* button fg, bg */</div><div class='add'>+ "yellow", "cyan", /* active button fg, bg */</div><div class='add'>+ "yellow", "blue", /* checkbox fg, bg */</div><div class='add'>+ "blue", "brown", /* active checkbox fg, bg */</div><div class='add'>+ "yellow", "blue", /* entry box fg, bg */</div><div class='add'>+ "white", "blue", /* label fg, bg */</div><div class='add'>+ "black", "cyan", /* listbox fg, bg */</div><div class='add'>+ "yellow", "cyan", /* active listbox fg, bg */</div><div class='add'>+ "white", "blue", /* textbox fg, bg */</div><div class='add'>+ "cyan", "black", /* active textbox fg, bg */</div><div class='add'>+ "white", "blue", /* help line */</div><div class='add'>+ "yellow", "blue", /* root text */</div><div class='add'>+ "blue", /* scale full */</div><div class='add'>+ "red", /* scale empty */</div><div class='add'>+ "blue", "cyan", /* disabled entry fg, bg */</div><div class='add'>+ "white", "blue", /* compact button fg, bg */</div><div class='add'>+ "yellow", "red", /* active & sel listbox */</div><div class='add'>+ "black", "brown" /* selected listbox */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static const struct keymap keymap[] = {</div><div class='add'>+ { "\033OA", NEWT_KEY_UP, "kh" },</div><div class='add'>+ { "\033[A", NEWT_KEY_UP, "ku" },</div><div class='add'>+ { "\033OB", NEWT_KEY_DOWN, "kd" },</div><div class='add'>+ { "\033[B", NEWT_KEY_DOWN, "kd" },</div><div class='add'>+ { "\033[C", NEWT_KEY_RIGHT, "kr" },</div><div class='add'>+ { "\033OC", NEWT_KEY_RIGHT, "kr" },</div><div class='add'>+ { "\033[D", NEWT_KEY_LEFT, "kl" },</div><div class='add'>+ { "\033OD", NEWT_KEY_LEFT, "kl" },</div><div class='add'>+ { "\033[H", NEWT_KEY_HOME, "kh" },</div><div class='add'>+ { "\033[1~", NEWT_KEY_HOME, "kh" },</div><div class='add'>+ { "\033Ow", NEWT_KEY_END, "kH" },</div><div class='add'>+ { "\033[4~", NEWT_KEY_END, "kH" },</div><div class='add'>+</div><div class='add'>+ { "\033[3~", NEWT_KEY_DELETE, "kl" },</div><div class='add'>+ { "\033[2~", NEWT_KEY_INSERT, NULL },</div><div class='add'>+</div><div class='add'>+ { "\033\t", NEWT_KEY_UNTAB, NULL },</div><div class='add'>+</div><div class='add'>+ { "\033[5~", NEWT_KEY_PGUP, NULL },</div><div class='add'>+ { "\033[6~", NEWT_KEY_PGDN, NULL },</div><div class='add'>+ { "\033V", NEWT_KEY_PGUP, "kH" },</div><div class='add'>+ { "\033v", NEWT_KEY_PGUP, "kH" },</div><div class='add'>+</div><div class='add'>+ { "\033[[A", NEWT_KEY_F1, NULL },</div><div class='add'>+ { "\033[[B", NEWT_KEY_F2, NULL },</div><div class='add'>+ { "\033[[C", NEWT_KEY_F3, NULL },</div><div class='add'>+ { "\033[[D", NEWT_KEY_F4, NULL },</div><div class='add'>+ { "\033[[E", NEWT_KEY_F5, NULL },</div><div class='add'>+</div><div class='add'>+ { "\033OP", NEWT_KEY_F1, NULL },</div><div class='add'>+ { "\033OQ", NEWT_KEY_F2, NULL },</div><div class='add'>+ { "\033OR", NEWT_KEY_F3, NULL },</div><div class='add'>+ { "\033OS", NEWT_KEY_F4, NULL },</div><div class='add'>+</div><div class='add'>+ { "\033[11~", NEWT_KEY_F1, NULL },</div><div class='add'>+ { "\033[12~", NEWT_KEY_F2, NULL },</div><div class='add'>+ { "\033[13~", NEWT_KEY_F3, NULL },</div><div class='add'>+ { "\033[14~", NEWT_KEY_F4, NULL },</div><div class='add'>+ { "\033[15~", NEWT_KEY_F5, NULL },</div><div class='add'>+ { "\033[17~", NEWT_KEY_F6, NULL },</div><div class='add'>+ { "\033[18~", NEWT_KEY_F7, NULL },</div><div class='add'>+ { "\033[19~", NEWT_KEY_F8, NULL },</div><div class='add'>+ { "\033[20~", NEWT_KEY_F9, NULL },</div><div class='add'>+ { "\033[21~", NEWT_KEY_F10, NULL },</div><div class='add'>+ { "\033[23~", NEWT_KEY_F11, NULL },</div><div class='add'>+ { "\033[24~", NEWT_KEY_F12, NULL },</div><div class='add'>+</div><div class='add'>+ { NULL, 0, NULL }, /* LEAVE this one */</div><div class='add'>+};</div><div class='add'>+static char keyPrefix = '\033';</div><div class='add'>+</div><div class='add'>+static const char * version = "Newt windowing library version " VERSION</div><div class='add'>+ " - (C) 1996-2000 Red Hat Software. "</div><div class='add'>+ "Redistributable under the term of the Library "</div><div class='add'>+ "GNU Public License. "</div><div class='add'>+ "Written by Erik Troan\n";</div><div class='add'>+</div><div class='add'>+static newtSuspendCallback suspendCallback = NULL;</div><div class='add'>+static void * suspendCallbackData = NULL;</div><div class='add'>+</div><div class='add'>+void newtSetSuspendCallback(newtSuspendCallback cb, void * data) {</div><div class='add'>+ suspendCallback = cb;</div><div class='add'>+ suspendCallbackData = data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void handleSigwinch(int signum) {</div><div class='add'>+ needResize = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int getkeyInterruptHook(void) {</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFlushInput(void) {</div><div class='add'>+ while (SLang_input_pending(0)) {</div><div class='add'>+ SLang_getkey();</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtRefresh(void) {</div><div class='add'>+ SLsmg_refresh();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtSuspend(void) {</div><div class='add'>+ SLtt_set_cursor_visibility (1);</div><div class='add'>+ SLsmg_suspend_smg();</div><div class='add'>+ SLang_reset_tty();</div><div class='add'>+ SLtt_set_cursor_visibility (cursorOn);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtResume(void) {</div><div class='add'>+ SLsmg_resume_smg ();</div><div class='add'>+ SLsmg_refresh();</div><div class='add'>+ SLang_init_tty(0, 0, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCls(void) {</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_ROOT);</div><div class='add'>+ SLsmg_gotorc(0, 0);</div><div class='add'>+ SLsmg_erase_eos();</div><div class='add'>+</div><div class='add'>+ newtRefresh();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if defined(THIS_DOESNT_WORK)</div><div class='add'>+void newtResizeScreen(int redraw) {</div><div class='add'>+ newtPushHelpLine("");</div><div class='add'>+</div><div class='add'>+ SLtt_get_screen_size();</div><div class='add'>+ SLang_init_tty(0, 0, 0);</div><div class='add'>+</div><div class='add'>+ SLsmg_touch_lines (0, SLtt_Screen_Rows - 1);</div><div class='add'>+</div><div class='add'>+ /* I don't know why I need this */</div><div class='add'>+ SLsmg_refresh();</div><div class='add'>+</div><div class='add'>+ newtPopHelpLine();</div><div class='add'>+</div><div class='add'>+ if (redraw)</div><div class='add'>+ SLsmg_refresh();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int newtInit(void) {</div><div class='add'>+ char * MonoValue, * MonoEnv = "NEWT_MONO";</div><div class='add'>+</div><div class='add'>+ /* use the version variable just to be sure it gets included */</div><div class='add'>+ strlen(version);</div><div class='add'>+</div><div class='add'>+ SLtt_get_terminfo();</div><div class='add'>+ SLtt_get_screen_size();</div><div class='add'>+</div><div class='add'>+ MonoValue = getenv(MonoEnv);</div><div class='add'>+ if ( MonoValue == NULL ) {</div><div class='add'>+ SLtt_Use_Ansi_Colors = 1;</div><div class='add'>+ } else {</div><div class='add'>+ SLtt_Use_Ansi_Colors = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLsmg_init_smg();</div><div class='add'>+ SLang_init_tty(0, 0, 0);</div><div class='add'>+</div><div class='add'>+ newtSetColors(newtDefaultColorPalette);</div><div class='add'>+ newtCursorOff();</div><div class='add'>+ /*initKeymap();*/</div><div class='add'>+</div><div class='add'>+ /*memset(&sa, 0, sizeof(sa));</div><div class='add'>+ sa.sa_handler = handleSigwinch;</div><div class='add'>+ sigaction(SIGWINCH, &sa, NULL);*/</div><div class='add'>+</div><div class='add'>+ SLsignal_intr(SIGWINCH, handleSigwinch);</div><div class='add'>+ SLang_getkey_intr_hook = getkeyInterruptHook;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtFinished(void) {</div><div class='add'>+ SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);</div><div class='add'>+ newtCursorOn();</div><div class='add'>+ SLsmg_refresh();</div><div class='add'>+ SLsmg_reset_smg();</div><div class='add'>+ SLang_reset_tty();</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtSetColors(struct newtColors colors) {</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_ROOT, "", colors.rootFg, colors.rootBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_BORDER, "", colors.borderFg, colors.borderBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_WINDOW, "", colors.windowFg, colors.windowBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_SHADOW, "", colors.shadowFg, colors.shadowBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_TITLE, "", colors.titleFg, colors.titleBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_BUTTON, "", colors.buttonFg, colors.buttonBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_ACTBUTTON, "", colors.actButtonFg,</div><div class='add'>+ colors.actButtonBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_CHECKBOX, "", colors.checkboxFg,</div><div class='add'>+ colors.checkboxBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_ACTCHECKBOX, "", colors.actCheckboxFg,</div><div class='add'>+ colors.actCheckboxBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_ENTRY, "", colors.entryFg, colors.entryBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_LABEL, "", colors.labelFg, colors.labelBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_LISTBOX, "", colors.listboxFg,</div><div class='add'>+ colors.listboxBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_ACTLISTBOX, "", colors.actListboxFg,</div><div class='add'>+ colors.actListboxBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_TEXTBOX, "", colors.textboxFg,</div><div class='add'>+ colors.textboxBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_ACTTEXTBOX, "", colors.actTextboxFg,</div><div class='add'>+ colors.actTextboxBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_HELPLINE, "", colors.helpLineFg,</div><div class='add'>+ colors.helpLineBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_ROOTTEXT, "", colors.rootTextFg,</div><div class='add'>+ colors.rootTextBg);</div><div class='add'>+</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_EMPTYSCALE, "", "black",</div><div class='add'>+ colors.emptyScale);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_FULLSCALE, "", "black",</div><div class='add'>+ colors.fullScale);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_DISENTRY, "", colors.disabledEntryFg,</div><div class='add'>+ colors.disabledEntryBg);</div><div class='add'>+</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_COMPACTBUTTON, "", colors.compactButtonFg,</div><div class='add'>+ colors.compactButtonBg);</div><div class='add'>+</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_ACTSELLISTBOX, "", colors.actSelListboxFg,</div><div class='add'>+ colors.actSelListboxBg);</div><div class='add'>+ SLtt_set_color(NEWT_COLORSET_SELLISTBOX, "", colors.selListboxFg,</div><div class='add'>+ colors.selListboxBg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtGetKey(void) {</div><div class='add'>+ int key;</div><div class='add'>+ char buf[10], * chptr = buf;</div><div class='add'>+ const struct keymap * curr;</div><div class='add'>+</div><div class='add'>+ do {</div><div class='add'>+ key = SLang_getkey();</div><div class='add'>+ if (key == 0xFFFF) {</div><div class='add'>+ if (needResize)</div><div class='add'>+ return NEWT_KEY_RESIZE;</div><div class='add'>+</div><div class='add'>+ /* ignore other signals */</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (key == NEWT_KEY_SUSPEND && suspendCallback)</div><div class='add'>+ suspendCallback(suspendCallbackData);</div><div class='add'>+ } while (key == NEWT_KEY_SUSPEND);</div><div class='add'>+</div><div class='add'>+ switch (key) {</div><div class='add'>+ case 'v' | 0x80:</div><div class='add'>+ case 'V' | 0x80:</div><div class='add'>+ return NEWT_KEY_PGUP;</div><div class='add'>+</div><div class='add'>+ case 22:</div><div class='add'>+ return NEWT_KEY_PGDN;</div><div class='add'>+</div><div class='add'>+ return NEWT_KEY_BKSPC;</div><div class='add'>+ case 0x7f:</div><div class='add'>+ return NEWT_KEY_BKSPC;</div><div class='add'>+</div><div class='add'>+ case 0x08:</div><div class='add'>+ return NEWT_KEY_BKSPC;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ if (key != keyPrefix) return key;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ memset(buf, 0, sizeof(buf));</div><div class='add'>+</div><div class='add'>+ *chptr++ = key;</div><div class='add'>+ while (SLang_input_pending(5)) {</div><div class='add'>+ key = SLang_getkey();</div><div class='add'>+ if (key == keyPrefix) {</div><div class='add'>+ /* he hit unknown keys too many times -- start over */</div><div class='add'>+ memset(buf, 0, sizeof(buf));</div><div class='add'>+ chptr = buf;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *chptr++ = key;</div><div class='add'>+</div><div class='add'>+ /* this search should use bsearch(), but when we only look through</div><div class='add'>+ a list of 20 (or so) keymappings, it's probably faster just to</div><div class='add'>+ do a inline linear search */</div><div class='add'>+</div><div class='add'>+ for (curr = keymap; curr->code; curr++) {</div><div class='add'>+ if (curr->str) {</div><div class='add'>+ if (!strcmp(curr->str, buf))</div><div class='add'>+ return curr->code;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (curr = keymap; curr->code; curr++) {</div><div class='add'>+ if (curr->str) {</div><div class='add'>+ if (!strcmp(curr->str, buf))</div><div class='add'>+ return curr->code;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Looks like we were a bit overzealous in reading characters. Return</div><div class='add'>+ just the first character, and put everything else back in the buffer</div><div class='add'>+ for later */</div><div class='add'>+</div><div class='add'>+ chptr--;</div><div class='add'>+ while (chptr > buf)</div><div class='add'>+ SLang_ungetkey(*chptr--);</div><div class='add'>+</div><div class='add'>+ return *chptr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtWaitForKey(void) {</div><div class='add'>+ newtRefresh();</div><div class='add'>+</div><div class='add'>+ SLang_getkey();</div><div class='add'>+ newtClearKeyBuffer();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtClearKeyBuffer(void) {</div><div class='add'>+ while (SLang_input_pending(1)) {</div><div class='add'>+ SLang_getkey();</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtOpenWindow(int left, int top, int width, int height,</div><div class='add'>+ const char * title) {</div><div class='add'>+ int j, row, col;</div><div class='add'>+ int n;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ newtFlushInput();</div><div class='add'>+</div><div class='add'>+ if (!currentWindow) {</div><div class='add'>+ currentWindow = windowStack;</div><div class='add'>+ } else {</div><div class='add'>+ currentWindow++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ currentWindow->left = left;</div><div class='add'>+ currentWindow->top = top;</div><div class='add'>+ currentWindow->width = width;</div><div class='add'>+ currentWindow->height = height;</div><div class='add'>+ currentWindow->title = title ? strdup(title) : NULL;</div><div class='add'>+</div><div class='add'>+ currentWindow->buffer = malloc(sizeof(short) * (width + 3) * (height + 3));</div><div class='add'>+</div><div class='add'>+ row = top - 1;</div><div class='add'>+ col = left - 1;</div><div class='add'>+ n = 0;</div><div class='add'>+ for (j = 0; j < height + 3; j++, row++) {</div><div class='add'>+ SLsmg_gotorc(row, col);</div><div class='add'>+ SLsmg_read_raw(currentWindow->buffer + n,</div><div class='add'>+ currentWindow->width + 3);</div><div class='add'>+ n += currentWindow->width + 3;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_BORDER);</div><div class='add'>+ SLsmg_draw_box(top - 1, left - 1, height + 2, width + 2);</div><div class='add'>+</div><div class='add'>+ if (currentWindow->title) {</div><div class='add'>+ i = strlen(currentWindow->title) + 4;</div><div class='add'>+ i = ((width - i) / 2) + left;</div><div class='add'>+ SLsmg_gotorc(top - 1, i);</div><div class='add'>+ SLsmg_set_char_set(1);</div><div class='add'>+ SLsmg_write_char(SLSMG_RTEE_CHAR);</div><div class='add'>+ SLsmg_set_char_set(0);</div><div class='add'>+ SLsmg_write_char(' ');</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_TITLE);</div><div class='add'>+ SLsmg_write_string((char *)currentWindow->title);</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_BORDER);</div><div class='add'>+ SLsmg_write_char(' ');</div><div class='add'>+ SLsmg_set_char_set(1);</div><div class='add'>+ SLsmg_write_char(SLSMG_LTEE_CHAR);</div><div class='add'>+ SLsmg_set_char_set(0);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_WINDOW);</div><div class='add'>+ SLsmg_fill_region(top, left, height, width, ' ');</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_SHADOW);</div><div class='add'>+ SLsmg_fill_region(top + height + 1, left, 1, width + 2, ' ');</div><div class='add'>+ SLsmg_fill_region(top, left + width + 1, height + 1, 1, ' ');</div><div class='add'>+</div><div class='add'>+ for (i = top; i < (top + height + 1); i++) {</div><div class='add'>+ SLsmg_gotorc(i, left + width + 1);</div><div class='add'>+ SLsmg_write_string(" ");</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtCenteredWindow(int width, int height, const char * title) {</div><div class='add'>+ int top, left;</div><div class='add'>+</div><div class='add'>+ top = (SLtt_Screen_Rows - height) / 2;</div><div class='add'>+</div><div class='add'>+ /* I don't know why, but this seems to look better */</div><div class='add'>+ if ((SLtt_Screen_Rows % 2) && (top % 2)) top--;</div><div class='add'>+</div><div class='add'>+ left = (SLtt_Screen_Cols - width) / 2;</div><div class='add'>+</div><div class='add'>+ newtOpenWindow(left, top, width, height, title);</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtPopWindow(void) {</div><div class='add'>+ int j, row, col;</div><div class='add'>+ int n = 0;</div><div class='add'>+</div><div class='add'>+ row = col = 0;</div><div class='add'>+</div><div class='add'>+ row = currentWindow->top - 1;</div><div class='add'>+ col = currentWindow->left - 1;</div><div class='add'>+ for (j = 0; j < currentWindow->height + 3; j++, row++) {</div><div class='add'>+ SLsmg_gotorc(row, col);</div><div class='add'>+ SLsmg_write_raw(currentWindow->buffer + n,</div><div class='add'>+ currentWindow->width + 3);</div><div class='add'>+ n += currentWindow->width + 3;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ free(currentWindow->buffer);</div><div class='add'>+ free(currentWindow->title);</div><div class='add'>+</div><div class='add'>+ if (currentWindow == windowStack)</div><div class='add'>+ currentWindow = NULL;</div><div class='add'>+ else</div><div class='add'>+ currentWindow--;</div><div class='add'>+</div><div class='add'>+ SLsmg_set_char_set(0);</div><div class='add'>+</div><div class='add'>+ newtRefresh();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGetWindowPos(int * x, int * y) {</div><div class='add'>+ if (currentWindow) {</div><div class='add'>+ *x = currentWindow->left;</div><div class='add'>+ *y = currentWindow->top;</div><div class='add'>+ } else</div><div class='add'>+ *x = *y = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGetrc(int * row, int * col) {</div><div class='add'>+ *row = cursorRow;</div><div class='add'>+ *col = cursorCol;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGotorc(int newRow, int newCol) {</div><div class='add'>+ if (currentWindow) {</div><div class='add'>+ newRow += currentWindow->top;</div><div class='add'>+ newCol += currentWindow->left;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ cursorRow = newRow;</div><div class='add'>+ cursorCol = newCol;</div><div class='add'>+ SLsmg_gotorc(cursorRow, cursorCol);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtDrawBox(int left, int top, int width, int height, int shadow) {</div><div class='add'>+ if (currentWindow) {</div><div class='add'>+ top += currentWindow->top;</div><div class='add'>+ left += currentWindow->left;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLsmg_draw_box(top, left, height, width);</div><div class='add'>+</div><div class='add'>+ if (shadow) {</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_SHADOW);</div><div class='add'>+ SLsmg_fill_region(top + height, left + 1, 1, width - 1, ' ');</div><div class='add'>+ SLsmg_fill_region(top + 1, left + width, height, 1, ' ');</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtClearBox(int left, int top, int width, int height) {</div><div class='add'>+ if (currentWindow) {</div><div class='add'>+ top += currentWindow->top;</div><div class='add'>+ left += currentWindow->left;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLsmg_fill_region(top, left, height, width, ' ');</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+/* This doesn't seem to work quite right. I don't know why not, but when</div><div class='add'>+ I rsh from an rxvt into a box and run this code, the machine returns</div><div class='add'>+ console key's (\033[B) rather then xterm ones (\033OB). */</div><div class='add'>+static void initKeymap(void) {</div><div class='add'>+ struct keymap * curr;</div><div class='add'>+</div><div class='add'>+ for (curr = keymap; curr->code; curr++) {</div><div class='add'>+ if (!curr->str)</div><div class='add'>+ curr->str = SLtt_tgetstr(curr->tc);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Newt's keymap handling is a bit broken. It assumes that any extended</div><div class='add'>+ keystrokes begin with ESC. If you're using a homebrek terminal you</div><div class='add'>+ will probably need to fix this, or just yell at me and I'll be so</div><div class='add'>+ ashamed of myself for doing it this way I'll fix it */</div><div class='add'>+</div><div class='add'>+ keyPrefix = 0x1b; /* ESC */</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+void newtDelay(int usecs) {</div><div class='add'>+ fd_set set;</div><div class='add'>+ struct timeval tv;</div><div class='add'>+</div><div class='add'>+ FD_ZERO(&set);</div><div class='add'>+</div><div class='add'>+ tv.tv_sec = usecs / 1000000;</div><div class='add'>+ tv.tv_usec = usecs % 1000000;</div><div class='add'>+</div><div class='add'>+ select(0, &set, &set, &set, &tv);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct eventResult newtDefaultEventHandler(newtComponent c,</div><div class='add'>+ struct event ev) {</div><div class='add'>+ struct eventResult er;</div><div class='add'>+</div><div class='add'>+ er.result = ER_IGNORED;</div><div class='add'>+ return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtRedrawHelpLine(void) {</div><div class='add'>+ char * buf;</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_HELPLINE);</div><div class='add'>+</div><div class='add'>+ buf = alloca(SLtt_Screen_Cols + 1);</div><div class='add'>+ memset(buf, ' ', SLtt_Screen_Cols);</div><div class='add'>+ buf[SLtt_Screen_Cols] = '\0';</div><div class='add'>+</div><div class='add'>+ if (currentHelpline)</div><div class='add'>+ memcpy(buf, *currentHelpline, strlen(*currentHelpline));</div><div class='add'>+</div><div class='add'>+ SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);</div><div class='add'>+ SLsmg_write_string(buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtPushHelpLine(const char * text) {</div><div class='add'>+ if (!text)</div><div class='add'>+ text = defaultHelpLine;</div><div class='add'>+</div><div class='add'>+ if (currentHelpline)</div><div class='add'>+ (*(++currentHelpline)) = strdup(text);</div><div class='add'>+ else {</div><div class='add'>+ currentHelpline = helplineStack;</div><div class='add'>+ *currentHelpline = strdup(text);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ newtRedrawHelpLine();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtPopHelpLine(void) {</div><div class='add'>+ if (!currentHelpline) return;</div><div class='add'>+</div><div class='add'>+ free(*currentHelpline);</div><div class='add'>+ if (currentHelpline == helplineStack)</div><div class='add'>+ currentHelpline = NULL;</div><div class='add'>+ else</div><div class='add'>+ currentHelpline--;</div><div class='add'>+</div><div class='add'>+ newtRedrawHelpLine();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtDrawRootText(int col, int row, const char * text) {</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_ROOTTEXT);</div><div class='add'>+</div><div class='add'>+ if (col < 0) {</div><div class='add'>+ col = SLtt_Screen_Cols + col;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (row < 0) {</div><div class='add'>+ row = SLtt_Screen_Rows + row;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLsmg_gotorc(row, col);</div><div class='add'>+ SLsmg_write_string((char *)text);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtSetFlags(int oldFlags, int newFlags, enum newtFlagsSense sense) {</div><div class='add'>+ switch (sense) {</div><div class='add'>+ case NEWT_FLAGS_SET:</div><div class='add'>+ return oldFlags | newFlags;</div><div class='add'>+</div><div class='add'>+ case NEWT_FLAGS_RESET:</div><div class='add'>+ return oldFlags & (~newFlags);</div><div class='add'>+</div><div class='add'>+ case NEWT_FLAGS_TOGGLE:</div><div class='add'>+ return oldFlags ^ newFlags;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ return oldFlags;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtBell(void)</div><div class='add'>+{</div><div class='add'>+ SLtt_beep();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGetScreenSize(int * cols, int * rows) {</div><div class='add'>+ if (rows) *rows = SLtt_Screen_Rows;</div><div class='add'>+ if (cols) *cols = SLtt_Screen_Cols;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtDefaultPlaceHandler(newtComponent c, int newLeft, int newTop) {</div><div class='add'>+ c->left = newLeft;</div><div class='add'>+ c->top = newTop;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtDefaultMappedHandler(newtComponent c, int isMapped) {</div><div class='add'>+ c->isMapped = isMapped;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCursorOff(void) {</div><div class='add'>+ cursorOn = 0;</div><div class='add'>+ SLtt_set_cursor_visibility (cursorOn);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCursorOn(void) {</div><div class='add'>+ cursorOn = 1;</div><div class='add'>+ SLtt_set_cursor_visibility (cursorOn);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/newt.h b/mdk-stage1/newt/newt.h<br/>new file mode 100644<br/>index 000000000..d3fd8bedc<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/newt.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/newt.h</a></div><div class='hunk'>@@ -0,0 +1,362 @@</div><div class='add'>+#ifndef H_NEWT</div><div class='add'>+#define H_NEWT</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+extern "C" {</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include <stdarg.h></div><div class='add'>+</div><div class='add'>+#define NEWT_COLORSET_ROOT 2</div><div class='add'>+#define NEWT_COLORSET_BORDER 3</div><div class='add'>+#define NEWT_COLORSET_WINDOW 4</div><div class='add'>+#define NEWT_COLORSET_SHADOW 5</div><div class='add'>+#define NEWT_COLORSET_TITLE 6</div><div class='add'>+#define NEWT_COLORSET_BUTTON 7</div><div class='add'>+#define NEWT_COLORSET_ACTBUTTON 8</div><div class='add'>+#define NEWT_COLORSET_CHECKBOX 9</div><div class='add'>+#define NEWT_COLORSET_ACTCHECKBOX 10</div><div class='add'>+#define NEWT_COLORSET_ENTRY 11</div><div class='add'>+#define NEWT_COLORSET_LABEL 12</div><div class='add'>+#define NEWT_COLORSET_LISTBOX 13</div><div class='add'>+#define NEWT_COLORSET_ACTLISTBOX 14</div><div class='add'>+#define NEWT_COLORSET_TEXTBOX 15</div><div class='add'>+#define NEWT_COLORSET_ACTTEXTBOX 16</div><div class='add'>+#define NEWT_COLORSET_HELPLINE 17</div><div class='add'>+#define NEWT_COLORSET_ROOTTEXT 18</div><div class='add'>+#define NEWT_COLORSET_EMPTYSCALE 19</div><div class='add'>+#define NEWT_COLORSET_FULLSCALE 20</div><div class='add'>+#define NEWT_COLORSET_DISENTRY 21</div><div class='add'>+#define NEWT_COLORSET_COMPACTBUTTON 22</div><div class='add'>+#define NEWT_COLORSET_ACTSELLISTBOX 23</div><div class='add'>+#define NEWT_COLORSET_SELLISTBOX 24</div><div class='add'>+</div><div class='add'>+#define NEWT_ARG_LAST -100000</div><div class='add'>+#define NEWT_ARG_APPEND -1</div><div class='add'>+</div><div class='add'>+struct newtColors {</div><div class='add'>+ char * rootFg, * rootBg;</div><div class='add'>+ char * borderFg, * borderBg;</div><div class='add'>+ char * windowFg, * windowBg;</div><div class='add'>+ char * shadowFg, * shadowBg;</div><div class='add'>+ char * titleFg, * titleBg;</div><div class='add'>+ char * buttonFg, * buttonBg;</div><div class='add'>+ char * actButtonFg, * actButtonBg;</div><div class='add'>+ char * checkboxFg, * checkboxBg;</div><div class='add'>+ char * actCheckboxFg, * actCheckboxBg;</div><div class='add'>+ char * entryFg, * entryBg;</div><div class='add'>+ char * labelFg, * labelBg;</div><div class='add'>+ char * listboxFg, * listboxBg;</div><div class='add'>+ char * actListboxFg, * actListboxBg;</div><div class='add'>+ char * textboxFg, * textboxBg;</div><div class='add'>+ char * actTextboxFg, * actTextboxBg;</div><div class='add'>+ char * helpLineFg, * helpLineBg;</div><div class='add'>+ char * rootTextFg, * rootTextBg;</div><div class='add'>+ char * emptyScale, * fullScale;</div><div class='add'>+ char * disabledEntryFg, * disabledEntryBg;</div><div class='add'>+ char * compactButtonFg, * compactButtonBg;</div><div class='add'>+ char * actSelListboxFg, * actSelListboxBg;</div><div class='add'>+ char * selListboxFg, * selListboxBg;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum newtFlagsSense { NEWT_FLAGS_SET, NEWT_FLAGS_RESET, NEWT_FLAGS_TOGGLE };</div><div class='add'>+</div><div class='add'>+#define NEWT_FLAG_RETURNEXIT (1 << 0)</div><div class='add'>+#define NEWT_FLAG_HIDDEN (1 << 1)</div><div class='add'>+#define NEWT_FLAG_SCROLL (1 << 2)</div><div class='add'>+#define NEWT_FLAG_DISABLED (1 << 3)</div><div class='add'>+/* OBSOLETE #define NEWT_FLAG_NOSCROLL (1 << 4) for listboxes */</div><div class='add'>+#define NEWT_FLAG_BORDER (1 << 5)</div><div class='add'>+#define NEWT_FLAG_WRAP (1 << 6)</div><div class='add'>+#define NEWT_FLAG_NOF12 (1 << 7)</div><div class='add'>+#define NEWT_FLAG_MULTIPLE (1 << 8)</div><div class='add'>+#define NEWT_FLAG_SELECTED (1 << 9)</div><div class='add'>+#define NEWT_FLAG_CHECKBOX (1 << 10)</div><div class='add'>+#define NEWT_FLAG_PASSWORD (1 << 11) /* draw '*' of chars in entrybox */</div><div class='add'>+#define NEWT_FD_READ (1 << 0)</div><div class='add'>+#define NEWT_FD_WRITE (1 << 1)</div><div class='add'>+</div><div class='add'>+#define NEWT_CHECKBOXTREE_COLLAPSED '\0'</div><div class='add'>+#define NEWT_CHECKBOXTREE_EXPANDED '\1'</div><div class='add'>+#define NEWT_CHECKBOXTREE_UNSELECTED ' '</div><div class='add'>+#define NEWT_CHECKBOXTREE_SELECTED '*'</div><div class='add'>+</div><div class='add'>+/* Backwards compatibility */</div><div class='add'>+#define NEWT_LISTBOX_RETURNEXIT NEWT_FLAG_RETURNEXIT</div><div class='add'>+#define NEWT_ENTRY_SCROLL NEWT_FLAG_SCROLL</div><div class='add'>+#define NEWT_ENTRY_HIDDEN NEWT_FLAG_HIDDEN</div><div class='add'>+#define NEWT_ENTRY_RETURNEXIT NEWT_FLAG_RETURNEXIT</div><div class='add'>+#define NEWT_ENTRY_DISABLED NEWT_FLAG_DISABLED</div><div class='add'>+</div><div class='add'>+#define NEWT_TEXTBOX_WRAP NEWT_FLAG_WRAP</div><div class='add'>+#define NEWT_TEXTBOX_SCROLL NEWT_FLAG_SCROLL</div><div class='add'>+#define NEWT_FORM_NOF12 NEWT_FLAG_NOF12</div><div class='add'>+</div><div class='add'>+#define newtListboxAddEntry newtListboxAppendEntry</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+typedef struct newtComponent_struct * newtComponent;</div><div class='add'>+</div><div class='add'>+extern const struct newtColors newtDefaultColorPalette;</div><div class='add'>+</div><div class='add'>+typedef void (*newtCallback)(newtComponent, void *);</div><div class='add'>+typedef void (*newtSuspendCallback)(void * data);</div><div class='add'>+</div><div class='add'>+int newtInit(void);</div><div class='add'>+int newtFinished(void);</div><div class='add'>+void newtCls(void);</div><div class='add'>+void newtResizeScreen(int redraw);</div><div class='add'>+void newtWaitForKey(void);</div><div class='add'>+void newtClearKeyBuffer(void);</div><div class='add'>+void newtDelay(int usecs);</div><div class='add'>+/* top, left are *not* counting the border */</div><div class='add'>+int newtOpenWindow(int left, int top, int width, int height, </div><div class='add'>+ const char * title);</div><div class='add'>+int newtCenteredWindow(int width, int height, const char * title);</div><div class='add'>+void newtPopWindow(void);</div><div class='add'>+void newtSetColors(struct newtColors colors);</div><div class='add'>+void newtRefresh(void);</div><div class='add'>+void newtSuspend(void);</div><div class='add'>+void newtSetSuspendCallback(newtSuspendCallback cb, void * data);</div><div class='add'>+void newtSetHelpCallback(newtCallback cb);</div><div class='add'>+void newtResume(void);</div><div class='add'>+void newtPushHelpLine(const char * text);</div><div class='add'>+void newtRedrawHelpLine(void);</div><div class='add'>+void newtPopHelpLine(void);</div><div class='add'>+void newtDrawRootText(int col, int row, const char * text);</div><div class='add'>+void newtBell(void);</div><div class='add'>+void newtCursorOff(void);</div><div class='add'>+void newtCursorOn(void);</div><div class='add'>+</div><div class='add'>+/* Components */</div><div class='add'>+</div><div class='add'>+newtComponent newtCompactButton(int left, int top, const char * text);</div><div class='add'>+newtComponent newtButton(int left, int top, const char * text);</div><div class='add'>+newtComponent newtCheckbox(int left, int top, const char * text, char defValue,</div><div class='add'>+ const char * seq, char * result);</div><div class='add'>+char newtCheckboxGetValue(newtComponent co);</div><div class='add'>+void newtCheckboxSetValue(newtComponent co, char value);</div><div class='add'>+void newtCheckboxSetFlags(newtComponent co, int flags, enum newtFlagsSense sense);</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+newtComponent newtRadiobutton(int left, int top, const char * text, int isDefault,</div><div class='add'>+ newtComponent prevButton);</div><div class='add'>+newtComponent newtRadioGetCurrent(newtComponent setMember);</div><div class='add'>+newtComponent newtListitem(int left, int top, const char * text, int isDefault,</div><div class='add'>+ newtComponent prevItem, const void * data, int flags);</div><div class='add'>+void newtListitemSet(newtComponent co, const char * text);</div><div class='add'>+void * newtListitemGetData(newtComponent co);</div><div class='add'>+void newtGetScreenSize(int * cols, int * rows);</div><div class='add'>+</div><div class='add'>+newtComponent newtLabel(int left, int top, const char * text);</div><div class='add'>+void newtLabelSetText(newtComponent co, const char * text);</div><div class='add'>+newtComponent newtVerticalScrollbar(int left, int top, int height,</div><div class='add'>+ int normalColorset, int thumbColorset);</div><div class='add'>+void newtScrollbarSet(newtComponent co, int where, int total);</div><div class='add'>+</div><div class='add'>+newtComponent newtListbox(int left, int top, int height, int flags);</div><div class='add'>+void * newtListboxGetCurrent(newtComponent co);</div><div class='add'>+void newtListboxSetCurrent(newtComponent co, int num);</div><div class='add'>+void newtListboxSetCurrentByKey(newtComponent co, void * key);</div><div class='add'>+void newtListboxSetEntry(newtComponent co, int num, const char * text);</div><div class='add'>+void newtListboxSetWidth(newtComponent co, int width);</div><div class='add'>+void newtListboxSetData(newtComponent co, int num, void * data);</div><div class='add'>+int newtListboxAppendEntry(newtComponent co, const char * text, </div><div class='add'>+ const void * data);</div><div class='add'>+/* Send the key to insert after, or NULL to insert at the top */</div><div class='add'>+int newtListboxInsertEntry(newtComponent co, const char * text, const void * data, void * key);</div><div class='add'>+int newtListboxDeleteEntry(newtComponent co, void * data);</div><div class='add'>+void newtListboxClear(newtComponent co); /* removes all entries from listbox */</div><div class='add'>+void newtListboxGetEntry(newtComponent co, int num, char **text, void **data);</div><div class='add'>+/* Returns an array of data pointers from items, last element is NULL */</div><div class='add'>+void **newtListboxGetSelection(newtComponent co, int *numitems);</div><div class='add'>+void newtListboxClearSelection(newtComponent co);</div><div class='add'>+void newtListboxSelectItem(newtComponent co, const void * key,</div><div class='add'>+ enum newtFlagsSense sense);</div><div class='add'>+</div><div class='add'>+newtComponent newtCheckboxTree(int left, int top, int height, int flags);</div><div class='add'>+newtComponent newtCheckboxTreeMulti(int left, int top, int height, char *seq, int flags);</div><div class='add'>+const void ** newtCheckboxTreeGetSelection(newtComponent co, int *numitems);</div><div class='add'>+const void * newtCheckboxTreeGetCurrent(newtComponent co);</div><div class='add'>+const void ** newtCheckboxTreeGetMultiSelection(newtComponent co, int *numitems, char seqnum);</div><div class='add'>+/* last item is NEWT_ARG_LAST for all of these */</div><div class='add'>+int newtCheckboxTreeAddItem(newtComponent co, </div><div class='add'>+ const char * text, const void * data,</div><div class='add'>+ int flags, int index, ...);</div><div class='add'>+int newtCheckboxTreeAddArray(newtComponent co, </div><div class='add'>+ const char * text, const void * data,</div><div class='add'>+ int flags, int * indexes);</div><div class='add'>+int * newtCheckboxTreeFindItem(newtComponent co, void * data);</div><div class='add'>+void newtCheckboxTreeSetEntry(newtComponent co, const void * data,</div><div class='add'>+ const char * text);</div><div class='add'>+char newtCheckboxTreeGetEntryValue(newtComponent co, const void * data);</div><div class='add'>+void newtCheckboxTreeSetEntryValue(newtComponent co, const void * data,</div><div class='add'>+ char value);</div><div class='add'>+ </div><div class='add'>+newtComponent newtTextboxReflowed(int left, int top, char * text, int width,</div><div class='add'>+ int flexDown, int flexUp, int flags);</div><div class='add'>+newtComponent newtTextbox(int left, int top, int width, int height, int flags);</div><div class='add'>+void newtTextboxSetText(newtComponent co, const char * text);</div><div class='add'>+void newtTextboxSetHeight(newtComponent co, int height);</div><div class='add'>+int newtTextboxGetNumLines(newtComponent co);</div><div class='add'>+char * newtReflowText(char * text, int width, int flexDown, int flexUp,</div><div class='add'>+ int * actualWidth, int * actualHeight);</div><div class='add'>+</div><div class='add'>+struct newtExitStruct {</div><div class='add'>+ enum { NEWT_EXIT_HOTKEY, NEWT_EXIT_COMPONENT, NEWT_EXIT_FDREADY,</div><div class='add'>+ NEWT_EXIT_TIMER } reason;</div><div class='add'>+ union {</div><div class='add'>+ int key;</div><div class='add'>+ newtComponent co;</div><div class='add'>+ } u;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+newtComponent newtForm(newtComponent vertBar, void * helpTag, int flags);</div><div class='add'>+void newtFormSetTimer(newtComponent form, int millisecs);</div><div class='add'>+void newtFormWatchFd(newtComponent form, int fd, int fdFlags);</div><div class='add'>+void newtFormSetSize(newtComponent co);</div><div class='add'>+newtComponent newtFormGetCurrent(newtComponent co);</div><div class='add'>+void newtFormSetBackground(newtComponent co, int color);</div><div class='add'>+void newtFormSetCurrent(newtComponent co, newtComponent subco);</div><div class='add'>+void newtFormAddComponent(newtComponent form, newtComponent co);</div><div class='add'>+void newtFormAddComponents(newtComponent form, ...);</div><div class='add'>+void newtFormSetHeight(newtComponent co, int height);</div><div class='add'>+void newtFormSetWidth(newtComponent co, int width);</div><div class='add'>+newtComponent newtRunForm(newtComponent form); /* obsolete */</div><div class='add'>+void newtFormRun(newtComponent co, struct newtExitStruct * es);</div><div class='add'>+void newtDrawForm(newtComponent form);</div><div class='add'>+void newtFormAddHotKey(newtComponent co, int key);</div><div class='add'>+</div><div class='add'>+typedef int (*newtEntryFilter)(newtComponent entry, void * data, int ch,</div><div class='add'>+ int cursor);</div><div class='add'>+newtComponent newtEntry(int left, int top, const char * initialValue, int width,</div><div class='add'>+ char ** resultPtr, int flags);</div><div class='add'>+void newtEntrySet(newtComponent co, const char * value, int cursorAtEnd);</div><div class='add'>+void newtEntrySetFilter(newtComponent co, newtEntryFilter filter, void * data);</div><div class='add'>+char * newtEntryGetValue(newtComponent co);</div><div class='add'>+void newtEntrySetFlags(newtComponent co, int flags, enum newtFlagsSense sense);</div><div class='add'>+</div><div class='add'>+newtComponent newtScale(int left, int top, int width, int fullValue);</div><div class='add'>+void newtScaleSet(newtComponent co, unsigned int amount);</div><div class='add'>+</div><div class='add'>+void newtComponentAddCallback(newtComponent co, newtCallback f, void * data);</div><div class='add'>+void newtComponentTakesFocus(newtComponent co, int val);</div><div class='add'>+</div><div class='add'>+/* this also destroys all of the components (including other forms) on the </div><div class='add'>+ form */</div><div class='add'>+void newtFormDestroy(newtComponent form); </div><div class='add'>+</div><div class='add'>+/* Key codes */</div><div class='add'>+</div><div class='add'>+#define NEWT_KEY_TAB '\t'</div><div class='add'>+#define NEWT_KEY_ENTER '\r'</div><div class='add'>+#define NEWT_KEY_SUSPEND '\032' /* ctrl - z*/</div><div class='add'>+#define NEWT_KEY_RETURN NEWT_KEY_ENTER</div><div class='add'>+</div><div class='add'>+#define NEWT_KEY_EXTRA_BASE 0x8000</div><div class='add'>+#define NEWT_KEY_UP NEWT_KEY_EXTRA_BASE + 1</div><div class='add'>+#define NEWT_KEY_DOWN NEWT_KEY_EXTRA_BASE + 2</div><div class='add'>+#define NEWT_KEY_LEFT NEWT_KEY_EXTRA_BASE + 4</div><div class='add'>+#define NEWT_KEY_RIGHT NEWT_KEY_EXTRA_BASE + 5</div><div class='add'>+#define NEWT_KEY_BKSPC NEWT_KEY_EXTRA_BASE + 6</div><div class='add'>+#define NEWT_KEY_DELETE NEWT_KEY_EXTRA_BASE + 7</div><div class='add'>+#define NEWT_KEY_HOME NEWT_KEY_EXTRA_BASE + 8</div><div class='add'>+#define NEWT_KEY_END NEWT_KEY_EXTRA_BASE + 9</div><div class='add'>+#define NEWT_KEY_UNTAB NEWT_KEY_EXTRA_BASE + 10</div><div class='add'>+#define NEWT_KEY_PGUP NEWT_KEY_EXTRA_BASE + 11</div><div class='add'>+#define NEWT_KEY_PGDN NEWT_KEY_EXTRA_BASE + 12</div><div class='add'>+#define NEWT_KEY_INSERT NEWT_KEY_EXTRA_BASE + 13</div><div class='add'>+</div><div class='add'>+#define NEWT_KEY_F1 NEWT_KEY_EXTRA_BASE + 101</div><div class='add'>+#define NEWT_KEY_F2 NEWT_KEY_EXTRA_BASE + 102</div><div class='add'>+#define NEWT_KEY_F3 NEWT_KEY_EXTRA_BASE + 103</div><div class='add'>+#define NEWT_KEY_F4 NEWT_KEY_EXTRA_BASE + 104</div><div class='add'>+#define NEWT_KEY_F5 NEWT_KEY_EXTRA_BASE + 105</div><div class='add'>+#define NEWT_KEY_F6 NEWT_KEY_EXTRA_BASE + 106</div><div class='add'>+#define NEWT_KEY_F7 NEWT_KEY_EXTRA_BASE + 107</div><div class='add'>+#define NEWT_KEY_F8 NEWT_KEY_EXTRA_BASE + 108</div><div class='add'>+#define NEWT_KEY_F9 NEWT_KEY_EXTRA_BASE + 109</div><div class='add'>+#define NEWT_KEY_F10 NEWT_KEY_EXTRA_BASE + 110</div><div class='add'>+#define NEWT_KEY_F11 NEWT_KEY_EXTRA_BASE + 111</div><div class='add'>+#define NEWT_KEY_F12 NEWT_KEY_EXTRA_BASE + 112</div><div class='add'>+</div><div class='add'>+/* not really a key, but newtGetKey returns it */</div><div class='add'>+#define NEWT_KEY_RESIZE NEWT_KEY_EXTRA_BASE + 113</div><div class='add'>+</div><div class='add'>+#define NEWT_ANCHOR_LEFT (1 << 0)</div><div class='add'>+#define NEWT_ANCHOR_RIGHT (1 << 1)</div><div class='add'>+#define NEWT_ANCHOR_TOP (1 << 2)</div><div class='add'>+#define NEWT_ANCHOR_BOTTOM (1 << 3)</div><div class='add'>+</div><div class='add'>+#define NEWT_GRID_FLAG_GROWX (1 << 0)</div><div class='add'>+#define NEWT_GRID_FLAG_GROWY (1 << 1)</div><div class='add'>+</div><div class='add'>+typedef struct grid_s * newtGrid;</div><div class='add'>+enum newtGridElement { NEWT_GRID_EMPTY = 0,</div><div class='add'>+ NEWT_GRID_COMPONENT, NEWT_GRID_SUBGRID };</div><div class='add'>+</div><div class='add'>+newtGrid newtCreateGrid(int cols, int rows);</div><div class='add'>+/* TYPE, what, TYPE, what, ..., NULL */</div><div class='add'>+newtGrid newtGridVStacked(enum newtGridElement type, void * what, ...);</div><div class='add'>+newtGrid newtGridVCloseStacked(enum newtGridElement type, void * what, ...);</div><div class='add'>+newtGrid newtGridHStacked(enum newtGridElement type1, void * what1, ...);</div><div class='add'>+newtGrid newtGridHCloseStacked(enum newtGridElement type1, void * what1, ...);</div><div class='add'>+newtGrid newtGridBasicWindow(newtComponent text, newtGrid middle,</div><div class='add'>+ newtGrid buttons);</div><div class='add'>+newtGrid newtGridSimpleWindow(newtComponent text, newtComponent middle,</div><div class='add'>+ newtGrid buttons);</div><div class='add'>+void newtGridSetField(newtGrid grid, int col, int row, </div><div class='add'>+ enum newtGridElement type, void * val, int padLeft,</div><div class='add'>+ int padTop, int padRight, int padBottom, int anchor,</div><div class='add'>+ int flags);</div><div class='add'>+void newtGridPlace(newtGrid grid, int left, int top);</div><div class='add'>+#define newtGridDestroy newtGridFree</div><div class='add'>+void newtGridFree(newtGrid grid, int recurse);</div><div class='add'>+void newtGridGetSize(newtGrid grid, int * width, int * height);</div><div class='add'>+void newtGridWrappedWindow(newtGrid grid, char * title);</div><div class='add'>+void newtGridWrappedWindowAt(newtGrid grid, char * title, int left, int top);</div><div class='add'>+void newtGridAddComponentsToForm(newtGrid grid, newtComponent form, </div><div class='add'>+ int recurse);</div><div class='add'>+</div><div class='add'>+/* convienve */</div><div class='add'>+newtGrid newtButtonBarv(char * button1, newtComponent * b1comp, va_list args);</div><div class='add'>+newtGrid newtButtonBar(char * button1, newtComponent * b1comp, ...);</div><div class='add'>+</div><div class='add'>+/* automatically centered and shrink wrapped */</div><div class='add'>+void newtWinMessage(char * title, char * buttonText, char * text, ...);</div><div class='add'>+void newtWinMessagev(char * title, char * buttonText, char * text, </div><div class='add'>+ va_list argv);</div><div class='add'>+</div><div class='add'>+/* having separate calls for these two seems silly, but having two separate</div><div class='add'>+ variable length-arg lists seems like a bad idea as well */</div><div class='add'>+</div><div class='add'>+/* Returns 0 if F12 was pressed, 1 for button1, 2 for button2 */</div><div class='add'>+int newtWinChoice(char * title, char * button1, char * button2, </div><div class='add'>+ char * text, ...);</div><div class='add'>+/* Returns 0 if F12 was pressed, 1 for button1, 2 for button2, </div><div class='add'>+ 3 for button3 */</div><div class='add'>+int newtWinTernary(char * title, char * button1, char * button2, </div><div class='add'>+ char * button3, char * message, ...);</div><div class='add'>+</div><div class='add'>+/* Returns the button number pressed, 0 on F12 */</div><div class='add'>+int newtWinMenu(char * title, char * text, int suggestedWidth, int flexDown, </div><div class='add'>+ int flexUp, int maxListHeight, char ** items, int * listItem,</div><div class='add'>+ char * button1, ...);</div><div class='add'>+</div><div class='add'>+struct newtWinEntry {</div><div class='add'>+ char * text;</div><div class='add'>+ char ** value; /* may be initialized to set default */</div><div class='add'>+ int flags;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Returns the button number pressed, 0 on F12. The final values are</div><div class='add'>+ dynamically allocated, and need to be freed. */</div><div class='add'>+int newtWinEntries(char * title, char * text, int suggestedWidth, int flexDown, </div><div class='add'>+ int flexUp, int dataWidth, </div><div class='add'>+ struct newtWinEntry * items, char * button1, ...);</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+} /* End of extern "C" { */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* H_NEWT */</div><div class='head'>diff --git a/mdk-stage1/newt/newt_pr.h b/mdk-stage1/newt/newt_pr.h<br/>new file mode 100644<br/>index 000000000..76f5e2f6f<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/newt_pr.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/newt_pr.h</a></div><div class='hunk'>@@ -0,0 +1,82 @@</div><div class='add'>+#ifndef H_NEWT_PR</div><div class='add'>+#define H_NEWT_PR</div><div class='add'>+</div><div class='add'>+#define COLORSET_ROOT NEWT_COLORSET_ROOT</div><div class='add'>+#define COLORSET_BORDER NEWT_COLORSET_BORDER</div><div class='add'>+#define COLORSET_WINDOW NEWT_COLORSET_WINDOW</div><div class='add'>+#define COLORSET_SHADOW NEWT_COLORSET_SHADOW</div><div class='add'>+#define COLORSET_TITLE NEWT_COLORSET_TITLE</div><div class='add'>+#define COLORSET_BUTTON NEWT_COLORSET_BUTTON</div><div class='add'>+#define COLORSET_ACTBUTTON NEWT_COLORSET_ACTBUTTON</div><div class='add'>+#define COLORSET_CHECKBOX NEWT_COLORSET_CHECKBOX</div><div class='add'>+#define COLORSET_ACTCHECKBOX NEWT_COLORSET_ACTCHECKBOX</div><div class='add'>+#define COLORSET_ENTRY NEWT_COLORSET_ENTRY</div><div class='add'>+#define COLORSET_LABEL NEWT_COLORSET_LABEL</div><div class='add'>+#define COLORSET_LISTBOX NEWT_COLORSET_LISTBOX</div><div class='add'>+#define COLORSET_ACTLISTBOX NEWT_COLORSET_ACTLISTBOX</div><div class='add'>+#define COLORSET_TEXTBOX NEWT_COLORSET_TEXTBOX</div><div class='add'>+#define COLORSET_ACTTEXTBOX NEWT_COLORSET_ACTTEXTBOX</div><div class='add'>+</div><div class='add'>+int newtSetFlags(int oldFlags, int newFlags, enum newtFlagsSense sense);</div><div class='add'>+</div><div class='add'>+void newtGotorc(int row, int col);</div><div class='add'>+void newtGetrc(int * row, int * col);</div><div class='add'>+void newtGetWindowPos(int * x, int * y);</div><div class='add'>+void newtDrawBox(int left, int top, int width, int height, int shadow);</div><div class='add'>+void newtClearBox(int left, int top, int width, int height);</div><div class='add'>+</div><div class='add'>+int newtGetKey(void);</div><div class='add'>+</div><div class='add'>+struct newtComponent_struct {</div><div class='add'>+ /* common data */</div><div class='add'>+ int height, width;</div><div class='add'>+ int top, left;</div><div class='add'>+ int takesFocus;</div><div class='add'>+ int isMapped;</div><div class='add'>+</div><div class='add'>+ struct componentOps * ops;</div><div class='add'>+</div><div class='add'>+ newtCallback callback;</div><div class='add'>+ void * callbackData;</div><div class='add'>+</div><div class='add'>+ void * data;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+enum eventResultTypes { ER_IGNORED, ER_SWALLOWED, ER_EXITFORM, ER_SETFOCUS,</div><div class='add'>+ ER_NEXTCOMP };</div><div class='add'>+struct eventResult {</div><div class='add'>+ enum eventResultTypes result;</div><div class='add'>+ union {</div><div class='add'>+ newtComponent focus;</div><div class='add'>+ } u;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum eventTypes { EV_FOCUS, EV_UNFOCUS, EV_KEYPRESS, EV_MOUSE };</div><div class='add'>+enum eventSequence { EV_EARLY, EV_NORMAL, EV_LATE };</div><div class='add'>+</div><div class='add'>+struct event {</div><div class='add'>+ enum eventTypes event;</div><div class='add'>+ enum eventSequence when;</div><div class='add'>+ union {</div><div class='add'>+ int key;</div><div class='add'>+ struct {</div><div class='add'>+ enum { MOUSE_MOTION, MOUSE_BUTTON_DOWN, MOUSE_BUTTON_UP } type;</div><div class='add'>+ int x, y;</div><div class='add'>+ } mouse;</div><div class='add'>+ } u;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+struct componentOps {</div><div class='add'>+ void (* draw)(newtComponent c);</div><div class='add'>+ struct eventResult (* event)(newtComponent c, struct event ev);</div><div class='add'>+ void (* destroy)(newtComponent c);</div><div class='add'>+ void (* place)(newtComponent c, int newLeft, int newTop);</div><div class='add'>+ void (* mapped)(newtComponent c, int isMapped);</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+void newtDefaultPlaceHandler(newtComponent c, int newLeft, int newTop);</div><div class='add'>+void newtDefaultMappedHandler(newtComponent c, int isMapped);</div><div class='add'>+struct eventResult newtDefaultEventHandler(newtComponent c,</div><div class='add'>+ struct event ev);</div><div class='add'>+</div><div class='add'>+#endif /* H_NEWT_PR */</div><div class='head'>diff --git a/mdk-stage1/newt/scale.c b/mdk-stage1/newt/scale.c<br/>new file mode 100644<br/>index 000000000..800958580<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/scale.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/scale.c</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct scale {</div><div class='add'>+ int fullValue;</div><div class='add'>+ int charsSet;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void scaleDraw(newtComponent co);</div><div class='add'>+</div><div class='add'>+static struct componentOps scaleOps = {</div><div class='add'>+ scaleDraw,</div><div class='add'>+ newtDefaultEventHandler,</div><div class='add'>+ NULL,</div><div class='add'>+ newtDefaultPlaceHandler,</div><div class='add'>+ newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+newtComponent newtScale(int left, int top, int width, int fullValue) {</div><div class='add'>+ newtComponent co;</div><div class='add'>+ struct scale * sc;</div><div class='add'>+</div><div class='add'>+ co = malloc(sizeof(*co));</div><div class='add'>+ sc = malloc(sizeof(struct scale));</div><div class='add'>+ co->data = sc;</div><div class='add'>+</div><div class='add'>+ co->ops = &scaleOps;</div><div class='add'>+</div><div class='add'>+ co->height = 1;</div><div class='add'>+ co->width = width;</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->takesFocus = 0;</div><div class='add'>+</div><div class='add'>+ sc->fullValue = fullValue;</div><div class='add'>+ sc->charsSet = 0;</div><div class='add'>+</div><div class='add'>+ return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtScaleSet(newtComponent co, unsigned int amount) {</div><div class='add'>+ struct scale * sc = co->data;</div><div class='add'>+ int newCharsSet;</div><div class='add'>+</div><div class='add'>+ newCharsSet = (amount * co->width) / sc->fullValue;</div><div class='add'>+ </div><div class='add'>+ if (newCharsSet != sc->charsSet) {</div><div class='add'>+ sc->charsSet = newCharsSet;</div><div class='add'>+ scaleDraw(co);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void scaleDraw(newtComponent co) {</div><div class='add'>+ struct scale * sc = co->data;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if (co->top == -1) return;</div><div class='add'>+</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_FULLSCALE);</div><div class='add'>+ for (i = 0; i < sc->charsSet; i++)</div><div class='add'>+ SLsmg_write_string(" ");</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_EMPTYSCALE);</div><div class='add'>+ for (i = 0; i < (co->width - sc->charsSet); i++)</div><div class='add'>+ SLsmg_write_string(" ");</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/scrollbar.c b/mdk-stage1/newt/scrollbar.c<br/>new file mode 100644<br/>index 000000000..cb4bc2757<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/scrollbar.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/scrollbar.c</a></div><div class='hunk'>@@ -0,0 +1,124 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct scrollbar {</div><div class='add'>+ int curr;</div><div class='add'>+ int cs, csThumb;</div><div class='add'>+ int arrows;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+static void sbDraw(newtComponent co);</div><div class='add'>+static void sbDestroy(newtComponent co);</div><div class='add'>+static void sbDrawThumb(newtComponent co, int isOn);</div><div class='add'>+</div><div class='add'>+static struct componentOps sbOps = {</div><div class='add'>+ sbDraw,</div><div class='add'>+ newtDefaultEventHandler,</div><div class='add'>+ sbDestroy,</div><div class='add'>+ newtDefaultPlaceHandler,</div><div class='add'>+ newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+void newtScrollbarSet(newtComponent co, int where, int total) {</div><div class='add'>+ struct scrollbar * sb = co->data;</div><div class='add'>+ int new;</div><div class='add'>+</div><div class='add'>+ if (sb->arrows)</div><div class='add'>+ new = (where * (co->height - 3)) / (total ? total : 1) + 1;</div><div class='add'>+ else</div><div class='add'>+ new = (where * (co->height - 1)) / (total ? total : 1);</div><div class='add'>+ if (new != sb->curr) {</div><div class='add'>+ sbDrawThumb(co, 0);</div><div class='add'>+ sb->curr = new;</div><div class='add'>+ sbDrawThumb(co, 1);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtVerticalScrollbar(int left, int top, int height,</div><div class='add'>+ int normalColorset, int thumbColorset) {</div><div class='add'>+ newtComponent co;</div><div class='add'>+ struct scrollbar * sb;</div><div class='add'>+</div><div class='add'>+ co = malloc(sizeof(*co));</div><div class='add'>+ sb = malloc(sizeof(*sb));</div><div class='add'>+ co->data = sb;</div><div class='add'>+</div><div class='add'>+ if (!strcmp(getenv("TERM"), "linux") && height >= 2) {</div><div class='add'>+ sb->arrows = 1;</div><div class='add'>+ sb->curr = 1;</div><div class='add'>+ } else {</div><div class='add'>+ sb->arrows = 0;</div><div class='add'>+ sb->curr = 0;</div><div class='add'>+ }</div><div class='add'>+ sb->cs = normalColorset;</div><div class='add'>+ sb->csThumb = thumbColorset;</div><div class='add'>+</div><div class='add'>+ co->ops = &sbOps;</div><div class='add'>+ co->isMapped = 0;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->height = height;</div><div class='add'>+ co->width = 1;</div><div class='add'>+ co->takesFocus = 0; </div><div class='add'>+ </div><div class='add'>+ return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sbDraw(newtComponent co) {</div><div class='add'>+ struct scrollbar * sb = co->data;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if (!co->isMapped) return;</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(sb->cs);</div><div class='add'>+</div><div class='add'>+ SLsmg_set_char_set(1);</div><div class='add'>+ if (sb->arrows) {</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+ SLsmg_write_char('\x2d');</div><div class='add'>+ for (i = 1; i < co->height - 1; i++) {</div><div class='add'>+ newtGotorc(i + co->top, co->left);</div><div class='add'>+ SLsmg_write_char('\x61');</div><div class='add'>+ }</div><div class='add'>+ newtGotorc(co->top + co->height - 1, co->left);</div><div class='add'>+ SLsmg_write_char('\x2e');</div><div class='add'>+ } else {</div><div class='add'>+ for (i = 0; i < co->height; i++) {</div><div class='add'>+ newtGotorc(i + co->top, co->left);</div><div class='add'>+ SLsmg_write_char('\x61');</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLsmg_set_char_set(0);</div><div class='add'>+</div><div class='add'>+ sbDrawThumb(co, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sbDrawThumb(newtComponent co, int isOn) {</div><div class='add'>+ struct scrollbar * sb = co->data;</div><div class='add'>+ char ch = isOn ? '#' : '\x61';</div><div class='add'>+</div><div class='add'>+ if (!co->isMapped) return;</div><div class='add'>+</div><div class='add'>+ newtGotorc(sb->curr + co->top, co->left);</div><div class='add'>+ SLsmg_set_char_set(1);</div><div class='add'>+</div><div class='add'>+ /*if (isOn)</div><div class='add'>+ SLsmg_set_color(sb->csThumb);</div><div class='add'>+ else*/</div><div class='add'>+ SLsmg_set_color(sb->cs);</div><div class='add'>+</div><div class='add'>+ SLsmg_write_char(ch);</div><div class='add'>+ SLsmg_set_char_set(0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sbDestroy(newtComponent co) {</div><div class='add'>+ struct scrollbar * sb = co->data;</div><div class='add'>+ </div><div class='add'>+ free(sb);</div><div class='add'>+ free(co);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/textbox.c b/mdk-stage1/newt/textbox.c<br/>new file mode 100644<br/>index 000000000..272c9b675<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/textbox.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/textbox.c</a></div><div class='hunk'>@@ -0,0 +1,409 @@</div><div class='add'>+#include <ctype.h></div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct textbox {</div><div class='add'>+ char ** lines;</div><div class='add'>+ int numLines;</div><div class='add'>+ int linesAlloced;</div><div class='add'>+ int doWrap;</div><div class='add'>+ newtComponent sb;</div><div class='add'>+ int topLine;</div><div class='add'>+ int textWidth;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static char * expandTabs(const char * text);</div><div class='add'>+static void textboxDraw(newtComponent co);</div><div class='add'>+static void addLine(newtComponent co, const char * s, int len);</div><div class='add'>+static void doReflow(const char * text, char ** resultPtr, int width, </div><div class='add'>+ int * badness, int * heightPtr);</div><div class='add'>+static struct eventResult textboxEvent(newtComponent c,</div><div class='add'>+ struct event ev);</div><div class='add'>+static void textboxDestroy(newtComponent co);</div><div class='add'>+static void textboxPlace(newtComponent co, int newLeft, int newTop);</div><div class='add'>+static void textboxMapped(newtComponent co, int isMapped);</div><div class='add'>+</div><div class='add'>+static struct componentOps textboxOps = {</div><div class='add'>+ textboxDraw,</div><div class='add'>+ textboxEvent,</div><div class='add'>+ textboxDestroy,</div><div class='add'>+ textboxPlace,</div><div class='add'>+ textboxMapped,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+static void textboxMapped(newtComponent co, int isMapped) {</div><div class='add'>+ struct textbox * tb = co->data;</div><div class='add'>+</div><div class='add'>+ co->isMapped = isMapped;</div><div class='add'>+ if (tb->sb)</div><div class='add'>+ tb->sb->ops->mapped(tb->sb, isMapped);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void textboxPlace(newtComponent co, int newLeft, int newTop) {</div><div class='add'>+ struct textbox * tb = co->data;</div><div class='add'>+</div><div class='add'>+ co->top = newTop;</div><div class='add'>+ co->left = newLeft;</div><div class='add'>+</div><div class='add'>+ if (tb->sb)</div><div class='add'>+ tb->sb->ops->place(tb->sb, co->left + co->width - 1, co->top);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtTextboxSetHeight(newtComponent co, int height) {</div><div class='add'>+ co->height = height;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtTextboxGetNumLines(newtComponent co) {</div><div class='add'>+ struct textbox * tb = co->data;</div><div class='add'>+</div><div class='add'>+ return (tb->numLines);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtTextboxReflowed(int left, int top, char * text, int width,</div><div class='add'>+ int flexDown, int flexUp, int flags) {</div><div class='add'>+ newtComponent co;</div><div class='add'>+ char * reflowedText;</div><div class='add'>+ int actWidth, actHeight;</div><div class='add'>+</div><div class='add'>+ reflowedText = newtReflowText(text, width, flexDown, flexUp,</div><div class='add'>+ &actWidth, &actHeight);</div><div class='add'>+ </div><div class='add'>+ co = newtTextbox(left, top, actWidth, actHeight, NEWT_FLAG_WRAP);</div><div class='add'>+ newtTextboxSetText(co, reflowedText);</div><div class='add'>+ free(reflowedText);</div><div class='add'>+</div><div class='add'>+ return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtTextbox(int left, int top, int width, int height, int flags) {</div><div class='add'>+ newtComponent co;</div><div class='add'>+ struct textbox * tb;</div><div class='add'>+</div><div class='add'>+ co = malloc(sizeof(*co));</div><div class='add'>+ tb = malloc(sizeof(*tb));</div><div class='add'>+ co->data = tb;</div><div class='add'>+</div><div class='add'>+ co->ops = &textboxOps;</div><div class='add'>+</div><div class='add'>+ co->height = height;</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->takesFocus = 0;</div><div class='add'>+ co->width = width;</div><div class='add'>+</div><div class='add'>+ tb->doWrap = flags & NEWT_FLAG_WRAP;</div><div class='add'>+ tb->numLines = 0;</div><div class='add'>+ tb->linesAlloced = 0;</div><div class='add'>+ tb->lines = NULL;</div><div class='add'>+ tb->topLine = 0;</div><div class='add'>+ tb->textWidth = width;</div><div class='add'>+</div><div class='add'>+ if (flags & NEWT_FLAG_SCROLL) {</div><div class='add'>+ co->width += 2;</div><div class='add'>+ tb->sb = newtVerticalScrollbar(co->left + co->width - 1, co->top, </div><div class='add'>+ co->height, COLORSET_TEXTBOX, COLORSET_TEXTBOX);</div><div class='add'>+ } else {</div><div class='add'>+ tb->sb = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char * expandTabs(const char * text) {</div><div class='add'>+ int bufAlloced = strlen(text) + 40;</div><div class='add'>+ char * buf, * dest;</div><div class='add'>+ const char * src;</div><div class='add'>+ int bufUsed = 0;</div><div class='add'>+ int linePos = 0;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ buf = malloc(bufAlloced + 1);</div><div class='add'>+ for (src = text, dest = buf; *src; src++) {</div><div class='add'>+ if ((bufUsed + 10) > bufAlloced) {</div><div class='add'>+ bufAlloced += strlen(text) / 2;</div><div class='add'>+ buf = realloc(buf, bufAlloced + 1);</div><div class='add'>+ dest = buf + bufUsed;</div><div class='add'>+ }</div><div class='add'>+ if (*src == '\t') {</div><div class='add'>+ i = 8 - (linePos & 8);</div><div class='add'>+ memset(dest, ' ', i);</div><div class='add'>+ dest += i, bufUsed += i, linePos += i;</div><div class='add'>+ } else {</div><div class='add'>+ if (*src == '\n')</div><div class='add'>+ linePos = 0;</div><div class='add'>+ else</div><div class='add'>+ linePos++;</div><div class='add'>+</div><div class='add'>+ *dest++ = *src;</div><div class='add'>+ bufUsed++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *dest = '\0';</div><div class='add'>+ return buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define iseuckanji(c) (0xa1 <= (unsigned char)(c&0xff) && (unsigned char)(c&0xff) <= 0xfe)</div><div class='add'>+</div><div class='add'>+static void doReflow(const char * text, char ** resultPtr, int width, </div><div class='add'>+ int * badness, int * heightPtr) {</div><div class='add'>+ char * result = NULL;</div><div class='add'>+ const char * chptr, * end;</div><div class='add'>+ int i;</div><div class='add'>+ int howbad = 0;</div><div class='add'>+ int height = 0;</div><div class='add'>+ int kanji = 0;</div><div class='add'>+</div><div class='add'>+ if (resultPtr) {</div><div class='add'>+ /* XXX I think this will work */</div><div class='add'>+ result = malloc(strlen(text) + (strlen(text) / width) + 50);</div><div class='add'>+ *result = '\0';</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (*text) {</div><div class='add'>+ kanji = 0;</div><div class='add'>+ end = strchr(text, '\n');</div><div class='add'>+ if (!end)</div><div class='add'>+ end = text + strlen(text);</div><div class='add'>+</div><div class='add'>+ while (*text && text < end) {</div><div class='add'>+ if (end - text < width) {</div><div class='add'>+ if (result) {</div><div class='add'>+ strncat(result, text, end - text + 1);</div><div class='add'>+ strcat(result, "\n");</div><div class='add'>+ height++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (end - text < (width / 2))</div><div class='add'>+ howbad += ((width / 2) - (end - text)) / 2;</div><div class='add'>+ text = end;</div><div class='add'>+ if (*text) text++;</div><div class='add'>+ } else {</div><div class='add'>+ chptr = text;</div><div class='add'>+ kanji = 0;</div><div class='add'>+ for ( i = 0; i < width - 1; i++ ) {</div><div class='add'>+ if ( !iseuckanji(*chptr)) {</div><div class='add'>+ kanji = 0;</div><div class='add'>+ } else if ( kanji == 1 ) {</div><div class='add'>+ kanji = 2; </div><div class='add'>+ } else {</div><div class='add'>+ kanji = 1;</div><div class='add'>+ }</div><div class='add'>+ chptr++;</div><div class='add'>+ }</div><div class='add'>+ if (kanji == 0) {</div><div class='add'>+ while (chptr > text && !isspace(*chptr)) chptr--;</div><div class='add'>+ while (chptr > text && isspace(*chptr)) chptr--;</div><div class='add'>+ chptr++;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (chptr-text == 1 && !isspace(*chptr))</div><div class='add'>+ chptr = text + width - 1;</div><div class='add'>+</div><div class='add'>+ if (chptr > text)</div><div class='add'>+ howbad += width - (chptr - text) + 1;</div><div class='add'>+ if (result) {</div><div class='add'>+ if (kanji == 1) {</div><div class='add'>+ strncat(result, text, chptr - text + 1);</div><div class='add'>+ chptr++;</div><div class='add'>+ kanji = 0;</div><div class='add'>+ } else {</div><div class='add'>+ strncat(result, text, chptr - text + 1);</div><div class='add'>+ }</div><div class='add'>+ strcat(result, "\n");</div><div class='add'>+ height++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (isspace(*chptr))</div><div class='add'>+ text = chptr + 1;</div><div class='add'>+ else</div><div class='add'>+ text = chptr;</div><div class='add'>+ while (isspace(*text)) text++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+// if (result) printf("result: %s\n", result);</div><div class='add'>+</div><div class='add'>+ if (badness) *badness = howbad;</div><div class='add'>+ if (resultPtr) *resultPtr = result;</div><div class='add'>+ if (heightPtr) *heightPtr = height;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char * newtReflowText(char * text, int width, int flexDown, int flexUp,</div><div class='add'>+ int * actualWidth, int * actualHeight) {</div><div class='add'>+ int min, max;</div><div class='add'>+ int i;</div><div class='add'>+ char * result;</div><div class='add'>+ int minbad, minbadwidth, howbad;</div><div class='add'>+ char * expandedText;</div><div class='add'>+</div><div class='add'>+ expandedText = expandTabs(text);</div><div class='add'>+</div><div class='add'>+ if (flexDown || flexUp) {</div><div class='add'>+ min = width - flexDown;</div><div class='add'>+ max = width + flexUp;</div><div class='add'>+</div><div class='add'>+ minbad = -1;</div><div class='add'>+ minbadwidth = width;</div><div class='add'>+</div><div class='add'>+ for (i = min; i <= max; i++) {</div><div class='add'>+ doReflow(expandedText, NULL, i, &howbad, NULL);</div><div class='add'>+</div><div class='add'>+ if (minbad == -1 || howbad < minbad) {</div><div class='add'>+ minbad = howbad;</div><div class='add'>+ minbadwidth = i;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ width = minbadwidth;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ doReflow(expandedText, &result, width, NULL, actualHeight);</div><div class='add'>+ free(expandedText);</div><div class='add'>+ if (actualWidth) *actualWidth = width;</div><div class='add'>+ return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtTextboxSetText(newtComponent co, const char * text) {</div><div class='add'>+ const char * start, * end;</div><div class='add'>+ struct textbox * tb = co->data;</div><div class='add'>+ char * reflowed, * expanded;</div><div class='add'>+ int badness, height;</div><div class='add'>+</div><div class='add'>+ if (tb->lines) {</div><div class='add'>+ free(tb->lines);</div><div class='add'>+ tb->linesAlloced = tb->numLines = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ expanded = expandTabs(text);</div><div class='add'>+</div><div class='add'>+ if (tb->doWrap) {</div><div class='add'>+ doReflow(expanded, &reflowed, tb->textWidth, &badness, &height);</div><div class='add'>+ free(expanded);</div><div class='add'>+ expanded = reflowed;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (start = expanded; *start; start++)</div><div class='add'>+ if (*start == '\n') tb->linesAlloced++;</div><div class='add'>+</div><div class='add'>+ /* This ++ leaves room for an ending line w/o a \n */</div><div class='add'>+ tb->linesAlloced++;</div><div class='add'>+ tb->lines = malloc(sizeof(char *) * tb->linesAlloced);</div><div class='add'>+</div><div class='add'>+ start = expanded;</div><div class='add'>+ while ((end = strchr(start, '\n'))) {</div><div class='add'>+ addLine(co, start, end - start);</div><div class='add'>+ start = end + 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (*start)</div><div class='add'>+ addLine(co, start, strlen(start));</div><div class='add'>+</div><div class='add'>+ free(expanded);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This assumes the buffer is allocated properly! */</div><div class='add'>+static void addLine(newtComponent co, const char * s, int len) {</div><div class='add'>+ struct textbox * tb = co->data;</div><div class='add'>+</div><div class='add'>+ if (len > tb->textWidth) len = tb->textWidth;</div><div class='add'>+</div><div class='add'>+ tb->lines[tb->numLines] = malloc(tb->textWidth + 1);</div><div class='add'>+ memset(tb->lines[tb->numLines], ' ', tb->textWidth); </div><div class='add'>+ memcpy(tb->lines[tb->numLines], s, len);</div><div class='add'>+ tb->lines[tb->numLines++][tb->textWidth] = '\0';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void textboxDraw(newtComponent c) {</div><div class='add'>+ int i;</div><div class='add'>+ struct textbox * tb = c->data;</div><div class='add'>+ int size;</div><div class='add'>+</div><div class='add'>+ if (tb->sb) {</div><div class='add'>+ size = tb->numLines - c->height;</div><div class='add'>+ newtScrollbarSet(tb->sb, tb->topLine, size ? size : 0);</div><div class='add'>+ tb->sb->ops->draw(tb->sb);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_TEXTBOX);</div><div class='add'>+ </div><div class='add'>+ for (i = 0; (i + tb->topLine) < tb->numLines && i < c->height; i++) {</div><div class='add'>+ newtGotorc(c->top + i, c->left);</div><div class='add'>+ SLsmg_write_string(tb->lines[i + tb->topLine]);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult textboxEvent(newtComponent co, </div><div class='add'>+ struct event ev) {</div><div class='add'>+ struct textbox * tb = co->data;</div><div class='add'>+ struct eventResult er;</div><div class='add'>+</div><div class='add'>+ er.result = ER_IGNORED;</div><div class='add'>+</div><div class='add'>+ if (ev.when == EV_EARLY && ev.event == EV_KEYPRESS && tb->sb) {</div><div class='add'>+ switch (ev.u.key) {</div><div class='add'>+ case NEWT_KEY_UP:</div><div class='add'>+ if (tb->topLine) tb->topLine--;</div><div class='add'>+ textboxDraw(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_DOWN:</div><div class='add'>+ if (tb->topLine < (tb->numLines - co->height)) tb->topLine++;</div><div class='add'>+ textboxDraw(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_PGDN:</div><div class='add'>+ tb->topLine += co->height;</div><div class='add'>+ if (tb->topLine > (tb->numLines - co->height)) {</div><div class='add'>+ tb->topLine = tb->numLines - co->height;</div><div class='add'>+ if (tb->topLine < 0) tb->topLine = 0;</div><div class='add'>+ }</div><div class='add'>+ textboxDraw(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NEWT_KEY_PGUP:</div><div class='add'>+ tb->topLine -= co->height;</div><div class='add'>+ if (tb->topLine < 0) tb->topLine = 0;</div><div class='add'>+ textboxDraw(co);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ if (ev.when == EV_EARLY && ev.event == EV_MOUSE && tb->sb) {</div><div class='add'>+ /* Top scroll arrow */</div><div class='add'>+ if (ev.u.mouse.x == co->width && ev.u.mouse.y == co->top) {</div><div class='add'>+ if (tb->topLine) tb->topLine--;</div><div class='add'>+ textboxDraw(co);</div><div class='add'>+ </div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ }</div><div class='add'>+ /* Bottom scroll arrow */</div><div class='add'>+ if (ev.u.mouse.x == co->width &&</div><div class='add'>+ ev.u.mouse.y == co->top + co->height - 1) {</div><div class='add'>+ if (tb->topLine < (tb->numLines - co->height)) tb->topLine++;</div><div class='add'>+ textboxDraw(co);</div><div class='add'>+ </div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void textboxDestroy(newtComponent co) {</div><div class='add'>+ int i;</div><div class='add'>+ struct textbox * tb = co->data;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < tb->numLines; i++) </div><div class='add'>+ free(tb->lines[i]);</div><div class='add'>+ free(tb->lines);</div><div class='add'>+ free(tb);</div><div class='add'>+ free(co);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/windows.c b/mdk-stage1/newt/windows.c<br/>new file mode 100644<br/>index 000000000..792d3ed76<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/windows.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/windows.c</a></div><div class='hunk'>@@ -0,0 +1,275 @@</div><div class='add'>+#include <errno.h></div><div class='add'>+#include <stdarg.h></div><div class='add'>+#include <stdio.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+</div><div class='add'>+#include "errno.h"</div><div class='add'>+#include "newt.h"</div><div class='add'>+</div><div class='add'>+static void * newtvwindow(char * title, char * button1, char * button2, </div><div class='add'>+ char * button3, char * message, va_list args) {</div><div class='add'>+ newtComponent b1, b2 = NULL, b3 = NULL, t, f, answer;</div><div class='add'>+ char * buf = NULL;</div><div class='add'>+ int size = 0;</div><div class='add'>+ int i = 0;</div><div class='add'>+ int scroll = 0;</div><div class='add'>+ int width, height;</div><div class='add'>+ char * flowedText;</div><div class='add'>+ newtGrid grid, buttonGrid;</div><div class='add'>+</div><div class='add'>+ do {</div><div class='add'>+ size += 1000;</div><div class='add'>+ if (buf) free(buf);</div><div class='add'>+ buf = malloc(size);</div><div class='add'>+ i = vsnprintf(buf, size, message, args);</div><div class='add'>+ } while (i >= size || i == -1);</div><div class='add'>+</div><div class='add'>+ flowedText = newtReflowText(buf, 35, 5, 5, &width, &height);</div><div class='add'>+ if (height > 6) {</div><div class='add'>+ free(flowedText);</div><div class='add'>+ flowedText = newtReflowText(buf, 60, 5, 5, &width, &height);</div><div class='add'>+ }</div><div class='add'>+ free(buf);</div><div class='add'>+</div><div class='add'>+ if (height > 12) {</div><div class='add'>+ height = 12;</div><div class='add'>+ scroll = NEWT_FLAG_SCROLL;</div><div class='add'>+ }</div><div class='add'>+ t = newtTextbox(-1, -1, width, height, NEWT_TEXTBOX_WRAP | scroll);</div><div class='add'>+ newtTextboxSetText(t, flowedText);</div><div class='add'>+ free(flowedText);</div><div class='add'>+</div><div class='add'>+ if (button3) {</div><div class='add'>+ buttonGrid = newtButtonBar(button1, &b1, button2, &b2, </div><div class='add'>+ button3, &b3, NULL);</div><div class='add'>+ } else if (button2) {</div><div class='add'>+ buttonGrid = newtButtonBar(button1, &b1, button2, &b2, NULL);</div><div class='add'>+ } else {</div><div class='add'>+ buttonGrid = newtButtonBar(button1, &b1, NULL);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ newtGridSetField(buttonGrid, 0, 0, NEWT_GRID_COMPONENT, b1, </div><div class='add'>+ 0, 0, button2 ? 1 : 0, 0, 0, 0);</div><div class='add'>+</div><div class='add'>+ grid = newtCreateGrid(1, 2);</div><div class='add'>+ newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, t, 0, 0, 0, 0, 0, 0);</div><div class='add'>+ newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, buttonGrid, </div><div class='add'>+ 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX);</div><div class='add'>+ newtGridWrappedWindow(grid, title);</div><div class='add'>+</div><div class='add'>+ f = newtForm(NULL, NULL, 0);</div><div class='add'>+ newtFormAddComponents(f, t, b1, NULL);</div><div class='add'>+</div><div class='add'>+ if (button2)</div><div class='add'>+ newtFormAddComponent(f, b2);</div><div class='add'>+ if (button3)</div><div class='add'>+ newtFormAddComponent(f, b3);</div><div class='add'>+</div><div class='add'>+ answer = newtRunForm(f);</div><div class='add'>+ newtGridFree(grid, 1);</div><div class='add'>+ </div><div class='add'>+ newtFormDestroy(f);</div><div class='add'>+ newtPopWindow();</div><div class='add'>+</div><div class='add'>+ if (answer == f)</div><div class='add'>+ return NULL;</div><div class='add'>+ else if (answer == b1)</div><div class='add'>+ return button1;</div><div class='add'>+ else if (answer == b2)</div><div class='add'>+ return button2;</div><div class='add'>+</div><div class='add'>+ return button3;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtWinChoice(char * title, char * button1, char * button2, </div><div class='add'>+ char * message, ...) {</div><div class='add'>+ va_list args;</div><div class='add'>+ void * rc;</div><div class='add'>+</div><div class='add'>+ va_start(args, message);</div><div class='add'>+ rc = newtvwindow(title, button1, button2, NULL, message, args);</div><div class='add'>+ va_end(args);</div><div class='add'>+</div><div class='add'>+ if (rc == button1)</div><div class='add'>+ return 1;</div><div class='add'>+ else if (rc == button2)</div><div class='add'>+ return 2;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtWinMessage(char * title, char * buttonText, char * text, ...) {</div><div class='add'>+ va_list args;</div><div class='add'>+</div><div class='add'>+ va_start(args, text);</div><div class='add'>+ newtvwindow(title, buttonText, NULL, NULL, text, args);</div><div class='add'>+ va_end(args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtWinMessagev(char * title, char * buttonText, char * text, </div><div class='add'>+ va_list argv) {</div><div class='add'>+ newtvwindow(title, buttonText, NULL, NULL, text, argv);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtWinTernary(char * title, char * button1, char * button2, </div><div class='add'>+ char * button3, char * message, ...) {</div><div class='add'>+ va_list args;</div><div class='add'>+ void * rc;</div><div class='add'>+</div><div class='add'>+ va_start(args, message);</div><div class='add'>+ rc = newtvwindow(title, button1, button2, button3, message, args);</div><div class='add'>+ va_end(args);</div><div class='add'>+</div><div class='add'>+ if (rc == button1)</div><div class='add'>+ return 1;</div><div class='add'>+ else if (rc == button2)</div><div class='add'>+ return 2;</div><div class='add'>+ else if (rc == button3)</div><div class='add'>+ return 3;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* only supports up to 50 buttons -- shucks! */</div><div class='add'>+int newtWinMenu(char * title, char * text, int suggestedWidth, int flexDown, </div><div class='add'>+ int flexUp, int maxListHeight, char ** items, int * listItem,</div><div class='add'>+ char * button1, ...) {</div><div class='add'>+ newtComponent textbox, listbox, result, form;</div><div class='add'>+ va_list args;</div><div class='add'>+ newtComponent buttons[50];</div><div class='add'>+ newtGrid grid, buttonBar;</div><div class='add'>+ int numButtons;</div><div class='add'>+ int i, rc;</div><div class='add'>+ int needScroll;</div><div class='add'>+ char * buttonName;</div><div class='add'>+</div><div class='add'>+ textbox = newtTextboxReflowed(-1, -1, text, suggestedWidth, flexDown,</div><div class='add'>+ flexUp, 0);</div><div class='add'>+</div><div class='add'>+ for (i = 0; items[i]; i++) ;</div><div class='add'>+ if (i < maxListHeight) maxListHeight = i;</div><div class='add'>+ needScroll = i > maxListHeight;</div><div class='add'>+</div><div class='add'>+ listbox = newtListbox(-1, -1, maxListHeight, </div><div class='add'>+ (needScroll ? NEWT_FLAG_SCROLL : 0) | NEWT_FLAG_RETURNEXIT);</div><div class='add'>+ for (i = 0; items[i]; i++) {</div><div class='add'>+ newtListboxAddEntry(listbox, items[i], (void *) i);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ newtListboxSetCurrent(listbox, *listItem);</div><div class='add'>+</div><div class='add'>+ buttonName = button1, numButtons = 0;</div><div class='add'>+ va_start(args, button1);</div><div class='add'>+ while (buttonName) {</div><div class='add'>+ buttons[numButtons] = newtButton(-1, -1, buttonName);</div><div class='add'>+ numButtons++;</div><div class='add'>+ buttonName = va_arg(args, char *);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ va_end(args);</div><div class='add'>+</div><div class='add'>+ buttonBar = newtCreateGrid(numButtons, 1);</div><div class='add'>+ for (i = 0; i < numButtons; i++) {</div><div class='add'>+ newtGridSetField(buttonBar, i, 0, NEWT_GRID_COMPONENT, </div><div class='add'>+ buttons[i],</div><div class='add'>+ i ? 1 : 0, 0, 0, 0, 0, 0);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ grid = newtGridSimpleWindow(textbox, listbox, buttonBar);</div><div class='add'>+ newtGridWrappedWindow(grid, title);</div><div class='add'>+</div><div class='add'>+ form = newtForm(NULL, 0, 0);</div><div class='add'>+ newtGridAddComponentsToForm(grid, form, 1);</div><div class='add'>+ newtGridFree(grid, 1);</div><div class='add'>+</div><div class='add'>+ result = newtRunForm(form);</div><div class='add'>+</div><div class='add'>+ *listItem = ((long) newtListboxGetCurrent(listbox));</div><div class='add'>+</div><div class='add'>+ for (rc = 0; result != buttons[rc] && rc < numButtons; rc++);</div><div class='add'>+ if (rc == numButtons) </div><div class='add'>+ rc = 0; /* F12 or return-on-exit (which are the same for us) */</div><div class='add'>+ else </div><div class='add'>+ rc++;</div><div class='add'>+</div><div class='add'>+ newtFormDestroy(form);</div><div class='add'>+ newtPopWindow();</div><div class='add'>+</div><div class='add'>+ return rc;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* only supports up to 50 buttons and entries -- shucks! */</div><div class='add'>+int newtWinEntries(char * title, char * text, int suggestedWidth, int flexDown, </div><div class='add'>+ int flexUp, int dataWidth, </div><div class='add'>+ struct newtWinEntry * items, char * button1, ...) {</div><div class='add'>+ newtComponent buttons[50], result, form, textw;</div><div class='add'>+ newtGrid grid, buttonBar, subgrid;</div><div class='add'>+ int numItems;</div><div class='add'>+ int rc, i;</div><div class='add'>+ int numButtons;</div><div class='add'>+ char * buttonName;</div><div class='add'>+ va_list args;</div><div class='add'>+</div><div class='add'>+ textw = newtTextboxReflowed(-1, -1, text, suggestedWidth, flexDown,</div><div class='add'>+ flexUp, 0);</div><div class='add'>+</div><div class='add'>+ for (numItems = 0; items[numItems].text; numItems++); </div><div class='add'>+</div><div class='add'>+ buttonName = button1, numButtons = 0;</div><div class='add'>+ va_start(args, button1);</div><div class='add'>+ while (buttonName) {</div><div class='add'>+ buttons[numButtons] = newtButton(-1, -1, buttonName);</div><div class='add'>+ numButtons++;</div><div class='add'>+ buttonName = va_arg(args, char *);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ va_end(args);</div><div class='add'>+</div><div class='add'>+ buttonBar = newtCreateGrid(numButtons, 1);</div><div class='add'>+ for (i = 0; i < numButtons; i++) {</div><div class='add'>+ newtGridSetField(buttonBar, i, 0, NEWT_GRID_COMPONENT, </div><div class='add'>+ buttons[i],</div><div class='add'>+ i ? 1 : 0, 0, 0, 0, 0, 0);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ subgrid = newtCreateGrid(2, numItems);</div><div class='add'>+ for (i = 0; i < numItems; i++) {</div><div class='add'>+ newtGridSetField(subgrid, 0, i, NEWT_GRID_COMPONENT,</div><div class='add'>+ newtLabel(-1, -1, items[i].text),</div><div class='add'>+ 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);</div><div class='add'>+ newtGridSetField(subgrid, 1, i, NEWT_GRID_COMPONENT,</div><div class='add'>+ newtEntry(-1, -1, items[i].value ? </div><div class='add'>+ *items[i].value : NULL, dataWidth,</div><div class='add'>+ items[i].value, items[i].flags),</div><div class='add'>+ 1, 0, 0, 0, 0, 0);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ grid = newtCreateGrid(1, 3);</div><div class='add'>+ form = newtForm(NULL, 0, 0);</div><div class='add'>+ newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, textw, </div><div class='add'>+ 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);</div><div class='add'>+ newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, subgrid, </div><div class='add'>+ 0, 1, 0, 0, 0, 0);</div><div class='add'>+ newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttonBar, </div><div class='add'>+ 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX);</div><div class='add'>+ newtGridAddComponentsToForm(grid, form, 1);</div><div class='add'>+ newtGridWrappedWindow(grid, title);</div><div class='add'>+ newtGridFree(grid, 1);</div><div class='add'>+</div><div class='add'>+ result = newtRunForm(form);</div><div class='add'>+</div><div class='add'>+ for (rc = 0; rc < numItems; rc++)</div><div class='add'>+ *items[rc].value = strdup(*items[rc].value);</div><div class='add'>+</div><div class='add'>+ for (rc = 0; result != buttons[rc] && rc < numButtons; rc++);</div><div class='add'>+ if (rc == numButtons) </div><div class='add'>+ rc = 0; /* F12 */</div><div class='add'>+ else </div><div class='add'>+ rc++;</div><div class='add'>+</div><div class='add'>+ newtFormDestroy(form);</div><div class='add'>+ newtPopWindow();</div><div class='add'>+</div><div class='add'>+ return rc;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/Makefile b/mdk-stage1/slang/Makefile<br/>new file mode 100644<br/>index 000000000..c78ee4668<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/Makefile?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/Makefile</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+ #******************************************************************************</div><div class='add'>+ #</div><div class='add'>+ # Guillaume Cottenceau (gc@mandrakesoft.com)</div><div class='add'>+ #</div><div class='add'>+ # Copyright 2000 MandrakeSoft</div><div class='add'>+ #</div><div class='add'>+ # This software may be freely redistributed under the terms of the GNU</div><div class='add'>+ # public license.</div><div class='add'>+ #</div><div class='add'>+ # You should have received a copy of the GNU General Public License</div><div class='add'>+ # along with this program; if not, write to the Free Software</div><div class='add'>+ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.</div><div class='add'>+ #</div><div class='add'>+ #*****************************************************************************</div><div class='add'>+</div><div class='add'>+top_dir = ..</div><div class='add'>+</div><div class='add'>+include $(top_dir)/Makefile.common</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+all: libslang.a libslang-DIET.a</div><div class='add'>+</div><div class='add'>+clean:</div><div class='add'>+ rm -f *.o *.a</div><div class='add'>+</div><div class='add'>+FLAGS = -Wall -Werror -Os -fomit-frame-pointer -Dunix -DSLANG -c</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+OBJS = sltermin.o sldisply.o slutty.o slang.o slarray.o slclass.o slcmd.o slerr.o slgetkey.o slkeymap.o slmalloc.o slmath.o slmemchr.o slmemcmp.o slmemcpy.o slmemset.o slmisc.o slparse.o slprepr.o slregexp.o slrline.o slsearch.o slsmg.o slstd.o sltoken.o sltypes.o slxstrng.o slcurses.o slscroll.o slsignal.o slkeypad.o slerrno.o slstring.o slstruct.o slcmplex.o slarrfun.o slimport.o slpath.o slarith.o slassoc.o slcompat.o slposdir.o slstdio.o slproc.o sltime.o slstrops.o slbstr.o slpack.o slintall.o slistruc.o slposio.o slnspace.o slarrmis.o slospath.o slscanf.o</div><div class='add'>+</div><div class='add'>+OBJS-DIET = $(subst .o,-DIET.o,$(OBJS))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+libslang.a: $(OBJS)</div><div class='add'>+ ar -cru $@ $^</div><div class='add'>+ ranlib $@</div><div class='add'>+</div><div class='add'>+libslang-DIET.a: $(OBJS-DIET)</div><div class='add'>+ ar -cru $@ $^</div><div class='add'>+ ranlib $@</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+$(OBJS): %.o: %.c</div><div class='add'>+ gcc $(FLAGS) $(GLIBC_INCLUDES) -c $< -o $@</div><div class='add'>+</div><div class='add'>+$(OBJS-DIET): %-DIET.o: %.c</div><div class='add'>+ gcc $(FLAGS) $(DIETLIBC_INCLUDES) -c $< -o $@</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/_slang.h b/mdk-stage1/slang/_slang.h<br/>new file mode 100644<br/>index 000000000..02ee13505<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/_slang.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/_slang.h</a></div><div class='hunk'>@@ -0,0 +1,743 @@</div><div class='add'>+#ifndef _PRIVATE_SLANG_H_</div><div class='add'>+#define _PRIVATE_SLANG_H_</div><div class='add'>+/* header file for S-Lang internal structures that users do not (should not)</div><div class='add'>+ need. Use slang.h for that purpose. */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* #include "config.h" */</div><div class='add'>+#include "jdmacros.h"</div><div class='add'>+#include "sllimits.h"</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+# define SLANG_SYSTEM_NAME "_VMS"</div><div class='add'>+#else</div><div class='add'>+# if defined (IBMPC_SYSTEM)</div><div class='add'>+# define SLANG_SYSTEM_NAME "_IBMPC"</div><div class='add'>+# else</div><div class='add'>+# define SLANG_SYSTEM_NAME "_UNIX"</div><div class='add'>+# endif</div><div class='add'>+#endif /* VMS */</div><div class='add'>+</div><div class='add'>+/* These quantities are main_types for byte-compiled code. They are used</div><div class='add'>+ * by the inner_interp routine. The _BC_ means byte-code.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_LVARIABLE SLANG_LVARIABLE /* 0x01 */</div><div class='add'>+#define _SLANG_BC_GVARIABLE SLANG_GVARIABLE /* 0x02 */</div><div class='add'>+#define _SLANG_BC_IVARIABLE SLANG_IVARIABLE /* 0x03 */</div><div class='add'>+#define _SLANG_BC_RVARIABLE SLANG_RVARIABLE /* 0x04 */</div><div class='add'>+#define _SLANG_BC_INTRINSIC SLANG_INTRINSIC /* 0x05 */</div><div class='add'>+#define _SLANG_BC_FUNCTION SLANG_FUNCTION /* 0x06 */</div><div class='add'>+#define _SLANG_BC_MATH_UNARY SLANG_MATH_UNARY /* 0x07 */</div><div class='add'>+#define _SLANG_BC_APP_UNARY SLANG_APP_UNARY /* 0x08 */</div><div class='add'>+#define _SLANG_BC_ICONST SLANG_ICONSTANT /* 0x09 */</div><div class='add'>+#define _SLANG_BC_DCONST SLANG_DCONSTANT /* 0x0A */</div><div class='add'>+#define _SLANG_BC_PVARIABLE SLANG_PVARIABLE /* 0x0B */</div><div class='add'>+#define _SLANG_BC_PFUNCTION SLANG_PFUNCTION /* 0x0C */</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_BINARY 0x10</div><div class='add'>+#define _SLANG_BC_LITERAL 0x11 /* constant objects */</div><div class='add'>+#define _SLANG_BC_LITERAL_INT 0x12</div><div class='add'>+#define _SLANG_BC_LITERAL_STR 0x13</div><div class='add'>+#define _SLANG_BC_BLOCK 0x14</div><div class='add'>+</div><div class='add'>+/* These 3 MUST be in this order too ! */</div><div class='add'>+#define _SLANG_BC_RETURN 0x15</div><div class='add'>+#define _SLANG_BC_BREAK 0x16</div><div class='add'>+#define _SLANG_BC_CONTINUE 0x17</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_EXCH 0x18</div><div class='add'>+#define _SLANG_BC_LABEL 0x19</div><div class='add'>+#define _SLANG_BC_LOBJPTR 0x1A</div><div class='add'>+#define _SLANG_BC_GOBJPTR 0x1B</div><div class='add'>+#define _SLANG_BC_X_ERROR 0x1C</div><div class='add'>+/* These must be in this order */</div><div class='add'>+#define _SLANG_BC_X_USER0 0x1D</div><div class='add'>+#define _SLANG_BC_X_USER1 0x1E</div><div class='add'>+#define _SLANG_BC_X_USER2 0x1F</div><div class='add'>+#define _SLANG_BC_X_USER3 0x20</div><div class='add'>+#define _SLANG_BC_X_USER4 0x21</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT 0x24</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_FRAME 0x25</div><div class='add'>+#define _SLANG_BC_UNARY 0x26</div><div class='add'>+#define _SLANG_BC_UNARY_FUNC 0x27</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_DEREF_ASSIGN 0x30</div><div class='add'>+#define _SLANG_BC_SET_LOCAL_LVALUE 0x31</div><div class='add'>+#define _SLANG_BC_SET_GLOBAL_LVALUE 0x32</div><div class='add'>+#define _SLANG_BC_SET_INTRIN_LVALUE 0x33</div><div class='add'>+#define _SLANG_BC_SET_STRUCT_LVALUE 0x34</div><div class='add'>+#define _SLANG_BC_FIELD 0x35</div><div class='add'>+#define _SLANG_BC_SET_ARRAY_LVALUE 0x36</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_LINE_NUM 0x40</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_TMP 0x50</div><div class='add'>+#define _SLANG_BC_LVARIABLE_AGET 0x60</div><div class='add'>+#define _SLANG_BC_LVARIABLE_APUT 0x61</div><div class='add'>+#define _SLANG_BC_INTEGER_PLUS 0x62</div><div class='add'>+#define _SLANG_BC_INTEGER_MINUS 0x63</div><div class='add'>+#define _SLANG_BC_ARG_LVARIABLE 0x64</div><div class='add'>+#define _SLANG_BC_EARG_LVARIABLE 0x65</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_INTRINSIC 0x80</div><div class='add'>+#define _SLANG_BC_INTRINSIC_CALL_DIRECT 0x81</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_LSTR 0x82</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_SLFUN 0x83</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_INTRSTOP 0x84</div><div class='add'>+#define _SLANG_BC_INTRINSIC_STOP 0x85</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_EARG_LVAR 0x86</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_LINT 0x87</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_LVAR 0x88</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* Byte-Code Sub Types (_BCST_) */</div><div class='add'>+</div><div class='add'>+/* These are sub_types of _SLANG_BC_BLOCK */</div><div class='add'>+#define _SLANG_BCST_ERROR_BLOCK 0x01</div><div class='add'>+#define _SLANG_BCST_EXIT_BLOCK 0x02</div><div class='add'>+#define _SLANG_BCST_USER_BLOCK0 0x03</div><div class='add'>+#define _SLANG_BCST_USER_BLOCK1 0x04</div><div class='add'>+#define _SLANG_BCST_USER_BLOCK2 0x05</div><div class='add'>+#define _SLANG_BCST_USER_BLOCK3 0x06</div><div class='add'>+#define _SLANG_BCST_USER_BLOCK4 0x07</div><div class='add'>+/* The user blocks MUST be in the above order */</div><div class='add'>+#define _SLANG_BCST_LOOP 0x10</div><div class='add'>+#define _SLANG_BCST_WHILE 0x11</div><div class='add'>+#define _SLANG_BCST_FOR 0x12</div><div class='add'>+#define _SLANG_BCST_FOREVER 0x13</div><div class='add'>+#define _SLANG_BCST_CFOR 0x14</div><div class='add'>+#define _SLANG_BCST_DOWHILE 0x15</div><div class='add'>+#define _SLANG_BCST_FOREACH 0x16</div><div class='add'>+</div><div class='add'>+#define _SLANG_BCST_IF 0x20</div><div class='add'>+#define _SLANG_BCST_IFNOT 0x21</div><div class='add'>+#define _SLANG_BCST_ELSE 0x22</div><div class='add'>+#define _SLANG_BCST_ANDELSE 0x23</div><div class='add'>+#define _SLANG_BCST_ORELSE 0x24</div><div class='add'>+#define _SLANG_BCST_SWITCH 0x25</div><div class='add'>+#define _SLANG_BCST_NOTELSE 0x26</div><div class='add'>+</div><div class='add'>+/* assignment (_SLANG_BC_SET_*_LVALUE) subtypes. The order MUST correspond</div><div class='add'>+ * to the assignment token order with the ASSIGN_TOKEN as the first!</div><div class='add'>+ */</div><div class='add'>+#define _SLANG_BCST_ASSIGN 0x01</div><div class='add'>+#define _SLANG_BCST_PLUSEQS 0x02</div><div class='add'>+#define _SLANG_BCST_MINUSEQS 0x03</div><div class='add'>+#define _SLANG_BCST_TIMESEQS 0x04</div><div class='add'>+#define _SLANG_BCST_DIVEQS 0x05</div><div class='add'>+#define _SLANG_BCST_BOREQS 0x06</div><div class='add'>+#define _SLANG_BCST_BANDEQS 0x07</div><div class='add'>+#define _SLANG_BCST_PLUSPLUS 0x08</div><div class='add'>+#define _SLANG_BCST_POST_PLUSPLUS 0x09</div><div class='add'>+#define _SLANG_BCST_MINUSMINUS 0x0A</div><div class='add'>+#define _SLANG_BCST_POST_MINUSMINUS 0x0B</div><div class='add'>+</div><div class='add'>+/* These use SLANG_PLUS, SLANG_MINUS, SLANG_PLUSPLUS, etc... */</div><div class='add'>+</div><div class='add'>+typedef union</div><div class='add'>+{</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ double double_val;</div><div class='add'>+ float float_val;</div><div class='add'>+#endif</div><div class='add'>+ long long_val;</div><div class='add'>+ unsigned long ulong_val;</div><div class='add'>+ VOID_STAR ptr_val;</div><div class='add'>+ char *s_val;</div><div class='add'>+ int int_val;</div><div class='add'>+ unsigned int uint_val;</div><div class='add'>+ SLang_MMT_Type *ref;</div><div class='add'>+ SLang_Name_Type *n_val;</div><div class='add'>+ struct _SLang_Struct_Type *struct_val;</div><div class='add'>+ struct _SLang_Array_Type *array_val;</div><div class='add'>+ short short_val;</div><div class='add'>+ unsigned short ushort_val;</div><div class='add'>+ char char_val;</div><div class='add'>+ unsigned char uchar_val;</div><div class='add'>+}</div><div class='add'>+_SL_Object_Union_Type;</div><div class='add'>+</div><div class='add'>+typedef struct _SLang_Object_Type</div><div class='add'>+{</div><div class='add'>+ unsigned char data_type; /* SLANG_INT_TYPE, ... */</div><div class='add'>+ _SL_Object_Union_Type v;</div><div class='add'>+}</div><div class='add'>+SLang_Object_Type;</div><div class='add'>+</div><div class='add'>+struct _SLang_MMT_Type</div><div class='add'>+{</div><div class='add'>+ unsigned char data_type; /* int, string, etc... */</div><div class='add'>+ VOID_STAR user_data; /* address of user structure */</div><div class='add'>+ unsigned int count; /* number of references */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+extern int _SLang_pop_object_of_type (unsigned char, SLang_Object_Type *, int);</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name; /* slstring */</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+}</div><div class='add'>+_SLstruct_Field_Type;</div><div class='add'>+</div><div class='add'>+typedef struct _SLang_Struct_Type</div><div class='add'>+{</div><div class='add'>+ _SLstruct_Field_Type *fields;</div><div class='add'>+ unsigned int nfields; /* number used */</div><div class='add'>+ unsigned int num_refs;</div><div class='add'>+}</div><div class='add'>+_SLang_Struct_Type;</div><div class='add'>+</div><div class='add'>+extern void _SLstruct_delete_struct (_SLang_Struct_Type *);</div><div class='add'>+extern int _SLang_push_struct (_SLang_Struct_Type *);</div><div class='add'>+extern int _SLang_pop_struct (_SLang_Struct_Type **);</div><div class='add'>+extern int _SLstruct_init (void);</div><div class='add'>+/* extern int _SLstruct_get_field (char *); */</div><div class='add'>+extern int _SLstruct_define_struct (void);</div><div class='add'>+extern int _SLstruct_define_typedef (void);</div><div class='add'>+</div><div class='add'>+extern int _SLang_pop_datatype (unsigned char *);</div><div class='add'>+extern int _SLang_push_datatype (unsigned char);</div><div class='add'>+</div><div class='add'>+struct _SLang_Ref_Type</div><div class='add'>+{</div><div class='add'>+ int is_global;</div><div class='add'>+ union</div><div class='add'>+ {</div><div class='add'>+ SLang_Name_Type *nt;</div><div class='add'>+ SLang_Object_Type *local_obj;</div><div class='add'>+ }</div><div class='add'>+ v;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+extern int _SLang_dereference_ref (SLang_Ref_Type *);</div><div class='add'>+extern int _SLang_deref_assign (SLang_Ref_Type *);</div><div class='add'>+extern int _SLang_push_ref (int, VOID_STAR);</div><div class='add'>+</div><div class='add'>+extern int _SL_increment_frame_pointer (void);</div><div class='add'>+extern int _SL_decrement_frame_pointer (void);</div><div class='add'>+</div><div class='add'>+extern int SLang_pop(SLang_Object_Type *);</div><div class='add'>+extern void SLang_free_object (SLang_Object_Type *);</div><div class='add'>+extern int _SLanytype_typecast (unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR);</div><div class='add'>+extern void _SLstring_intrinsic (void);</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* These functions are used to create slstrings of a fixed length. Be</div><div class='add'>+ * very careful how they are used. In particular, if len bytes are allocated,</div><div class='add'>+ * then the string must be len characters long, no more and no less.</div><div class='add'>+ */</div><div class='add'>+extern char *_SLallocate_slstring (unsigned int);</div><div class='add'>+extern char *_SLcreate_via_alloced_slstring (char *, unsigned int);</div><div class='add'>+extern void _SLunallocate_slstring (char *, unsigned int);</div><div class='add'>+extern int _SLpush_alloced_slstring (char *, unsigned int);</div><div class='add'>+ </div><div class='add'>+typedef struct </div><div class='add'>+{</div><div class='add'>+ char **buf;</div><div class='add'>+ unsigned int max_num;</div><div class='add'>+ unsigned int num;</div><div class='add'>+ unsigned int delta_num;</div><div class='add'>+}</div><div class='add'>+_SLString_List_Type;</div><div class='add'>+extern int _SLstring_list_append (_SLString_List_Type *, char *);</div><div class='add'>+extern int _SLstring_list_init (_SLString_List_Type *, unsigned int, unsigned int);</div><div class='add'>+extern void _SLstring_list_delete (_SLString_List_Type *);</div><div class='add'>+extern int _SLstring_list_push (_SLString_List_Type *);</div><div class='add'>+</div><div class='add'>+/* This function assumes that s is an slstring. */</div><div class='add'>+extern char *_SLstring_dup_slstring (char *);</div><div class='add'>+extern int _SLang_dup_and_push_slstring (char *);</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+extern int _SLang_init_import (void);</div><div class='add'>+</div><div class='add'>+/* This function checks to see if the referenced object is initialized */</div><div class='add'>+extern int _SLang_is_ref_initialized (SLang_Ref_Type *);</div><div class='add'>+extern int _SLcheck_identifier_syntax (char *);</div><div class='add'>+extern int _SLang_uninitialize_ref (SLang_Ref_Type *);</div><div class='add'>+</div><div class='add'>+extern int _SLpush_slang_obj (SLang_Object_Type *);</div><div class='add'>+</div><div class='add'>+extern char *_SLexpand_escaped_char(char *, char *);</div><div class='add'>+extern void _SLexpand_escaped_string (char *, char *, char *);</div><div class='add'>+</div><div class='add'>+/* returns a pointer to an SLstring string-- use SLang_free_slstring */</div><div class='add'>+extern char *_SLstringize_object (SLang_Object_Type *);</div><div class='add'>+extern int _SLdump_objects (char *, SLang_Object_Type *, unsigned int, int);</div><div class='add'>+</div><div class='add'>+extern SLang_Object_Type *_SLRun_Stack;</div><div class='add'>+extern SLang_Object_Type *_SLStack_Pointer;</div><div class='add'>+</div><div class='add'>+struct _SLang_NameSpace_Type</div><div class='add'>+{</div><div class='add'>+ struct _SLang_NameSpace_Type *next;</div><div class='add'>+ char *name; /* this is the load_type name */</div><div class='add'>+ char *namespace_name; /* this name is assigned by implements */</div><div class='add'>+ unsigned int table_size;</div><div class='add'>+ SLang_Name_Type **table;</div><div class='add'>+};</div><div class='add'>+extern SLang_NameSpace_Type *_SLns_allocate_namespace (char *, unsigned int);</div><div class='add'>+extern SLang_NameSpace_Type *_SLns_find_namespace (char *);</div><div class='add'>+extern int _SLns_set_namespace_name (SLang_NameSpace_Type *, char *);</div><div class='add'>+extern SLang_Array_Type *_SLnspace_apropos (SLang_NameSpace_Type *, char *, unsigned int);</div><div class='add'>+extern void _SLang_use_namespace_intrinsic (char *name);</div><div class='add'>+extern char *_SLang_cur_namespace_intrinsic (void);</div><div class='add'>+extern SLang_Array_Type *_SLang_apropos (char *, char *, unsigned int);</div><div class='add'>+extern void _SLang_implements_intrinsic (char *);</div><div class='add'>+</div><div class='add'>+extern int _SLang_Trace;</div><div class='add'>+extern int _SLstack_depth(void);</div><div class='add'>+extern char *_SLang_Current_Function_Name;</div><div class='add'>+</div><div class='add'>+extern int _SLang_trace_fun(char *);</div><div class='add'>+extern int _SLang_Compile_Line_Num_Info;</div><div class='add'>+</div><div class='add'>+extern char *_SLstring_dup_hashed_string (char *, unsigned long);</div><div class='add'>+extern unsigned long _SLcompute_string_hash (char *);</div><div class='add'>+extern char *_SLstring_make_hashed_string (char *, unsigned int, unsigned long *);</div><div class='add'>+extern void _SLfree_hashed_string (char *, unsigned int, unsigned long);</div><div class='add'>+unsigned long _SLstring_hash (unsigned char *, unsigned char *);</div><div class='add'>+extern int _SLinit_slcomplex (void);</div><div class='add'>+</div><div class='add'>+extern int _SLang_init_slstrops (void);</div><div class='add'>+extern int _SLstrops_do_sprintf_n (int);</div><div class='add'>+extern int _SLang_sscanf (void);</div><div class='add'>+extern double _SLang_atof (char *);</div><div class='add'>+extern int _SLang_init_bstring (void);</div><div class='add'>+extern int _SLang_init_sltime (void);</div><div class='add'>+extern void _SLpack (void);</div><div class='add'>+extern void _SLunpack (char *, SLang_BString_Type *);</div><div class='add'>+extern void _SLpack_pad_format (char *);</div><div class='add'>+extern unsigned int _SLpack_compute_size (char *);</div><div class='add'>+extern int _SLusleep (unsigned long);</div><div class='add'>+</div><div class='add'>+/* frees upon error. NULL __NOT__ ok. */</div><div class='add'>+extern int _SLang_push_slstring (char *);</div><div class='add'>+</div><div class='add'>+extern unsigned char _SLarith_promote_type (unsigned char);</div><div class='add'>+extern int _SLarith_get_precedence (unsigned char);</div><div class='add'>+extern int _SLarith_typecast (unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR);</div><div class='add'>+</div><div class='add'>+extern int SLang_push(SLang_Object_Type *);</div><div class='add'>+extern int SLadd_global_variable (char *);</div><div class='add'>+extern void _SLang_clear_error (void);</div><div class='add'>+</div><div class='add'>+extern int _SLdo_pop (void);</div><div class='add'>+extern unsigned int _SLsys_getkey (void);</div><div class='add'>+extern int _SLsys_input_pending (int);</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+extern unsigned int _SLpc_convert_scancode (unsigned int, unsigned int, int);</div><div class='add'>+#define _SLTT_KEY_SHIFT 1</div><div class='add'>+#define _SLTT_KEY_CTRL 2</div><div class='add'>+#define _SLTT_KEY_ALT 4</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct _SLterminfo_Type SLterminfo_Type;</div><div class='add'>+extern SLterminfo_Type *_SLtt_tigetent (char *);</div><div class='add'>+extern char *_SLtt_tigetstr (SLterminfo_Type *, char *);</div><div class='add'>+extern int _SLtt_tigetnum (SLterminfo_Type *, char *);</div><div class='add'>+extern int _SLtt_tigetflag (SLterminfo_Type *, char *);</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+extern int _SLtt_get_bce_color_offset (void);</div><div class='add'>+#endif</div><div class='add'>+extern void (*_SLtt_color_changed_hook)(void);</div><div class='add'>+</div><div class='add'>+extern unsigned char SLang_Input_Buffer [SL_MAX_INPUT_BUFFER_LEN];</div><div class='add'>+</div><div class='add'>+extern int _SLregister_types (void);</div><div class='add'>+extern SLang_Class_Type *_SLclass_get_class (unsigned char);</div><div class='add'>+extern VOID_STAR _SLclass_get_ptr_to_value (SLang_Class_Type *, SLang_Object_Type *);</div><div class='add'>+extern void _SLclass_type_mismatch_error (unsigned char, unsigned char);</div><div class='add'>+extern int _SLclass_init (void);</div><div class='add'>+extern int _SLclass_copy_class (unsigned char, unsigned char);</div><div class='add'>+</div><div class='add'>+extern unsigned char _SLclass_Class_Type [256];</div><div class='add'>+</div><div class='add'>+extern int (*_SLclass_get_typecast (unsigned char, unsigned char, int))</div><div class='add'>+(unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR);</div><div class='add'>+</div><div class='add'>+extern int (*_SLclass_get_binary_fun (int, SLang_Class_Type *, SLang_Class_Type *, SLang_Class_Type **, int))</div><div class='add'>+(int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR);</div><div class='add'>+</div><div class='add'>+extern int (*_SLclass_get_unary_fun (int, SLang_Class_Type *, SLang_Class_Type **, int))</div><div class='add'>+(int, unsigned char, VOID_STAR, unsigned int, VOID_STAR);</div><div class='add'>+</div><div class='add'>+extern int _SLarith_register_types (void);</div><div class='add'>+extern unsigned char _SLarith_Arith_Types [];</div><div class='add'>+extern unsigned char _SLarith_Is_Arith_Type [256];</div><div class='add'>+extern int _SLarith_bin_op (SLang_Object_Type *, SLang_Object_Type *, int);</div><div class='add'>+</div><div class='add'>+extern int _SLarray_add_bin_op (unsigned char);</div><div class='add'>+</div><div class='add'>+extern int _SLang_call_funptr (SLang_Name_Type *);</div><div class='add'>+extern void _SLset_double_format (char *);</div><div class='add'>+extern SLang_Name_Type *_SLlocate_global_name (char *);</div><div class='add'>+extern SLang_Name_Type *_SLlocate_name (char *);</div><div class='add'>+</div><div class='add'>+extern char *_SLdefines[];</div><div class='add'>+</div><div class='add'>+#define SL_ERRNO_NOT_IMPLEMENTED 0x7FFF</div><div class='add'>+extern int _SLerrno_errno;</div><div class='add'>+extern int _SLerrno_init (void);</div><div class='add'>+</div><div class='add'>+extern int _SLstdio_fdopen (char *, int, char *);</div><div class='add'>+</div><div class='add'>+extern void _SLstruct_pop_args (int *);</div><div class='add'>+extern void _SLstruct_push_args (SLang_Array_Type *);</div><div class='add'>+</div><div class='add'>+extern int _SLarray_aput (void);</div><div class='add'>+extern int _SLarray_aget (void);</div><div class='add'>+extern int _SLarray_inline_implicit_array (void);</div><div class='add'>+extern int _SLarray_inline_array (void);</div><div class='add'>+extern int _SLarray_wildcard_array (void);</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+_SLarray_typecast (unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR, int);</div><div class='add'>+</div><div class='add'>+extern int _SLarray_aput_transfer_elem (SLang_Array_Type *, int *,</div><div class='add'>+ VOID_STAR, unsigned int, int);</div><div class='add'>+extern int _SLarray_aget_transfer_elem (SLang_Array_Type *, int *,</div><div class='add'>+ VOID_STAR, unsigned int, int);</div><div class='add'>+extern void _SLarray_free_array_elements (SLang_Class_Type *, VOID_STAR, unsigned int);</div><div class='add'>+</div><div class='add'>+extern SLang_Foreach_Context_Type *</div><div class='add'>+_SLarray_cl_foreach_open (unsigned char, unsigned int);</div><div class='add'>+extern void _SLarray_cl_foreach_close (unsigned char, SLang_Foreach_Context_Type *);</div><div class='add'>+extern int _SLarray_cl_foreach (unsigned char, SLang_Foreach_Context_Type *);</div><div class='add'>+</div><div class='add'>+extern int _SLarray_matrix_multiply (void);</div><div class='add'>+extern void (*_SLang_Matrix_Multiply)(void);</div><div class='add'>+</div><div class='add'>+extern int _SLarray_init_slarray (void);</div><div class='add'>+extern SLang_Array_Type *</div><div class='add'>+SLang_create_array1 (unsigned char, int, VOID_STAR, int *, unsigned int, int);</div><div class='add'>+</div><div class='add'>+extern int _SLcompile_push_context (SLang_Load_Type *);</div><div class='add'>+extern int _SLcompile_pop_context (void);</div><div class='add'>+extern int _SLang_Auto_Declare_Globals;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ union</div><div class='add'>+ {</div><div class='add'>+ long long_val;</div><div class='add'>+ char *s_val; /* Used for IDENT_TOKEN, FLOAT, etc... */</div><div class='add'>+ SLang_BString_Type *b_val;</div><div class='add'>+ } v;</div><div class='add'>+ int free_sval_flag;</div><div class='add'>+ unsigned int num_refs;</div><div class='add'>+ unsigned long hash;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ int line_number;</div><div class='add'>+#endif</div><div class='add'>+ unsigned char type;</div><div class='add'>+}</div><div class='add'>+_SLang_Token_Type;</div><div class='add'>+</div><div class='add'>+extern void _SLcompile (_SLang_Token_Type *);</div><div class='add'>+extern void (*_SLcompile_ptr)(_SLang_Token_Type *);</div><div class='add'>+</div><div class='add'>+/* *** TOKENS *** */</div><div class='add'>+</div><div class='add'>+/* Note that that tokens corresponding to ^J, ^M, and ^Z should not be used.</div><div class='add'>+ * This is because a file that contains any of these characters will</div><div class='add'>+ * have an OS dependent interpretation, e.g., ^Z is EOF on MSDOS.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Special tokens */</div><div class='add'>+#define EOF_TOKEN 0x01</div><div class='add'>+#define RPN_TOKEN 0x02</div><div class='add'>+#define NL_TOKEN 0x03</div><div class='add'>+#define NOP_TOKEN 0x05</div><div class='add'>+#define FARG_TOKEN 0x06</div><div class='add'>+#define TMP_TOKEN 0x07</div><div class='add'>+</div><div class='add'>+#define RESERVED1_TOKEN 0x0A /* \n */</div><div class='add'>+#define RESERVED2_TOKEN 0x0D /* \r */</div><div class='add'>+</div><div class='add'>+/* Literal tokens */</div><div class='add'>+#define CHAR_TOKEN 0x10</div><div class='add'>+#define UCHAR_TOKEN 0x11</div><div class='add'>+#define SHORT_TOKEN 0x12</div><div class='add'>+#define USHORT_TOKEN 0x13</div><div class='add'>+#define INT_TOKEN 0x14</div><div class='add'>+#define UINT_TOKEN 0x15</div><div class='add'>+#define LONG_TOKEN 0x16</div><div class='add'>+#define ULONG_TOKEN 0x17</div><div class='add'>+#define IS_INTEGER_TOKEN(x) ((x >= CHAR_TOKEN) && (x <= ULONG_TOKEN))</div><div class='add'>+#define FLOAT_TOKEN 0x18</div><div class='add'>+#define DOUBLE_TOKEN 0x19</div><div class='add'>+#define RESERVED3_TOKEN 0x1A /* ^Z */</div><div class='add'>+#define COMPLEX_TOKEN 0x1B</div><div class='add'>+#define STRING_TOKEN 0x1C</div><div class='add'>+#define BSTRING_TOKEN 0x1D</div><div class='add'>+#define _BSTRING_TOKEN 0x1E /* byte-compiled BSTRING */</div><div class='add'>+#define ESC_STRING_TOKEN 0x1F</div><div class='add'>+</div><div class='add'>+/* Tokens that can be LVALUES */</div><div class='add'>+#define IDENT_TOKEN 0x20</div><div class='add'>+#define ARRAY_TOKEN 0x21</div><div class='add'>+#define DOT_TOKEN 0x22</div><div class='add'>+#define IS_LVALUE_TOKEN (((t) <= DOT_TOKEN) && ((t) >= IDENT_TOKEN))</div><div class='add'>+</div><div class='add'>+/* do not use these values */</div><div class='add'>+#define RESERVED4_TOKEN 0x23 /* # */</div><div class='add'>+#define RESERVED5_TOKEN 0x25 /* % */</div><div class='add'>+</div><div class='add'>+/* Flags for struct fields */</div><div class='add'>+#define STATIC_TOKEN 0x26</div><div class='add'>+#define READONLY_TOKEN 0x27</div><div class='add'>+#define PRIVATE_TOKEN 0x28</div><div class='add'>+#define PUBLIC_TOKEN 0x29</div><div class='add'>+</div><div class='add'>+/* Punctuation tokens */</div><div class='add'>+#define OBRACKET_TOKEN 0x2a</div><div class='add'>+#define CBRACKET_TOKEN 0x2b</div><div class='add'>+#define OPAREN_TOKEN 0x2c</div><div class='add'>+#define CPAREN_TOKEN 0x2d</div><div class='add'>+#define OBRACE_TOKEN 0x2e</div><div class='add'>+#define CBRACE_TOKEN 0x2f</div><div class='add'>+</div><div class='add'>+#define COMMA_TOKEN 0x31</div><div class='add'>+#define SEMICOLON_TOKEN 0x32</div><div class='add'>+#define COLON_TOKEN 0x33</div><div class='add'>+#define NAMESPACE_TOKEN 0x34</div><div class='add'>+</div><div class='add'>+/* Operators */</div><div class='add'>+#define POW_TOKEN 0x38</div><div class='add'>+</div><div class='add'>+/* The order here must match the order in the Binop_Level table in slparse.c */</div><div class='add'>+#define FIRST_BINARY_OP 0x39</div><div class='add'>+#define ADD_TOKEN 0x39</div><div class='add'>+#define SUB_TOKEN 0x3a</div><div class='add'>+#define TIMES_TOKEN 0x3b</div><div class='add'>+#define DIV_TOKEN 0x3c</div><div class='add'>+#define LT_TOKEN 0x3d</div><div class='add'>+#define LE_TOKEN 0x3e</div><div class='add'>+#define GT_TOKEN 0x3f</div><div class='add'>+#define GE_TOKEN 0x40</div><div class='add'>+#define EQ_TOKEN 0x41</div><div class='add'>+#define NE_TOKEN 0x42</div><div class='add'>+#define AND_TOKEN 0x43</div><div class='add'>+#define OR_TOKEN 0x44</div><div class='add'>+#define MOD_TOKEN 0x45</div><div class='add'>+#define BAND_TOKEN 0x46</div><div class='add'>+#define SHL_TOKEN 0x47</div><div class='add'>+#define SHR_TOKEN 0x48</div><div class='add'>+#define BXOR_TOKEN 0x49</div><div class='add'>+#define BOR_TOKEN 0x4a</div><div class='add'>+#define POUND_TOKEN 0x4b /* matrix multiplication */</div><div class='add'>+</div><div class='add'>+#define LAST_BINARY_OP 0x4b</div><div class='add'>+#define IS_BINARY_OP(t) ((t >= FIRST_BINARY_OP) && (t <= LAST_BINARY_OP))</div><div class='add'>+</div><div class='add'>+/* unary tokens -- but not all of them (see grammar) */</div><div class='add'>+#define DEREF_TOKEN 0x4d</div><div class='add'>+#define NOT_TOKEN 0x4e</div><div class='add'>+#define BNOT_TOKEN 0x4f</div><div class='add'>+</div><div class='add'>+#define IS_INTERNAL_FUNC(t) ((t >= 0x50) && (t <= 0x56))</div><div class='add'>+#define POP_TOKEN 0x50</div><div class='add'>+#define CHS_TOKEN 0x51</div><div class='add'>+#define SIGN_TOKEN 0x52</div><div class='add'>+#define ABS_TOKEN 0x53</div><div class='add'>+#define SQR_TOKEN 0x54</div><div class='add'>+#define MUL2_TOKEN 0x55</div><div class='add'>+#define EXCH_TOKEN 0x56</div><div class='add'>+</div><div class='add'>+/* Assignment tokens. Note: these must appear with sequential values.</div><div class='add'>+ * The order here must match the specific lvalue assignments below.</div><div class='add'>+ * These tokens are used by rpn routines in slang.c. slparse.c maps them</div><div class='add'>+ * onto the specific lvalue tokens while parsing infix.</div><div class='add'>+ * Also the assignment _SLANG_BCST_ assumes this order</div><div class='add'>+ */</div><div class='add'>+#define ASSIGN_TOKEN 0x57</div><div class='add'>+#define PLUSEQS_TOKEN 0x58</div><div class='add'>+#define MINUSEQS_TOKEN 0x59</div><div class='add'>+#define TIMESEQS_TOKEN 0x5A</div><div class='add'>+#define DIVEQS_TOKEN 0x5B</div><div class='add'>+#define BOREQS_TOKEN 0x5C</div><div class='add'>+#define BANDEQS_TOKEN 0x5D</div><div class='add'>+#define PLUSPLUS_TOKEN 0x5E</div><div class='add'>+#define POST_PLUSPLUS_TOKEN 0x5F</div><div class='add'>+#define MINUSMINUS_TOKEN 0x60</div><div class='add'>+#define POST_MINUSMINUS_TOKEN 0x61</div><div class='add'>+</div><div class='add'>+/* Directives */</div><div class='add'>+#define FIRST_DIRECTIVE_TOKEN 0x62</div><div class='add'>+#define IFNOT_TOKEN 0x62</div><div class='add'>+#define IF_TOKEN 0x63</div><div class='add'>+#define ELSE_TOKEN 0x64</div><div class='add'>+#define FOREVER_TOKEN 0x65</div><div class='add'>+#define WHILE_TOKEN 0x66</div><div class='add'>+#define FOR_TOKEN 0x67</div><div class='add'>+#define _FOR_TOKEN 0x68</div><div class='add'>+#define LOOP_TOKEN 0x69</div><div class='add'>+#define SWITCH_TOKEN 0x6A</div><div class='add'>+#define DOWHILE_TOKEN 0x6B</div><div class='add'>+#define ANDELSE_TOKEN 0x6C</div><div class='add'>+#define ORELSE_TOKEN 0x6D</div><div class='add'>+#define ERRBLK_TOKEN 0x6E</div><div class='add'>+#define EXITBLK_TOKEN 0x6F</div><div class='add'>+/* These must be sequential */</div><div class='add'>+#define USRBLK0_TOKEN 0x70</div><div class='add'>+#define USRBLK1_TOKEN 0x71</div><div class='add'>+#define USRBLK2_TOKEN 0x72</div><div class='add'>+#define USRBLK3_TOKEN 0x73</div><div class='add'>+#define USRBLK4_TOKEN 0x74</div><div class='add'>+</div><div class='add'>+#define CONT_TOKEN 0x75</div><div class='add'>+#define BREAK_TOKEN 0x76</div><div class='add'>+#define RETURN_TOKEN 0x77</div><div class='add'>+</div><div class='add'>+#define CASE_TOKEN 0x78</div><div class='add'>+#define DEFINE_TOKEN 0x79</div><div class='add'>+#define DO_TOKEN 0x7a</div><div class='add'>+#define VARIABLE_TOKEN 0x7b</div><div class='add'>+#define GVARIABLE_TOKEN 0x7c</div><div class='add'>+#define _REF_TOKEN 0x7d</div><div class='add'>+#define PUSH_TOKEN 0x7e</div><div class='add'>+#define STRUCT_TOKEN 0x7f</div><div class='add'>+#define TYPEDEF_TOKEN 0x80</div><div class='add'>+#define NOTELSE_TOKEN 0x81</div><div class='add'>+#define DEFINE_STATIC_TOKEN 0x82</div><div class='add'>+#define FOREACH_TOKEN 0x83</div><div class='add'>+#define USING_TOKEN 0x84</div><div class='add'>+#define DEFINE_PRIVATE_TOKEN 0x85</div><div class='add'>+#define DEFINE_PUBLIC_TOKEN 0x86</div><div class='add'>+</div><div class='add'>+/* Note: the order here must match the order of the generic assignment tokens.</div><div class='add'>+ * Also, the first token of each group must be the ?_ASSIGN_TOKEN.</div><div class='add'>+ * slparse.c exploits this order, as well as slang.h.</div><div class='add'>+ */</div><div class='add'>+#define FIRST_ASSIGN_TOKEN 0x90</div><div class='add'>+#define _STRUCT_ASSIGN_TOKEN 0x90</div><div class='add'>+#define _STRUCT_PLUSEQS_TOKEN 0x91</div><div class='add'>+#define _STRUCT_MINUSEQS_TOKEN 0x92</div><div class='add'>+#define _STRUCT_TIMESEQS_TOKEN 0x93</div><div class='add'>+#define _STRUCT_DIVEQS_TOKEN 0x94</div><div class='add'>+#define _STRUCT_BOREQS_TOKEN 0x95</div><div class='add'>+#define _STRUCT_BANDEQS_TOKEN 0x96</div><div class='add'>+#define _STRUCT_PLUSPLUS_TOKEN 0x97</div><div class='add'>+#define _STRUCT_POST_PLUSPLUS_TOKEN 0x98</div><div class='add'>+#define _STRUCT_MINUSMINUS_TOKEN 0x99</div><div class='add'>+#define _STRUCT_POST_MINUSMINUS_TOKEN 0x9A</div><div class='add'>+</div><div class='add'>+#define _ARRAY_ASSIGN_TOKEN 0xA0</div><div class='add'>+#define _ARRAY_PLUSEQS_TOKEN 0xA1</div><div class='add'>+#define _ARRAY_MINUSEQS_TOKEN 0xA2</div><div class='add'>+#define _ARRAY_TIMESEQS_TOKEN 0xA3</div><div class='add'>+#define _ARRAY_DIVEQS_TOKEN 0xA4</div><div class='add'>+#define _ARRAY_BOREQS_TOKEN 0xA5</div><div class='add'>+#define _ARRAY_BANDEQS_TOKEN 0xA6</div><div class='add'>+#define _ARRAY_PLUSPLUS_TOKEN 0xA7</div><div class='add'>+#define _ARRAY_POST_PLUSPLUS_TOKEN 0xA8</div><div class='add'>+#define _ARRAY_MINUSMINUS_TOKEN 0xA9</div><div class='add'>+#define _ARRAY_POST_MINUSMINUS_TOKEN 0xAA</div><div class='add'>+</div><div class='add'>+#define _SCALAR_ASSIGN_TOKEN 0xB0</div><div class='add'>+#define _SCALAR_PLUSEQS_TOKEN 0xB1</div><div class='add'>+#define _SCALAR_MINUSEQS_TOKEN 0xB2</div><div class='add'>+#define _SCALAR_TIMESEQS_TOKEN 0xB3</div><div class='add'>+#define _SCALAR_DIVEQS_TOKEN 0xB4</div><div class='add'>+#define _SCALAR_BOREQS_TOKEN 0xB5</div><div class='add'>+#define _SCALAR_BANDEQS_TOKEN 0xB6</div><div class='add'>+#define _SCALAR_PLUSPLUS_TOKEN 0xB7</div><div class='add'>+#define _SCALAR_POST_PLUSPLUS_TOKEN 0xB8</div><div class='add'>+#define _SCALAR_MINUSMINUS_TOKEN 0xB9</div><div class='add'>+#define _SCALAR_POST_MINUSMINUS_TOKEN 0xBA</div><div class='add'>+</div><div class='add'>+#define _DEREF_ASSIGN_TOKEN 0xC0</div><div class='add'>+#define _DEREF_PLUSEQS_TOKEN 0xC1</div><div class='add'>+#define _DEREF_MINUSEQS_TOKEN 0xC2</div><div class='add'>+#define _DEREF_TIMESEQS_TOKEN 0xC3</div><div class='add'>+#define _DEREF_DIVEQS_TOKEN 0xC4</div><div class='add'>+#define _DEREF_BOREQS_TOKEN 0xC5</div><div class='add'>+#define _DEREF_BANDEQS_TOKEN 0xC6</div><div class='add'>+#define _DEREF_PLUSPLUS_TOKEN 0xC7</div><div class='add'>+#define _DEREF_POST_PLUSPLUS_TOKEN 0xC8</div><div class='add'>+#define _DEREF_MINUSMINUS_TOKEN 0xC9</div><div class='add'>+#define _DEREF_POST_MINUSMINUS_TOKEN 0xCA</div><div class='add'>+</div><div class='add'>+#define LAST_ASSIGN_TOKEN 0xCA</div><div class='add'>+#define IS_ASSIGN_TOKEN(t) (((t)>=FIRST_ASSIGN_TOKEN)&&((t)<=LAST_ASSIGN_TOKEN))</div><div class='add'>+</div><div class='add'>+#define _INLINE_ARRAY_TOKEN 0xE0</div><div class='add'>+#define _INLINE_IMPLICIT_ARRAY_TOKEN 0xE1</div><div class='add'>+#define _NULL_TOKEN 0xE2</div><div class='add'>+#define _INLINE_WILDCARD_ARRAY_TOKEN 0xE3</div><div class='add'>+</div><div class='add'>+#define LINE_NUM_TOKEN 0xFC</div><div class='add'>+#define ARG_TOKEN 0xFD</div><div class='add'>+#define EARG_TOKEN 0xFE</div><div class='add'>+#define NO_OP_LITERAL 0xFF</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ /* sltoken.c */</div><div class='add'>+ /* SLang_eval_object */</div><div class='add'>+ SLang_Load_Type *llt;</div><div class='add'>+ SLPreprocess_Type *this_slpp;</div><div class='add'>+ /* prep_get_char() */</div><div class='add'>+ char *input_line;</div><div class='add'>+ char cchar;</div><div class='add'>+ /* get_token() */</div><div class='add'>+ int want_nl_token;</div><div class='add'>+</div><div class='add'>+ /* slparse.c */</div><div class='add'>+ _SLang_Token_Type ctok;</div><div class='add'>+ int block_depth;</div><div class='add'>+ int assignment_expression;</div><div class='add'>+</div><div class='add'>+ /* slang.c : SLcompile() */</div><div class='add'>+ _SLang_Token_Type save_token;</div><div class='add'>+ _SLang_Token_Type next_token;</div><div class='add'>+ void (*slcompile_ptr)(_SLang_Token_Type *);</div><div class='add'>+}</div><div class='add'>+_SLEval_Context;</div><div class='add'>+</div><div class='add'>+extern int _SLget_token (_SLang_Token_Type *);</div><div class='add'>+extern void _SLparse_error (char *, _SLang_Token_Type *, int);</div><div class='add'>+extern void _SLparse_start (SLang_Load_Type *);</div><div class='add'>+extern int _SLget_rpn_token (_SLang_Token_Type *);</div><div class='add'>+extern void _SLcompile_byte_compiled (void);</div><div class='add'>+</div><div class='add'>+extern int (*_SLprep_eval_hook) (char *);</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_VSNPRINTF</div><div class='add'>+#define _SLvsnprintf vsnprintf</div><div class='add'>+#else</div><div class='add'>+extern int _SLvsnprintf (char *, unsigned int, char *, va_list);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SNPRINTF</div><div class='add'>+# define _SLsnprintf snprintf</div><div class='add'>+#else</div><div class='add'>+extern int _SLsnprintf (char *, unsigned int, char *, ...);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#undef _INLINE_</div><div class='add'>+#if defined(__GNUC__) && _SLANG_USE_INLINE_CODE</div><div class='add'>+# define _INLINE_ __inline__</div><div class='add'>+#else</div><div class='add'>+# define _INLINE_</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#endif /* _PRIVATE_SLANG_H_ */</div><div class='head'>diff --git a/mdk-stage1/slang/config.h b/mdk-stage1/slang/config.h<br/>new file mode 100644<br/>index 000000000..a5ab3273c<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/config.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/config.h</a></div><div class='hunk'>@@ -0,0 +1,163 @@</div><div class='add'>+/* src/sysconf.h. Generated automatically by configure. */</div><div class='add'>+/* -*- c -*- */</div><div class='add'>+/* Note: this is for unix only. */</div><div class='add'>+</div><div class='add'>+#ifndef SL_CONFIG_H</div><div class='add'>+#define SL_CONFIG_H</div><div class='add'>+</div><div class='add'>+/* define if you have stdlib.h */</div><div class='add'>+#define HAVE_STDLIB_H 1</div><div class='add'>+</div><div class='add'>+/* define if you have unistd.h */</div><div class='add'>+#define HAVE_UNISTD_H 1</div><div class='add'>+</div><div class='add'>+/* define if you have termios.h */</div><div class='add'>+#define HAVE_TERMIOS_H 1</div><div class='add'>+</div><div class='add'>+/* define if you have memory.h */</div><div class='add'>+#define HAVE_MEMORY_H 1</div><div class='add'>+</div><div class='add'>+/* define if you have malloc.h */</div><div class='add'>+#define HAVE_MALLOC_H 1</div><div class='add'>+</div><div class='add'>+/* define if you have memset */</div><div class='add'>+#define HAVE_MEMSET 1</div><div class='add'>+</div><div class='add'>+/* define if you have memcpy */</div><div class='add'>+#define HAVE_MEMCPY 1</div><div class='add'>+</div><div class='add'>+//#define HAVE_SETLOCALE 1</div><div class='add'>+//#define HAVE_LOCALE_H 1</div><div class='add'>+</div><div class='add'>+#define HAVE_VFSCANF 1</div><div class='add'>+</div><div class='add'>+/* define if you have fcntl.h */</div><div class='add'>+#define HAVE_FCNTL_H 1</div><div class='add'>+</div><div class='add'>+/* Define if you have the vsnprintf, snprintf functions and they return</div><div class='add'>+ * EOF upon failure.</div><div class='add'>+ */</div><div class='add'>+#define HAVE_VSNPRINTF 1</div><div class='add'>+#define HAVE_SNPRINTF 1</div><div class='add'>+</div><div class='add'>+/* define if you have sys/fcntl.h */</div><div class='add'>+#define HAVE_SYS_FCNTL_H 1</div><div class='add'>+</div><div class='add'>+#define HAVE_SYS_TYPES_H 1</div><div class='add'>+#define HAVE_SYS_WAIT_H 1</div><div class='add'>+#define HAVE_SYS_TIMES_H 1</div><div class='add'>+</div><div class='add'>+/* Set these to the appropriate values */</div><div class='add'>+#define SIZEOF_SHORT 2</div><div class='add'>+#define SIZEOF_INT 4</div><div class='add'>+#define SIZEOF_LONG 4</div><div class='add'>+#define SIZEOF_FLOAT 4</div><div class='add'>+#define SIZEOF_DOUBLE 8</div><div class='add'>+</div><div class='add'>+/* define if you have these. */</div><div class='add'>+#define HAVE_ATEXIT 1</div><div class='add'>+#define HAVE_ON_EXIT 1</div><div class='add'>+#define HAVE_PUTENV 1</div><div class='add'>+#define HAVE_GETCWD 1</div><div class='add'>+#define HAVE_TCGETATTR 1</div><div class='add'>+#define HAVE_TCSETATTR 1</div><div class='add'>+#define HAVE_CFGETOSPEED 1</div><div class='add'>+#define HAVE_LSTAT 1</div><div class='add'>+#define HAVE_KILL 1</div><div class='add'>+#define HAVE_CHOWN 1</div><div class='add'>+#define HAVE_VSNPRINTF 1</div><div class='add'>+#define HAVE_POPEN 1</div><div class='add'>+#define HAVE_UMASK 1</div><div class='add'>+#define HAVE_READLINK 1</div><div class='add'>+#define HAVE_TIMES 1</div><div class='add'>+#define HAVE_GMTIME 1</div><div class='add'>+#define HAVE_MKFIFO 1</div><div class='add'>+</div><div class='add'>+#define HAVE_GETPPID 1</div><div class='add'>+#define HAVE_GETGID 1</div><div class='add'>+#define HAVE_GETEGID 1</div><div class='add'>+#define HAVE_GETEUID 1</div><div class='add'>+/* #undef HAVE_GETUID */</div><div class='add'>+</div><div class='add'>+#define HAVE_SETGID 1 </div><div class='add'>+#define HAVE_SETPGID 1</div><div class='add'>+#define HAVE_SETUID 1</div><div class='add'>+</div><div class='add'>+#define HAVE_ACOSH 1</div><div class='add'>+#define HAVE_ASINH 1</div><div class='add'>+#define HAVE_ATANH 1</div><div class='add'>+</div><div class='add'>+#define HAVE_DIRENT_H 1</div><div class='add'>+/* #undef HAVE_SYS_NDIR_H */</div><div class='add'>+/* #undef HAVE_SYS_DIR_H */</div><div class='add'>+/* #undef HAVE_NDIR_H */</div><div class='add'>+</div><div class='add'>+#define HAVE_DLFCN_H 1</div><div class='add'>+</div><div class='add'>+#define HAVE_SYS_UTSNAME_H 1</div><div class='add'>+#define HAVE_UNAME 1</div><div class='add'>+</div><div class='add'>+/* These two are needed on DOS-like systems. Unix does not require them.</div><div class='add'>+ * They are included here for consistency.</div><div class='add'>+ *</div><div class='add'>+#define HAVE_IO_H</div><div class='add'>+#define HAVE_PROCESS_H</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* #undef USE_TERMCAP */</div><div class='add'>+</div><div class='add'>+/* #undef mode_t */</div><div class='add'>+/* #undef uid_t */</div><div class='add'>+/* #undef pid_t */</div><div class='add'>+/* #undef gid_t */</div><div class='add'>+</div><div class='add'>+/* Do we have posix signals? */</div><div class='add'>+#define HAVE_SIGACTION 1</div><div class='add'>+#define HAVE_SIGPROCMASK 1</div><div class='add'>+#define HAVE_SIGEMPTYSET 1</div><div class='add'>+#define HAVE_SIGADDSET 1</div><div class='add'>+</div><div class='add'>+#if defined(HAVE_SIGADDSET) && defined(HAVE_SIGEMPTYSET)</div><div class='add'>+# if defined(HAVE_SIGACTION) && defined(HAVE_SIGPROCMASK)</div><div class='add'>+# define SLANG_POSIX_SIGNALS</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Define if you need to in order for stat and other things to work. */</div><div class='add'>+/* #undef _POSIX_SOURCE */</div><div class='add'>+</div><div class='add'>+#ifdef _AIX</div><div class='add'>+# ifndef _POSIX_SOURCE</div><div class='add'>+# define _POSIX_SOURCE 1</div><div class='add'>+# endif</div><div class='add'>+# ifndef _ALL_SOURCE</div><div class='add'>+# define _ALL_SOURCE</div><div class='add'>+# endif</div><div class='add'>+/* This may generate warnings but the fact is that without it, xlc will </div><div class='add'>+ * INCORRECTLY inline many str* functions. */</div><div class='add'>+/* # undef __STR__ */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* define USE_TERMCAP if you want to use it instead of terminfo. */</div><div class='add'>+#if defined(sequent) || defined(NeXT)</div><div class='add'>+# ifndef USE_TERMCAP</div><div class='add'>+# define USE_TERMCAP</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(ultrix) && !defined(__GNUC__)</div><div class='add'>+# ifndef NO_PROTOTYPES</div><div class='add'>+# define NO_PROTOTYPES</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef unix</div><div class='add'>+# define unix 1</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef __unix__</div><div class='add'>+# define __unix__ 1</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define _SLANG_SOURCE_ 1</div><div class='add'>+#endif /* SL_CONFIG_H */</div><div class='head'>diff --git a/mdk-stage1/slang/jdmacros.h b/mdk-stage1/slang/jdmacros.h<br/>new file mode 100644<br/>index 000000000..70d491b78<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/jdmacros.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/jdmacros.h</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+#ifndef _JD_MACROS_H_</div><div class='add'>+#define _JD_MACROS_H_</div><div class='add'>+</div><div class='add'>+#ifndef SLMEMSET</div><div class='add'>+# ifdef HAVE_MEMSET</div><div class='add'>+# define SLMEMSET memset</div><div class='add'>+# else</div><div class='add'>+# define SLMEMSET SLmemset</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef SLMEMCHR</div><div class='add'>+# ifdef HAVE_MEMCHR</div><div class='add'>+# define SLMEMCHR memchr</div><div class='add'>+# else</div><div class='add'>+# define SLMEMCHR SLmemchr</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef SLMEMCPY</div><div class='add'>+# ifdef HAVE_MEMCPY</div><div class='add'>+# define SLMEMCPY memcpy</div><div class='add'>+# else</div><div class='add'>+# define SLMEMCPY SLmemcpy</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Note: HAVE_MEMCMP requires an unsigned memory comparison!!! */</div><div class='add'>+#ifndef SLMEMCMP</div><div class='add'>+# ifdef HAVE_MEMCMP</div><div class='add'>+# define SLMEMCMP memcmp</div><div class='add'>+# else</div><div class='add'>+# define SLMEMCMP SLmemcmp</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef SLFREE</div><div class='add'>+# define SLFREE free</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef SLMALLOC</div><div class='add'>+# define SLMALLOC malloc</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef SLCALLOC</div><div class='add'>+# define SLCALLOC calloc</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef SLREALLOC</div><div class='add'>+# define SLREALLOC realloc</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* _JD_MACROS_H_ */</div><div class='head'>diff --git a/mdk-stage1/slang/keywhash.c b/mdk-stage1/slang/keywhash.c<br/>new file mode 100644<br/>index 000000000..17d94d5a3<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/keywhash.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/keywhash.c</a></div><div class='hunk'>@@ -0,0 +1,190 @@</div><div class='add'>+/* Perfect hash generated by command line:</div><div class='add'>+ * ./a.out 1</div><div class='add'>+ */</div><div class='add'>+#define MIN_HASH_VALUE 2</div><div class='add'>+#define MAX_HASH_VALUE 118</div><div class='add'>+#define MIN_KEYWORD_LEN 2</div><div class='add'>+#define MAX_KEYWORD_LEN 11</div><div class='add'>+</div><div class='add'>+static unsigned char Keyword_Hash_Table [256] =</div><div class='add'>+{</div><div class='add'>+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+ 119, 1, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+ 9, 7, 1, 8, 2, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+ 119, 119, 0, 0, 119, 0, 119, 119, 119, 7, 119, 0, 0, 119, 119, 0, </div><div class='add'>+ 119, 119, 0, 0, 0, 0, 119, 119, 0, 119, 119, 119, 119, 119, 119, 2, </div><div class='add'>+ 119, 41, 1, 1, 9, 0, 55, 8, 0, 0, 119, 0, 27, 0, 0, 0, </div><div class='add'>+ 7, 2, 0, 21, 0, 0, 0, 3, 2, 0, 119, 119, 119, 119, 119, 119, </div><div class='add'>+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static unsigned char keyword_hash (char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ unsigned int sum;</div><div class='add'>+</div><div class='add'>+ sum = len;</div><div class='add'>+ while (len)</div><div class='add'>+ {</div><div class='add'>+ len--;</div><div class='add'>+ sum += (unsigned int) Keyword_Hash_Table [(unsigned char)s[len]];</div><div class='add'>+ }</div><div class='add'>+ return sum;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ unsigned int type;</div><div class='add'>+}</div><div class='add'>+Keyword_Table_Type;</div><div class='add'>+</div><div class='add'>+static Keyword_Table_Type Keyword_Table [/* 117 */] =</div><div class='add'>+{</div><div class='add'>+ {"or", OR_TOKEN},</div><div class='add'>+ {"not", NOT_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"xor", BXOR_TOKEN},</div><div class='add'>+ {"return", RETURN_TOKEN},</div><div class='add'>+ {"exch", EXCH_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"continue", CONT_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"do", DO_TOKEN},</div><div class='add'>+ {"mod", MOD_TOKEN},</div><div class='add'>+ {"ERROR_BLOCK", ERRBLK_TOKEN},</div><div class='add'>+ {"USER_BLOCK2", USRBLK2_TOKEN},</div><div class='add'>+ {"USER_BLOCK4", USRBLK4_TOKEN},</div><div class='add'>+ {"__tmp", TMP_TOKEN},</div><div class='add'>+ {"pop", POP_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"EXIT_BLOCK", EXITBLK_TOKEN},</div><div class='add'>+ {"USER_BLOCK1", USRBLK1_TOKEN},</div><div class='add'>+ {"USER_BLOCK3", USRBLK3_TOKEN},</div><div class='add'>+ {"USER_BLOCK0", USRBLK0_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"shr", SHR_TOKEN},</div><div class='add'>+ {"chs", CHS_TOKEN},</div><div class='add'>+ {"sqr", SQR_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"struct", STRUCT_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"switch", SWITCH_TOKEN},</div><div class='add'>+ {"mul2", MUL2_TOKEN},</div><div class='add'>+ {"sign", SIGN_TOKEN},</div><div class='add'>+ {"using", USING_TOKEN},</div><div class='add'>+ {"while", WHILE_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"loop", LOOP_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"public", PUBLIC_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"break", BREAK_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"do_while", DOWHILE_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"shl", SHL_TOKEN},</div><div class='add'>+ {"else", ELSE_TOKEN},</div><div class='add'>+ {"and", AND_TOKEN},</div><div class='add'>+ {"orelse", ORELSE_TOKEN},</div><div class='add'>+ {"private", PRIVATE_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"if", IF_TOKEN},</div><div class='add'>+ {"for", FOR_TOKEN},</div><div class='add'>+ {"!if", IFNOT_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"_for", _FOR_TOKEN},</div><div class='add'>+ {"forever", FOREVER_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"abs", ABS_TOKEN},</div><div class='add'>+ {"case", CASE_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"static", STATIC_TOKEN},</div><div class='add'>+ {"define", DEFINE_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"typedef", TYPEDEF_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"foreach", FOREACH_TOKEN},</div><div class='add'>+ {"andelse", ANDELSE_TOKEN},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {NULL,0},</div><div class='add'>+ {"variable", VARIABLE_TOKEN},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static Keyword_Table_Type *is_keyword (char *str, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ unsigned int hash;</div><div class='add'>+ char *name;</div><div class='add'>+ Keyword_Table_Type *kw;</div><div class='add'>+</div><div class='add'>+ if ((len < MIN_KEYWORD_LEN)</div><div class='add'>+ || (len > MAX_KEYWORD_LEN))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ hash = keyword_hash (str, len);</div><div class='add'>+ if ((hash > MAX_HASH_VALUE) || (hash < MIN_HASH_VALUE))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ kw = &Keyword_Table[hash - MIN_HASH_VALUE];</div><div class='add'>+ if ((NULL != (name = kw->name))</div><div class='add'>+ && (*str == *name)</div><div class='add'>+ && (0 == strcmp (str, name)))</div><div class='add'>+ return kw;</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/sl-feat.h b/mdk-stage1/slang/sl-feat.h<br/>new file mode 100644<br/>index 000000000..511d72451<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sl-feat.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sl-feat.h</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+/* Setting this to 1 enables automatic support for associative arrays.</div><div class='add'>+ * If this is set to 0, an application must explicitly enable associative</div><div class='add'>+ * array support via SLang_init_slassoc.</div><div class='add'>+ */</div><div class='add'>+#define SLANG_HAS_ASSOC_ARRAYS 1</div><div class='add'>+</div><div class='add'>+#define SLANG_HAS_COMPLEX 1</div><div class='add'>+#define SLANG_HAS_FLOAT 1</div><div class='add'>+</div><div class='add'>+/* This is the old space-speed trade off. To reduce memory usage and code</div><div class='add'>+ * size, set this to zero.</div><div class='add'>+ */</div><div class='add'>+#define _SLANG_OPTIMIZE_FOR_SPEED 2</div><div class='add'>+</div><div class='add'>+#define _SLANG_USE_INLINE_CODE 1</div><div class='add'>+</div><div class='add'>+/* This is experimental. It adds extra information for tracking down</div><div class='add'>+ * errors.</div><div class='add'>+ */</div><div class='add'>+#define _SLANG_HAS_DEBUG_CODE 1</div><div class='add'>+</div><div class='add'>+/* Allow optimizations based upon the __tmp operator. */</div><div class='add'>+#define _SLANG_USE_TMP_OPTIMIZATION 1</div><div class='add'>+</div><div class='add'>+/* Setting this to one will map 8 bit vtxxx terminals to 7 bit. Terminals</div><div class='add'>+ * such as the vt320 can be set up to output the two-character escape sequence</div><div class='add'>+ * encoded as 'ESC [' as single character. Setting this variable to 1 will</div><div class='add'>+ * insert code to map such characters to the 7 bit equivalent.</div><div class='add'>+ * This affects just input characters in the range 128-160 on non PC</div><div class='add'>+ * systems.</div><div class='add'>+ */</div><div class='add'>+#if defined(VMS) || defined(AMIGA)</div><div class='add'>+# define _SLANG_MAP_VTXXX_8BIT 1</div><div class='add'>+#else</div><div class='add'>+# define _SLANG_MAP_VTXXX_8BIT 0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Add support for color terminals that cannot do background color erases</div><div class='add'>+ * Such terminals are poorly designed and are slowly disappearing but they</div><div class='add'>+ * are still quite common. For example, screen is one of them!</div><div class='add'>+ * </div><div class='add'>+ * This is experimental. In particular, it is not known to work if </div><div class='add'>+ * KANJI suupport is enabled.</div><div class='add'>+ */</div><div class='add'>+#if !defined(IBMPC_SYSTEM)</div><div class='add'>+# define SLTT_HAS_NON_BCE_SUPPORT 1</div><div class='add'>+#else</div><div class='add'>+# define SLTT_HAS_NON_BCE_SUPPORT 0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* If you want slang to assume that an xterm always has the background color</div><div class='add'>+ * erase feature, then set this to 1. Otherwise, it will check the terminfo</div><div class='add'>+ * database. This may or may not be a good idea since most good color xterms</div><div class='add'>+ * support bce but many terminfo systems do not support it.</div><div class='add'>+ */</div><div class='add'>+#define SLTT_XTERM_ALWAYS_BCE 0</div><div class='add'>+ </div><div class='add'>+/* Set this to 1 to enable Kanji support. See above comment. */</div><div class='add'>+#define SLANG_HAS_KANJI_SUPPORT 0</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slang.c b/mdk-stage1/slang/slang.c<br/>new file mode 100644<br/>index 000000000..6edc7df37<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slang.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slang.c</a></div><div class='hunk'>@@ -0,0 +1,5547 @@</div><div class='add'>+/* -*- mode: C; mode: fold; -*- */</div><div class='add'>+/* slang.c --- guts of S-Lang interpreter */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+# include <math.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#define USE_COMBINED_BYTECODES 0</div><div class='add'>+</div><div class='add'>+struct _SLBlock_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ struct _SLBlock_Type *body;</div><div class='add'>+ unsigned int num_refs;</div><div class='add'>+}</div><div class='add'>+_SLBlock_Header_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ SLang_Name_Type *next;</div><div class='add'>+ char name_type;</div><div class='add'>+</div><div class='add'>+ union</div><div class='add'>+ {</div><div class='add'>+ _SLBlock_Header_Type *header; /* body of function */</div><div class='add'>+ char *autoload_filename;</div><div class='add'>+ }</div><div class='add'>+ v;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ char *file;</div><div class='add'>+#endif</div><div class='add'>+#define SLANG_MAX_LOCAL_VARIABLES 254</div><div class='add'>+#define AUTOLOAD_NUM_LOCALS (SLANG_MAX_LOCAL_VARIABLES + 1)</div><div class='add'>+ unsigned char nlocals; /* number of local variables */</div><div class='add'>+ unsigned char nargs; /* number of arguments */</div><div class='add'>+}</div><div class='add'>+_SLang_Function_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ SLang_Name_Type *next;</div><div class='add'>+ char name_type;</div><div class='add'>+</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+}</div><div class='add'>+SLang_Global_Var_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ SLang_Name_Type *next;</div><div class='add'>+ char name_type;</div><div class='add'>+</div><div class='add'>+ int local_var_number;</div><div class='add'>+}</div><div class='add'>+SLang_Local_Var_Type;</div><div class='add'>+</div><div class='add'>+typedef struct _SLBlock_Type</div><div class='add'>+{</div><div class='add'>+ unsigned char bc_main_type;</div><div class='add'>+ unsigned char bc_sub_type;</div><div class='add'>+ union</div><div class='add'>+ {</div><div class='add'>+ struct _SLBlock_Type *blk;</div><div class='add'>+ int i_blk;</div><div class='add'>+</div><div class='add'>+ SLang_Name_Type *nt_blk;</div><div class='add'>+ SLang_App_Unary_Type *nt_unary_blk;</div><div class='add'>+ SLang_Intrin_Var_Type *nt_ivar_blk;</div><div class='add'>+ SLang_Intrin_Fun_Type *nt_ifun_blk;</div><div class='add'>+ SLang_Global_Var_Type *nt_gvar_blk;</div><div class='add'>+ SLang_IConstant_Type *iconst_blk;</div><div class='add'>+ SLang_DConstant_Type *dconst_blk;</div><div class='add'>+ _SLang_Function_Type *nt_fun_blk;</div><div class='add'>+</div><div class='add'>+ VOID_STAR ptr_blk;</div><div class='add'>+ char *s_blk;</div><div class='add'>+ SLang_BString_Type *bs_blk;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ double *double_blk; /*literal double is a pointer */</div><div class='add'>+#endif</div><div class='add'>+ float float_blk;</div><div class='add'>+ long l_blk;</div><div class='add'>+ struct _SLang_Struct_Type *struct_blk;</div><div class='add'>+ int (*call_function)(void);</div><div class='add'>+ }</div><div class='add'>+ b;</div><div class='add'>+}</div><div class='add'>+SLBlock_Type;</div><div class='add'>+</div><div class='add'>+/* Debugging and tracing variables */</div><div class='add'>+</div><div class='add'>+void (*SLang_Enter_Function)(char *) = NULL;</div><div class='add'>+void (*SLang_Exit_Function)(char *) = NULL;</div><div class='add'>+/* If non null, these call C functions before and after a slang function. */</div><div class='add'>+</div><div class='add'>+int _SLang_Trace = 0;</div><div class='add'>+/* If _SLang_Trace = -1, do not trace intrinsics */</div><div class='add'>+static int Trace_Mode = 0;</div><div class='add'>+</div><div class='add'>+static char *Trace_Function; /* function to be traced */</div><div class='add'>+int SLang_Traceback = 0;</div><div class='add'>+/* non zero means do traceback. If less than 0, do not show local variables */</div><div class='add'>+</div><div class='add'>+/* These variables handle _NARGS processing by the parser */</div><div class='add'>+int SLang_Num_Function_Args;</div><div class='add'>+static int *Num_Args_Stack;</div><div class='add'>+static unsigned int Recursion_Depth;</div><div class='add'>+static SLang_Object_Type *Frame_Pointer;</div><div class='add'>+static int Next_Function_Num_Args;</div><div class='add'>+static unsigned int Frame_Pointer_Depth;</div><div class='add'>+static unsigned int *Frame_Pointer_Stack;</div><div class='add'>+</div><div class='add'>+static int Lang_Break_Condition = 0;</div><div class='add'>+/* true if any one below is true. This keeps us from testing 3 variables.</div><div class='add'>+ * I know this can be perfomed with a bitmapped variable, but...</div><div class='add'>+ */</div><div class='add'>+static int Lang_Break = 0;</div><div class='add'>+static int Lang_Return = 0;</div><div class='add'>+/* static int Lang_Continue = 0; */</div><div class='add'>+</div><div class='add'>+SLang_Object_Type *_SLRun_Stack;</div><div class='add'>+SLang_Object_Type *_SLStack_Pointer;</div><div class='add'>+static SLang_Object_Type *_SLStack_Pointer_Max;</div><div class='add'>+</div><div class='add'>+/* Might want to increase this. */</div><div class='add'>+static SLang_Object_Type Local_Variable_Stack[SLANG_MAX_LOCAL_STACK];</div><div class='add'>+static SLang_Object_Type *Local_Variable_Frame = Local_Variable_Stack;</div><div class='add'>+</div><div class='add'>+static void free_function_header (_SLBlock_Header_Type *);</div><div class='add'>+</div><div class='add'>+void (*SLang_Dump_Routine)(char *);</div><div class='add'>+</div><div class='add'>+static void call_dump_routine (char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+ char buf[1024];</div><div class='add'>+ va_list ap;</div><div class='add'>+</div><div class='add'>+ va_start (ap, fmt);</div><div class='add'>+ if (SLang_Dump_Routine != NULL)</div><div class='add'>+ {</div><div class='add'>+ (void) _SLvsnprintf (buf, sizeof (buf), fmt, ap);</div><div class='add'>+ (*SLang_Dump_Routine) (buf);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ vfprintf (stderr, fmt, ap);</div><div class='add'>+ fflush (stderr);</div><div class='add'>+ }</div><div class='add'>+ va_end (ap);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_traceback (char *, unsigned int, char *);</div><div class='add'>+static int init_interpreter (void);</div><div class='add'>+</div><div class='add'>+/*{{{ push/pop/etc stack manipulation functions */</div><div class='add'>+</div><div class='add'>+/* This routine is assumed to work even in the presence of a SLang_Error. */</div><div class='add'>+_INLINE_</div><div class='add'>+int SLang_pop (SLang_Object_Type *x)</div><div class='add'>+{</div><div class='add'>+ register SLang_Object_Type *y;</div><div class='add'>+</div><div class='add'>+ y = _SLStack_Pointer;</div><div class='add'>+ if (y == _SLRun_Stack)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error == 0) SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+ x->data_type = 0;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ y--;</div><div class='add'>+ *x = *y;</div><div class='add'>+</div><div class='add'>+ _SLStack_Pointer = y;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_ctrl_integer (int *i)</div><div class='add'>+{</div><div class='add'>+ int type;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ register SLang_Object_Type *y;</div><div class='add'>+</div><div class='add'>+ /* Most of the time, either an integer or a char will be on the stack.</div><div class='add'>+ * Optimize these cases.</div><div class='add'>+ */</div><div class='add'>+ y = _SLStack_Pointer;</div><div class='add'>+ if (y == _SLRun_Stack)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error == 0) SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ y--;</div><div class='add'>+ </div><div class='add'>+ type = y->data_type;</div><div class='add'>+ if (type == SLANG_INT_TYPE)</div><div class='add'>+ {</div><div class='add'>+ _SLStack_Pointer = y; </div><div class='add'>+ *i = y->v.int_val;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ if (type == SLANG_CHAR_TYPE)</div><div class='add'>+ {</div><div class='add'>+ _SLStack_Pointer = y; </div><div class='add'>+ *i = y->v.char_val;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (-1 == (type = SLang_peek_at_stack ()))</div><div class='add'>+ return -1;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class ((unsigned char) type);</div><div class='add'>+ if (cl->cl_to_bool == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH,</div><div class='add'>+ "%s cannot be used in a boolean context",</div><div class='add'>+ cl->cl_name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return cl->cl_to_bool ((unsigned char) type, i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int SLang_peek_at_stack (void)</div><div class='add'>+{</div><div class='add'>+ if (_SLStack_Pointer == _SLRun_Stack)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error == 0)</div><div class='add'>+ SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return (_SLStack_Pointer - 1)->data_type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_peek_at_stack1 (void)</div><div class='add'>+{</div><div class='add'>+ int type;</div><div class='add'>+</div><div class='add'>+ type = SLang_peek_at_stack ();</div><div class='add'>+ if (type == SLANG_ARRAY_TYPE)</div><div class='add'>+ type = (_SLStack_Pointer - 1)->v.array_val->data_type;</div><div class='add'>+</div><div class='add'>+ return type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+void SLang_free_object (SLang_Object_Type *obj)</div><div class='add'>+{</div><div class='add'>+ unsigned char data_type;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (obj == NULL) return;</div><div class='add'>+ data_type = obj->data_type;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [data_type])</div><div class='add'>+ return;</div><div class='add'>+ if (data_type == SLANG_STRING_TYPE)</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (obj->v.s_val);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ cl = _SLclass_get_class (data_type);</div><div class='add'>+#if !_SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (cl->cl_class_type != SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+#endif</div><div class='add'>+ (*cl->cl_destroy) (data_type, (VOID_STAR) &obj->v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int SLang_push (SLang_Object_Type *x)</div><div class='add'>+{</div><div class='add'>+ register SLang_Object_Type *y;</div><div class='add'>+ y = _SLStack_Pointer;</div><div class='add'>+</div><div class='add'>+ /* if there is a SLang_Error, probably not much harm will be done</div><div class='add'>+ if it is ignored here */</div><div class='add'>+ /* if (SLang_Error) return; */</div><div class='add'>+</div><div class='add'>+ /* flag it now */</div><div class='add'>+ if (y >= _SLStack_Pointer_Max)</div><div class='add'>+ {</div><div class='add'>+ if (!SLang_Error) SLang_Error = SL_STACK_OVERFLOW;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *y = *x;</div><div class='add'>+ _SLStack_Pointer = y + 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* _INLINE_ */</div><div class='add'>+int SLclass_push_ptr_obj (unsigned char type, VOID_STAR pval)</div><div class='add'>+{</div><div class='add'>+ register SLang_Object_Type *y;</div><div class='add'>+ y = _SLStack_Pointer;</div><div class='add'>+</div><div class='add'>+ if (y >= _SLStack_Pointer_Max)</div><div class='add'>+ {</div><div class='add'>+ if (!SLang_Error) SLang_Error = SL_STACK_OVERFLOW;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ y->data_type = type;</div><div class='add'>+ y->v.ptr_val = pval;</div><div class='add'>+</div><div class='add'>+ _SLStack_Pointer = y + 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int SLclass_push_int_obj (unsigned char type, int x)</div><div class='add'>+{</div><div class='add'>+ register SLang_Object_Type *y;</div><div class='add'>+ y = _SLStack_Pointer;</div><div class='add'>+</div><div class='add'>+ if (y >= _SLStack_Pointer_Max)</div><div class='add'>+ {</div><div class='add'>+ if (!SLang_Error) SLang_Error = SL_STACK_OVERFLOW;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ y->data_type = type;</div><div class='add'>+ y->v.int_val = x;</div><div class='add'>+</div><div class='add'>+ _SLStack_Pointer = y + 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int _SLang_pop_object_of_type (unsigned char type, SLang_Object_Type *obj,</div><div class='add'>+ int allow_arrays)</div><div class='add'>+{</div><div class='add'>+ register SLang_Object_Type *y;</div><div class='add'>+</div><div class='add'>+ y = _SLStack_Pointer;</div><div class='add'>+ if (y == _SLRun_Stack)</div><div class='add'>+ return SLang_pop (obj);</div><div class='add'>+ y--;</div><div class='add'>+ if (y->data_type != type)</div><div class='add'>+ {</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ /* This is an implicit typecast. We do not want to typecast</div><div class='add'>+ * floats to ints implicitly. </div><div class='add'>+ */</div><div class='add'>+ if (_SLarith_Is_Arith_Type [type]</div><div class='add'>+ && _SLarith_Is_Arith_Type [y->data_type]</div><div class='add'>+ && (_SLarith_Is_Arith_Type [type] >= _SLarith_Is_Arith_Type[y->data_type]))</div><div class='add'>+ {</div><div class='add'>+ /* This should not fail */</div><div class='add'>+ (void) _SLarith_typecast (y->data_type, (VOID_STAR)&y->v, 1, </div><div class='add'>+ type, (VOID_STAR)&obj->v);</div><div class='add'>+ obj->data_type = type;</div><div class='add'>+ _SLStack_Pointer = y;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ </div><div class='add'>+ if ((allow_arrays == 0)</div><div class='add'>+ || (y->data_type != SLANG_ARRAY_TYPE)</div><div class='add'>+ || (y->v.array_val->data_type != type))</div><div class='add'>+ if (-1 == SLclass_typecast (type, 1, 0))</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ *obj = *y;</div><div class='add'>+ _SLStack_Pointer = y;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function reverses the top n items on the stack and returns a</div><div class='add'>+ * an offset from the start of the stack to the last item.</div><div class='add'>+ */</div><div class='add'>+int SLreverse_stack (int n)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type *otop, *obot, tmp;</div><div class='add'>+</div><div class='add'>+ otop = _SLStack_Pointer;</div><div class='add'>+ if ((n > otop - _SLRun_Stack) || (n < 0))</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ obot = otop - n;</div><div class='add'>+ otop--;</div><div class='add'>+ while (otop > obot)</div><div class='add'>+ {</div><div class='add'>+ tmp = *obot;</div><div class='add'>+ *obot = *otop;</div><div class='add'>+ *otop = tmp;</div><div class='add'>+ otop--;</div><div class='add'>+ obot++;</div><div class='add'>+ }</div><div class='add'>+ return (int) ((_SLStack_Pointer - n) - _SLRun_Stack);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int SLroll_stack (int np)</div><div class='add'>+{</div><div class='add'>+ int n, i;</div><div class='add'>+ SLang_Object_Type *otop, *obot, tmp;</div><div class='add'>+</div><div class='add'>+ if ((n = abs(np)) <= 1) return 0; /* identity */</div><div class='add'>+</div><div class='add'>+ obot = otop = _SLStack_Pointer;</div><div class='add'>+ i = n;</div><div class='add'>+ while (i != 0)</div><div class='add'>+ {</div><div class='add'>+ if (obot <= _SLRun_Stack)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ obot--;</div><div class='add'>+ i--;</div><div class='add'>+ }</div><div class='add'>+ otop--;</div><div class='add'>+</div><div class='add'>+ if (np > 0)</div><div class='add'>+ {</div><div class='add'>+ /* Put top on bottom and roll rest up. */</div><div class='add'>+ tmp = *otop;</div><div class='add'>+ while (otop > obot)</div><div class='add'>+ {</div><div class='add'>+ *otop = *(otop - 1);</div><div class='add'>+ otop--;</div><div class='add'>+ }</div><div class='add'>+ *otop = tmp;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ /* Put bottom on top and roll rest down. */</div><div class='add'>+ tmp = *obot;</div><div class='add'>+ while (obot < otop)</div><div class='add'>+ {</div><div class='add'>+ *obot = *(obot + 1);</div><div class='add'>+ obot++;</div><div class='add'>+ }</div><div class='add'>+ *obot = tmp;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLstack_depth (void)</div><div class='add'>+{</div><div class='add'>+ return (int) (_SLStack_Pointer - _SLRun_Stack);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLdup_n (int n)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type *bot, *top;</div><div class='add'>+</div><div class='add'>+ if (n <= 0)</div><div class='add'>+ return 0;</div><div class='add'>+ </div><div class='add'>+ top = _SLStack_Pointer;</div><div class='add'>+ if (top < _SLRun_Stack + n)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error == 0)</div><div class='add'>+ SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ if (top + n > _SLStack_Pointer_Max)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error == 0)</div><div class='add'>+ SLang_Error = SL_STACK_OVERFLOW;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ bot = top - n;</div><div class='add'>+</div><div class='add'>+ while (bot < top)</div><div class='add'>+ {</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ unsigned char data_type = bot->data_type;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [data_type])</div><div class='add'>+ {</div><div class='add'>+ *_SLStack_Pointer++ = *bot++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ cl = _SLclass_get_class (data_type);</div><div class='add'>+ if (-1 == (*cl->cl_push) (data_type, (VOID_STAR) &bot->v))</div><div class='add'>+ return -1;</div><div class='add'>+ bot++;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ inner interpreter and support functions */</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int _SL_increment_frame_pointer (void)</div><div class='add'>+{</div><div class='add'>+ if (Recursion_Depth >= SLANG_MAX_RECURSIVE_DEPTH)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_STACK_OVERFLOW, "Num Args Stack Overflow");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ Num_Args_Stack [Recursion_Depth] = SLang_Num_Function_Args;</div><div class='add'>+</div><div class='add'>+ SLang_Num_Function_Args = Next_Function_Num_Args;</div><div class='add'>+ Next_Function_Num_Args = 0;</div><div class='add'>+ Recursion_Depth++;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int _SL_decrement_frame_pointer (void)</div><div class='add'>+{</div><div class='add'>+ if (Recursion_Depth == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_STACK_UNDERFLOW, "Num Args Stack Underflow");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Recursion_Depth--;</div><div class='add'>+ if (Recursion_Depth < SLANG_MAX_RECURSIVE_DEPTH)</div><div class='add'>+ SLang_Num_Function_Args = Num_Args_Stack [Recursion_Depth];</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int SLang_start_arg_list (void)</div><div class='add'>+{</div><div class='add'>+ if (Frame_Pointer_Depth < SLANG_MAX_RECURSIVE_DEPTH)</div><div class='add'>+ {</div><div class='add'>+ Frame_Pointer_Stack [Frame_Pointer_Depth] = (unsigned int) (Frame_Pointer - _SLRun_Stack);</div><div class='add'>+ Frame_Pointer = _SLStack_Pointer;</div><div class='add'>+ Frame_Pointer_Depth++;</div><div class='add'>+ Next_Function_Num_Args = 0;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_STACK_OVERFLOW, "Frame Stack Overflow");</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int SLang_end_arg_list (void)</div><div class='add'>+{</div><div class='add'>+ if (Frame_Pointer_Depth == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_STACK_UNDERFLOW, "Frame Stack Underflow");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ Frame_Pointer_Depth--;</div><div class='add'>+ if (Frame_Pointer_Depth < SLANG_MAX_RECURSIVE_DEPTH)</div><div class='add'>+ {</div><div class='add'>+ Next_Function_Num_Args = (int) (_SLStack_Pointer - Frame_Pointer);</div><div class='add'>+ Frame_Pointer = _SLRun_Stack + Frame_Pointer_Stack [Frame_Pointer_Depth];</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static int do_bc_call_direct_frame (int (*f)(void))</div><div class='add'>+{</div><div class='add'>+ if ((0 == SLang_end_arg_list ())</div><div class='add'>+ && (0 == _SL_increment_frame_pointer ()))</div><div class='add'>+ {</div><div class='add'>+ (void) (*f) ();</div><div class='add'>+ _SL_decrement_frame_pointer ();</div><div class='add'>+ }</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ return -1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int do_name_type_error (SLang_Name_Type *nt)</div><div class='add'>+{</div><div class='add'>+ char buf[256];</div><div class='add'>+ if (nt != NULL)</div><div class='add'>+ {</div><div class='add'>+ (void) _SLsnprintf (buf, sizeof (buf), "(Error occurred processing %s)", nt->name);</div><div class='add'>+ do_traceback (buf, 0, NULL);</div><div class='add'>+ }</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* local and global variable assignments */</div><div class='add'>+</div><div class='add'>+static int do_binary_ab (int op, SLang_Object_Type *obja, SLang_Object_Type *objb)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *a_cl, *b_cl, *c_cl;</div><div class='add'>+ unsigned char b_data_type, a_data_type, c_data_type;</div><div class='add'>+ int (*binary_fun) (int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR);</div><div class='add'>+ VOID_STAR pa;</div><div class='add'>+ VOID_STAR pb;</div><div class='add'>+ VOID_STAR pc;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ b_data_type = objb->data_type;</div><div class='add'>+ a_data_type = obja->data_type;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (_SLarith_Is_Arith_Type[a_data_type]</div><div class='add'>+ && _SLarith_Is_Arith_Type[b_data_type])</div><div class='add'>+ {</div><div class='add'>+ int status;</div><div class='add'>+ status = _SLarith_bin_op (obja, objb, op);</div><div class='add'>+ if (status != 1)</div><div class='add'>+ return status;</div><div class='add'>+ /* drop and try it the hard way */</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ a_cl = _SLclass_get_class (a_data_type);</div><div class='add'>+ if (a_data_type == b_data_type)</div><div class='add'>+ b_cl = a_cl;</div><div class='add'>+ else</div><div class='add'>+ b_cl = _SLclass_get_class (b_data_type);</div><div class='add'>+</div><div class='add'>+ if (NULL == (binary_fun = _SLclass_get_binary_fun (op, a_cl, b_cl, &c_cl, 1)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ c_data_type = c_cl->cl_data_type;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [a_data_type])</div><div class='add'>+ pa = (VOID_STAR) &obja->v;</div><div class='add'>+ else</div><div class='add'>+#endif</div><div class='add'>+ pa = _SLclass_get_ptr_to_value (a_cl, obja);</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [b_data_type])</div><div class='add'>+ pb = (VOID_STAR) &objb->v;</div><div class='add'>+ else</div><div class='add'>+#endif</div><div class='add'>+ pb = _SLclass_get_ptr_to_value (b_cl, objb);</div><div class='add'>+</div><div class='add'>+ pc = c_cl->cl_transfer_buf;</div><div class='add'>+</div><div class='add'>+ if (1 != (*binary_fun) (op,</div><div class='add'>+ a_data_type, pa, 1,</div><div class='add'>+ b_data_type, pb, 1,</div><div class='add'>+ pc))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "Binary operation between %s and %s failed",</div><div class='add'>+ a_cl->cl_name, b_cl->cl_name);</div><div class='add'>+</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* apush will create a copy, so make sure we free after the push */</div><div class='add'>+ ret = (*c_cl->cl_apush)(c_data_type, pc);</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [c_data_type])</div><div class='add'>+#endif</div><div class='add'>+ (*c_cl->cl_adestroy)(c_data_type, pc);</div><div class='add'>+</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static void do_binary (int op)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obja, objb;</div><div class='add'>+</div><div class='add'>+ if (SLang_pop (&objb)) return;</div><div class='add'>+ if (0 == SLang_pop (&obja))</div><div class='add'>+ {</div><div class='add'>+ (void) do_binary_ab (op, &obja, &objb);</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [obja.data_type])</div><div class='add'>+#endif</div><div class='add'>+ SLang_free_object (&obja);</div><div class='add'>+ }</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [objb.data_type])</div><div class='add'>+#endif</div><div class='add'>+ SLang_free_object (&objb);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int do_unary_op (int op, SLang_Object_Type *obj, int unary_type)</div><div class='add'>+{</div><div class='add'>+ int (*f) (int, unsigned char, VOID_STAR, unsigned int, VOID_STAR);</div><div class='add'>+ VOID_STAR pa;</div><div class='add'>+ VOID_STAR pb;</div><div class='add'>+ SLang_Class_Type *a_cl, *b_cl;</div><div class='add'>+ unsigned char a_type, b_type;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ a_type = obj->data_type;</div><div class='add'>+ a_cl = _SLclass_get_class (a_type);</div><div class='add'>+</div><div class='add'>+ if (NULL == (f = _SLclass_get_unary_fun (op, a_cl, &b_cl, unary_type)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ b_type = b_cl->cl_data_type;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [a_type])</div><div class='add'>+ pa = (VOID_STAR) &obj->v;</div><div class='add'>+ else</div><div class='add'>+#endif</div><div class='add'>+ pa = _SLclass_get_ptr_to_value (a_cl, obj);</div><div class='add'>+</div><div class='add'>+ pb = b_cl->cl_transfer_buf;</div><div class='add'>+</div><div class='add'>+ if (1 != (*f) (op, a_type, pa, 1, pb))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "Unary operation for %s failed", a_cl->cl_name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ret = (*b_cl->cl_apush)(b_type, pb);</div><div class='add'>+ /* cl_apush creates a copy, so make sure we call cl_adestroy */</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [b_type])</div><div class='add'>+#endif</div><div class='add'>+ (*b_cl->cl_adestroy)(b_type, pb);</div><div class='add'>+</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static int do_unary (int op, int unary_type)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&obj)) return -1;</div><div class='add'>+ ret = do_unary_op (op, &obj, unary_type);</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [obj.data_type])</div><div class='add'>+#endif</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int do_assignment_binary (int op, SLang_Object_Type *obja_ptr)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type objb;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (SLang_pop (&objb))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ ret = do_binary_ab (op, obja_ptr, &objb);</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [objb.data_type])</div><div class='add'>+#endif</div><div class='add'>+ SLang_free_object (&objb);</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* The order of these is assumed to match the binary operators</div><div class='add'>+ * defined in slang.h</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+map_assignment_op_to_binary (unsigned char op_type, int *op, int *is_unary)</div><div class='add'>+{</div><div class='add'>+ *is_unary = 0;</div><div class='add'>+ switch (op_type)</div><div class='add'>+ {</div><div class='add'>+ case _SLANG_BCST_PLUSEQS:</div><div class='add'>+ case _SLANG_BCST_MINUSEQS:</div><div class='add'>+ case _SLANG_BCST_TIMESEQS:</div><div class='add'>+ case _SLANG_BCST_DIVEQS:</div><div class='add'>+ *op = SLANG_PLUS + (op_type - _SLANG_BCST_PLUSEQS);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_BOREQS:</div><div class='add'>+ *op = SLANG_BOR;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_BANDEQS:</div><div class='add'>+ *op = SLANG_BAND;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_POST_MINUSMINUS:</div><div class='add'>+ case _SLANG_BCST_MINUSMINUS:</div><div class='add'>+ *op = SLANG_MINUS;</div><div class='add'>+ *is_unary = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_PLUSPLUS:</div><div class='add'>+ case _SLANG_BCST_POST_PLUSPLUS:</div><div class='add'>+ *op = SLANG_PLUS;</div><div class='add'>+ *is_unary = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "Assignment operator not implemented");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+perform_lvalue_operation (unsigned char op_type, SLang_Object_Type *obja_ptr)</div><div class='add'>+{</div><div class='add'>+ switch (op_type)</div><div class='add'>+ {</div><div class='add'>+ case _SLANG_BCST_ASSIGN:</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* The order of these is assumed to match the binary operators</div><div class='add'>+ * defined in slang.h</div><div class='add'>+ */</div><div class='add'>+ case _SLANG_BCST_PLUSEQS:</div><div class='add'>+ case _SLANG_BCST_MINUSEQS:</div><div class='add'>+ case _SLANG_BCST_TIMESEQS:</div><div class='add'>+ case _SLANG_BCST_DIVEQS:</div><div class='add'>+ if (-1 == do_assignment_binary (SLANG_PLUS + (op_type - _SLANG_BCST_PLUSEQS), obja_ptr))</div><div class='add'>+ return -1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_BOREQS:</div><div class='add'>+ if (-1 == do_assignment_binary (SLANG_BOR, obja_ptr))</div><div class='add'>+ return -1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_BANDEQS:</div><div class='add'>+ if (-1 == do_assignment_binary (SLANG_BAND, obja_ptr))</div><div class='add'>+ return -1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_PLUSPLUS:</div><div class='add'>+ case _SLANG_BCST_POST_PLUSPLUS:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (obja_ptr->data_type == SLANG_INT_TYPE)</div><div class='add'>+ return SLclass_push_int_obj (SLANG_INT_TYPE, obja_ptr->v.int_val + 1);</div><div class='add'>+#endif</div><div class='add'>+ if (-1 == do_unary_op (SLANG_PLUSPLUS, obja_ptr, _SLANG_BC_UNARY))</div><div class='add'>+ return -1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_MINUSMINUS:</div><div class='add'>+ case _SLANG_BCST_POST_MINUSMINUS:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (obja_ptr->data_type == SLANG_INT_TYPE)</div><div class='add'>+ return SLclass_push_int_obj (SLANG_INT_TYPE, obja_ptr->v.int_val - 1);</div><div class='add'>+#endif</div><div class='add'>+ if (-1 == do_unary_op (SLANG_MINUSMINUS, obja_ptr, _SLANG_BC_UNARY))</div><div class='add'>+ return -1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static int</div><div class='add'>+set_lvalue_obj (unsigned char op_type, SLang_Object_Type *obja_ptr)</div><div class='add'>+{</div><div class='add'>+ if (op_type != _SLANG_BCST_ASSIGN)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == perform_lvalue_operation (op_type, obja_ptr))</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [obja_ptr->data_type])</div><div class='add'>+#endif</div><div class='add'>+ SLang_free_object (obja_ptr);</div><div class='add'>+</div><div class='add'>+ return SLang_pop(obja_ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+set_struct_lvalue (SLBlock_Type *bc_blk)</div><div class='add'>+{</div><div class='add'>+ int type;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ char *name;</div><div class='add'>+ int op;</div><div class='add'>+</div><div class='add'>+ if (-1 == (type = SLang_peek_at_stack ()))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ if ((cl->cl_sput == NULL)</div><div class='add'>+ || (cl->cl_sget == NULL))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "%s does not support structure access",</div><div class='add'>+ cl->cl_name);</div><div class='add'>+ SLdo_pop_n (2); /* object plus what was to be assigned */</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ name = bc_blk->b.s_blk;</div><div class='add'>+ op = bc_blk->bc_sub_type;</div><div class='add'>+</div><div class='add'>+ if (op != _SLANG_BCST_ASSIGN)</div><div class='add'>+ {</div><div class='add'>+ /* We have something like (A.x += b) or (A.x++). In either case,</div><div class='add'>+ * we need A.x.</div><div class='add'>+ */</div><div class='add'>+ SLang_Object_Type obj_A;</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&obj_A))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((-1 == _SLpush_slang_obj (&obj_A))</div><div class='add'>+ || (-1 == cl->cl_sget ((unsigned char) type, name))</div><div class='add'>+ || (-1 == SLang_pop (&obj)))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&obj_A);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ /* Now the value of A.x is in obj. */</div><div class='add'>+ if (-1 == perform_lvalue_operation (op, &obj))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ SLang_free_object (&obj_A);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ /* The result of the operation is now on the stack.</div><div class='add'>+ * Perform assignment */</div><div class='add'>+ if (-1 == SLang_push (&obj_A))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&obj_A);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return (*cl->cl_sput) ((unsigned char) type, name);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int make_unit_object (SLang_Object_Type *a, SLang_Object_Type *u)</div><div class='add'>+{</div><div class='add'>+ unsigned char type;</div><div class='add'>+ </div><div class='add'>+ type = a->data_type;</div><div class='add'>+ if (type == SLANG_ARRAY_TYPE)</div><div class='add'>+ type = a->v.array_val->data_type;</div><div class='add'>+ </div><div class='add'>+ u->data_type = type;</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_UCHAR_TYPE:</div><div class='add'>+ case SLANG_CHAR_TYPE:</div><div class='add'>+ u->v.char_val = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_SHORT_TYPE:</div><div class='add'>+ case SLANG_USHORT_TYPE:</div><div class='add'>+ u->v.short_val = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_LONG_TYPE:</div><div class='add'>+ case SLANG_ULONG_TYPE:</div><div class='add'>+ u->v.long_val = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ u->v.float_val = 1;</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case SLANG_COMPLEX_TYPE:</div><div class='add'>+ u->data_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ u->v.double_val = 1;</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ default:</div><div class='add'>+ u->data_type = SLANG_INT_TYPE;</div><div class='add'>+ u->v.int_val = 1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* We want to convert 'A[i] op X' to 'A[i] = A[i] op X'. The code that</div><div class='add'>+ * has been generated is: X __args i A __aput-op</div><div class='add'>+ * where __aput-op represents this function. We need to generate:</div><div class='add'>+ * __args i A __eargs __aget X op __args i A __eargs __aput</div><div class='add'>+ * Here, __eargs implies a call to do_bc_call_direct_frame with either</div><div class='add'>+ * the aput or aget function. In addition, __args represents a call to </div><div class='add'>+ * SLang_start_arg_list. Of course, i represents a set of indices.</div><div class='add'>+ * </div><div class='add'>+ * Note: If op is an unary operation (e.g., ++ or --), then X will not</div><div class='add'>+ * b present an will have to be taken to be 1.</div><div class='add'>+ * </div><div class='add'>+ * Implementation note: For efficiency, calls to setup the frame, start</div><div class='add'>+ * arg list will be omitted and SLang_Num_Function_Args will be set.</div><div class='add'>+ * This is ugly but the alternative is much less efficient rendering these</div><div class='add'>+ * assignment operators useless. So, the plan is to roll the stack to get X,</div><div class='add'>+ * then duplicate the next N values, call __aget followed by op X, finally</div><div class='add'>+ * calling __aput. Hence, the sequence is:</div><div class='add'>+ * </div><div class='add'>+ * start: X i .. j A </div><div class='add'>+ * dupN: X i .. j A i .. j A</div><div class='add'>+ * __aget: X i .. j A Y</div><div class='add'>+ * roll: i .. j A Y X</div><div class='add'>+ * op: i .. j A Z</div><div class='add'>+ * roll: Z i .. j A</div><div class='add'>+ * __aput:</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+set_array_lvalue (int op)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type x, y;</div><div class='add'>+ int num_args, is_unary;</div><div class='add'>+</div><div class='add'>+ if (-1 == map_assignment_op_to_binary (op, &op, &is_unary))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* Grab the indices and the array. Do not start a new frame. */</div><div class='add'>+ if (-1 == SLang_end_arg_list ())</div><div class='add'>+ return -1;</div><div class='add'>+ num_args = Next_Function_Num_Args;</div><div class='add'>+ Next_Function_Num_Args = 0;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLdup_n (num_args))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ SLang_Num_Function_Args = num_args;</div><div class='add'>+ if (-1 == _SLarray_aget ())</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&y))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ if (is_unary == 0)</div><div class='add'>+ {</div><div class='add'>+ if ((-1 == SLroll_stack (-(num_args + 1)))</div><div class='add'>+ || (-1 == SLang_pop (&x)))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&y);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else if (-1 == make_unit_object (&y, &x))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&y);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (-1 == do_binary_ab (op, &y, &x))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&y);</div><div class='add'>+ SLang_free_object (&x);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [y.data_type])</div><div class='add'>+#endif</div><div class='add'>+ SLang_free_object (&y);</div><div class='add'>+ </div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [x.data_type])</div><div class='add'>+#endif</div><div class='add'>+ SLang_free_object (&x);</div><div class='add'>+</div><div class='add'>+ if (-1 == SLroll_stack (num_args + 1))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ SLang_Num_Function_Args = num_args;</div><div class='add'>+ return _SLarray_aput ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+set_intrin_lvalue (SLBlock_Type *bc_blk)</div><div class='add'>+{</div><div class='add'>+ unsigned char op_type;</div><div class='add'>+ SLang_Object_Type obja;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ SLang_Intrin_Var_Type *ivar;</div><div class='add'>+ VOID_STAR intrinsic_addr;</div><div class='add'>+ unsigned char intrinsic_type;</div><div class='add'>+</div><div class='add'>+ ivar = bc_blk->b.nt_ivar_blk;</div><div class='add'>+</div><div class='add'>+ intrinsic_type = ivar->type;</div><div class='add'>+ intrinsic_addr = ivar->addr;</div><div class='add'>+</div><div class='add'>+ op_type = bc_blk->bc_sub_type;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (intrinsic_type);</div><div class='add'>+</div><div class='add'>+ if (op_type != _SLANG_BCST_ASSIGN)</div><div class='add'>+ {</div><div class='add'>+ /* We want to get the current value into obja. This is the</div><div class='add'>+ * easiest way.</div><div class='add'>+ */</div><div class='add'>+ if ((-1 == (*cl->cl_push) (intrinsic_type, intrinsic_addr))</div><div class='add'>+ || (-1 == SLang_pop (&obja)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ (void) perform_lvalue_operation (op_type, &obja);</div><div class='add'>+ SLang_free_object (&obja);</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return (*cl->cl_pop) (intrinsic_type, intrinsic_addr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_deref_assign (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type *objp;</div><div class='add'>+ SLang_Name_Type *nt;</div><div class='add'>+ SLBlock_Type blk;</div><div class='add'>+</div><div class='add'>+ if (ref->is_global == 0)</div><div class='add'>+ {</div><div class='add'>+ objp = ref->v.local_obj;</div><div class='add'>+ if (objp > Local_Variable_Frame)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_UNDEFINED_NAME, "Local variable reference is out of scope");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return set_lvalue_obj (_SLANG_BCST_ASSIGN, objp);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ nt = ref->v.nt;</div><div class='add'>+ switch (nt->name_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_GVARIABLE:</div><div class='add'>+ case SLANG_PVARIABLE:</div><div class='add'>+ if (-1 == set_lvalue_obj (_SLANG_BCST_ASSIGN,</div><div class='add'>+ &((SLang_Global_Var_Type *)nt)->obj))</div><div class='add'>+ {</div><div class='add'>+ do_name_type_error (nt);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_IVARIABLE:</div><div class='add'>+ blk.b.nt_blk = nt;</div><div class='add'>+ blk.bc_sub_type = _SLANG_BCST_ASSIGN;</div><div class='add'>+ if (-1 == set_intrin_lvalue (&blk))</div><div class='add'>+ {</div><div class='add'>+ do_name_type_error (nt);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_LVARIABLE:</div><div class='add'>+ SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+ /* set_intrin_lvalue (&blk); */</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ case SLANG_RVARIABLE:</div><div class='add'>+ default:</div><div class='add'>+ SLang_verror (SL_READONLY_ERROR, "deref assignment to %s not allowed", nt->name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void set_deref_lvalue (SLBlock_Type *bc_blk)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type *objp;</div><div class='add'>+ SLang_Ref_Type *ref;</div><div class='add'>+</div><div class='add'>+ switch (bc_blk->bc_sub_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_LVARIABLE:</div><div class='add'>+ objp = (Local_Variable_Frame - bc_blk->b.i_blk);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_GVARIABLE:</div><div class='add'>+ case SLANG_PVARIABLE:</div><div class='add'>+ objp = &bc_blk->b.nt_gvar_blk->obj;</div><div class='add'>+ break;</div><div class='add'>+ default:</div><div class='add'>+ SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLpush_slang_obj (objp))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_ref (&ref))</div><div class='add'>+ return;</div><div class='add'>+ (void) _SLang_deref_assign (ref);</div><div class='add'>+ SLang_free_ref (ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_struct_field (char *name)</div><div class='add'>+{</div><div class='add'>+ int type;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (-1 == (type = SLang_peek_at_stack ()))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class ((unsigned char) type);</div><div class='add'>+ if (cl->cl_sget == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "%s does not permit structure access",</div><div class='add'>+ cl->cl_name);</div><div class='add'>+ SLdo_pop_n (2);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return (*cl->cl_sget) ((unsigned char) type, name);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void trace_dump (char *format, char *name, SLang_Object_Type *objs, int n, int dir)</div><div class='add'>+{</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char prefix [52];</div><div class='add'>+</div><div class='add'>+ len = Trace_Mode - 1;</div><div class='add'>+ if (len + 2 >= sizeof (prefix))</div><div class='add'>+ len = sizeof (prefix) - 2;</div><div class='add'>+</div><div class='add'>+ SLMEMSET (prefix, ' ', len);</div><div class='add'>+ prefix[len] = 0;</div><div class='add'>+</div><div class='add'>+ call_dump_routine (prefix);</div><div class='add'>+ call_dump_routine (format, name, n);</div><div class='add'>+</div><div class='add'>+ if (n > 0)</div><div class='add'>+ {</div><div class='add'>+ prefix[len] = ' ';</div><div class='add'>+ len++;</div><div class='add'>+ prefix[len] = 0;</div><div class='add'>+</div><div class='add'>+ _SLdump_objects (prefix, objs, n, dir);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Pop a data item from the stack and return a pointer to it.</div><div class='add'>+ * Strings are not freed from stack so use another routine to do it.</div><div class='add'>+ */</div><div class='add'>+static VOID_STAR pop_pointer (SLang_Object_Type *obj, unsigned char type)</div><div class='add'>+{</div><div class='add'>+#ifndef _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ /* Arrays are special. Allow scalars to automatically convert to arrays.</div><div class='add'>+ */</div><div class='add'>+ if (type == SLANG_ARRAY_TYPE)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLang_pop_array (&at, 1))</div><div class='add'>+ return NULL;</div><div class='add'>+ obj->data_type = SLANG_ARRAY_TYPE;</div><div class='add'>+ return obj->v.ptr_val = (VOID_STAR) at;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (type == 0)</div><div class='add'>+ {</div><div class='add'>+ /* This happens when an intrinsic is declared without any information</div><div class='add'>+ * regarding parameter types.</div><div class='add'>+ */</div><div class='add'>+ if (-1 == SLang_pop (obj))</div><div class='add'>+ return NULL;</div><div class='add'>+ type = obj->data_type;</div><div class='add'>+ }</div><div class='add'>+ else if (-1 == _SLang_pop_object_of_type (type, obj, 0))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ type = _SLclass_Class_Type [type];</div><div class='add'>+#else</div><div class='add'>+ type = _SLclass_get_class (type)->cl_class_type;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+ return (VOID_STAR) &obj->v;</div><div class='add'>+ else if (type == SLANG_CLASS_TYPE_MMT)</div><div class='add'>+ return SLang_object_from_mmt (obj->v.ref);</div><div class='add'>+ else</div><div class='add'>+ return obj->v.ptr_val;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is ugly. Does anyone have a advice for a cleaner way of doing</div><div class='add'>+ * this??</div><div class='add'>+ */</div><div class='add'>+typedef void (*VF0_Type)(void);</div><div class='add'>+typedef void (*VF1_Type)(VOID_STAR);</div><div class='add'>+typedef void (*VF2_Type)(VOID_STAR, VOID_STAR);</div><div class='add'>+typedef void (*VF3_Type)(VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef void (*VF4_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef void (*VF5_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef void (*VF6_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef void (*VF7_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef long (*LF0_Type)(void);</div><div class='add'>+typedef long (*LF1_Type)(VOID_STAR);</div><div class='add'>+typedef long (*LF2_Type)(VOID_STAR, VOID_STAR);</div><div class='add'>+typedef long (*LF3_Type)(VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef long (*LF4_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef long (*LF5_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef long (*LF6_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef long (*LF7_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+typedef double (*FF0_Type)(void);</div><div class='add'>+typedef double (*FF1_Type)(VOID_STAR);</div><div class='add'>+typedef double (*FF2_Type)(VOID_STAR, VOID_STAR);</div><div class='add'>+typedef double (*FF3_Type)(VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef double (*FF4_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef double (*FF5_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef double (*FF6_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef double (*FF7_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int execute_intrinsic_fun (SLang_Intrin_Fun_Type *objf)</div><div class='add'>+{</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ double xf;</div><div class='add'>+#endif</div><div class='add'>+ VOID_STAR p[SLANG_MAX_INTRIN_ARGS];</div><div class='add'>+ SLang_Object_Type objs[SLANG_MAX_INTRIN_ARGS];</div><div class='add'>+ long ret;</div><div class='add'>+ unsigned char type;</div><div class='add'>+ unsigned int argc;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ FVOID_STAR fptr;</div><div class='add'>+ unsigned char *arg_types;</div><div class='add'>+ int stk_depth;</div><div class='add'>+</div><div class='add'>+ fptr = objf->i_fun;</div><div class='add'>+ argc = objf->num_args;</div><div class='add'>+ type = objf->return_type;</div><div class='add'>+ arg_types = objf->arg_types;</div><div class='add'>+</div><div class='add'>+ if (argc > SLANG_MAX_INTRIN_ARGS)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror(SL_APPLICATION_ERROR,</div><div class='add'>+ "Intrinsic function %s requires too many parameters", objf->name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == _SL_increment_frame_pointer ())</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ stk_depth = -1;</div><div class='add'>+ if (Trace_Mode && (_SLang_Trace > 0))</div><div class='add'>+ {</div><div class='add'>+ int nargs;</div><div class='add'>+</div><div class='add'>+ stk_depth = _SLstack_depth ();</div><div class='add'>+</div><div class='add'>+ nargs = SLang_Num_Function_Args;</div><div class='add'>+ if (nargs == 0)</div><div class='add'>+ nargs = (int)argc;</div><div class='add'>+</div><div class='add'>+ stk_depth -= nargs;</div><div class='add'>+</div><div class='add'>+ if (stk_depth >= 0)</div><div class='add'>+ trace_dump (">>%s (%d args)\n",</div><div class='add'>+ objf->name,</div><div class='add'>+ _SLStack_Pointer - nargs,</div><div class='add'>+ nargs,</div><div class='add'>+ 1);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ i = argc;</div><div class='add'>+ while (i != 0)</div><div class='add'>+ {</div><div class='add'>+ i--;</div><div class='add'>+ if (NULL == (p[i] = pop_pointer (objs + i, arg_types[i])))</div><div class='add'>+ {</div><div class='add'>+ i++;</div><div class='add'>+ goto free_and_return;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ret = 0;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ xf = 0.0;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ switch (argc)</div><div class='add'>+ {</div><div class='add'>+ case 0:</div><div class='add'>+ if (type == SLANG_VOID_TYPE) ((VF0_Type) fptr) ();</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ else if (type == SLANG_DOUBLE_TYPE) xf = ((FF0_Type) fptr)();</div><div class='add'>+#endif</div><div class='add'>+ else ret = ((LF0_Type) fptr)();</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 1:</div><div class='add'>+ if (type == SLANG_VOID_TYPE) ((VF1_Type) fptr)(p[0]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ else if (type == SLANG_DOUBLE_TYPE) xf = ((FF1_Type) fptr)(p[0]);</div><div class='add'>+#endif</div><div class='add'>+ else ret = ((LF1_Type) fptr)(p[0]);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 2:</div><div class='add'>+ if (type == SLANG_VOID_TYPE) ((VF2_Type) fptr)(p[0], p[1]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ else if (type == SLANG_DOUBLE_TYPE) xf = ((FF2_Type) fptr)(p[0], p[1]);</div><div class='add'>+#endif</div><div class='add'>+ else ret = ((LF2_Type) fptr)(p[0], p[1]);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 3:</div><div class='add'>+ if (type == SLANG_VOID_TYPE) ((VF3_Type) fptr)(p[0], p[1], p[2]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ else if (type == SLANG_DOUBLE_TYPE) xf = ((FF3_Type) fptr)(p[0], p[1], p[2]);</div><div class='add'>+#endif</div><div class='add'>+ else ret = ((LF3_Type) fptr)(p[0], p[1], p[2]);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 4:</div><div class='add'>+ if (type == SLANG_VOID_TYPE) ((VF4_Type) fptr)(p[0], p[1], p[2], p[3]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ else if (type == SLANG_DOUBLE_TYPE) xf = ((FF4_Type) fptr)(p[0], p[1], p[2], p[3]);</div><div class='add'>+#endif</div><div class='add'>+ else ret = ((LF4_Type) fptr)(p[0], p[1], p[2], p[3]);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 5:</div><div class='add'>+ if (type == SLANG_VOID_TYPE) ((VF5_Type) fptr)(p[0], p[1], p[2], p[3], p[4]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ else if (type == SLANG_DOUBLE_TYPE) xf = ((FF5_Type) fptr)(p[0], p[1], p[2], p[3], p[4]);</div><div class='add'>+#endif</div><div class='add'>+ else ret = ((LF5_Type) fptr)(p[0], p[1], p[2], p[3], p[4]);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 6:</div><div class='add'>+ if (type == SLANG_VOID_TYPE) ((VF6_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ else if (type == SLANG_DOUBLE_TYPE) xf = ((FF6_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5]);</div><div class='add'>+#endif</div><div class='add'>+ else ret = ((LF6_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5]);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 7:</div><div class='add'>+ if (type == SLANG_VOID_TYPE) ((VF7_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5], p[6]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ else if (type == SLANG_DOUBLE_TYPE) xf = ((FF7_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5], p[6]);</div><div class='add'>+#endif</div><div class='add'>+ else ret = ((LF7_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5], p[6]);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_VOID_TYPE:</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ (void) SLang_push_double (xf);</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ case SLANG_UINT_TYPE:</div><div class='add'>+ case SLANG_INT_TYPE: (void) SLclass_push_int_obj (type, (int) ret);</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case SLANG_CHAR_TYPE:</div><div class='add'>+ case SLANG_UCHAR_TYPE: (void) SLclass_push_char_obj (type, (char) ret);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_SHORT_TYPE:</div><div class='add'>+ case SLANG_USHORT_TYPE: (void) SLclass_push_short_obj (type, (short) ret);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_LONG_TYPE:</div><div class='add'>+ case SLANG_ULONG_TYPE: (void) SLclass_push_long_obj (type, ret);</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case SLANG_STRING_TYPE:</div><div class='add'>+ if (NULL == (char *)ret)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error == 0) SLang_Error = SL_INTRINSIC_ERROR;</div><div class='add'>+ }</div><div class='add'>+ else (void) SLang_push_string ((char *)ret);</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ default:</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "Support for intrinsic functions returning %s is not provided",</div><div class='add'>+ SLclass_get_datatype_name (type));</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (stk_depth >= 0)</div><div class='add'>+ {</div><div class='add'>+ stk_depth = _SLstack_depth () - stk_depth;</div><div class='add'>+</div><div class='add'>+ trace_dump ("<<%s (returning %d values)\n",</div><div class='add'>+ objf->name,</div><div class='add'>+ _SLStack_Pointer - stk_depth,</div><div class='add'>+ stk_depth,</div><div class='add'>+ 1);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ free_and_return:</div><div class='add'>+ while (i < argc)</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (objs + i);</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return _SL_decrement_frame_pointer ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int inner_interp(register SLBlock_Type *);</div><div class='add'>+</div><div class='add'>+/* Switch_Obj_Ptr points to the NEXT available free switch object */</div><div class='add'>+static SLang_Object_Type Switch_Objects[SLANG_MAX_NESTED_SWITCH];</div><div class='add'>+static SLang_Object_Type *Switch_Obj_Ptr = Switch_Objects;</div><div class='add'>+static SLang_Object_Type *Switch_Obj_Max = Switch_Objects + SLANG_MAX_NESTED_SWITCH;</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+lang_do_loops (unsigned char stype, SLBlock_Type *block, unsigned int num_blocks)</div><div class='add'>+{</div><div class='add'>+ int i, ctrl;</div><div class='add'>+ int first, last;</div><div class='add'>+ SLBlock_Type *blks[4];</div><div class='add'>+ char *loop_name;</div><div class='add'>+ SLang_Foreach_Context_Type *foreach_context;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ int type;</div><div class='add'>+ unsigned int j;</div><div class='add'>+</div><div class='add'>+ j = 0;</div><div class='add'>+ for (i = 0; i < (int) num_blocks; i++)</div><div class='add'>+ {</div><div class='add'>+ if (block[i].bc_main_type != _SLANG_BC_BLOCK)</div><div class='add'>+ {</div><div class='add'>+ if (block[i].bc_main_type == _SLANG_BC_LINE_NUM)</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Bytecode is not a looping block");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ blks[j] = block[i].b.blk;</div><div class='add'>+ j++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ num_blocks = j;</div><div class='add'>+ block = blks[0];</div><div class='add'>+</div><div class='add'>+ switch (stype)</div><div class='add'>+ {</div><div class='add'>+ case _SLANG_BCST_FOREACH:</div><div class='add'>+ loop_name = "foreach";</div><div class='add'>+ if (num_blocks != 1)</div><div class='add'>+ goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+ /* We should find Next_Function_Num_Args + 1 items on the stack.</div><div class='add'>+ * The first Next_Function_Num_Args items represent the arguments to</div><div class='add'>+ * to USING. The last item (deepest in stack) is the object to loop</div><div class='add'>+ * over. So, roll the stack up and grab it.</div><div class='add'>+ */</div><div class='add'>+ if ((-1 == SLroll_stack (-(Next_Function_Num_Args + 1)))</div><div class='add'>+ || (-1 == (type = SLang_peek_at_stack ())))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class ((unsigned char) type);</div><div class='add'>+ if ((cl->cl_foreach == NULL)</div><div class='add'>+ || (cl->cl_foreach_open == NULL)</div><div class='add'>+ || (cl->cl_foreach_close == NULL))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "%s does not permit foreach", cl->cl_name);</div><div class='add'>+ SLdo_pop_n (Next_Function_Num_Args + 1);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (foreach_context = (*cl->cl_foreach_open) ((unsigned char)type, Next_Function_Num_Args)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ {</div><div class='add'>+ (*cl->cl_foreach_close) ((unsigned char) type, foreach_context);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ status = (*cl->cl_foreach) ((unsigned char) type, foreach_context);</div><div class='add'>+ if (status <= 0)</div><div class='add'>+ {</div><div class='add'>+ if (status == 0)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ (*cl->cl_foreach_close) ((unsigned char) type, foreach_context);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ inner_interp (block);</div><div class='add'>+ if (Lang_Break) break;</div><div class='add'>+ Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+ }</div><div class='add'>+ (*cl->cl_foreach_close) ((unsigned char) type, foreach_context);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_WHILE:</div><div class='add'>+ loop_name = "while";</div><div class='add'>+</div><div class='add'>+ if (num_blocks != 2)</div><div class='add'>+ goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+ type = blks[1]->bc_main_type;</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ inner_interp (block);</div><div class='add'>+ if (Lang_Break) break;</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_ctrl_integer (&ctrl))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (ctrl == 0) break;</div><div class='add'>+</div><div class='add'>+ if (type)</div><div class='add'>+ {</div><div class='add'>+ inner_interp (blks[1]);</div><div class='add'>+ if (Lang_Break) break;</div><div class='add'>+ Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_DOWHILE:</div><div class='add'>+ loop_name = "do...while";</div><div class='add'>+</div><div class='add'>+ if (num_blocks != 2)</div><div class='add'>+ goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+ inner_interp (block);</div><div class='add'>+ if (Lang_Break) break;</div><div class='add'>+ Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+ inner_interp (blks[1]);</div><div class='add'>+ if (-1 == pop_ctrl_integer (&ctrl))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (ctrl == 0) break;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_CFOR:</div><div class='add'>+ loop_name = "for";</div><div class='add'>+</div><div class='add'>+ /* we need 4 blocks: first 3 control, the last is code */</div><div class='add'>+ if (num_blocks != 4) goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+ inner_interp (block);</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ inner_interp(blks[1]); /* test */</div><div class='add'>+ if (-1 == pop_ctrl_integer (&ctrl))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (ctrl == 0) break;</div><div class='add'>+ inner_interp(blks[3]); /* code */</div><div class='add'>+ if (Lang_Break) break;</div><div class='add'>+ inner_interp(blks[2]); /* bump */</div><div class='add'>+ Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_FOR:</div><div class='add'>+ loop_name = "_for";</div><div class='add'>+</div><div class='add'>+ if (num_blocks != 1)</div><div class='add'>+ goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+ /* 3 elements: first, last, step */</div><div class='add'>+ if ((-1 == SLang_pop_integer (&ctrl))</div><div class='add'>+ || (-1 == SLang_pop_integer (&last))</div><div class='add'>+ || (-1 == SLang_pop_integer (&first)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ i = first;</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ /* It is ugly to have this test here but I do not know of a</div><div class='add'>+ * simple way to do this without using two while loops.</div><div class='add'>+ */</div><div class='add'>+ if (ctrl >= 0)</div><div class='add'>+ {</div><div class='add'>+ if (i > last) break;</div><div class='add'>+ }</div><div class='add'>+ else if (i < last) break;</div><div class='add'>+</div><div class='add'>+ if (SLang_Error) goto return_error;</div><div class='add'>+</div><div class='add'>+ SLclass_push_int_obj (SLANG_INT_TYPE, i);</div><div class='add'>+ inner_interp (block);</div><div class='add'>+ if (Lang_Break) break;</div><div class='add'>+ Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+</div><div class='add'>+ i += ctrl;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_LOOP:</div><div class='add'>+ loop_name = "loop";</div><div class='add'>+ if (num_blocks != 1)</div><div class='add'>+ goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_integer (&ctrl))</div><div class='add'>+ goto return_error;</div><div class='add'>+ while (ctrl > 0)</div><div class='add'>+ {</div><div class='add'>+ ctrl--;</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ inner_interp (block);</div><div class='add'>+ if (Lang_Break) break;</div><div class='add'>+ Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_FOREVER:</div><div class='add'>+ loop_name = "forever";</div><div class='add'>+</div><div class='add'>+ if (num_blocks != 1)</div><div class='add'>+ goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ inner_interp (block);</div><div class='add'>+ if (Lang_Break) break;</div><div class='add'>+ Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default: SLang_verror(SL_INTERNAL_ERROR, "Unknown loop type");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ Lang_Break = /* Lang_Continue = */ 0;</div><div class='add'>+ Lang_Break_Condition = Lang_Return;</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ wrong_num_blocks_error:</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Wrong number of blocks for '%s' construct", loop_name);</div><div class='add'>+</div><div class='add'>+ /* drop */</div><div class='add'>+ return_error:</div><div class='add'>+ do_traceback (loop_name, 0, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void lang_do_and_orelse (unsigned char stype, SLBlock_Type *addr, SLBlock_Type *addr_max)</div><div class='add'>+{</div><div class='add'>+ int test = 0;</div><div class='add'>+ int is_or;</div><div class='add'>+</div><div class='add'>+ is_or = (stype == _SLANG_BCST_ORELSE);</div><div class='add'>+</div><div class='add'>+ while (addr <= addr_max)</div><div class='add'>+ {</div><div class='add'>+ if (addr->bc_main_type == _SLANG_BC_LINE_NUM)</div><div class='add'>+ {</div><div class='add'>+ addr++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ inner_interp (addr->b.blk);</div><div class='add'>+ if (SLang_Error</div><div class='add'>+ || Lang_Break_Condition</div><div class='add'>+ || (-1 == pop_ctrl_integer (&test)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (is_or == (test != 0))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* if (((stype == _SLANG_BCST_ANDELSE) && (test == 0))</div><div class='add'>+ * || ((stype == _SLANG_BCST_ORELSE) && test))</div><div class='add'>+ * break;</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ addr++;</div><div class='add'>+ }</div><div class='add'>+ SLclass_push_int_obj (SLANG_INT_TYPE, test);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_else_if (SLBlock_Type *zero_block, SLBlock_Type *non_zero_block)</div><div class='add'>+{</div><div class='add'>+ int test;</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_ctrl_integer (&test))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (test == 0)</div><div class='add'>+ non_zero_block = zero_block;</div><div class='add'>+</div><div class='add'>+ if (non_zero_block != NULL)</div><div class='add'>+ inner_interp (non_zero_block->b.blk);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_trace_fun (char *f)</div><div class='add'>+{</div><div class='add'>+ if (NULL == (f = SLang_create_slstring (f)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ SLang_free_slstring (Trace_Function);</div><div class='add'>+ Trace_Function = f;</div><div class='add'>+ _SLang_Trace = 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLdump_objects (char *prefix, SLang_Object_Type *x, unsigned int n, int dir)</div><div class='add'>+{</div><div class='add'>+ char *s;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ while (n)</div><div class='add'>+ {</div><div class='add'>+ cl = _SLclass_get_class (x->data_type);</div><div class='add'>+</div><div class='add'>+ if (NULL == (s = _SLstringize_object (x)))</div><div class='add'>+ s = "??";</div><div class='add'>+</div><div class='add'>+ call_dump_routine ("%s[%s]:%s\n", prefix, cl->cl_name, s);</div><div class='add'>+</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+</div><div class='add'>+ x += dir;</div><div class='add'>+ n--;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLBlock_Type *Exit_Block_Ptr;</div><div class='add'>+static SLBlock_Type *Global_User_Block[5];</div><div class='add'>+static SLBlock_Type **User_Block_Ptr = Global_User_Block;</div><div class='add'>+char *_SLang_Current_Function_Name = NULL;</div><div class='add'>+</div><div class='add'>+static int execute_slang_fun (_SLang_Function_Type *fun)</div><div class='add'>+{</div><div class='add'>+ register unsigned int i;</div><div class='add'>+ register SLang_Object_Type *frame, *lvf;</div><div class='add'>+ register unsigned int n_locals;</div><div class='add'>+ _SLBlock_Header_Type *header;</div><div class='add'>+ /* SLBlock_Type *val; */</div><div class='add'>+ SLBlock_Type *exit_block_save;</div><div class='add'>+ SLBlock_Type **user_block_save;</div><div class='add'>+ SLBlock_Type *user_blocks[5];</div><div class='add'>+ char *save_fname;</div><div class='add'>+</div><div class='add'>+ exit_block_save = Exit_Block_Ptr;</div><div class='add'>+ user_block_save = User_Block_Ptr;</div><div class='add'>+ User_Block_Ptr = user_blocks;</div><div class='add'>+ *(user_blocks) = NULL;</div><div class='add'>+ *(user_blocks + 1) = NULL;</div><div class='add'>+ *(user_blocks + 2) = NULL;</div><div class='add'>+ *(user_blocks + 3) = NULL;</div><div class='add'>+ *(user_blocks + 4) = NULL;</div><div class='add'>+</div><div class='add'>+ Exit_Block_Ptr = NULL;</div><div class='add'>+</div><div class='add'>+ save_fname = _SLang_Current_Function_Name;</div><div class='add'>+ _SLang_Current_Function_Name = fun->name;</div><div class='add'>+</div><div class='add'>+ _SL_increment_frame_pointer ();</div><div class='add'>+</div><div class='add'>+ /* need loaded? */</div><div class='add'>+ if (fun->nlocals == AUTOLOAD_NUM_LOCALS)</div><div class='add'>+ {</div><div class='add'>+ header = NULL;</div><div class='add'>+ if (-1 == SLang_load_file(fun->v.autoload_filename))</div><div class='add'>+ goto the_return;</div><div class='add'>+</div><div class='add'>+ if (fun->nlocals == AUTOLOAD_NUM_LOCALS)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_UNDEFINED_NAME, "%s: Function did not autoload",</div><div class='add'>+ _SLang_Current_Function_Name);</div><div class='add'>+ goto the_return;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ n_locals = fun->nlocals;</div><div class='add'>+</div><div class='add'>+ /* let the error propagate through since it will do no harm</div><div class='add'>+ and allow us to restore stack. */</div><div class='add'>+</div><div class='add'>+ /* set new stack frame */</div><div class='add'>+ lvf = frame = Local_Variable_Frame;</div><div class='add'>+ i = n_locals;</div><div class='add'>+ if ((lvf + i) > Local_Variable_Stack + SLANG_MAX_LOCAL_STACK)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror(SL_STACK_OVERFLOW, "%s: Local Variable Stack Overflow",</div><div class='add'>+ _SLang_Current_Function_Name);</div><div class='add'>+ goto the_return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Make sure we do not allow this header to get destroyed by something</div><div class='add'>+ * like: define crash () { eval ("define crash ();") }</div><div class='add'>+ */</div><div class='add'>+ header = fun->v.header;</div><div class='add'>+ header->num_refs++;</div><div class='add'>+</div><div class='add'>+ while (i--)</div><div class='add'>+ {</div><div class='add'>+ lvf++;</div><div class='add'>+ lvf->data_type = SLANG_UNDEFINED_TYPE;</div><div class='add'>+ }</div><div class='add'>+ Local_Variable_Frame = lvf;</div><div class='add'>+</div><div class='add'>+ /* read values of function arguments */</div><div class='add'>+ i = fun->nargs;</div><div class='add'>+ while (i > 0)</div><div class='add'>+ {</div><div class='add'>+ i--;</div><div class='add'>+ (void) SLang_pop (Local_Variable_Frame - i);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (SLang_Enter_Function != NULL) (*SLang_Enter_Function)(_SLang_Current_Function_Name);</div><div class='add'>+</div><div class='add'>+ if (_SLang_Trace)</div><div class='add'>+ {</div><div class='add'>+ int stack_depth;</div><div class='add'>+</div><div class='add'>+ stack_depth = _SLstack_depth ();</div><div class='add'>+</div><div class='add'>+ if ((Trace_Function != NULL)</div><div class='add'>+ && (0 == strcmp (Trace_Function, _SLang_Current_Function_Name))</div><div class='add'>+ && (Trace_Mode == 0))</div><div class='add'>+ Trace_Mode = 1;</div><div class='add'>+</div><div class='add'>+ if (Trace_Mode)</div><div class='add'>+ {</div><div class='add'>+ /* The local variable frame grows backwards */</div><div class='add'>+ trace_dump (">>%s (%d args)\n",</div><div class='add'>+ _SLang_Current_Function_Name,</div><div class='add'>+ Local_Variable_Frame,</div><div class='add'>+ (int) fun->nargs,</div><div class='add'>+ -1);</div><div class='add'>+ Trace_Mode++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ inner_interp (header->body);</div><div class='add'>+ Lang_Break_Condition = Lang_Return = Lang_Break = 0;</div><div class='add'>+ if (Exit_Block_Ptr != NULL) inner_interp(Exit_Block_Ptr);</div><div class='add'>+</div><div class='add'>+ if (Trace_Mode)</div><div class='add'>+ {</div><div class='add'>+ Trace_Mode--;</div><div class='add'>+ stack_depth = _SLstack_depth () - stack_depth;</div><div class='add'>+</div><div class='add'>+ trace_dump ("<<%s (returning %d values)\n",</div><div class='add'>+ _SLang_Current_Function_Name,</div><div class='add'>+ _SLStack_Pointer - stack_depth,</div><div class='add'>+ stack_depth,</div><div class='add'>+ 1);</div><div class='add'>+</div><div class='add'>+ if (Trace_Mode == 1)</div><div class='add'>+ Trace_Mode = 0;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ inner_interp (header->body);</div><div class='add'>+ Lang_Break_Condition = Lang_Return = Lang_Break = 0;</div><div class='add'>+ if (Exit_Block_Ptr != NULL) inner_interp(Exit_Block_Ptr);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (SLang_Exit_Function != NULL) (*SLang_Exit_Function)(_SLang_Current_Function_Name);</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ do_traceback(fun->name, n_locals,</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ fun->file</div><div class='add'>+#else</div><div class='add'>+ NULL</div><div class='add'>+#endif</div><div class='add'>+ );</div><div class='add'>+</div><div class='add'>+ /* free local variables.... */</div><div class='add'>+ lvf = Local_Variable_Frame;</div><div class='add'>+ while (lvf > frame)</div><div class='add'>+ {</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [lvf->data_type])</div><div class='add'>+#endif</div><div class='add'>+ SLang_free_object (lvf);</div><div class='add'>+ lvf--;</div><div class='add'>+ }</div><div class='add'>+ Local_Variable_Frame = lvf;</div><div class='add'>+</div><div class='add'>+ if (header->num_refs == 1)</div><div class='add'>+ free_function_header (header);</div><div class='add'>+ else</div><div class='add'>+ header->num_refs--;</div><div class='add'>+</div><div class='add'>+ the_return:</div><div class='add'>+</div><div class='add'>+ Lang_Break_Condition = Lang_Return = Lang_Break = 0;</div><div class='add'>+ Exit_Block_Ptr = exit_block_save;</div><div class='add'>+ User_Block_Ptr = user_block_save;</div><div class='add'>+ _SLang_Current_Function_Name = save_fname;</div><div class='add'>+ _SL_decrement_frame_pointer ();</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_traceback (char *name, unsigned int locals, char *file)</div><div class='add'>+{</div><div class='add'>+ char *s;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ SLang_Object_Type *objp;</div><div class='add'>+ unsigned short stype;</div><div class='add'>+</div><div class='add'>+ /* FIXME: Priority=low</div><div class='add'>+ * I need to make this configurable!!! That is, let the</div><div class='add'>+ * application decide whether or not a usage error should result in a</div><div class='add'>+ * traceback.</div><div class='add'>+ */</div><div class='add'>+ if (SLang_Error == SL_USAGE_ERROR)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (SLang_Traceback == 0)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ call_dump_routine ("S-Lang Traceback: %s\n", name);</div><div class='add'>+ if (SLang_Traceback < 0)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (file != NULL)</div><div class='add'>+ call_dump_routine ("File: %s\n", file);</div><div class='add'>+</div><div class='add'>+ if (locals == 0)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ call_dump_routine (" Local Variables:\n");</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < locals; i++)</div><div class='add'>+ {</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ char *class_name;</div><div class='add'>+</div><div class='add'>+ objp = Local_Variable_Frame - i;</div><div class='add'>+ stype = objp->data_type;</div><div class='add'>+</div><div class='add'>+ s = _SLstringize_object (objp);</div><div class='add'>+ cl = _SLclass_get_class (stype);</div><div class='add'>+ class_name = cl->cl_name;</div><div class='add'>+</div><div class='add'>+ call_dump_routine ("\t$%d: Type: %s,\tValue:\t", i, class_name);</div><div class='add'>+</div><div class='add'>+ if (s == NULL) call_dump_routine("??\n");</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ char *q = "";</div><div class='add'>+#ifndef HAVE_VSNPRINTF</div><div class='add'>+ char buf[256];</div><div class='add'>+ if (strlen (s) >= sizeof (buf))</div><div class='add'>+ {</div><div class='add'>+ strncpy (buf, s, sizeof(buf));</div><div class='add'>+ s = buf;</div><div class='add'>+ s[sizeof(buf) - 1] = 0;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ if (SLANG_STRING_TYPE == stype) q = "\"";</div><div class='add'>+ call_dump_routine ("%s%s%s\n", q, s, q);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_app_unary (SLang_App_Unary_Type *nt)</div><div class='add'>+{</div><div class='add'>+ if (-1 == do_unary (nt->unary_op, nt->name_type))</div><div class='add'>+ do_traceback (nt->name, 0, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int inner_interp_nametype (SLang_Name_Type *nt)</div><div class='add'>+{</div><div class='add'>+ SLBlock_Type bc_blks[2];</div><div class='add'>+</div><div class='add'>+ bc_blks[0].b.nt_blk = nt;</div><div class='add'>+ bc_blks[0].bc_main_type = nt->name_type;</div><div class='add'>+ bc_blks[1].bc_main_type = 0;</div><div class='add'>+ return inner_interp(bc_blks);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_dereference_ref (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+ if (ref == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ref->is_global == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Object_Type *obj = ref->v.local_obj;</div><div class='add'>+ if (obj > Local_Variable_Frame)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_UNDEFINED_NAME, "Local variable deref is out of scope");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return _SLpush_slang_obj (ref->v.local_obj);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ (void) inner_interp_nametype (ref->v.nt);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_is_ref_initialized (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+ unsigned char type;</div><div class='add'>+</div><div class='add'>+ if (ref == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ref->is_global == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Object_Type *obj = ref->v.local_obj;</div><div class='add'>+ if (obj > Local_Variable_Frame)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_UNDEFINED_NAME, "Local variable deref is out of scope");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ type = ref->v.local_obj->data_type;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ SLang_Name_Type *nt = ref->v.nt;</div><div class='add'>+ if ((nt->name_type != SLANG_GVARIABLE)</div><div class='add'>+ && (nt->name_type != SLANG_PVARIABLE))</div><div class='add'>+ return 1;</div><div class='add'>+ type = ((SLang_Global_Var_Type *)nt)->obj.data_type;</div><div class='add'>+ }</div><div class='add'>+ return type != SLANG_UNDEFINED_TYPE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_uninitialize_ref (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+ if (ref == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ref->is_global == 0)</div><div class='add'>+ {</div><div class='add'>+ obj = ref->v.local_obj;</div><div class='add'>+ if (obj > Local_Variable_Frame)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_UNDEFINED_NAME, "Local variable deref is out of scope");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ obj = ref->v.local_obj;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ SLang_Name_Type *nt = ref->v.nt;</div><div class='add'>+ if ((nt->name_type != SLANG_GVARIABLE)</div><div class='add'>+ && (nt->name_type != SLANG_PVARIABLE))</div><div class='add'>+ return -1;</div><div class='add'>+ obj = &((SLang_Global_Var_Type *)nt)->obj;</div><div class='add'>+ }</div><div class='add'>+ SLang_free_object (obj);</div><div class='add'>+ obj->data_type = SLANG_UNDEFINED_TYPE;</div><div class='add'>+ obj->v.ptr_val = NULL;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void (*SLang_Interrupt)(void);</div><div class='add'>+static int Last_Error;</div><div class='add'>+void (*SLang_User_Clear_Error)(void);</div><div class='add'>+void _SLang_clear_error (void)</div><div class='add'>+{</div><div class='add'>+ if (Last_Error <= 0)</div><div class='add'>+ {</div><div class='add'>+ Last_Error = 0;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ Last_Error--;</div><div class='add'>+ if (SLang_User_Clear_Error != NULL) (*SLang_User_Clear_Error)();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLpush_slang_obj (SLang_Object_Type *obj)</div><div class='add'>+{</div><div class='add'>+ unsigned char subtype;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (obj == NULL) return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+ subtype = obj->data_type;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type[subtype])</div><div class='add'>+ return SLang_push (obj);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (subtype);</div><div class='add'>+ return (*cl->cl_push) (subtype, (VOID_STAR) &obj->v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static int push_local_variable (int i)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ SLang_Object_Type *obj;</div><div class='add'>+ unsigned char subtype;</div><div class='add'>+</div><div class='add'>+ obj = Local_Variable_Frame - i;</div><div class='add'>+ subtype = obj->data_type;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type[subtype])</div><div class='add'>+ return SLang_push (obj);</div><div class='add'>+ if (subtype == SLANG_STRING_TYPE)</div><div class='add'>+ return _SLang_dup_and_push_slstring (obj->v.s_val);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (subtype);</div><div class='add'>+ return (*cl->cl_push) (subtype, (VOID_STAR) &obj->v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_intrinsic_variable (SLang_Intrin_Var_Type *ivar)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ unsigned char stype;</div><div class='add'>+</div><div class='add'>+ stype = ivar->type;</div><div class='add'>+ cl = _SLclass_get_class (stype);</div><div class='add'>+</div><div class='add'>+ if (-1 == (*cl->cl_push_intrinsic) (stype, ivar->addr))</div><div class='add'>+ {</div><div class='add'>+ do_name_type_error ((SLang_Name_Type *) ivar);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int dereference_object (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ unsigned char type;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&obj))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ type = obj.data_type;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ ret = (*cl->cl_dereference)(type, (VOID_STAR) &obj.v);</div><div class='add'>+</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int case_function (void)</div><div class='add'>+{</div><div class='add'>+ unsigned char type;</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ SLang_Object_Type *swobjptr;</div><div class='add'>+</div><div class='add'>+ swobjptr = Switch_Obj_Ptr - 1;</div><div class='add'>+</div><div class='add'>+ if ((swobjptr < Switch_Objects)</div><div class='add'>+ || (0 == (type = swobjptr->data_type)))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Misplaced 'case' keyword");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&obj))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (obj.data_type != type)</div><div class='add'>+ {</div><div class='add'>+ SLang_Class_Type *a_cl, *b_cl;</div><div class='add'>+</div><div class='add'>+ a_cl = _SLclass_get_class (obj.data_type);</div><div class='add'>+ b_cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+ if (NULL == _SLclass_get_binary_fun (SLANG_EQ, a_cl, b_cl, &a_cl, 0))</div><div class='add'>+ {</div><div class='add'>+ (void) SLclass_push_int_obj (SLANG_INT_TYPE, 0);</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ (void) do_binary_ab (SLANG_EQ, swobjptr, &obj);</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void tmp_variable_function (SLBlock_Type *addr)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+ switch (addr->bc_sub_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_GVARIABLE:</div><div class='add'>+ case SLANG_PVARIABLE:</div><div class='add'>+ obj = &addr->b.nt_gvar_blk->obj;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_LVARIABLE:</div><div class='add'>+ obj = Local_Variable_Frame - addr->b.i_blk;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* There is no need to go through higher level routines since we are</div><div class='add'>+ * not creating or destroying extra copies.</div><div class='add'>+ */</div><div class='add'>+ if (-1 == SLang_push (obj))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ obj->data_type = SLANG_UNDEFINED_TYPE;</div><div class='add'>+ obj->v.ptr_val = NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+do_inner_interp_error (SLBlock_Type *err_block,</div><div class='add'>+ SLBlock_Type *addr_start,</div><div class='add'>+ SLBlock_Type *addr)</div><div class='add'>+{</div><div class='add'>+ int save_err, slerr;</div><div class='add'>+</div><div class='add'>+ /* Someday I can use the these variable to provide extra information</div><div class='add'>+ * about what went wrong.</div><div class='add'>+ */</div><div class='add'>+ (void) addr_start;</div><div class='add'>+ (void) addr;</div><div class='add'>+</div><div class='add'>+ if (err_block == NULL)</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (SLang_Error < 0) /* errors less than 0 are severe */</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ save_err = Last_Error++;</div><div class='add'>+ slerr = SLang_Error;</div><div class='add'>+ SLang_Error = 0;</div><div class='add'>+ inner_interp (err_block->b.blk);</div><div class='add'>+</div><div class='add'>+ if (Last_Error <= save_err)</div><div class='add'>+ {</div><div class='add'>+ /* Caught error and cleared it */</div><div class='add'>+ Last_Error = save_err;</div><div class='add'>+ if ((Lang_Break_Condition == 0)</div><div class='add'>+ /* An error may have cleared the error and then caused the</div><div class='add'>+ * function to return. We will allow that but let's not allow</div><div class='add'>+ * 'break' nor 'continue' statements until later.</div><div class='add'>+ */</div><div class='add'>+ || Lang_Return)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ /* drop--- either a break or continue was called */</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Last_Error = save_err;</div><div class='add'>+ SLang_Error = slerr;</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ while (addr >= addr_start)</div><div class='add'>+ {</div><div class='add'>+ if (addr->bc_main_type == _SLANG_BC_LINE_NUM)</div><div class='add'>+ {</div><div class='add'>+ char buf[256];</div><div class='add'>+ sprintf (buf, "(Error occurred on line %lu)", addr->b.l_blk);</div><div class='add'>+ do_traceback (buf, 0, NULL);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ /* Special hack for 16 bit systems to prevent pointer wrapping. */</div><div class='add'>+#if defined(__16_BIT_SYSTEM__)</div><div class='add'>+ if (addr == addr_start)</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ addr--;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#define GATHER_STATISTICS 0</div><div class='add'>+#if GATHER_STATISTICS</div><div class='add'>+static unsigned int Bytecodes[0xFFFF];</div><div class='add'>+</div><div class='add'>+static void print_stats (void)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+ unsigned long total;</div><div class='add'>+ FILE *fp = fopen ("stats.txt", "w");</div><div class='add'>+ if (fp == NULL)</div><div class='add'>+ return;</div><div class='add'>+ </div><div class='add'>+ total = 0;</div><div class='add'>+ for (i = 0; i < 0xFFFF; i++)</div><div class='add'>+ total += Bytecodes[i];</div><div class='add'>+ </div><div class='add'>+ if (total == 0)</div><div class='add'>+ total = 1;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 0xFFFF; i++)</div><div class='add'>+ {</div><div class='add'>+ if (Bytecodes[i])</div><div class='add'>+ fprintf (fp, "0x%04X %9u %e\n", i, Bytecodes[i], Bytecodes[i]/(double) total);</div><div class='add'>+ }</div><div class='add'>+ fclose (fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void add_to_statistics (SLBlock_Type *b)</div><div class='add'>+{</div><div class='add'>+ unsigned short x, y;</div><div class='add'>+ </div><div class='add'>+ x = b->bc_main_type;</div><div class='add'>+ if (x == 0)</div><div class='add'>+ {</div><div class='add'>+ Bytecodes[0] += 1;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ b++;</div><div class='add'>+ y = b->bc_main_type;</div><div class='add'>+</div><div class='add'>+ Bytecodes[(x << 8) | y] += 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* inner interpreter */</div><div class='add'>+/* The return value from this function is only meaningful when it is used</div><div class='add'>+ * to process blocks for the switch statement. If it returns 0, the calling</div><div class='add'>+ * routine should pass the next block to it. Otherwise it will</div><div class='add'>+ * return non-zero, with or without error.</div><div class='add'>+ */</div><div class='add'>+static int inner_interp (SLBlock_Type *addr_start)</div><div class='add'>+{</div><div class='add'>+ SLBlock_Type *block, *err_block, *addr;</div><div class='add'>+#if GATHER_STATISTICS</div><div class='add'>+ static int inited = 0;</div><div class='add'>+</div><div class='add'>+ if (inited == 0)</div><div class='add'>+ {</div><div class='add'>+ (void) SLang_add_cleanup_function (print_stats);</div><div class='add'>+ inited = 1;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ /* for systems that have no real interrupt facility (e.g. go32 on dos) */</div><div class='add'>+ if (SLang_Interrupt != NULL) (*SLang_Interrupt)();</div><div class='add'>+</div><div class='add'>+ block = err_block = NULL;</div><div class='add'>+ addr = addr_start;</div><div class='add'>+</div><div class='add'>+#if GATHER_STATISTICS</div><div class='add'>+ add_to_statistics (addr);</div><div class='add'>+#endif</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ switch (addr->bc_main_type)</div><div class='add'>+ {</div><div class='add'>+ case 0:</div><div class='add'>+ return 1;</div><div class='add'>+ case _SLANG_BC_LVARIABLE:</div><div class='add'>+ push_local_variable (addr->b.i_blk);</div><div class='add'>+ break;</div><div class='add'>+ case _SLANG_BC_GVARIABLE:</div><div class='add'>+ if (-1 == _SLpush_slang_obj (&addr->b.nt_gvar_blk->obj))</div><div class='add'>+ do_name_type_error (addr->b.nt_blk);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_IVARIABLE:</div><div class='add'>+ case _SLANG_BC_RVARIABLE:</div><div class='add'>+ push_intrinsic_variable (addr->b.nt_ivar_blk);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_INTRINSIC:</div><div class='add'>+ execute_intrinsic_fun (addr->b.nt_ifun_blk);</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ do_traceback(addr->b.nt_ifun_blk->name, 0, NULL);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_FUNCTION:</div><div class='add'>+ execute_slang_fun (addr->b.nt_fun_blk);</div><div class='add'>+ if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_MATH_UNARY:</div><div class='add'>+ case _SLANG_BC_APP_UNARY:</div><div class='add'>+ /* Make sure we treat these like function calls since the</div><div class='add'>+ * parser took sin(x) to be a function call.</div><div class='add'>+ */</div><div class='add'>+ if (0 == _SL_increment_frame_pointer ())</div><div class='add'>+ {</div><div class='add'>+ do_app_unary (addr->b.nt_unary_blk);</div><div class='add'>+ (void) _SL_decrement_frame_pointer ();</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_ICONST:</div><div class='add'>+ SLclass_push_int_obj (SLANG_INT_TYPE, addr->b.iconst_blk->i);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ case _SLANG_BC_DCONST:</div><div class='add'>+ SLang_push_double (addr->b.dconst_blk->d);</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_PVARIABLE:</div><div class='add'>+ if (-1 == _SLpush_slang_obj (&addr->b.nt_gvar_blk->obj))</div><div class='add'>+ do_name_type_error (addr->b.nt_blk);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_PFUNCTION:</div><div class='add'>+ execute_slang_fun (addr->b.nt_fun_blk);</div><div class='add'>+ if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_BINARY:</div><div class='add'>+ do_binary (addr->b.i_blk);</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case _SLANG_BC_LITERAL:</div><div class='add'>+#if !_SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ case _SLANG_BC_LITERAL_INT:</div><div class='add'>+ case _SLANG_BC_LITERAL_STR:</div><div class='add'>+#endif</div><div class='add'>+ {</div><div class='add'>+ SLang_Class_Type *cl = _SLclass_get_class (addr->bc_sub_type);</div><div class='add'>+ (*cl->cl_push_literal) (addr->bc_sub_type, (VOID_STAR) &addr->b.ptr_blk);</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ case _SLANG_BC_LITERAL_INT:</div><div class='add'>+ SLclass_push_int_obj (addr->bc_sub_type, (int) addr->b.l_blk);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_LITERAL_STR:</div><div class='add'>+ _SLang_dup_and_push_slstring (addr->b.s_blk);</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ case _SLANG_BC_BLOCK:</div><div class='add'>+ switch (addr->bc_sub_type)</div><div class='add'>+ {</div><div class='add'>+ case _SLANG_BCST_ERROR_BLOCK:</div><div class='add'>+ err_block = addr;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_EXIT_BLOCK:</div><div class='add'>+ Exit_Block_Ptr = addr->b.blk;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_USER_BLOCK0:</div><div class='add'>+ case _SLANG_BCST_USER_BLOCK1:</div><div class='add'>+ case _SLANG_BCST_USER_BLOCK2:</div><div class='add'>+ case _SLANG_BCST_USER_BLOCK3:</div><div class='add'>+ case _SLANG_BCST_USER_BLOCK4:</div><div class='add'>+ User_Block_Ptr[addr->bc_sub_type - _SLANG_BCST_USER_BLOCK0] = addr->b.blk;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_LOOP:</div><div class='add'>+ case _SLANG_BCST_WHILE:</div><div class='add'>+ case _SLANG_BCST_FOR:</div><div class='add'>+ case _SLANG_BCST_FOREVER:</div><div class='add'>+ case _SLANG_BCST_CFOR:</div><div class='add'>+ case _SLANG_BCST_DOWHILE:</div><div class='add'>+ case _SLANG_BCST_FOREACH:</div><div class='add'>+ if (block == NULL) block = addr;</div><div class='add'>+ lang_do_loops(addr->bc_sub_type, block, 1 + (unsigned int) (addr - block));</div><div class='add'>+ block = NULL;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_IFNOT:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ {</div><div class='add'>+ int i;</div><div class='add'>+ </div><div class='add'>+ if ((0 == pop_ctrl_integer (&i)) && (i == 0))</div><div class='add'>+ inner_interp (addr->b.blk);</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ do_else_if (addr, NULL);</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_IF:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ {</div><div class='add'>+ int i;</div><div class='add'>+ </div><div class='add'>+ if ((0 == pop_ctrl_integer (&i)) && i)</div><div class='add'>+ inner_interp (addr->b.blk);</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ do_else_if (NULL, addr);</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_NOTELSE:</div><div class='add'>+ do_else_if (block, addr);</div><div class='add'>+ block = NULL;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_ELSE:</div><div class='add'>+ do_else_if (addr, block);</div><div class='add'>+ block = NULL;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_SWITCH:</div><div class='add'>+ if (Switch_Obj_Ptr == Switch_Obj_Max)</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror("switch nesting too deep");</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ (void) SLang_pop (Switch_Obj_Ptr);</div><div class='add'>+ Switch_Obj_Ptr++;</div><div class='add'>+</div><div class='add'>+ if (block == NULL) block = addr;</div><div class='add'>+ while ((SLang_Error == 0)</div><div class='add'>+ && (block <= addr)</div><div class='add'>+ && (Lang_Break_Condition == 0)</div><div class='add'>+ && (0 == inner_interp (block->b.blk)))</div><div class='add'>+ block++;</div><div class='add'>+ Switch_Obj_Ptr--;</div><div class='add'>+ SLang_free_object (Switch_Obj_Ptr);</div><div class='add'>+ Switch_Obj_Ptr->data_type = 0;</div><div class='add'>+ block = NULL;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BCST_ANDELSE:</div><div class='add'>+ case _SLANG_BCST_ORELSE:</div><div class='add'>+ if (block == NULL) block = addr;</div><div class='add'>+ lang_do_and_orelse (addr->bc_sub_type, block, addr);</div><div class='add'>+ block = NULL;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ if (block == NULL) block = addr;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_RETURN:</div><div class='add'>+ Lang_Break_Condition = Lang_Return = Lang_Break = 1; return 1;</div><div class='add'>+ case _SLANG_BC_BREAK:</div><div class='add'>+ Lang_Break_Condition = Lang_Break = 1; return 1;</div><div class='add'>+ case _SLANG_BC_CONTINUE:</div><div class='add'>+ Lang_Break_Condition = /* Lang_Continue = */ 1; return 1;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_EXCH:</div><div class='add'>+ (void) SLreverse_stack (2);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_LABEL:</div><div class='add'>+ {</div><div class='add'>+ int test;</div><div class='add'>+ if ((0 == SLang_pop_integer (&test))</div><div class='add'>+ && (test == 0))</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_LOBJPTR:</div><div class='add'>+ (void)_SLang_push_ref (0, (VOID_STAR)(Local_Variable_Frame - addr->b.i_blk));</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_GOBJPTR:</div><div class='add'>+ (void)_SLang_push_ref (1, (VOID_STAR)addr->b.nt_blk);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_X_ERROR:</div><div class='add'>+ if (err_block != NULL)</div><div class='add'>+ {</div><div class='add'>+ inner_interp(err_block->b.blk);</div><div class='add'>+ if (SLang_Error) err_block = NULL;</div><div class='add'>+ }</div><div class='add'>+ else SLang_verror(SL_SYNTAX_ERROR, "No ERROR_BLOCK");</div><div class='add'>+ if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_X_USER0:</div><div class='add'>+ case _SLANG_BC_X_USER1:</div><div class='add'>+ case _SLANG_BC_X_USER2:</div><div class='add'>+ case _SLANG_BC_X_USER3:</div><div class='add'>+ case _SLANG_BC_X_USER4:</div><div class='add'>+ if (User_Block_Ptr[addr->bc_main_type - _SLANG_BC_X_USER0] != NULL)</div><div class='add'>+ {</div><div class='add'>+ inner_interp(User_Block_Ptr[addr->bc_main_type - _SLANG_BC_X_USER0]);</div><div class='add'>+ }</div><div class='add'>+ else SLang_verror(SL_SYNTAX_ERROR, "No block for X_USERBLOCK");</div><div class='add'>+ if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_CALL_DIRECT:</div><div class='add'>+ (*addr->b.call_function) ();</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_CALL_DIRECT_FRAME:</div><div class='add'>+ do_bc_call_direct_frame (addr->b.call_function);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_UNARY:</div><div class='add'>+ do_unary (addr->b.i_blk, _SLANG_BC_UNARY);</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case _SLANG_BC_UNARY_FUNC:</div><div class='add'>+ /* Make sure we treat these like function calls since the</div><div class='add'>+ * parser took abs(x) to be a function call.</div><div class='add'>+ */</div><div class='add'>+ if (0 == _SL_increment_frame_pointer ())</div><div class='add'>+ {</div><div class='add'>+ do_unary (addr->b.i_blk, _SLANG_BC_UNARY);</div><div class='add'>+ (void) _SL_decrement_frame_pointer ();</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case _SLANG_BC_DEREF_ASSIGN:</div><div class='add'>+ set_deref_lvalue (addr);</div><div class='add'>+ break;</div><div class='add'>+ case _SLANG_BC_SET_LOCAL_LVALUE:</div><div class='add'>+ set_lvalue_obj (addr->bc_sub_type, Local_Variable_Frame - addr->b.i_blk);</div><div class='add'>+ break;</div><div class='add'>+ case _SLANG_BC_SET_GLOBAL_LVALUE:</div><div class='add'>+ if (-1 == set_lvalue_obj (addr->bc_sub_type, &addr->b.nt_gvar_blk->obj))</div><div class='add'>+ do_name_type_error (addr->b.nt_blk);</div><div class='add'>+ break;</div><div class='add'>+ case _SLANG_BC_SET_INTRIN_LVALUE:</div><div class='add'>+ set_intrin_lvalue (addr);</div><div class='add'>+ break;</div><div class='add'>+ case _SLANG_BC_SET_STRUCT_LVALUE:</div><div class='add'>+ set_struct_lvalue (addr);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_FIELD:</div><div class='add'>+ (void) push_struct_field (addr->b.s_blk);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_SET_ARRAY_LVALUE:</div><div class='add'>+ set_array_lvalue (addr->bc_sub_type);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ case _SLANG_BC_LINE_NUM:</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ </div><div class='add'>+ case _SLANG_BC_TMP:</div><div class='add'>+ tmp_variable_function (addr);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ case _SLANG_BC_LVARIABLE_AGET:</div><div class='add'>+ if (0 == push_local_variable (addr->b.i_blk))</div><div class='add'>+ do_bc_call_direct_frame (_SLarray_aget);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_LVARIABLE_APUT:</div><div class='add'>+ if (0 == push_local_variable (addr->b.i_blk))</div><div class='add'>+ do_bc_call_direct_frame (_SLarray_aput);</div><div class='add'>+ break;</div><div class='add'>+ case _SLANG_BC_INTEGER_PLUS:</div><div class='add'>+ if (0 == SLclass_push_int_obj (addr->bc_sub_type, (int) addr->b.l_blk))</div><div class='add'>+ do_binary (SLANG_PLUS);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_INTEGER_MINUS:</div><div class='add'>+ if (0 == SLclass_push_int_obj (addr->bc_sub_type, (int) addr->b.l_blk))</div><div class='add'>+ do_binary (SLANG_MINUS);</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+#if 0</div><div class='add'>+ case _SLANG_BC_ARG_LVARIABLE:</div><div class='add'>+ (void) SLang_start_arg_list ();</div><div class='add'>+ push_local_variable (addr->b.i_blk);</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ case _SLANG_BC_EARG_LVARIABLE:</div><div class='add'>+ push_local_variable (addr->b.i_blk);</div><div class='add'>+ (void) SLang_end_arg_list ();</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+#if USE_COMBINED_BYTECODES</div><div class='add'>+ case _SLANG_BC_CALL_DIRECT_INTRINSIC:</div><div class='add'>+ (*addr->b.call_function) ();</div><div class='add'>+ addr++;</div><div class='add'>+ execute_intrinsic_fun (addr->b.nt_ifun_blk);</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ do_traceback(addr->b.nt_ifun_blk->name, 0, NULL);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_INTRINSIC_CALL_DIRECT:</div><div class='add'>+ execute_intrinsic_fun (addr->b.nt_ifun_blk);</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ {</div><div class='add'>+ do_traceback(addr->b.nt_ifun_blk->name, 0, NULL);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ addr++;</div><div class='add'>+ (*addr->b.call_function) ();</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_CALL_DIRECT_LSTR:</div><div class='add'>+ (*addr->b.call_function) ();</div><div class='add'>+ addr++;</div><div class='add'>+ _SLang_dup_and_push_slstring (addr->b.s_blk);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_CALL_DIRECT_SLFUN:</div><div class='add'>+ (*addr->b.call_function) ();</div><div class='add'>+ addr++;</div><div class='add'>+ execute_slang_fun (addr->b.nt_fun_blk);</div><div class='add'>+ if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_CALL_DIRECT_INTRSTOP:</div><div class='add'>+ (*addr->b.call_function) ();</div><div class='add'>+ addr++;</div><div class='add'>+ /* drop */</div><div class='add'>+ case _SLANG_BC_INTRINSIC_STOP:</div><div class='add'>+ execute_intrinsic_fun (addr->b.nt_ifun_blk);</div><div class='add'>+ if (SLang_Error == 0)</div><div class='add'>+ return 1;</div><div class='add'>+ do_traceback(addr->b.nt_ifun_blk->name, 0, NULL);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_CALL_DIRECT_EARG_LVAR:</div><div class='add'>+ (*addr->b.call_function) ();</div><div class='add'>+ addr++;</div><div class='add'>+ push_local_variable (addr->b.i_blk);</div><div class='add'>+ (void) SLang_end_arg_list ();</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_CALL_DIRECT_LINT:</div><div class='add'>+ (*addr->b.call_function) ();</div><div class='add'>+ addr++;</div><div class='add'>+ SLclass_push_int_obj (addr->bc_sub_type, (int) addr->b.l_blk);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_CALL_DIRECT_LVAR:</div><div class='add'>+ (*addr->b.call_function) ();</div><div class='add'>+ addr++;</div><div class='add'>+ push_local_variable (addr->b.i_blk);</div><div class='add'>+ break;</div><div class='add'>+#endif /* USE_COMBINED_BYTECODES */</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ SLang_verror (SL_INTERNAL_ERROR, "Byte-Code 0x%X is not valid", addr->bc_main_type);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Someday I plan to add a 'signal' intrinsic function. Then when a</div><div class='add'>+ * signal is caught, a variable will be set to one and that value of</div><div class='add'>+ * that variable will need to be monitored here, e.g.,</div><div class='add'>+ * if (Handle_Signal) handle_signal ();</div><div class='add'>+ * It would be nice to check only one variable instead of Handle_Signal</div><div class='add'>+ * and SLang_Error. Perhaps I should phase out SLang_Error = xxx</div><div class='add'>+ * and used something like: SLang_set_error (code); Then, I could</div><div class='add'>+ * use:</div><div class='add'>+ * if (Handle_Condition)</div><div class='add'>+ * {</div><div class='add'>+ * Handle_Condition = 0;</div><div class='add'>+ * if (SLang_Error) ....</div><div class='add'>+ * else if (Handle_Signal) handle_signal ();</div><div class='add'>+ * else....</div><div class='add'>+ * }</div><div class='add'>+ */</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == do_inner_interp_error (err_block, addr_start, addr))</div><div class='add'>+ return 1;</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+ /* Otherwise, error cleared. Continue onto next bytecode.</div><div class='add'>+ * Someday I need to add something to indicate where the</div><div class='add'>+ * next statement begins since continuing on the next</div><div class='add'>+ * bytecode is not really what is desired.</div><div class='add'>+ */</div><div class='add'>+ if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+ }</div><div class='add'>+ addr++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ handle_break_condition:</div><div class='add'>+ /* Get here if Lang_Break_Condition != 0, which implies that either</div><div class='add'>+ * Lang_Return, Lang_Break, or Lang_Continue is non zero</div><div class='add'>+ */</div><div class='add'>+ if (Lang_Return)</div><div class='add'>+ Lang_Break = 1;</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* The functions below this point are used to implement the parsed token</div><div class='add'>+ * to byte-compiled code.</div><div class='add'>+ */</div><div class='add'>+/* static SLang_Name_Type **Static_Hash_Table; */</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type **Locals_Hash_Table;</div><div class='add'>+static int Local_Variable_Number;</div><div class='add'>+static unsigned int Function_Args_Number;</div><div class='add'>+int _SLang_Auto_Declare_Globals = 0;</div><div class='add'>+int (*SLang_Auto_Declare_Var_Hook) (char *);</div><div class='add'>+</div><div class='add'>+static SLang_NameSpace_Type *This_Static_NameSpace;</div><div class='add'>+static SLang_NameSpace_Type *Global_NameSpace;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+static char *This_Compile_Filename;</div><div class='add'>+#endif</div><div class='add'>+static SLBlock_Type SLShort_Blocks[6];</div><div class='add'>+/* These are initialized in add_table below. I cannot init a Union!! */</div><div class='add'>+</div><div class='add'>+static int Lang_Defining_Function;</div><div class='add'>+static void (*Default_Variable_Mode) (_SLang_Token_Type *);</div><div class='add'>+static void (*Default_Define_Function) (char *, unsigned long);</div><div class='add'>+</div><div class='add'>+static int push_compile_context (char *);</div><div class='add'>+static int pop_compile_context (void);</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ int block_type;</div><div class='add'>+ SLBlock_Type *block; /* beginning of block definition */</div><div class='add'>+ SLBlock_Type *block_ptr; /* current location */</div><div class='add'>+ SLBlock_Type *block_max; /* end of definition */</div><div class='add'>+ SLang_NameSpace_Type *static_namespace;</div><div class='add'>+}</div><div class='add'>+Block_Context_Type;</div><div class='add'>+</div><div class='add'>+static Block_Context_Type Block_Context_Stack [SLANG_MAX_BLOCK_STACK_LEN];</div><div class='add'>+static unsigned int Block_Context_Stack_Len;</div><div class='add'>+</div><div class='add'>+static SLBlock_Type *Compile_ByteCode_Ptr;</div><div class='add'>+static SLBlock_Type *This_Compile_Block;</div><div class='add'>+static SLBlock_Type *This_Compile_Block_Max;</div><div class='add'>+static int This_Compile_Block_Type;</div><div class='add'>+#define COMPILE_BLOCK_TYPE_FUNCTION 1</div><div class='add'>+#define COMPILE_BLOCK_TYPE_BLOCK 2</div><div class='add'>+#define COMPILE_BLOCK_TYPE_TOP_LEVEL 3</div><div class='add'>+</div><div class='add'>+/* If it returns 0, DO NOT FREE p */</div><div class='add'>+static int lang_free_branch (SLBlock_Type *p)</div><div class='add'>+{</div><div class='add'>+ /* Note: we look at 0,2,4, since these blocks are 0 terminated */</div><div class='add'>+ if ((p == SLShort_Blocks)</div><div class='add'>+ || (p == SLShort_Blocks + 2)</div><div class='add'>+ || (p == SLShort_Blocks + 4)</div><div class='add'>+ )</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ switch (p->bc_main_type)</div><div class='add'>+ {</div><div class='add'>+ case _SLANG_BC_BLOCK:</div><div class='add'>+ if (lang_free_branch(p->b.blk))</div><div class='add'>+ SLfree((char *)p->b.blk);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_LITERAL:</div><div class='add'>+ case _SLANG_BC_LITERAL_STR:</div><div class='add'>+ /* No user types should be here. */</div><div class='add'>+ cl = _SLclass_get_class (p->bc_sub_type);</div><div class='add'>+ (*cl->cl_byte_code_destroy) (p->bc_sub_type, (VOID_STAR) &p->b.ptr_blk);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_FIELD:</div><div class='add'>+ case _SLANG_BC_SET_STRUCT_LVALUE:</div><div class='add'>+ SLang_free_slstring (p->b.s_blk);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 0:</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+ p++;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void free_function_header (_SLBlock_Header_Type *h)</div><div class='add'>+{</div><div class='add'>+ if (h->num_refs > 1)</div><div class='add'>+ {</div><div class='add'>+ h->num_refs--;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (h->body != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (lang_free_branch (h->body))</div><div class='add'>+ SLfree ((char *) h->body);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLfree ((char *) h);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_block_context (int type)</div><div class='add'>+{</div><div class='add'>+ Block_Context_Type *c;</div><div class='add'>+ unsigned int num;</div><div class='add'>+ SLBlock_Type *b;</div><div class='add'>+</div><div class='add'>+ if (Block_Context_Stack_Len == SLANG_MAX_BLOCK_STACK_LEN)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_STACK_OVERFLOW, "Block stack overflow");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ num = 5; /* 40 bytes */</div><div class='add'>+ if (NULL == (b = (SLBlock_Type *) SLcalloc (num, sizeof (SLBlock_Type))))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ c = Block_Context_Stack + Block_Context_Stack_Len;</div><div class='add'>+ c->block = This_Compile_Block;</div><div class='add'>+ c->block_ptr = Compile_ByteCode_Ptr;</div><div class='add'>+ c->block_max = This_Compile_Block_Max;</div><div class='add'>+ c->block_type = This_Compile_Block_Type;</div><div class='add'>+ c->static_namespace = This_Static_NameSpace;</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr = This_Compile_Block = b;</div><div class='add'>+ This_Compile_Block_Max = b + num;</div><div class='add'>+ This_Compile_Block_Type = type;</div><div class='add'>+</div><div class='add'>+ Block_Context_Stack_Len += 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_block_context (void)</div><div class='add'>+{</div><div class='add'>+ Block_Context_Type *c;</div><div class='add'>+</div><div class='add'>+ if (Block_Context_Stack_Len == 0)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ Block_Context_Stack_Len -= 1;</div><div class='add'>+ c = Block_Context_Stack + Block_Context_Stack_Len;</div><div class='add'>+</div><div class='add'>+ This_Compile_Block = c->block;</div><div class='add'>+ This_Compile_Block_Max = c->block_max;</div><div class='add'>+ This_Compile_Block_Type = c->block_type;</div><div class='add'>+ Compile_ByteCode_Ptr = c->block_ptr;</div><div class='add'>+ This_Static_NameSpace = c->static_namespace;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLcompile_push_context (SLang_Load_Type *load_object)</div><div class='add'>+{</div><div class='add'>+ if (-1 == push_compile_context (load_object->name))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (NULL == (This_Static_NameSpace = _SLns_allocate_namespace (load_object->name, SLSTATIC_HASH_TABLE_SIZE)))</div><div class='add'>+ {</div><div class='add'>+ pop_compile_context ();</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == push_block_context (COMPILE_BLOCK_TYPE_TOP_LEVEL))</div><div class='add'>+ {</div><div class='add'>+ pop_compile_context ();</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLcompile_pop_context (void)</div><div class='add'>+{</div><div class='add'>+ if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+ {</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = 0;</div><div class='add'>+ if (lang_free_branch (This_Compile_Block))</div><div class='add'>+ SLfree ((char *) This_Compile_Block);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ (void) pop_block_context ();</div><div class='add'>+ (void) pop_compile_context ();</div><div class='add'>+</div><div class='add'>+ if (This_Compile_Block == NULL)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+ if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INTERNAL_ERROR, "Not at top-level");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*{{{ Hash and Name Table Functions */</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type *locate_name_in_table (char *name, unsigned long hash,</div><div class='add'>+ SLang_Name_Type **table, unsigned int table_size)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *t;</div><div class='add'>+ char ch;</div><div class='add'>+</div><div class='add'>+ t = table [(unsigned int) (hash % table_size)];</div><div class='add'>+ ch = *name++;</div><div class='add'>+</div><div class='add'>+ while (t != NULL)</div><div class='add'>+ {</div><div class='add'>+ if ((ch == t->name[0])</div><div class='add'>+ && (0 == strcmp (t->name + 1, name)))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ t = t->next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return t;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type *locate_namespace_encoded_name (char *name, int err_on_bad_ns)</div><div class='add'>+{</div><div class='add'>+ char *ns, *ns1;</div><div class='add'>+ SLang_NameSpace_Type *table;</div><div class='add'>+ SLang_Name_Type *nt;</div><div class='add'>+</div><div class='add'>+ ns = name;</div><div class='add'>+ name = strchr (name, '-');</div><div class='add'>+ if ((name == NULL) || (name [1] != '>'))</div><div class='add'>+ name = ns;</div><div class='add'>+</div><div class='add'>+ ns1 = SLang_create_nslstring (ns, (unsigned int) (name - ns));</div><div class='add'>+ if (ns1 == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+ if (ns != name)</div><div class='add'>+ name += 2;</div><div class='add'>+ ns = ns1;</div><div class='add'>+</div><div class='add'>+ if (*ns == 0)</div><div class='add'>+ {</div><div class='add'>+ /* Use Global Namespace */</div><div class='add'>+ SLang_free_slstring (ns);</div><div class='add'>+ return locate_name_in_table (name, _SLcompute_string_hash (name),</div><div class='add'>+ Global_NameSpace->table, Global_NameSpace->table_size);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (table = _SLns_find_namespace (ns)))</div><div class='add'>+ {</div><div class='add'>+ if (err_on_bad_ns)</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Unable to find namespace called %s", ns);</div><div class='add'>+ SLang_free_slstring (ns);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ SLang_free_slstring (ns);</div><div class='add'>+</div><div class='add'>+ /* FIXME: the hash table size should be stored in the hash table itself */</div><div class='add'>+ nt = locate_name_in_table (name, _SLcompute_string_hash (name),</div><div class='add'>+ table->table, table->table_size);</div><div class='add'>+ if (nt == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ switch (nt->name_type)</div><div class='add'>+ {</div><div class='add'>+ /* These are private and cannot be accessed through the namespace. */</div><div class='add'>+ case SLANG_PVARIABLE:</div><div class='add'>+ case SLANG_PFUNCTION:</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ return nt;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type *locate_hashed_name (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *t;</div><div class='add'>+</div><div class='add'>+ if (Lang_Defining_Function)</div><div class='add'>+ {</div><div class='add'>+ t = locate_name_in_table (name, hash, Locals_Hash_Table, SLLOCALS_HASH_TABLE_SIZE);</div><div class='add'>+ if (t != NULL)</div><div class='add'>+ return t;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((This_Static_NameSpace != NULL)</div><div class='add'>+ && (NULL != (t = locate_name_in_table (name, hash, This_Static_NameSpace->table, This_Static_NameSpace->table_size))))</div><div class='add'>+ return t;</div><div class='add'>+</div><div class='add'>+ t = locate_name_in_table (name, hash, Global_NameSpace->table, Global_NameSpace->table_size);</div><div class='add'>+ if (NULL != t)</div><div class='add'>+ return t;</div><div class='add'>+</div><div class='add'>+ return locate_namespace_encoded_name (name, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Name_Type *_SLlocate_name (char *name)</div><div class='add'>+{</div><div class='add'>+ return locate_hashed_name (name, _SLcompute_string_hash (name));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type *</div><div class='add'>+add_name_to_hash_table (char *name, unsigned long hash,</div><div class='add'>+ unsigned int sizeof_obj, unsigned char name_type,</div><div class='add'>+ SLang_Name_Type **table, unsigned int table_size,</div><div class='add'>+ int check_existing)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *t;</div><div class='add'>+</div><div class='add'>+ if (check_existing)</div><div class='add'>+ {</div><div class='add'>+ t = locate_name_in_table (name, hash, table, table_size);</div><div class='add'>+ if (t != NULL)</div><div class='add'>+ return t;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLcheck_identifier_syntax (name))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ t = (SLang_Name_Type *) SLmalloc (sizeof_obj);</div><div class='add'>+ if (t == NULL)</div><div class='add'>+ return t;</div><div class='add'>+</div><div class='add'>+ memset ((char *) t, 0, sizeof_obj);</div><div class='add'>+ if (NULL == (t->name = _SLstring_dup_hashed_string (name, hash)))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) t);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ t->name_type = name_type;</div><div class='add'>+</div><div class='add'>+ hash = hash % table_size;</div><div class='add'>+ t->next = table [(unsigned int)hash];</div><div class='add'>+ table [(unsigned int) hash] = t;</div><div class='add'>+</div><div class='add'>+ return t;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type *</div><div class='add'>+add_global_name (char *name, unsigned long hash,</div><div class='add'>+ unsigned char name_type, unsigned int sizeof_obj,</div><div class='add'>+ SLang_NameSpace_Type *ns)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *nt;</div><div class='add'>+ SLang_Name_Type **table;</div><div class='add'>+ unsigned int table_size;</div><div class='add'>+ </div><div class='add'>+ table = ns->table;</div><div class='add'>+ table_size = ns->table_size;</div><div class='add'>+</div><div class='add'>+ nt = locate_name_in_table (name, hash, table, table_size);</div><div class='add'>+ if (nt != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (nt->name_type == name_type)</div><div class='add'>+ return nt;</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_DUPLICATE_DEFINITION, "%s cannot be re-defined", name);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return add_name_to_hash_table (name, hash, sizeof_obj, name_type,</div><div class='add'>+ table, table_size, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int add_intrinsic_function (SLang_NameSpace_Type *ns,</div><div class='add'>+ char *name, FVOID_STAR addr, unsigned char ret_type,</div><div class='add'>+ unsigned int nargs, va_list ap)</div><div class='add'>+{</div><div class='add'>+ SLang_Intrin_Fun_Type *f;</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ if (-1 == init_interpreter ())</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ if (ns == NULL) ns = Global_NameSpace;</div><div class='add'>+</div><div class='add'>+ if (nargs > SLANG_MAX_INTRIN_ARGS)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_APPLICATION_ERROR, "Function %s requires too many arguments", name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ret_type == SLANG_FLOAT_TYPE)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "Function %s is not permitted to return float", name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ f = (SLang_Intrin_Fun_Type *) add_global_name (name, _SLcompute_string_hash (name),</div><div class='add'>+ SLANG_INTRINSIC, sizeof (SLang_Intrin_Fun_Type),</div><div class='add'>+ ns);</div><div class='add'>+</div><div class='add'>+ if (f == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ f->i_fun = addr;</div><div class='add'>+ f->num_args = nargs;</div><div class='add'>+ f->return_type = ret_type;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < nargs; i++)</div><div class='add'>+ f->arg_types [i] = va_arg (ap, unsigned int);</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_intrinsic_function (char *name, FVOID_STAR addr, unsigned char ret_type,</div><div class='add'>+ unsigned int nargs, ...)</div><div class='add'>+{</div><div class='add'>+ va_list ap;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ va_start (ap, nargs);</div><div class='add'>+ status = add_intrinsic_function (NULL, name, addr, ret_type, nargs, ap);</div><div class='add'>+ va_end (ap);</div><div class='add'>+</div><div class='add'>+ return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLns_add_intrinsic_function (SLang_NameSpace_Type *ns, </div><div class='add'>+ char *name, FVOID_STAR addr, unsigned char ret_type,</div><div class='add'>+ unsigned int nargs, ...)</div><div class='add'>+{</div><div class='add'>+ va_list ap;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ va_start (ap, nargs);</div><div class='add'>+ status = add_intrinsic_function (ns, name, addr, ret_type, nargs, ap);</div><div class='add'>+ va_end (ap);</div><div class='add'>+</div><div class='add'>+ return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLns_add_intrinsic_variable (SLang_NameSpace_Type *ns,</div><div class='add'>+ char *name, VOID_STAR addr, unsigned char data_type, int ro)</div><div class='add'>+{</div><div class='add'>+ SLang_Intrin_Var_Type *v;</div><div class='add'>+</div><div class='add'>+ if (-1 == init_interpreter ())</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ if (ns == NULL) ns = Global_NameSpace;</div><div class='add'>+</div><div class='add'>+ v = (SLang_Intrin_Var_Type *)add_global_name (name,</div><div class='add'>+ _SLcompute_string_hash (name),</div><div class='add'>+ (ro ? SLANG_RVARIABLE : SLANG_IVARIABLE),</div><div class='add'>+ sizeof (SLang_Intrin_Var_Type),</div><div class='add'>+ ns);</div><div class='add'>+ if (v == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ v->addr = addr;</div><div class='add'>+ v->type = data_type;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+ </div><div class='add'>+int SLadd_intrinsic_variable (char *name, VOID_STAR addr, unsigned char data_type, int ro)</div><div class='add'>+{</div><div class='add'>+ return SLns_add_intrinsic_variable (NULL, name, addr, data_type, ro);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+add_slang_function (char *name, unsigned char type, unsigned long hash,</div><div class='add'>+ unsigned int num_args, unsigned int num_locals,</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ char *file,</div><div class='add'>+#endif</div><div class='add'>+ _SLBlock_Header_Type *h, </div><div class='add'>+ SLang_NameSpace_Type *ns)</div><div class='add'>+{</div><div class='add'>+ _SLang_Function_Type *f;</div><div class='add'>+ </div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ if ((file != NULL)</div><div class='add'>+ && (NULL == (file = SLang_create_slstring (file))))</div><div class='add'>+ return -1;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ f = (_SLang_Function_Type *)add_global_name (name, hash,</div><div class='add'>+ type,</div><div class='add'>+ sizeof (_SLang_Function_Type),</div><div class='add'>+ ns);</div><div class='add'>+ if (f == NULL)</div><div class='add'>+ {</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ SLang_free_slstring (file); /* NULL ok */</div><div class='add'>+#endif</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (f->v.header != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (f->nlocals == AUTOLOAD_NUM_LOCALS)</div><div class='add'>+ SLang_free_slstring ((char *)f->v.autoload_filename); /* autoloaded filename */</div><div class='add'>+ else</div><div class='add'>+ free_function_header (f->v.header);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ if (f->file != NULL) SLang_free_slstring (f->file);</div><div class='add'>+ f->file = file;</div><div class='add'>+#endif</div><div class='add'>+ f->v.header = h;</div><div class='add'>+ f->nlocals = num_locals;</div><div class='add'>+ f->nargs = num_args;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_autoload (char *name, char *file)</div><div class='add'>+{</div><div class='add'>+ _SLang_Function_Type *f;</div><div class='add'>+ unsigned long hash;</div><div class='add'>+</div><div class='add'>+ hash = _SLcompute_string_hash (name);</div><div class='add'>+ f = (_SLang_Function_Type *)locate_name_in_table (name, hash, Global_NameSpace->table, Global_NameSpace->table_size);</div><div class='add'>+</div><div class='add'>+ if ((f != NULL)</div><div class='add'>+ && (f->name_type == SLANG_FUNCTION)</div><div class='add'>+ && (f->v.header != NULL)</div><div class='add'>+ && (f->nlocals != AUTOLOAD_NUM_LOCALS))</div><div class='add'>+ {</div><div class='add'>+ /* already loaded */</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ file = SLang_create_slstring (file);</div><div class='add'>+ if (-1 == add_slang_function (name, SLANG_FUNCTION, hash, 0, AUTOLOAD_NUM_LOCALS,</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ file,</div><div class='add'>+#endif</div><div class='add'>+ (_SLBlock_Header_Type *) file,</div><div class='add'>+ Global_NameSpace))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (file);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Name_Type *_SLlocate_global_name (char *name)</div><div class='add'>+{</div><div class='add'>+ unsigned long hash;</div><div class='add'>+</div><div class='add'>+ hash = _SLcompute_string_hash (name);</div><div class='add'>+ return locate_name_in_table (name, hash, Global_NameSpace->table, </div><div class='add'>+ Global_NameSpace->table_size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void free_local_variable_table (void)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+ SLang_Name_Type *t, *t1;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < SLLOCALS_HASH_TABLE_SIZE; i++)</div><div class='add'>+ {</div><div class='add'>+ t = Locals_Hash_Table [i];</div><div class='add'>+ while (t != NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (t->name);</div><div class='add'>+ t1 = t->next;</div><div class='add'>+ SLfree ((char *) t);</div><div class='add'>+ t = t1;</div><div class='add'>+ }</div><div class='add'>+ Locals_Hash_Table [i] = NULL;</div><div class='add'>+ }</div><div class='add'>+ Local_Variable_Number = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* call inner interpreter or return for more */</div><div class='add'>+static void lang_try_now(void)</div><div class='add'>+{</div><div class='add'>+ Compile_ByteCode_Ptr++;</div><div class='add'>+ if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = 0; /* so next command stops after this */</div><div class='add'>+</div><div class='add'>+ /* now do it */</div><div class='add'>+ inner_interp (This_Compile_Block);</div><div class='add'>+ (void) lang_free_branch (This_Compile_Block);</div><div class='add'>+ Compile_ByteCode_Ptr = This_Compile_Block;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Name_Type *SLang_get_fun_from_ref (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+ if (ref->is_global)</div><div class='add'>+ {</div><div class='add'>+ SLang_Name_Type *nt = ref->v.nt;</div><div class='add'>+</div><div class='add'>+ switch (nt->name_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_PFUNCTION:</div><div class='add'>+ case SLANG_FUNCTION:</div><div class='add'>+ case SLANG_INTRINSIC:</div><div class='add'>+ case SLANG_MATH_UNARY:</div><div class='add'>+ case SLANG_APP_UNARY:</div><div class='add'>+ return nt;</div><div class='add'>+ }</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH,</div><div class='add'>+ "Reference to a function expected. Found &%s", </div><div class='add'>+ nt->name);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH,</div><div class='add'>+ "Reference to a function expected");</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLexecute_function (SLang_Name_Type *nt)</div><div class='add'>+{</div><div class='add'>+ unsigned char type;</div><div class='add'>+ char *name;</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ type = nt->name_type;</div><div class='add'>+ name = nt->name;</div><div class='add'>+</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_PFUNCTION:</div><div class='add'>+ case SLANG_FUNCTION:</div><div class='add'>+ execute_slang_fun ((_SLang_Function_Type *) nt);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_INTRINSIC:</div><div class='add'>+ execute_intrinsic_fun ((SLang_Intrin_Fun_Type *) nt);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_MATH_UNARY:</div><div class='add'>+ case SLANG_APP_UNARY:</div><div class='add'>+ inner_interp_nametype (nt);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "%s is not a function", name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SLang_Error, "Error while executing %s", name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_execute_function (char *name)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *entry;</div><div class='add'>+</div><div class='add'>+ if (NULL == (entry = SLang_get_function (name)))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ return SLexecute_function (entry);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* return S-Lang function or NULL */</div><div class='add'>+SLang_Name_Type *SLang_get_function (char *name)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *entry;</div><div class='add'>+</div><div class='add'>+ if (NULL == (entry = locate_namespace_encoded_name (name, 0)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ if ((entry->name_type == SLANG_FUNCTION)</div><div class='add'>+ || (entry->name_type == SLANG_INTRINSIC))</div><div class='add'>+ return entry;</div><div class='add'>+</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void lang_begin_function (void)</div><div class='add'>+{</div><div class='add'>+ if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Function nesting is illegal");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ Lang_Defining_Function = 1;</div><div class='add'>+ (void) push_block_context (COMPILE_BLOCK_TYPE_FUNCTION);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if USE_COMBINED_BYTECODES</div><div class='add'>+static void optimize_block (SLBlock_Type *b)</div><div class='add'>+{</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ switch (b->bc_main_type)</div><div class='add'>+ {</div><div class='add'>+ case 0:</div><div class='add'>+ return;</div><div class='add'>+ </div><div class='add'>+ default:</div><div class='add'>+ b++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_CALL_DIRECT:</div><div class='add'>+ b++;</div><div class='add'>+ switch (b->bc_main_type)</div><div class='add'>+ {</div><div class='add'>+ case 0:</div><div class='add'>+ return;</div><div class='add'>+ case _SLANG_BC_INTRINSIC:</div><div class='add'>+ if ((b+1)->bc_main_type == 0)</div><div class='add'>+ {</div><div class='add'>+ (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_INTRSTOP;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_INTRINSIC;</div><div class='add'>+ b++;</div><div class='add'>+ break;</div><div class='add'>+ case _SLANG_BC_LITERAL_STR:</div><div class='add'>+ (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_LSTR;</div><div class='add'>+ b++;</div><div class='add'>+ break;</div><div class='add'>+ case _SLANG_BC_FUNCTION:</div><div class='add'>+ case _SLANG_BC_PFUNCTION:</div><div class='add'>+ (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_SLFUN;</div><div class='add'>+ b++;</div><div class='add'>+ break;</div><div class='add'>+ case _SLANG_BC_EARG_LVARIABLE:</div><div class='add'>+ (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_EARG_LVAR;</div><div class='add'>+ b++;</div><div class='add'>+ break;</div><div class='add'>+ case _SLANG_BC_LITERAL_INT:</div><div class='add'>+ (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_LINT;</div><div class='add'>+ b++;</div><div class='add'>+ break;</div><div class='add'>+ case _SLANG_BC_LVARIABLE:</div><div class='add'>+ (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_LVAR;</div><div class='add'>+ b++;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case _SLANG_BC_INTRINSIC:</div><div class='add'>+ b++;</div><div class='add'>+ switch (b->bc_main_type)</div><div class='add'>+ {</div><div class='add'>+ case _SLANG_BC_CALL_DIRECT:</div><div class='add'>+ (b-1)->bc_main_type = _SLANG_BC_INTRINSIC_CALL_DIRECT;</div><div class='add'>+ b++;</div><div class='add'>+ break;</div><div class='add'>+#if 0</div><div class='add'>+ case _SLANG_BC_BLOCK:</div><div class='add'>+ (b-1)->bc_main_type = _SLANG_BC_INTRINSIC_BLOCK;</div><div class='add'>+ b++;</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ case 0:</div><div class='add'>+ (b-1)->bc_main_type = _SLANG_BC_INTRINSIC_STOP;</div><div class='add'>+ return;</div><div class='add'>+ } </div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* name will be NULL if the object is to simply terminate the function</div><div class='add'>+ * definition. See SLang_restart.</div><div class='add'>+ */</div><div class='add'>+static int lang_define_function (char *name, unsigned char type, unsigned long hash,</div><div class='add'>+ SLang_NameSpace_Type *ns)</div><div class='add'>+{</div><div class='add'>+ if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_FUNCTION)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Premature end of function");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* terminate function */</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = 0;</div><div class='add'>+</div><div class='add'>+ if (name != NULL)</div><div class='add'>+ {</div><div class='add'>+ _SLBlock_Header_Type *h;</div><div class='add'>+</div><div class='add'>+ h = (_SLBlock_Header_Type *)SLmalloc (sizeof (_SLBlock_Header_Type));</div><div class='add'>+ if (h != NULL)</div><div class='add'>+ {</div><div class='add'>+ h->num_refs = 1;</div><div class='add'>+ h->body = This_Compile_Block;</div><div class='add'>+ </div><div class='add'>+#if USE_COMBINED_BYTECODES</div><div class='add'>+ optimize_block (h->body);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (-1 == add_slang_function (name, type, hash,</div><div class='add'>+ Function_Args_Number,</div><div class='add'>+ Local_Variable_Number,</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ This_Compile_Filename,</div><div class='add'>+#endif</div><div class='add'>+ h, ns))</div><div class='add'>+ SLfree ((char *) h);</div><div class='add'>+ }</div><div class='add'>+ /* Drop through for clean-up */</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ free_local_variable_table ();</div><div class='add'>+</div><div class='add'>+ Function_Args_Number = 0;</div><div class='add'>+ Lang_Defining_Function = 0;</div><div class='add'>+</div><div class='add'>+ if (SLang_Error) return -1;</div><div class='add'>+ /* SLang_restart will finish this if there is a slang error. */</div><div class='add'>+</div><div class='add'>+ pop_block_context ();</div><div class='add'>+</div><div class='add'>+ /* A function is only defined at top-level */</div><div class='add'>+ if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INTERNAL_ERROR, "Not at top-level");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ Compile_ByteCode_Ptr = This_Compile_Block;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void define_static_function (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ (void) lang_define_function (name, SLANG_FUNCTION, hash, This_Static_NameSpace);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void define_private_function (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ (void) lang_define_function (name, SLANG_PFUNCTION, hash, This_Static_NameSpace);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void define_public_function (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ (void) lang_define_function (name, SLANG_FUNCTION, hash, Global_NameSpace);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void lang_end_block (void)</div><div class='add'>+{</div><div class='add'>+ SLBlock_Type *node, *branch;</div><div class='add'>+ unsigned char mtype;</div><div class='add'>+</div><div class='add'>+ if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_BLOCK)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Not defining a block");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* terminate the block */</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = 0;</div><div class='add'>+ branch = This_Compile_Block;</div><div class='add'>+</div><div class='add'>+ /* Try to save some space by using the cached blocks. */</div><div class='add'>+ if (Compile_ByteCode_Ptr == branch + 1)</div><div class='add'>+ {</div><div class='add'>+ mtype = branch->bc_main_type;</div><div class='add'>+ if (((mtype == _SLANG_BC_BREAK)</div><div class='add'>+ || (mtype == _SLANG_BC_CONTINUE)</div><div class='add'>+ || (mtype == _SLANG_BC_RETURN))</div><div class='add'>+ && (SLang_Error == 0))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *)branch);</div><div class='add'>+ branch = SLShort_Blocks + 2 * (int) (mtype - _SLANG_BC_RETURN);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#if USE_COMBINED_BYTECODES</div><div class='add'>+ optimize_block (branch);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ pop_block_context ();</div><div class='add'>+ node = Compile_ByteCode_Ptr++;</div><div class='add'>+</div><div class='add'>+ node->bc_main_type = _SLANG_BC_BLOCK;</div><div class='add'>+ node->bc_sub_type = 0;</div><div class='add'>+ node->b.blk = branch;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int lang_begin_block (void)</div><div class='add'>+{</div><div class='add'>+ return push_block_context (COMPILE_BLOCK_TYPE_BLOCK);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int lang_check_space (void)</div><div class='add'>+{</div><div class='add'>+ unsigned int n;</div><div class='add'>+ SLBlock_Type *p;</div><div class='add'>+</div><div class='add'>+ if (NULL == (p = This_Compile_Block))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INTERNAL_ERROR, "Top-level block not present");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Allow 1 extra for terminator */</div><div class='add'>+ if (Compile_ByteCode_Ptr + 1 < This_Compile_Block_Max)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ n = (unsigned int) (This_Compile_Block_Max - p);</div><div class='add'>+</div><div class='add'>+ /* enlarge the space by 2 objects */</div><div class='add'>+ n += 2;</div><div class='add'>+</div><div class='add'>+ if (NULL == (p = (SLBlock_Type *) SLrealloc((char *)p, n * sizeof(SLBlock_Type))))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ This_Compile_Block_Max = p + n;</div><div class='add'>+ n = (unsigned int) (Compile_ByteCode_Ptr - This_Compile_Block);</div><div class='add'>+ This_Compile_Block = p;</div><div class='add'>+ Compile_ByteCode_Ptr = p + n;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* returns positive number if name is a function or negative number if it</div><div class='add'>+ is a variable. If it is intrinsic, it returns magnitude of 1, else 2 */</div><div class='add'>+int SLang_is_defined(char *name)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *t;</div><div class='add'>+</div><div class='add'>+ if (-1 == init_interpreter ())</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ t = locate_namespace_encoded_name (name, 0);</div><div class='add'>+ if (t == NULL)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ switch (t->name_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_FUNCTION:</div><div class='add'>+ /* case SLANG_PFUNCTION: */</div><div class='add'>+ return 2;</div><div class='add'>+ case SLANG_GVARIABLE:</div><div class='add'>+ /* case SLANG_PVARIABLE: */</div><div class='add'>+ return -2;</div><div class='add'>+</div><div class='add'>+ case SLANG_ICONSTANT:</div><div class='add'>+ case SLANG_DCONSTANT:</div><div class='add'>+ case SLANG_RVARIABLE:</div><div class='add'>+ case SLANG_IVARIABLE:</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ case SLANG_INTRINSIC:</div><div class='add'>+ default:</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int add_global_variable (char *name, char name_type, unsigned long hash,</div><div class='add'>+ SLang_NameSpace_Type *ns)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *g;</div><div class='add'>+</div><div class='add'>+ /* Note the importance of checking if it is already defined or not. For example,</div><div class='add'>+ * suppose X is defined as an intrinsic variable. Then S-Lang code like:</div><div class='add'>+ * !if (is_defined("X")) { variable X; }</div><div class='add'>+ * will not result in a global variable X. On the other hand, this would</div><div class='add'>+ * not be an issue if 'variable' statements always were not processed</div><div class='add'>+ * immediately. That is, as it is now, 'if (0) {variable ZZZZ;}' will result</div><div class='add'>+ * in the variable ZZZZ being defined because of the immediate processing.</div><div class='add'>+ * The current solution is to do: if (0) { eval("variable ZZZZ;"); }</div><div class='add'>+ */</div><div class='add'>+ /* hash = _SLcompute_string_hash (name); */</div><div class='add'>+ g = locate_name_in_table (name, hash, ns->table, ns->table_size);</div><div class='add'>+</div><div class='add'>+ if (g != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (g->name_type == name_type)</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == add_global_name (name, hash, name_type,</div><div class='add'>+ sizeof (SLang_Global_Var_Type), ns))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_global_variable (char *name)</div><div class='add'>+{</div><div class='add'>+ if (-1 == init_interpreter ())</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return add_global_variable (name, SLANG_GVARIABLE,</div><div class='add'>+ _SLcompute_string_hash (name),</div><div class='add'>+ Global_NameSpace);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int add_local_variable (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ SLang_Local_Var_Type *t;</div><div class='add'>+</div><div class='add'>+ /* local variable */</div><div class='add'>+ if (Local_Variable_Number >= SLANG_MAX_LOCAL_VARIABLES)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Too many local variables");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL != locate_name_in_table (name, hash, Locals_Hash_Table, SLLOCALS_HASH_TABLE_SIZE))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Local variable %s has already been defined", name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ t = (SLang_Local_Var_Type *)</div><div class='add'>+ add_name_to_hash_table (name, hash,</div><div class='add'>+ sizeof (SLang_Local_Var_Type), SLANG_LVARIABLE,</div><div class='add'>+ Locals_Hash_Table, SLLOCALS_HASH_TABLE_SIZE, 0);</div><div class='add'>+ if (t == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ t->local_var_number = Local_Variable_Number;</div><div class='add'>+ Local_Variable_Number++;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void (*Compile_Mode_Function) (_SLang_Token_Type *);</div><div class='add'>+static void compile_basic_token_mode (_SLang_Token_Type *);</div><div class='add'>+</div><div class='add'>+/* if an error occurs, discard current object, block, function, etc... */</div><div class='add'>+void SLang_restart (int localv)</div><div class='add'>+{</div><div class='add'>+ int save = SLang_Error;</div><div class='add'>+</div><div class='add'>+ SLang_Error = SL_UNKNOWN_ERROR;</div><div class='add'>+</div><div class='add'>+ _SLcompile_ptr = _SLcompile;</div><div class='add'>+ Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+</div><div class='add'>+ Lang_Break = /* Lang_Continue = */ Lang_Return = 0;</div><div class='add'>+ Trace_Mode = 0;</div><div class='add'>+</div><div class='add'>+ while (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_BLOCK)</div><div class='add'>+ lang_end_block();</div><div class='add'>+</div><div class='add'>+ if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_FUNCTION)</div><div class='add'>+ {</div><div class='add'>+ /* Terminate function definition and free variables */</div><div class='add'>+ lang_define_function (NULL, SLANG_FUNCTION, 0, Global_NameSpace);</div><div class='add'>+ if (lang_free_branch (This_Compile_Block))</div><div class='add'>+ SLfree((char *)This_Compile_Block);</div><div class='add'>+ }</div><div class='add'>+ Lang_Defining_Function = 0;</div><div class='add'>+</div><div class='add'>+ SLang_Error = save;</div><div class='add'>+</div><div class='add'>+ if (SLang_Error == SL_STACK_OVERFLOW)</div><div class='add'>+ {</div><div class='add'>+ /* This loop guarantees that the stack is properly cleaned. */</div><div class='add'>+ while (_SLStack_Pointer != _SLRun_Stack)</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop ();</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while ((This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+ && (0 == pop_block_context ()))</div><div class='add'>+ ;</div><div class='add'>+</div><div class='add'>+ if (localv)</div><div class='add'>+ {</div><div class='add'>+ Next_Function_Num_Args = SLang_Num_Function_Args = 0;</div><div class='add'>+ Local_Variable_Frame = Local_Variable_Stack;</div><div class='add'>+ Recursion_Depth = 0;</div><div class='add'>+ Frame_Pointer = _SLStack_Pointer;</div><div class='add'>+ Frame_Pointer_Depth = 0;</div><div class='add'>+ Switch_Obj_Ptr = Switch_Objects;</div><div class='add'>+ while (Switch_Obj_Ptr < Switch_Obj_Max)</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (Switch_Obj_Ptr);</div><div class='add'>+ Switch_Obj_Ptr++;</div><div class='add'>+ }</div><div class='add'>+ Switch_Obj_Ptr = Switch_Objects;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_directive (unsigned char sub_type)</div><div class='add'>+{</div><div class='add'>+ /* This function is called only from compile_directive_mode which is</div><div class='add'>+ * only possible when a block is available.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ /* use BLOCK */</div><div class='add'>+ Compile_ByteCode_Ptr--;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = sub_type;</div><div class='add'>+</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_unary (int op, unsigned char mt)</div><div class='add'>+{</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = mt;</div><div class='add'>+ Compile_ByteCode_Ptr->b.i_blk = op;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = 0;</div><div class='add'>+</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static void compile_binary (int op)</div><div class='add'>+{</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_BINARY;</div><div class='add'>+ Compile_ByteCode_Ptr->b.i_blk = op;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = 0;</div><div class='add'>+</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+static int try_compressed_bytecode (unsigned char last_bc, unsigned char bc)</div><div class='add'>+{</div><div class='add'>+ if (Compile_ByteCode_Ptr != This_Compile_Block)</div><div class='add'>+ {</div><div class='add'>+ SLBlock_Type *b;</div><div class='add'>+ b = Compile_ByteCode_Ptr - 1;</div><div class='add'>+ if (b->bc_main_type == last_bc)</div><div class='add'>+ {</div><div class='add'>+ Compile_ByteCode_Ptr = b;</div><div class='add'>+ b->bc_main_type = bc;</div><div class='add'>+ lang_try_now ();</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void compile_fast_binary (int op, unsigned char bc)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (0 == try_compressed_bytecode (_SLANG_BC_LITERAL_INT, bc))</div><div class='add'>+ return;</div><div class='add'>+#else</div><div class='add'>+ (void) bc;</div><div class='add'>+#endif</div><div class='add'>+ compile_binary (op);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is a hack */</div><div class='add'>+typedef struct _Special_NameTable_Type</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ int (*fun) (struct _Special_NameTable_Type *, _SLang_Token_Type *);</div><div class='add'>+ VOID_STAR blk_data;</div><div class='add'>+ unsigned char main_type;</div><div class='add'>+}</div><div class='add'>+Special_NameTable_Type;</div><div class='add'>+</div><div class='add'>+static int handle_special (Special_NameTable_Type *nt, _SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+ (void) tok;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = nt->main_type;</div><div class='add'>+ Compile_ByteCode_Ptr->b.ptr_blk = nt->blk_data;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int handle_special_file (Special_NameTable_Type *nt, _SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+</div><div class='add'>+ (void) nt; (void) tok;</div><div class='add'>+</div><div class='add'>+ if (This_Static_NameSpace == NULL) name = "***Unknown***";</div><div class='add'>+ else</div><div class='add'>+ name = This_Static_NameSpace->name;</div><div class='add'>+</div><div class='add'>+ name = SLang_create_slstring (name);</div><div class='add'>+ if (name == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr->b.s_blk = name;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL_STR;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = SLANG_STRING_TYPE;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int handle_special_line (Special_NameTable_Type *nt, _SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+ (void) nt;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ Compile_ByteCode_Ptr->b.l_blk = (long) tok->line_number;</div><div class='add'>+#endif</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = SLANG_UINT_TYPE;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static Special_NameTable_Type Special_Name_Table [] =</div><div class='add'>+{</div><div class='add'>+ {"EXECUTE_ERROR_BLOCK", handle_special, NULL, _SLANG_BC_X_ERROR},</div><div class='add'>+ {"X_USER_BLOCK0", handle_special, NULL, _SLANG_BC_X_USER0},</div><div class='add'>+ {"X_USER_BLOCK1", handle_special, NULL, _SLANG_BC_X_USER1},</div><div class='add'>+ {"X_USER_BLOCK2", handle_special, NULL, _SLANG_BC_X_USER2},</div><div class='add'>+ {"X_USER_BLOCK3", handle_special, NULL, _SLANG_BC_X_USER3},</div><div class='add'>+ {"X_USER_BLOCK4", handle_special, NULL, _SLANG_BC_X_USER4},</div><div class='add'>+ {"__FILE__", handle_special_file, NULL, 0},</div><div class='add'>+ {"__LINE__", handle_special_line, NULL, 0},</div><div class='add'>+#if 0</div><div class='add'>+ {"__NAMESPACE__", handle_special_namespace, NULL, 0},</div><div class='add'>+#endif</div><div class='add'>+ {NULL, NULL, NULL, 0}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void compile_hashed_identifier (char *name, unsigned long hash, _SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *entry;</div><div class='add'>+ unsigned char name_type;</div><div class='add'>+</div><div class='add'>+ entry = locate_hashed_name (name, hash);</div><div class='add'>+</div><div class='add'>+ if (entry == NULL)</div><div class='add'>+ {</div><div class='add'>+ Special_NameTable_Type *nt = Special_Name_Table;</div><div class='add'>+</div><div class='add'>+ while (nt->name != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (strcmp (name, nt->name))</div><div class='add'>+ {</div><div class='add'>+ nt++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (0 == (*nt->fun)(nt, tok))</div><div class='add'>+ lang_try_now ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ name_type = entry->name_type;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = name_type;</div><div class='add'>+</div><div class='add'>+ if (name_type == SLANG_LVARIABLE)</div><div class='add'>+ Compile_ByteCode_Ptr->b.i_blk = ((SLang_Local_Var_Type *) entry)->local_var_number;</div><div class='add'>+ else</div><div class='add'>+ Compile_ByteCode_Ptr->b.nt_blk = entry;</div><div class='add'>+</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_tmp_variable (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *entry;</div><div class='add'>+ unsigned char name_type;</div><div class='add'>+</div><div class='add'>+ if (NULL == (entry = locate_hashed_name (name, hash)))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ name_type = entry->name_type;</div><div class='add'>+ switch (name_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_LVARIABLE:</div><div class='add'>+ Compile_ByteCode_Ptr->b.i_blk = ((SLang_Local_Var_Type *) entry)->local_var_number;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_GVARIABLE:</div><div class='add'>+ case SLANG_PVARIABLE:</div><div class='add'>+ Compile_ByteCode_Ptr->b.nt_blk = entry;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "__tmp(%s) does not specifiy a variable", name);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_TMP;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = name_type;</div><div class='add'>+</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_simple (unsigned char main_type)</div><div class='add'>+{</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = main_type;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = 0;</div><div class='add'>+ Compile_ByteCode_Ptr->b.blk = NULL;</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_identifier (char *name, _SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+ compile_hashed_identifier (name, _SLcompute_string_hash (name), tok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_call_direct (int (*f) (void), unsigned char byte_code)</div><div class='add'>+{</div><div class='add'>+ Compile_ByteCode_Ptr->b.call_function = f;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = byte_code;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = 0;</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_lvar_call_direct (int (*f)(void), unsigned char bc,</div><div class='add'>+ unsigned char frame_op)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (0 == try_compressed_bytecode (_SLANG_BC_LVARIABLE, bc))</div><div class='add'>+ return;</div><div class='add'>+#else</div><div class='add'>+ (void) bc;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ compile_call_direct (f, frame_op);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_integer (long i, unsigned char bc_main_type, unsigned char bc_sub_type)</div><div class='add'>+{</div><div class='add'>+ Compile_ByteCode_Ptr->b.l_blk = i;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = bc_main_type;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = bc_sub_type;</div><div class='add'>+</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+static void compile_double (char *str, unsigned char type)</div><div class='add'>+{</div><div class='add'>+ double d;</div><div class='add'>+ unsigned int factor = 1;</div><div class='add'>+ double *ptr;</div><div class='add'>+</div><div class='add'>+#if 1</div><div class='add'>+ d = _SLang_atof (str);</div><div class='add'>+#else</div><div class='add'>+ if (1 != sscanf (str, "%lf", &d))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Unable to convert %s to double", str);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ if (type == SLANG_COMPLEX_TYPE) factor = 2;</div><div class='add'>+#endif</div><div class='add'>+ if (NULL == (ptr = (double *) SLmalloc(factor * sizeof(double))))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr->b.double_blk = ptr;</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ if (type == SLANG_COMPLEX_TYPE)</div><div class='add'>+ *ptr++ = 0;</div><div class='add'>+#endif</div><div class='add'>+ *ptr = d;</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = type;</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_float (char *s)</div><div class='add'>+{</div><div class='add'>+ float x;</div><div class='add'>+</div><div class='add'>+#if 1</div><div class='add'>+ x = (float) _SLang_atof (s);</div><div class='add'>+#else</div><div class='add'>+ if (1 != sscanf (s, "%f", &x))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Unable to convert %s to float", s);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ Compile_ByteCode_Ptr->b.float_blk = x;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = SLANG_FLOAT_TYPE;</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void compile_string (char *s, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ if (NULL == (Compile_ByteCode_Ptr->b.s_blk = _SLstring_dup_hashed_string (s, hash)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL_STR;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = SLANG_STRING_TYPE;</div><div class='add'>+</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_bstring (SLang_BString_Type *s)</div><div class='add'>+{</div><div class='add'>+ if (NULL == (Compile_ByteCode_Ptr->b.bs_blk = SLbstring_dup (s)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = SLANG_BSTRING_TYPE;</div><div class='add'>+</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* assign_type is one of _SLANG_BCST_ASSIGN, ... values */</div><div class='add'>+static void compile_assign (unsigned char assign_type,</div><div class='add'>+ char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *v;</div><div class='add'>+ unsigned char main_type;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ v = locate_hashed_name (name, hash);</div><div class='add'>+ if (v == NULL)</div><div class='add'>+ {</div><div class='add'>+ if ((_SLang_Auto_Declare_Globals == 0)</div><div class='add'>+ || (NULL != strchr (name, '-')) /* namespace->name form */</div><div class='add'>+ || Lang_Defining_Function</div><div class='add'>+ || (assign_type != _SLANG_BCST_ASSIGN)</div><div class='add'>+ || (This_Static_NameSpace == NULL))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ /* Note that function local variables are not at top level */</div><div class='add'>+</div><div class='add'>+ /* Variables that are automatically declared are given static</div><div class='add'>+ * scope.</div><div class='add'>+ */</div><div class='add'>+ if ((NULL != SLang_Auto_Declare_Var_Hook)</div><div class='add'>+ && (-1 == (*SLang_Auto_Declare_Var_Hook) (name)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if ((-1 == add_global_variable (name, SLANG_GVARIABLE, hash, This_Static_NameSpace))</div><div class='add'>+ || (NULL == (v = locate_hashed_name (name, hash))))</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ switch (v->name_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_LVARIABLE:</div><div class='add'>+ main_type = _SLANG_BC_SET_LOCAL_LVALUE;</div><div class='add'>+ Compile_ByteCode_Ptr->b.i_blk = ((SLang_Local_Var_Type *) v)->local_var_number;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_GVARIABLE:</div><div class='add'>+ case SLANG_PVARIABLE:</div><div class='add'>+ main_type = _SLANG_BC_SET_GLOBAL_LVALUE;</div><div class='add'>+ Compile_ByteCode_Ptr->b.nt_blk = v;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_IVARIABLE:</div><div class='add'>+ cl = _SLclass_get_class (((SLang_Intrin_Var_Type *)v)->type);</div><div class='add'>+ if (cl->cl_class_type != SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Assignment to %s is not allowed", name);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ main_type = _SLANG_BC_SET_INTRIN_LVALUE;</div><div class='add'>+ Compile_ByteCode_Ptr->b.nt_blk = v;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_RVARIABLE:</div><div class='add'>+ SLang_verror (SL_READONLY_ERROR, "%s is read-only", name);</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ SLang_verror (SL_DUPLICATE_DEFINITION, "%s may not be used as an lvalue", name);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = assign_type;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = main_type;</div><div class='add'>+</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_deref_assign (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *v;</div><div class='add'>+</div><div class='add'>+ v = locate_hashed_name (name, hash);</div><div class='add'>+</div><div class='add'>+ if (v == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ switch (v->name_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_LVARIABLE:</div><div class='add'>+ Compile_ByteCode_Ptr->b.i_blk = ((SLang_Local_Var_Type *) v)->local_var_number;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_GVARIABLE:</div><div class='add'>+ case SLANG_PVARIABLE:</div><div class='add'>+ Compile_ByteCode_Ptr->b.nt_blk = v;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ /* FIXME: Priority=low</div><div class='add'>+ * This could be made to work. It is not a priority because</div><div class='add'>+ * I cannot imagine application intrinsics which are references.</div><div class='add'>+ */</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "Deref assignment to %s is not allowed", name);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = v->name_type;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_DEREF_ASSIGN;</div><div class='add'>+</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+compile_struct_assign (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = _SLANG_BCST_ASSIGN + (t->type - _STRUCT_ASSIGN_TOKEN);</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_SET_STRUCT_LVALUE;</div><div class='add'>+ Compile_ByteCode_Ptr->b.s_blk = _SLstring_dup_hashed_string (t->v.s_val, t->hash);</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+compile_array_assign (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = _SLANG_BCST_ASSIGN + (t->type - _ARRAY_ASSIGN_TOKEN);</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_SET_ARRAY_LVALUE;</div><div class='add'>+ Compile_ByteCode_Ptr->b.s_blk = NULL;</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_dot(_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_FIELD;</div><div class='add'>+ Compile_ByteCode_Ptr->b.s_blk = _SLstring_dup_hashed_string(t->v.s_val, t->hash);</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_ref (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *entry;</div><div class='add'>+ unsigned char main_type;</div><div class='add'>+</div><div class='add'>+ if (NULL == (entry = locate_hashed_name (name, hash)))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ main_type = entry->name_type;</div><div class='add'>+</div><div class='add'>+ if (main_type == SLANG_LVARIABLE)</div><div class='add'>+ {</div><div class='add'>+ main_type = _SLANG_BC_LOBJPTR;</div><div class='add'>+ Compile_ByteCode_Ptr->b.i_blk = ((SLang_Local_Var_Type *)entry)->local_var_number;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ main_type = _SLANG_BC_GOBJPTR;</div><div class='add'>+ Compile_ByteCode_Ptr->b.nt_blk = entry;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = main_type;</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_break (unsigned char break_type,</div><div class='add'>+ int requires_block, int requires_fun,</div><div class='add'>+ char *str)</div><div class='add'>+{</div><div class='add'>+ if ((requires_fun</div><div class='add'>+ && (Lang_Defining_Function == 0))</div><div class='add'>+ || (requires_block</div><div class='add'>+ && (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_BLOCK)))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "misplaced %s", str);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = break_type;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = 0;</div><div class='add'>+</div><div class='add'>+ lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_public_variable_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ if (t->type == IDENT_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ /* If the variable is already defined in the static hash table,</div><div class='add'>+ * generate an error.</div><div class='add'>+ */</div><div class='add'>+ if ((This_Static_NameSpace != NULL)</div><div class='add'>+ && (NULL != locate_name_in_table (t->v.s_val, t->hash, This_Static_NameSpace->table, This_Static_NameSpace->table_size)))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_DUPLICATE_DEFINITION,</div><div class='add'>+ "%s already has static or private linkage in this unit",</div><div class='add'>+ t->v.s_val);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ add_global_variable (t->v.s_val, SLANG_GVARIABLE, t->hash, Global_NameSpace);</div><div class='add'>+ }</div><div class='add'>+ else if (t->type == CBRACKET_TOKEN)</div><div class='add'>+ Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+ else</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Misplaced token in variable list");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_local_variable_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ if (t->type == IDENT_TOKEN)</div><div class='add'>+ add_local_variable (t->v.s_val, t->hash);</div><div class='add'>+ else if (t->type == CBRACKET_TOKEN)</div><div class='add'>+ Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+ else</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Misplaced token in variable list");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_static_variable_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ if (t->type == IDENT_TOKEN)</div><div class='add'>+ add_global_variable (t->v.s_val, SLANG_GVARIABLE, t->hash, This_Static_NameSpace);</div><div class='add'>+ else if (t->type == CBRACKET_TOKEN)</div><div class='add'>+ Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+ else</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Misplaced token in variable list");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_private_variable_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ if (t->type == IDENT_TOKEN)</div><div class='add'>+ add_global_variable (t->v.s_val, SLANG_PVARIABLE, t->hash, This_Static_NameSpace);</div><div class='add'>+ else if (t->type == CBRACKET_TOKEN)</div><div class='add'>+ Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+ else</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Misplaced token in variable list");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_function_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ if (-1 == lang_check_space ())</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (t->type != IDENT_TOKEN)</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Expecting function name");</div><div class='add'>+ else</div><div class='add'>+ lang_define_function (t->v.s_val, SLANG_FUNCTION, t->hash, Global_NameSpace);</div><div class='add'>+</div><div class='add'>+ Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* An error block is not permitted to contain continue or break statements.</div><div class='add'>+ * This restriction may be removed later but for now reject them.</div><div class='add'>+ */</div><div class='add'>+static int check_error_block (void)</div><div class='add'>+{</div><div class='add'>+ SLBlock_Type *p;</div><div class='add'>+ unsigned char t;</div><div class='add'>+</div><div class='add'>+ /* Back up to the block and then scan it. */</div><div class='add'>+ p = (Compile_ByteCode_Ptr - 1)->b.blk;</div><div class='add'>+</div><div class='add'>+ while (0 != (t = p->bc_main_type))</div><div class='add'>+ {</div><div class='add'>+ if ((t == _SLANG_BC_BREAK)</div><div class='add'>+ || (t == _SLANG_BC_CONTINUE))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR,</div><div class='add'>+ "An ERROR_BLOCK is not permitted to contain continue or break statements");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ p++;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* The only allowed tokens are the directives and another block start.</div><div class='add'>+ * The mode is only active if a block is available. The inner_interp routine</div><div class='add'>+ * expects such safety checks.</div><div class='add'>+ */</div><div class='add'>+static void compile_directive_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ int bc_sub_type;</div><div class='add'>+</div><div class='add'>+ if (-1 == lang_check_space ())</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ bc_sub_type = -1;</div><div class='add'>+</div><div class='add'>+ switch (t->type)</div><div class='add'>+ {</div><div class='add'>+ case FOREVER_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_FOREVER;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case IFNOT_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_IFNOT;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case IF_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_IF;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case ANDELSE_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_ANDELSE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SWITCH_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_SWITCH;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EXITBLK_TOKEN:</div><div class='add'>+ if (Lang_Defining_Function == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "misplaced EXIT_BLOCK");</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ bc_sub_type = _SLANG_BCST_EXIT_BLOCK;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case ERRBLK_TOKEN:</div><div class='add'>+ if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "misplaced ERROR_BLOCK");</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ if (0 == check_error_block ())</div><div class='add'>+ bc_sub_type = _SLANG_BCST_ERROR_BLOCK;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case USRBLK0_TOKEN:</div><div class='add'>+ case USRBLK1_TOKEN:</div><div class='add'>+ case USRBLK2_TOKEN:</div><div class='add'>+ case USRBLK3_TOKEN:</div><div class='add'>+ case USRBLK4_TOKEN:</div><div class='add'>+ if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "misplaced USER_BLOCK");</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ bc_sub_type = _SLANG_BCST_USER_BLOCK0 + (t->type - USRBLK0_TOKEN);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NOTELSE_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_NOTELSE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case ELSE_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_ELSE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case LOOP_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_LOOP;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case DOWHILE_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_DOWHILE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case WHILE_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_WHILE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case ORELSE_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_ORELSE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _FOR_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_FOR;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case FOR_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_CFOR;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case FOREACH_TOKEN:</div><div class='add'>+ bc_sub_type = _SLANG_BCST_FOREACH;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case OBRACE_TOKEN:</div><div class='add'>+ lang_begin_block ();</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Expecting directive token. Found 0x%X", t->type);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Reset this pointer first because compile_directive may cause a</div><div class='add'>+ * file to be loaded.</div><div class='add'>+ */</div><div class='add'>+ Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+</div><div class='add'>+ if (bc_sub_type != -1)</div><div class='add'>+ compile_directive (bc_sub_type);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned int Assign_Mode_Type;</div><div class='add'>+static void compile_assign_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ if (t->type != IDENT_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Expecting identifier for assignment");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ compile_assign (Assign_Mode_Type, t->v.s_val, t->hash);</div><div class='add'>+ Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_basic_token_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ if (-1 == lang_check_space ())</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ switch (t->type)</div><div class='add'>+ {</div><div class='add'>+ case PUSH_TOKEN:</div><div class='add'>+ case NOP_TOKEN:</div><div class='add'>+ case EOF_TOKEN:</div><div class='add'>+ case READONLY_TOKEN:</div><div class='add'>+ case DO_TOKEN:</div><div class='add'>+ case VARIABLE_TOKEN:</div><div class='add'>+ case SEMICOLON_TOKEN:</div><div class='add'>+ default:</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Unknown or unsupported token type 0x%X", t->type);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case DEREF_TOKEN:</div><div class='add'>+ compile_call_direct (dereference_object, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case STRUCT_TOKEN:</div><div class='add'>+ compile_call_direct (_SLstruct_define_struct, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case TYPEDEF_TOKEN:</div><div class='add'>+ compile_call_direct (_SLstruct_define_typedef, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case TMP_TOKEN:</div><div class='add'>+ compile_tmp_variable (t->v.s_val, t->hash);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case DOT_TOKEN: /* X . field */</div><div class='add'>+ compile_dot (t);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case COMMA_TOKEN:</div><div class='add'>+ break; /* do nothing */</div><div class='add'>+</div><div class='add'>+ case IDENT_TOKEN:</div><div class='add'>+ compile_hashed_identifier (t->v.s_val, t->hash, t);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _REF_TOKEN:</div><div class='add'>+ compile_ref (t->v.s_val, t->hash);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case ARG_TOKEN:</div><div class='add'>+ compile_call_direct (SLang_start_arg_list, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EARG_TOKEN:</div><div class='add'>+ compile_lvar_call_direct (SLang_end_arg_list, _SLANG_BC_EARG_LVARIABLE, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case COLON_TOKEN:</div><div class='add'>+ if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_BLOCK)</div><div class='add'>+ compile_simple (_SLANG_BC_LABEL);</div><div class='add'>+ else SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case POP_TOKEN:</div><div class='add'>+ compile_call_direct (SLdo_pop, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case CASE_TOKEN:</div><div class='add'>+ if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_BLOCK)</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Misplaced 'case'");</div><div class='add'>+ else</div><div class='add'>+ compile_call_direct (case_function, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case CHAR_TOKEN:</div><div class='add'>+ compile_integer (t->v.long_val, _SLANG_BC_LITERAL, SLANG_CHAR_TYPE);</div><div class='add'>+ break;</div><div class='add'>+ case SHORT_TOKEN:</div><div class='add'>+ compile_integer (t->v.long_val, _SLANG_BC_LITERAL, SLANG_SHORT_TYPE);</div><div class='add'>+ break;</div><div class='add'>+ case INT_TOKEN:</div><div class='add'>+ compile_integer (t->v.long_val, _SLANG_BC_LITERAL_INT, SLANG_INT_TYPE);</div><div class='add'>+ break;</div><div class='add'>+ case UCHAR_TOKEN:</div><div class='add'>+ compile_integer (t->v.long_val, _SLANG_BC_LITERAL, SLANG_UCHAR_TYPE);</div><div class='add'>+ break;</div><div class='add'>+ case USHORT_TOKEN:</div><div class='add'>+ compile_integer (t->v.long_val, _SLANG_BC_LITERAL, SLANG_USHORT_TYPE);</div><div class='add'>+ break;</div><div class='add'>+ case UINT_TOKEN:</div><div class='add'>+ compile_integer (t->v.long_val, _SLANG_BC_LITERAL_INT, SLANG_UINT_TYPE);</div><div class='add'>+ break;</div><div class='add'>+ case LONG_TOKEN:</div><div class='add'>+ compile_integer (t->v.long_val, _SLANG_BC_LITERAL, SLANG_LONG_TYPE);</div><div class='add'>+ break;</div><div class='add'>+ case ULONG_TOKEN:</div><div class='add'>+ compile_integer (t->v.long_val, _SLANG_BC_LITERAL, SLANG_ULONG_TYPE);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ case FLOAT_TOKEN:</div><div class='add'>+ compile_float (t->v.s_val);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case DOUBLE_TOKEN:</div><div class='add'>+ compile_double (t->v.s_val, SLANG_DOUBLE_TYPE);</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ case COMPLEX_TOKEN:</div><div class='add'>+ compile_double (t->v.s_val, SLANG_COMPLEX_TYPE);</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ case STRING_TOKEN:</div><div class='add'>+ compile_string (t->v.s_val, t->hash);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _BSTRING_TOKEN:</div><div class='add'>+ compile_bstring (SLbstring_create ((unsigned char *)t->v.s_val, (unsigned int) t->hash));</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case BSTRING_TOKEN:</div><div class='add'>+ compile_bstring (t->v.b_val);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _NULL_TOKEN:</div><div class='add'>+ compile_identifier ("NULL", t);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _INLINE_WILDCARD_ARRAY_TOKEN:</div><div class='add'>+ compile_call_direct (_SLarray_wildcard_array, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _INLINE_ARRAY_TOKEN:</div><div class='add'>+ compile_call_direct (_SLarray_inline_array, _SLANG_BC_CALL_DIRECT_FRAME);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _INLINE_IMPLICIT_ARRAY_TOKEN:</div><div class='add'>+ compile_call_direct (_SLarray_inline_implicit_array, _SLANG_BC_CALL_DIRECT_FRAME);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case ARRAY_TOKEN:</div><div class='add'>+ compile_lvar_call_direct (_SLarray_aget, _SLANG_BC_LVARIABLE_AGET, _SLANG_BC_CALL_DIRECT_FRAME);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* Note: I need to add the other _ARRAY assign tokens. */</div><div class='add'>+ case _ARRAY_PLUSEQS_TOKEN:</div><div class='add'>+ case _ARRAY_MINUSEQS_TOKEN:</div><div class='add'>+ case _ARRAY_TIMESEQS_TOKEN:</div><div class='add'>+ case _ARRAY_DIVEQS_TOKEN:</div><div class='add'>+ case _ARRAY_BOREQS_TOKEN:</div><div class='add'>+ case _ARRAY_BANDEQS_TOKEN:</div><div class='add'>+ case _ARRAY_POST_MINUSMINUS_TOKEN:</div><div class='add'>+ case _ARRAY_MINUSMINUS_TOKEN:</div><div class='add'>+ case _ARRAY_POST_PLUSPLUS_TOKEN:</div><div class='add'>+ case _ARRAY_PLUSPLUS_TOKEN:</div><div class='add'>+ compile_array_assign (t);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _ARRAY_ASSIGN_TOKEN:</div><div class='add'>+ compile_lvar_call_direct (_SLarray_aput, _SLANG_BC_LVARIABLE_APUT, _SLANG_BC_CALL_DIRECT_FRAME);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _STRUCT_ASSIGN_TOKEN:</div><div class='add'>+ case _STRUCT_PLUSEQS_TOKEN:</div><div class='add'>+ case _STRUCT_MINUSEQS_TOKEN:</div><div class='add'>+ case _STRUCT_TIMESEQS_TOKEN:</div><div class='add'>+ case _STRUCT_DIVEQS_TOKEN:</div><div class='add'>+ case _STRUCT_BOREQS_TOKEN:</div><div class='add'>+ case _STRUCT_BANDEQS_TOKEN:</div><div class='add'>+ case _STRUCT_POST_MINUSMINUS_TOKEN:</div><div class='add'>+ case _STRUCT_MINUSMINUS_TOKEN:</div><div class='add'>+ case _STRUCT_POST_PLUSPLUS_TOKEN:</div><div class='add'>+ case _STRUCT_PLUSPLUS_TOKEN:</div><div class='add'>+ compile_struct_assign (t);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SCALAR_ASSIGN_TOKEN:</div><div class='add'>+ case _SCALAR_PLUSEQS_TOKEN:</div><div class='add'>+ case _SCALAR_MINUSEQS_TOKEN:</div><div class='add'>+ case _SCALAR_TIMESEQS_TOKEN:</div><div class='add'>+ case _SCALAR_DIVEQS_TOKEN:</div><div class='add'>+ case _SCALAR_BOREQS_TOKEN:</div><div class='add'>+ case _SCALAR_BANDEQS_TOKEN:</div><div class='add'>+ case _SCALAR_POST_MINUSMINUS_TOKEN:</div><div class='add'>+ case _SCALAR_MINUSMINUS_TOKEN:</div><div class='add'>+ case _SCALAR_POST_PLUSPLUS_TOKEN:</div><div class='add'>+ case _SCALAR_PLUSPLUS_TOKEN:</div><div class='add'>+ compile_assign (_SLANG_BCST_ASSIGN + (t->type - _SCALAR_ASSIGN_TOKEN),</div><div class='add'>+ t->v.s_val, t->hash);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _DEREF_ASSIGN_TOKEN:</div><div class='add'>+ compile_deref_assign (t->v.s_val, t->hash);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* For processing RPN tokens */</div><div class='add'>+ case ASSIGN_TOKEN:</div><div class='add'>+ case PLUSEQS_TOKEN:</div><div class='add'>+ case MINUSEQS_TOKEN:</div><div class='add'>+ case TIMESEQS_TOKEN:</div><div class='add'>+ case DIVEQS_TOKEN:</div><div class='add'>+ case BOREQS_TOKEN:</div><div class='add'>+ case BANDEQS_TOKEN:</div><div class='add'>+ case POST_MINUSMINUS_TOKEN:</div><div class='add'>+ case MINUSMINUS_TOKEN:</div><div class='add'>+ case POST_PLUSPLUS_TOKEN:</div><div class='add'>+ case PLUSPLUS_TOKEN:</div><div class='add'>+ Compile_Mode_Function = compile_assign_mode;</div><div class='add'>+ Assign_Mode_Type = _SLANG_BCST_ASSIGN + (t->type - ASSIGN_TOKEN);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case LT_TOKEN:</div><div class='add'>+ compile_binary (SLANG_LT);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case LE_TOKEN:</div><div class='add'>+ compile_binary (SLANG_LE);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case GT_TOKEN:</div><div class='add'>+ compile_binary (SLANG_GT);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case GE_TOKEN:</div><div class='add'>+ compile_binary (SLANG_GE);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EQ_TOKEN:</div><div class='add'>+ compile_binary (SLANG_EQ);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NE_TOKEN:</div><div class='add'>+ compile_binary (SLANG_NE);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case AND_TOKEN:</div><div class='add'>+ compile_binary (SLANG_AND);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case ADD_TOKEN:</div><div class='add'>+ compile_fast_binary (SLANG_PLUS, _SLANG_BC_INTEGER_PLUS);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SUB_TOKEN:</div><div class='add'>+ compile_fast_binary (SLANG_MINUS, _SLANG_BC_INTEGER_MINUS);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case TIMES_TOKEN:</div><div class='add'>+ compile_binary (SLANG_TIMES);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case DIV_TOKEN:</div><div class='add'>+ compile_binary (SLANG_DIVIDE);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case POW_TOKEN:</div><div class='add'>+ compile_binary (SLANG_POW);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case BXOR_TOKEN:</div><div class='add'>+ compile_binary (SLANG_BXOR);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case BAND_TOKEN:</div><div class='add'>+ compile_binary (SLANG_BAND);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case BOR_TOKEN:</div><div class='add'>+ compile_binary (SLANG_BOR);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SHR_TOKEN:</div><div class='add'>+ compile_binary (SLANG_SHR);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SHL_TOKEN:</div><div class='add'>+ compile_binary (SLANG_SHL);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case MOD_TOKEN:</div><div class='add'>+ compile_binary (SLANG_MOD);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case OR_TOKEN:</div><div class='add'>+ compile_binary (SLANG_OR);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NOT_TOKEN:</div><div class='add'>+ compile_unary (SLANG_NOT, _SLANG_BC_UNARY);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case BNOT_TOKEN:</div><div class='add'>+ compile_unary (SLANG_BNOT, _SLANG_BC_UNARY);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case MUL2_TOKEN:</div><div class='add'>+ compile_unary (SLANG_MUL2, _SLANG_BC_UNARY_FUNC);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case CHS_TOKEN:</div><div class='add'>+ compile_unary (SLANG_CHS, _SLANG_BC_UNARY_FUNC);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case ABS_TOKEN:</div><div class='add'>+ compile_unary (SLANG_ABS, _SLANG_BC_UNARY_FUNC);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SQR_TOKEN:</div><div class='add'>+ compile_unary (SLANG_SQR, _SLANG_BC_UNARY_FUNC);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SIGN_TOKEN:</div><div class='add'>+ compile_unary (SLANG_SIGN, _SLANG_BC_UNARY_FUNC);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case BREAK_TOKEN:</div><div class='add'>+ compile_break (_SLANG_BC_BREAK, 1, 0, "break");</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case RETURN_TOKEN:</div><div class='add'>+ compile_break (_SLANG_BC_RETURN, 0, 1, "return");</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case CONT_TOKEN:</div><div class='add'>+ compile_break (_SLANG_BC_CONTINUE, 1, 0, "continue");</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EXCH_TOKEN:</div><div class='add'>+ compile_break (_SLANG_BC_EXCH, 0, 0, ""); /* FIXME: Priority=low */</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case STATIC_TOKEN:</div><div class='add'>+ if (Lang_Defining_Function == 0)</div><div class='add'>+ Compile_Mode_Function = compile_static_variable_mode;</div><div class='add'>+ else</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "static variables not permitted in functions");</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case PRIVATE_TOKEN:</div><div class='add'>+ if (Lang_Defining_Function == 0)</div><div class='add'>+ Compile_Mode_Function = compile_private_variable_mode;</div><div class='add'>+ else</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "private variables not permitted in functions");</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case PUBLIC_TOKEN:</div><div class='add'>+ if (Lang_Defining_Function == 0)</div><div class='add'>+ Compile_Mode_Function = compile_public_variable_mode;</div><div class='add'>+ else</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "public variables not permitted in functions");</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case OBRACKET_TOKEN:</div><div class='add'>+ if (Lang_Defining_Function == 0)</div><div class='add'>+ Compile_Mode_Function = Default_Variable_Mode;</div><div class='add'>+ else</div><div class='add'>+ Compile_Mode_Function = compile_local_variable_mode;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case OPAREN_TOKEN:</div><div class='add'>+ lang_begin_function ();</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case DEFINE_STATIC_TOKEN:</div><div class='add'>+ if (Lang_Defining_Function)</div><div class='add'>+ define_static_function (t->v.s_val, t->hash);</div><div class='add'>+ else SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case DEFINE_PRIVATE_TOKEN:</div><div class='add'>+ if (Lang_Defining_Function)</div><div class='add'>+ define_private_function (t->v.s_val, t->hash);</div><div class='add'>+ else SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case DEFINE_PUBLIC_TOKEN:</div><div class='add'>+ if (Lang_Defining_Function)</div><div class='add'>+ define_public_function (t->v.s_val, t->hash);</div><div class='add'>+ else SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case DEFINE_TOKEN:</div><div class='add'>+ if (Lang_Defining_Function)</div><div class='add'>+ (*Default_Define_Function) (t->v.s_val, t->hash);</div><div class='add'>+ else</div><div class='add'>+ SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case CPAREN_TOKEN:</div><div class='add'>+ if (Lang_Defining_Function)</div><div class='add'>+ Compile_Mode_Function = compile_function_mode;</div><div class='add'>+ else SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case CBRACE_TOKEN:</div><div class='add'>+ lang_end_block ();</div><div class='add'>+ Compile_Mode_Function = compile_directive_mode;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case OBRACE_TOKEN:</div><div class='add'>+ lang_begin_block ();</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case FARG_TOKEN:</div><div class='add'>+ Function_Args_Number = Local_Variable_Number;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ case LINE_NUM_TOKEN:</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LINE_NUM;</div><div class='add'>+ Compile_ByteCode_Ptr->b.l_blk = t->v.long_val;</div><div class='add'>+ lang_try_now ();</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ case POUND_TOKEN:</div><div class='add'>+ compile_call_direct (_SLarray_matrix_multiply, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLcompile (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ if (SLang_Error == 0)</div><div class='add'>+ {</div><div class='add'>+ if (Compile_Mode_Function != compile_basic_token_mode)</div><div class='add'>+ {</div><div class='add'>+ if (Compile_Mode_Function == NULL)</div><div class='add'>+ Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ if (t->type == LINE_NUM_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ compile_basic_token_mode (t);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ (*Compile_Mode_Function) (t);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ {</div><div class='add'>+ Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+ SLang_restart (0);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void (*_SLcompile_ptr)(_SLang_Token_Type *) = _SLcompile;</div><div class='add'>+</div><div class='add'>+typedef struct _Compile_Context_Type</div><div class='add'>+{</div><div class='add'>+ struct _Compile_Context_Type *next;</div><div class='add'>+ SLang_NameSpace_Type *static_namespace;</div><div class='add'>+ void (*compile_variable_mode) (_SLang_Token_Type *);</div><div class='add'>+ void (*define_function) (char *, unsigned long);</div><div class='add'>+ int lang_defining_function;</div><div class='add'>+ int local_variable_number;</div><div class='add'>+ unsigned int function_args_number;</div><div class='add'>+ SLang_Name_Type **locals_hash_table;</div><div class='add'>+ void (*compile_mode_function)(_SLang_Token_Type *);</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ char *compile_filename;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+Compile_Context_Type;</div><div class='add'>+</div><div class='add'>+static Compile_Context_Type *Compile_Context_Stack;</div><div class='add'>+</div><div class='add'>+/* The only way the push/pop_context functions can get called is via</div><div class='add'>+ * an eval type function. That can only happen when executed from a</div><div class='add'>+ * top level block. This means that Compile_ByteCode_Ptr can always be</div><div class='add'>+ * rest back to the beginning of a block.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static int pop_compile_context (void)</div><div class='add'>+{</div><div class='add'>+ Compile_Context_Type *cc;</div><div class='add'>+</div><div class='add'>+ if (NULL == (cc = Compile_Context_Stack))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ This_Static_NameSpace = cc->static_namespace;</div><div class='add'>+ Compile_Context_Stack = cc->next;</div><div class='add'>+ Default_Variable_Mode = cc->compile_variable_mode;</div><div class='add'>+ Default_Define_Function = cc->define_function;</div><div class='add'>+ Compile_Mode_Function = cc->compile_mode_function;</div><div class='add'>+</div><div class='add'>+ Lang_Defining_Function = cc->lang_defining_function;</div><div class='add'>+ Local_Variable_Number = cc->local_variable_number;</div><div class='add'>+ Function_Args_Number = cc->function_args_number;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ SLang_free_slstring (This_Compile_Filename);</div><div class='add'>+ This_Compile_Filename = cc->compile_filename;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ SLfree ((char *) Locals_Hash_Table);</div><div class='add'>+ Locals_Hash_Table = cc->locals_hash_table;</div><div class='add'>+</div><div class='add'>+ SLfree ((char *) cc);</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_compile_context (char *name)</div><div class='add'>+{</div><div class='add'>+ Compile_Context_Type *cc;</div><div class='add'>+ SLang_Name_Type **lns;</div><div class='add'>+</div><div class='add'>+ cc = (Compile_Context_Type *)SLmalloc (sizeof (Compile_Context_Type));</div><div class='add'>+ if (cc == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+ memset ((char *) cc, 0, sizeof (Compile_Context_Type));</div><div class='add'>+</div><div class='add'>+ lns = (SLang_Name_Type **) SLcalloc (sizeof (SLang_Name_Type *), SLLOCALS_HASH_TABLE_SIZE);</div><div class='add'>+ if (lns == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) cc);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ if ((name != NULL)</div><div class='add'>+ && (NULL == (name = SLang_create_slstring (name))))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) cc);</div><div class='add'>+ SLfree ((char *) lns);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ cc->compile_filename = This_Compile_Filename;</div><div class='add'>+ This_Compile_Filename = name;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ cc->static_namespace = This_Static_NameSpace;</div><div class='add'>+ cc->compile_variable_mode = Default_Variable_Mode;</div><div class='add'>+ cc->define_function = Default_Define_Function;</div><div class='add'>+ cc->locals_hash_table = Locals_Hash_Table;</div><div class='add'>+</div><div class='add'>+ cc->lang_defining_function = Lang_Defining_Function;</div><div class='add'>+ cc->local_variable_number = Local_Variable_Number;</div><div class='add'>+ cc->function_args_number = Function_Args_Number;</div><div class='add'>+ cc->locals_hash_table = Locals_Hash_Table;</div><div class='add'>+ cc->compile_mode_function = Compile_Mode_Function;</div><div class='add'>+</div><div class='add'>+ cc->next = Compile_Context_Stack;</div><div class='add'>+ Compile_Context_Stack = cc;</div><div class='add'>+</div><div class='add'>+ Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+ Default_Variable_Mode = compile_public_variable_mode;</div><div class='add'>+ Default_Define_Function = define_public_function;</div><div class='add'>+ Lang_Defining_Function = 0;</div><div class='add'>+ Local_Variable_Number = 0;</div><div class='add'>+ Function_Args_Number = 0;</div><div class='add'>+ Locals_Hash_Table = lns;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int init_interpreter (void)</div><div class='add'>+{</div><div class='add'>+ SLang_NameSpace_Type *ns;</div><div class='add'>+</div><div class='add'>+ if (Global_NameSpace != NULL)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ if (NULL == (ns = _SLns_allocate_namespace ("***GLOBAL***", SLGLOBALS_HASH_TABLE_SIZE)))</div><div class='add'>+ return -1;</div><div class='add'>+ if (-1 == _SLns_set_namespace_name (ns, "Global"))</div><div class='add'>+ return -1;</div><div class='add'>+ Global_NameSpace = ns;</div><div class='add'>+</div><div class='add'>+ _SLRun_Stack = (SLang_Object_Type *) SLcalloc (SLANG_MAX_STACK_LEN,</div><div class='add'>+ sizeof (SLang_Object_Type));</div><div class='add'>+ if (_SLRun_Stack == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ _SLStack_Pointer = _SLRun_Stack;</div><div class='add'>+ _SLStack_Pointer_Max = _SLRun_Stack + SLANG_MAX_STACK_LEN;</div><div class='add'>+</div><div class='add'>+ SLShort_Blocks[0].bc_main_type = _SLANG_BC_RETURN;</div><div class='add'>+ SLShort_Blocks[2].bc_main_type = _SLANG_BC_BREAK;</div><div class='add'>+ SLShort_Blocks[4].bc_main_type = _SLANG_BC_CONTINUE;</div><div class='add'>+</div><div class='add'>+ Num_Args_Stack = (int *) SLmalloc (sizeof (int) * SLANG_MAX_RECURSIVE_DEPTH);</div><div class='add'>+ if (Num_Args_Stack == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) _SLRun_Stack);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ Recursion_Depth = 0;</div><div class='add'>+ Frame_Pointer_Stack = (unsigned int *) SLmalloc (sizeof (unsigned int) * SLANG_MAX_RECURSIVE_DEPTH);</div><div class='add'>+ if (Frame_Pointer_Stack == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) _SLRun_Stack);</div><div class='add'>+ SLfree ((char *)Num_Args_Stack);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ Frame_Pointer_Depth = 0;</div><div class='add'>+ Frame_Pointer = _SLRun_Stack;</div><div class='add'>+</div><div class='add'>+ Default_Variable_Mode = compile_public_variable_mode;</div><div class='add'>+ Default_Define_Function = define_public_function;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int add_generic_table (SLang_NameSpace_Type *ns,</div><div class='add'>+ SLang_Name_Type *table, char *pp_name,</div><div class='add'>+ unsigned int entry_len)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *t, **ns_table;</div><div class='add'>+ char *name;</div><div class='add'>+ unsigned int table_size;</div><div class='add'>+ </div><div class='add'>+ if (-1 == init_interpreter ())</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ if (ns == NULL) </div><div class='add'>+ ns = Global_NameSpace;</div><div class='add'>+ </div><div class='add'>+ ns_table = ns->table;</div><div class='add'>+ table_size = ns->table_size;</div><div class='add'>+ </div><div class='add'>+ if ((pp_name != NULL)</div><div class='add'>+ && (-1 == SLdefine_for_ifdef (pp_name)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ t = table;</div><div class='add'>+ while (NULL != (name = t->name))</div><div class='add'>+ {</div><div class='add'>+ unsigned long hash;</div><div class='add'>+</div><div class='add'>+ /* Backward compatibility: '.' WAS used as hash marker */</div><div class='add'>+ if (*name == '.')</div><div class='add'>+ {</div><div class='add'>+ name++;</div><div class='add'>+ t->name = name;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (name = SLang_create_slstring (name)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ t->name = name;</div><div class='add'>+</div><div class='add'>+ hash = _SLcompute_string_hash (name);</div><div class='add'>+ hash = hash % table_size;</div><div class='add'>+</div><div class='add'>+ t->next = ns_table [(unsigned int) hash];</div><div class='add'>+ ns_table [(unsigned int) hash] = t;</div><div class='add'>+</div><div class='add'>+ t = (SLang_Name_Type *) ((char *)t + entry_len);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_intrin_fun_table (SLang_Intrin_Fun_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+ return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Intrin_Fun_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_intrin_var_table (SLang_Intrin_Var_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+ return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Intrin_Var_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_app_unary_table (SLang_App_Unary_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+ return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_App_Unary_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_math_unary_table (SLang_Math_Unary_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+ return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Math_Unary_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_iconstant_table (SLang_IConstant_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+ return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_IConstant_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+int SLadd_dconstant_table (SLang_DConstant_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+ return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_DConstant_Type));</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* ----------- */</div><div class='add'>+int SLns_add_intrin_fun_table (SLang_NameSpace_Type *ns, SLang_Intrin_Fun_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+ return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Intrin_Fun_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLns_add_intrin_var_table (SLang_NameSpace_Type *ns, SLang_Intrin_Var_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+ return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Intrin_Var_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLns_add_app_unary_table (SLang_NameSpace_Type *ns, SLang_App_Unary_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+ return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_App_Unary_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLns_add_math_unary_table (SLang_NameSpace_Type *ns, SLang_Math_Unary_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+ return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Math_Unary_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLns_add_iconstant_table (SLang_NameSpace_Type *ns, SLang_IConstant_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+ return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_IConstant_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+int SLns_add_dconstant_table (SLang_NameSpace_Type *ns, SLang_DConstant_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+ return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_DConstant_Type));</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* what is a bitmapped value:</div><div class='add'>+ * 1 intrin fun</div><div class='add'>+ * 2 user fun</div><div class='add'>+ * 4 intrin var</div><div class='add'>+ * 8 user defined var</div><div class='add'>+ */</div><div class='add'>+SLang_Array_Type *_SLang_apropos (char *namespace_name, char *pat, unsigned int what)</div><div class='add'>+{</div><div class='add'>+ SLang_NameSpace_Type *ns;</div><div class='add'>+</div><div class='add'>+ if (namespace_name == NULL)</div><div class='add'>+ namespace_name = "Global";</div><div class='add'>+</div><div class='add'>+ if (*namespace_name == 0)</div><div class='add'>+ ns = This_Static_NameSpace;</div><div class='add'>+ else ns = _SLns_find_namespace (namespace_name);</div><div class='add'>+</div><div class='add'>+ return _SLnspace_apropos (ns, pat, what);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLang_implements_intrinsic (char *name)</div><div class='add'>+{</div><div class='add'>+ if (This_Static_NameSpace == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INTRINSIC_ERROR, "No namespace available");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ (void) _SLns_set_namespace_name (This_Static_NameSpace, name);</div><div class='add'>+</div><div class='add'>+ Default_Define_Function = define_static_function;</div><div class='add'>+ Default_Variable_Mode = compile_static_variable_mode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLang_use_namespace_intrinsic (char *name)</div><div class='add'>+{</div><div class='add'>+ SLang_NameSpace_Type *ns;</div><div class='add'>+ </div><div class='add'>+ if (NULL == (ns = _SLns_find_namespace (name)))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INTRINSIC_ERROR, "Namespace %s does not exist", name);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ This_Static_NameSpace = ns;</div><div class='add'>+ if (Global_NameSpace == ns)</div><div class='add'>+ {</div><div class='add'>+ Default_Define_Function = define_public_function;</div><div class='add'>+ Default_Variable_Mode = compile_public_variable_mode;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ Default_Define_Function = define_static_function;</div><div class='add'>+ Default_Variable_Mode = compile_static_variable_mode;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+char *_SLang_cur_namespace_intrinsic (void)</div><div class='add'>+{</div><div class='add'>+ if (This_Static_NameSpace == NULL)</div><div class='add'>+ return "Global";</div><div class='add'>+</div><div class='add'>+ if (This_Static_NameSpace->namespace_name == NULL)</div><div class='add'>+ return "";</div><div class='add'>+ </div><div class='add'>+ return This_Static_NameSpace->namespace_name;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slang.h b/mdk-stage1/slang/slang.h<br/>new file mode 100644<br/>index 000000000..900b14043<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slang.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slang.h</a></div><div class='hunk'>@@ -0,0 +1,1930 @@</div><div class='add'>+#ifndef DAVIS_SLANG_H_</div><div class='add'>+#define DAVIS_SLANG_H_</div><div class='add'>+/* -*- mode: C; mode: fold; -*- */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#define SLANG_VERSION 10404</div><div class='add'>+#define SLANG_VERSION_STRING "1.4.4"</div><div class='add'>+</div><div class='add'>+/*{{{ System Dependent Macros and Typedefs */</div><div class='add'>+</div><div class='add'>+#if defined(__WATCOMC__) && defined(DOS)</div><div class='add'>+# ifndef __MSDOS__</div><div class='add'>+# define __MSDOS__</div><div class='add'>+# endif</div><div class='add'>+# ifndef DOS386</div><div class='add'>+# define DOS386</div><div class='add'>+# endif</div><div class='add'>+# ifndef IBMPC_SYSTEM</div><div class='add'>+# define IBMPC_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif /* __watcomc__ */</div><div class='add'>+</div><div class='add'>+#if defined(unix) || defined(__unix)</div><div class='add'>+# ifndef __unix__</div><div class='add'>+# define __unix__ 1</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if !defined(__GO32__)</div><div class='add'>+# ifdef __unix__</div><div class='add'>+# define REAL_UNIX_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Set of the various defines for pc systems. This includes OS/2 */</div><div class='add'>+#ifdef __GO32__</div><div class='add'>+# ifndef __DJGPP__</div><div class='add'>+# define __DJGPP__ 1</div><div class='add'>+# endif</div><div class='add'>+# ifndef IBMPC_SYSTEM</div><div class='add'>+# define IBMPC_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __BORLANDC__</div><div class='add'>+# ifndef IBMPC_SYSTEM</div><div class='add'>+# define IBMPC_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __MSDOS__</div><div class='add'>+# ifndef IBMPC_SYSTEM</div><div class='add'>+# define IBMPC_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(OS2) || defined(__os2__)</div><div class='add'>+# ifndef IBMPC_SYSTEM</div><div class='add'>+# define IBMPC_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+# ifndef __os2__</div><div class='add'>+# define __os2__</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__NT__) || defined(__MINGW32__) || defined(__CYGWIN32__)</div><div class='add'>+# ifndef IBMPC_SYSTEM</div><div class='add'>+# define IBMPC_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(IBMPC_SYSTEM) || defined(VMS)</div><div class='add'>+# ifdef REAL_UNIX_SYSTEM</div><div class='add'>+# undef REAL_UNIX_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+extern "C" {</div><div class='add'>+#endif</div><div class='add'>+#if 0</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include <stdio.h></div><div class='add'>+#include <stdarg.h></div><div class='add'>+#if defined(__STDC__) || defined(__BORLANDC__) || defined(__cplusplus)</div><div class='add'>+# include <stddef.h> /* for offsetof */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* ---------------------------- Generic Macros ----------------------------- */</div><div class='add'>+</div><div class='add'>+/* __SC__ is defined for Symantec C++</div><div class='add'>+ DOS386 is defined for -mx memory model, 32 bit DOS extender. */</div><div class='add'>+</div><div class='add'>+#if defined(__SC__) && !defined(DOS386)</div><div class='add'>+# include <dos.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include <alloc.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined (__cplusplus) || defined(__STDC__) || defined(IBMPC_SYSTEM)</div><div class='add'>+ typedef void *VOID_STAR;</div><div class='add'>+#else</div><div class='add'>+ typedef unsigned char *VOID_STAR;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef int (*FVOID_STAR)(void);</div><div class='add'>+</div><div class='add'>+#if defined(__MSDOS_) && defined(__BORLANDC__)</div><div class='add'>+# define SLFREE(buf) farfree((void far *)(buf))</div><div class='add'>+# define SLMALLOC(x) farmalloc((unsigned long) (x))</div><div class='add'>+# define SLREALLOC(buf, n) farrealloc((void far *) (buf), (unsigned long) (n))</div><div class='add'>+# define SLCALLOC(n, m) farcalloc((unsigned long) (n), (unsigned long) (m))</div><div class='add'>+#else</div><div class='add'>+# if defined(VMS) && !defined(__DECC)</div><div class='add'>+# define SLFREE VAXC$FREE_OPT</div><div class='add'>+# define SLMALLOC VAXC$MALLOC_OPT</div><div class='add'>+# define SLREALLOC VAXC$REALLOC_OPT</div><div class='add'>+# define SLCALLOC VAXC$CALLOC_OPT</div><div class='add'>+# else</div><div class='add'>+# define SLFREE(x) free((char *)(x))</div><div class='add'>+# define SLMALLOC malloc</div><div class='add'>+# define SLREALLOC realloc</div><div class='add'>+# define SLCALLOC calloc</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ extern char *SLdebug_malloc (unsigned long);</div><div class='add'>+ extern char *SLdebug_calloc (unsigned long, unsigned long);</div><div class='add'>+ extern char *SLdebug_realloc (char *, unsigned long);</div><div class='add'>+ extern void SLdebug_free (char *);</div><div class='add'>+ extern void SLmalloc_dump_statistics (void);</div><div class='add'>+ extern char *SLstrcpy(register char *, register char *);</div><div class='add'>+ extern int SLstrcmp(register char *, register char *);</div><div class='add'>+ extern char *SLstrncpy(char *, register char *, register int);</div><div class='add'>+</div><div class='add'>+ extern void SLmemset (char *, char, int);</div><div class='add'>+ extern char *SLmemchr (register char *, register char, register int);</div><div class='add'>+ extern char *SLmemcpy (char *, char *, int);</div><div class='add'>+ extern int SLmemcmp (char *, char *, int);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Interpreter Typedefs */</div><div class='add'>+</div><div class='add'>+typedef struct _SLang_Name_Type</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ struct _SLang_Name_Type *next;</div><div class='add'>+ char name_type;</div><div class='add'>+ /* These values must be less than 0x10 because they map directly</div><div class='add'>+ * to byte codes. See _slang.h.</div><div class='add'>+ */</div><div class='add'>+#define SLANG_LVARIABLE 0x01</div><div class='add'>+#define SLANG_GVARIABLE 0x02</div><div class='add'>+#define SLANG_IVARIABLE 0x03 /* intrinsic variables */</div><div class='add'>+ /* Note!!! For Macro MAKE_VARIABLE below to work, SLANG_IVARIABLE Must</div><div class='add'>+ be 1 less than SLANG_RVARIABLE!!! */</div><div class='add'>+#define SLANG_RVARIABLE 0x04 /* read only variable */</div><div class='add'>+#define SLANG_INTRINSIC 0x05</div><div class='add'>+#define SLANG_FUNCTION 0x06</div><div class='add'>+#define SLANG_MATH_UNARY 0x07</div><div class='add'>+#define SLANG_APP_UNARY 0x08</div><div class='add'>+#define SLANG_ICONSTANT 0x09</div><div class='add'>+#define SLANG_DCONSTANT 0x0A</div><div class='add'>+#define SLANG_PVARIABLE 0x0B /* private */</div><div class='add'>+#define SLANG_PFUNCTION 0x0C /* private */</div><div class='add'>+</div><div class='add'>+ /* Rest of fields depend on name type */</div><div class='add'>+}</div><div class='add'>+SLang_Name_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ struct _SLang_Name_Type *next; /* this is for the hash table */</div><div class='add'>+ char name_type;</div><div class='add'>+</div><div class='add'>+ FVOID_STAR i_fun; /* address of object */</div><div class='add'>+</div><div class='add'>+ /* Do not change this without modifying slang.c:execute_intrinsic_fun */</div><div class='add'>+#define SLANG_MAX_INTRIN_ARGS 7</div><div class='add'>+ unsigned char arg_types [SLANG_MAX_INTRIN_ARGS];</div><div class='add'>+ unsigned char num_args;</div><div class='add'>+ unsigned char return_type;</div><div class='add'>+}</div><div class='add'>+SLang_Intrin_Fun_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ SLang_Name_Type *next;</div><div class='add'>+ char name_type;</div><div class='add'>+</div><div class='add'>+ VOID_STAR addr;</div><div class='add'>+ unsigned char type;</div><div class='add'>+}</div><div class='add'>+SLang_Intrin_Var_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ SLang_Name_Type *next;</div><div class='add'>+ char name_type;</div><div class='add'>+</div><div class='add'>+ int unary_op;</div><div class='add'>+}</div><div class='add'>+SLang_App_Unary_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ SLang_Name_Type *next;</div><div class='add'>+ char name_type;</div><div class='add'>+</div><div class='add'>+ int unary_op;</div><div class='add'>+}</div><div class='add'>+SLang_Math_Unary_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ SLang_Name_Type *next;</div><div class='add'>+ char name_type;</div><div class='add'>+ int i;</div><div class='add'>+}</div><div class='add'>+SLang_IConstant_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ SLang_Name_Type *next;</div><div class='add'>+ char name_type;</div><div class='add'>+ double d;</div><div class='add'>+}</div><div class='add'>+SLang_DConstant_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *field_name;</div><div class='add'>+ unsigned int offset;</div><div class='add'>+ unsigned char type;</div><div class='add'>+ unsigned char read_only;</div><div class='add'>+}</div><div class='add'>+SLang_IStruct_Field_Type;</div><div class='add'>+</div><div class='add'>+extern int SLadd_intrin_fun_table (SLang_Intrin_Fun_Type *, char *);</div><div class='add'>+extern int SLadd_intrin_var_table (SLang_Intrin_Var_Type *, char *);</div><div class='add'>+extern int SLadd_app_unary_table (SLang_App_Unary_Type *, char *);</div><div class='add'>+extern int SLadd_math_unary_table (SLang_Math_Unary_Type *, char *);</div><div class='add'>+extern int SLadd_iconstant_table (SLang_IConstant_Type *, char *);</div><div class='add'>+extern int SLadd_dconstant_table (SLang_DConstant_Type *, char *);</div><div class='add'>+extern int SLadd_istruct_table (SLang_IStruct_Field_Type *, VOID_STAR, char *);</div><div class='add'>+</div><div class='add'>+typedef struct _SLang_NameSpace_Type SLang_NameSpace_Type;</div><div class='add'>+</div><div class='add'>+extern int SLns_add_intrin_fun_table (SLang_NameSpace_Type *, SLang_Intrin_Fun_Type *, char *);</div><div class='add'>+extern int SLns_add_intrin_var_table (SLang_NameSpace_Type *, SLang_Intrin_Var_Type *, char *);</div><div class='add'>+extern int SLns_add_app_unary_table (SLang_NameSpace_Type *, SLang_App_Unary_Type *, char *);</div><div class='add'>+extern int SLns_add_math_unary_table (SLang_NameSpace_Type *, SLang_Math_Unary_Type *, char *);</div><div class='add'>+extern int SLns_add_iconstant_table (SLang_NameSpace_Type *, SLang_IConstant_Type *, char *);</div><div class='add'>+extern int SLns_add_dconstant_table (SLang_NameSpace_Type *, SLang_DConstant_Type *, char *);</div><div class='add'>+extern int SLns_add_istruct_table (SLang_NameSpace_Type *, SLang_IStruct_Field_Type *, VOID_STAR, char *);</div><div class='add'>+</div><div class='add'>+extern SLang_NameSpace_Type *SLns_create_namespace (char *);</div><div class='add'>+extern void SLns_delete_namespace (SLang_NameSpace_Type *);</div><div class='add'>+</div><div class='add'>+typedef struct SLang_Load_Type</div><div class='add'>+{</div><div class='add'>+ int type;</div><div class='add'>+</div><div class='add'>+ VOID_STAR client_data;</div><div class='add'>+ /* Pointer to data that client needs for loading */</div><div class='add'>+</div><div class='add'>+ int auto_declare_globals;</div><div class='add'>+ /* if non-zero, undefined global variables are declared as static */</div><div class='add'>+</div><div class='add'>+ char *(*read)(struct SLang_Load_Type *);</div><div class='add'>+ /* function to call to read next line from obj. */</div><div class='add'>+</div><div class='add'>+ unsigned int line_num;</div><div class='add'>+ /* Number of lines read, used for error reporting */</div><div class='add'>+</div><div class='add'>+ int parse_level;</div><div class='add'>+ /* 0 if at top level of parsing */</div><div class='add'>+</div><div class='add'>+ char *name;</div><div class='add'>+ /* Name of this object, e.g., filename. This name should be unique because</div><div class='add'>+ * it alone determines the name space for static objects associated with</div><div class='add'>+ * the compilable unit.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ unsigned long reserved[4];</div><div class='add'>+ /* For future expansion */</div><div class='add'>+} SLang_Load_Type;</div><div class='add'>+</div><div class='add'>+extern SLang_Load_Type *SLallocate_load_type (char *);</div><div class='add'>+extern void SLdeallocate_load_type (SLang_Load_Type *);</div><div class='add'>+</div><div class='add'>+/* Returns SLang_Error upon failure */</div><div class='add'>+extern int SLang_load_object (SLang_Load_Type *);</div><div class='add'>+extern int (*SLang_Load_File_Hook)(char *);</div><div class='add'>+extern int (*SLang_Auto_Declare_Var_Hook) (char *);</div><div class='add'>+</div><div class='add'>+extern int SLang_generate_debug_info (int);</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#if defined(ultrix) && !defined(__GNUC__)</div><div class='add'>+# ifndef NO_PROTOTYPES</div><div class='add'>+# define NO_PROTOTYPES</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef NO_PROTOTYPES</div><div class='add'>+# define _PROTO(x) x</div><div class='add'>+#else</div><div class='add'>+# define _PROTO(x) ()</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct SL_OOBinary_Type</div><div class='add'>+{</div><div class='add'>+ unsigned char data_type; /* partner type for binary op */</div><div class='add'>+</div><div class='add'>+ int (*binary_function)_PROTO((int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR));</div><div class='add'>+</div><div class='add'>+ int (*binary_result) _PROTO((int, unsigned char, unsigned char, unsigned char *));</div><div class='add'>+ struct SL_OOBinary_Type *next;</div><div class='add'>+}</div><div class='add'>+SL_OOBinary_Type;</div><div class='add'>+</div><div class='add'>+typedef struct _SL_Typecast_Type</div><div class='add'>+{</div><div class='add'>+ unsigned char data_type; /* to_type */</div><div class='add'>+ int allow_implicit;</div><div class='add'>+</div><div class='add'>+ int (*typecast)_PROTO((unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR));</div><div class='add'>+ struct _SL_Typecast_Type *next;</div><div class='add'>+}</div><div class='add'>+SL_Typecast_Type;</div><div class='add'>+</div><div class='add'>+typedef struct _SLang_Struct_Type SLang_Struct_Type;</div><div class='add'>+</div><div class='add'>+#if defined(SL_APP_WANTS_FOREACH)</div><div class='add'>+/* It is up to the application to define struct _SLang_Foreach_Context_Type */</div><div class='add'>+typedef struct _SLang_Foreach_Context_Type SLang_Foreach_Context_Type;</div><div class='add'>+#else</div><div class='add'>+typedef int SLang_Foreach_Context_Type;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ unsigned char cl_class_type;</div><div class='add'>+#define SLANG_CLASS_TYPE_MMT 0</div><div class='add'>+#define SLANG_CLASS_TYPE_SCALAR 1</div><div class='add'>+#define SLANG_CLASS_TYPE_VECTOR 2</div><div class='add'>+#define SLANG_CLASS_TYPE_PTR 3</div><div class='add'>+</div><div class='add'>+ unsigned int cl_data_type; /* SLANG_INTEGER_TYPE, etc... */</div><div class='add'>+ char *cl_name; /* slstring type */</div><div class='add'>+</div><div class='add'>+ unsigned int cl_sizeof_type;</div><div class='add'>+ VOID_STAR cl_transfer_buf; /* cl_sizeof_type bytes*/</div><div class='add'>+</div><div class='add'>+ /* Methods */</div><div class='add'>+</div><div class='add'>+ /* Most of the method functions are prototyped:</div><div class='add'>+ * int method (unsigned char type, VOID_STAR addr);</div><div class='add'>+ * Here, @type@ represents the type of object that the method is asked</div><div class='add'>+ * to deal with. The second parameter @addr@ will contain the ADDRESS of</div><div class='add'>+ * the object. For example, if type is SLANG_INT_TYPE, then @addr@ will</div><div class='add'>+ * actually be int *. Similary, if type is SLANG_STRING_TYPE,</div><div class='add'>+ * then @addr@ will contain the address of the string, i.e., char **.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ void (*cl_destroy)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+ /* Prototype: void destroy(unsigned type, VOID_STAR val)</div><div class='add'>+ * Called to delete/free the object */</div><div class='add'>+</div><div class='add'>+ char *(*cl_string)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+ /* Prototype: char *to_string (unsigned char t, VOID_STAR p);</div><div class='add'>+ * Here p is a pointer to the object for which a string representation</div><div class='add'>+ * is to be returned. The returned pointer is to be a MALLOCED string.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ /* Prototype: void push(unsigned char type, VOID_STAR v);</div><div class='add'>+ * Push a copy of the object of type @type@ at address @v@ onto the</div><div class='add'>+ * stack.</div><div class='add'>+ */</div><div class='add'>+ int (*cl_push)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+</div><div class='add'>+ /* Prototype: int pop(unsigned char type, VOID_STAR v);</div><div class='add'>+ * Pops value from stack and assign it to object, whose address is @v@.</div><div class='add'>+ */</div><div class='add'>+ int (*cl_pop)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+</div><div class='add'>+ int (*cl_unary_op_result_type)_PROTO((int, unsigned char, unsigned char *));</div><div class='add'>+ int (*cl_unary_op)_PROTO((int, unsigned char, VOID_STAR, unsigned int, VOID_STAR));</div><div class='add'>+</div><div class='add'>+ int (*cl_app_unary_op_result_type)_PROTO((int, unsigned char, unsigned char *));</div><div class='add'>+ int (*cl_app_unary_op)_PROTO((int, unsigned char, VOID_STAR, unsigned int, VOID_STAR));</div><div class='add'>+</div><div class='add'>+ /* If this function is non-NULL, it will be called for sin, cos, etc... */</div><div class='add'>+#define SLMATH_SIN 1</div><div class='add'>+#define SLMATH_COS 2</div><div class='add'>+#define SLMATH_TAN 3</div><div class='add'>+#define SLMATH_ATAN 4</div><div class='add'>+#define SLMATH_ASIN 5</div><div class='add'>+#define SLMATH_ACOS 6</div><div class='add'>+#define SLMATH_EXP 7</div><div class='add'>+#define SLMATH_LOG 8</div><div class='add'>+#define SLMATH_SQRT 9</div><div class='add'>+#define SLMATH_LOG10 10</div><div class='add'>+#define SLMATH_REAL 11</div><div class='add'>+#define SLMATH_IMAG 12</div><div class='add'>+#define SLMATH_SINH 13</div><div class='add'>+#define SLMATH_COSH 14</div><div class='add'>+#define SLMATH_TANH 15</div><div class='add'>+#define SLMATH_ATANH 16</div><div class='add'>+#define SLMATH_ASINH 17</div><div class='add'>+#define SLMATH_ACOSH 18</div><div class='add'>+#define SLMATH_TODOUBLE 19</div><div class='add'>+#define SLMATH_CONJ 20</div><div class='add'>+</div><div class='add'>+ int (*cl_math_op)_PROTO((int, unsigned char, VOID_STAR, unsigned int, VOID_STAR));</div><div class='add'>+ int (*cl_math_op_result_type)_PROTO((int, unsigned char, unsigned char *));</div><div class='add'>+</div><div class='add'>+ SL_OOBinary_Type *cl_binary_ops;</div><div class='add'>+ SL_Typecast_Type *cl_typecast_funs;</div><div class='add'>+</div><div class='add'>+ void (*cl_byte_code_destroy)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+ void (*cl_user_destroy_fun)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+ int (*cl_init_array_object)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+ int (*cl_datatype_deref)_PROTO((unsigned char));</div><div class='add'>+ SLang_Struct_Type *cl_struct_def;</div><div class='add'>+ int (*cl_dereference) _PROTO((unsigned char, VOID_STAR));</div><div class='add'>+ int (*cl_acopy) (unsigned char, VOID_STAR, VOID_STAR);</div><div class='add'>+ int (*cl_apop) _PROTO((unsigned char, VOID_STAR));</div><div class='add'>+ int (*cl_apush) _PROTO((unsigned char, VOID_STAR));</div><div class='add'>+ int (*cl_push_literal) _PROTO((unsigned char, VOID_STAR));</div><div class='add'>+ void (*cl_adestroy)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+ int (*cl_push_intrinsic)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+ int (*cl_void_typecast)_PROTO((unsigned char, VOID_STAR, unsigned int, unsigned char, VOID_STAR));</div><div class='add'>+</div><div class='add'>+ int (*cl_anytype_typecast)_PROTO((unsigned char, VOID_STAR, unsigned int, unsigned char, VOID_STAR));</div><div class='add'>+</div><div class='add'>+ /* Array access functions */</div><div class='add'>+ int (*cl_aput) (unsigned char, unsigned int);</div><div class='add'>+ int (*cl_aget) (unsigned char, unsigned int);</div><div class='add'>+ int (*cl_anew) (unsigned char, unsigned int);</div><div class='add'>+</div><div class='add'>+ /* length method */</div><div class='add'>+ int (*cl_length) (unsigned char, VOID_STAR, unsigned int *);</div><div class='add'>+</div><div class='add'>+ /* foreach */</div><div class='add'>+ SLang_Foreach_Context_Type *(*cl_foreach_open) (unsigned char, unsigned int);</div><div class='add'>+ void (*cl_foreach_close) (unsigned char, SLang_Foreach_Context_Type *);</div><div class='add'>+ int (*cl_foreach) (unsigned char, SLang_Foreach_Context_Type *);</div><div class='add'>+</div><div class='add'>+ /* Structure access: get and put (assign to) fields */</div><div class='add'>+ int (*cl_sput) (unsigned char, char *);</div><div class='add'>+ int (*cl_sget) (unsigned char, char *);</div><div class='add'>+</div><div class='add'>+ /* File I/O */</div><div class='add'>+ int (*cl_fread) (unsigned char, FILE *, VOID_STAR, unsigned int, unsigned int *);</div><div class='add'>+ int (*cl_fwrite) (unsigned char, FILE *, VOID_STAR, unsigned int, unsigned int *);</div><div class='add'>+ int (*cl_fdread) (unsigned char, int, VOID_STAR, unsigned int, unsigned int *);</div><div class='add'>+ int (*cl_fdwrite) (unsigned char, int, VOID_STAR, unsigned int, unsigned int *);</div><div class='add'>+</div><div class='add'>+ int (*cl_to_bool) (unsigned char, int *);</div><div class='add'>+ </div><div class='add'>+ int (*cl_cmp)(unsigned char, VOID_STAR, VOID_STAR, int *);</div><div class='add'>+</div><div class='add'>+} SLang_Class_Type;</div><div class='add'>+</div><div class='add'>+/* These are the low-level functions for building push/pop methods. They</div><div class='add'>+ * know nothing about memory management. For SLANG_CLASS_TYPE_MMT, use the</div><div class='add'>+ * MMT push/pop functions instead.</div><div class='add'>+ */</div><div class='add'>+extern int SLclass_push_double_obj (unsigned char, double);</div><div class='add'>+extern int SLclass_push_float_obj (unsigned char, float);</div><div class='add'>+extern int SLclass_push_long_obj (unsigned char, long);</div><div class='add'>+extern int SLclass_push_int_obj (unsigned char, int);</div><div class='add'>+extern int SLclass_push_short_obj (unsigned char, short);</div><div class='add'>+extern int SLclass_push_char_obj (unsigned char, char);</div><div class='add'>+extern int SLclass_push_ptr_obj (unsigned char, VOID_STAR);</div><div class='add'>+extern int SLclass_pop_double_obj (unsigned char, double *);</div><div class='add'>+extern int SLclass_pop_float_obj (unsigned char, float *);</div><div class='add'>+extern int SLclass_pop_long_obj (unsigned char, long *);</div><div class='add'>+extern int SLclass_pop_int_obj (unsigned char, int *);</div><div class='add'>+extern int SLclass_pop_short_obj (unsigned char, short *);</div><div class='add'>+extern int SLclass_pop_char_obj (unsigned char, char *);</div><div class='add'>+extern int SLclass_pop_ptr_obj (unsigned char, VOID_STAR *);</div><div class='add'>+</div><div class='add'>+extern SLang_Class_Type *SLclass_allocate_class (char *);</div><div class='add'>+extern int SLclass_get_class_id (SLang_Class_Type *cl);</div><div class='add'>+extern int SLclass_create_synonym (char *, unsigned char);</div><div class='add'>+extern int SLclass_is_class_defined (unsigned char);</div><div class='add'>+</div><div class='add'>+extern int SLclass_register_class (SLang_Class_Type *, unsigned char, unsigned int, unsigned char);</div><div class='add'>+extern int SLclass_set_string_function (SLang_Class_Type *, char *(*)(unsigned char, VOID_STAR));</div><div class='add'>+extern int SLclass_set_destroy_function (SLang_Class_Type *, void (*)(unsigned char, VOID_STAR));</div><div class='add'>+extern int SLclass_set_push_function (SLang_Class_Type *, int (*)(unsigned char, VOID_STAR));</div><div class='add'>+extern int SLclass_set_pop_function (SLang_Class_Type *, int (*)(unsigned char, VOID_STAR));</div><div class='add'>+</div><div class='add'>+extern int SLclass_set_aget_function (SLang_Class_Type *, int (*)(unsigned char, unsigned int));</div><div class='add'>+extern int SLclass_set_aput_function (SLang_Class_Type *, int (*)(unsigned char, unsigned int));</div><div class='add'>+extern int SLclass_set_anew_function (SLang_Class_Type *, int (*)(unsigned char, unsigned int));</div><div class='add'>+</div><div class='add'>+extern int SLclass_set_sget_function (SLang_Class_Type *, int (*)(unsigned char, char *));</div><div class='add'>+extern int SLclass_set_sput_function (SLang_Class_Type *, int (*)(unsigned char, char *));</div><div class='add'>+</div><div class='add'>+/* Typecast object on the stack to type p1. p2 and p3 should be set to 1 */</div><div class='add'>+extern int SLclass_typecast (unsigned char, int, int);</div><div class='add'>+</div><div class='add'>+extern int SLclass_add_unary_op (unsigned char,</div><div class='add'>+ int (*) (int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR),</div><div class='add'>+ int (*) (int, unsigned char, unsigned char *));</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+SLclass_add_app_unary_op (unsigned char,</div><div class='add'>+ int (*) (int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR),</div><div class='add'>+ int (*) (int, unsigned char, unsigned char *));</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+SLclass_add_binary_op (unsigned char, unsigned char,</div><div class='add'>+ int (*) (int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR),</div><div class='add'>+ int (*) (int, unsigned char, unsigned char, unsigned char *));</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+SLclass_add_math_op (unsigned char,</div><div class='add'>+ int (*)(int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR),</div><div class='add'>+ int (*)(int, unsigned char, unsigned char *));</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+SLclass_add_typecast (unsigned char /* from */, unsigned char /* to */,</div><div class='add'>+ int (*)_PROTO((unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR)),</div><div class='add'>+ int /* allow implicit typecasts */</div><div class='add'>+ );</div><div class='add'>+</div><div class='add'>+extern char *SLclass_get_datatype_name (unsigned char);</div><div class='add'>+</div><div class='add'>+extern double SLcomplex_abs (double *);</div><div class='add'>+extern double *SLcomplex_times (double *, double *, double *);</div><div class='add'>+extern double *SLcomplex_divide (double *, double *, double *);</div><div class='add'>+extern double *SLcomplex_sin (double *, double *);</div><div class='add'>+extern double *SLcomplex_cos (double *, double *);</div><div class='add'>+extern double *SLcomplex_tan (double *, double *);</div><div class='add'>+extern double *SLcomplex_asin (double *, double *);</div><div class='add'>+extern double *SLcomplex_acos (double *, double *);</div><div class='add'>+extern double *SLcomplex_atan (double *, double *);</div><div class='add'>+extern double *SLcomplex_exp (double *, double *);</div><div class='add'>+extern double *SLcomplex_log (double *, double *);</div><div class='add'>+extern double *SLcomplex_log10 (double *, double *);</div><div class='add'>+extern double *SLcomplex_sqrt (double *, double *);</div><div class='add'>+extern double *SLcomplex_sinh (double *, double *);</div><div class='add'>+extern double *SLcomplex_cosh (double *, double *);</div><div class='add'>+extern double *SLcomplex_tanh (double *, double *);</div><div class='add'>+extern double *SLcomplex_pow (double *, double *, double *);</div><div class='add'>+extern double SLmath_hypot (double x, double y);</div><div class='add'>+</div><div class='add'>+/* Not implemented yet */</div><div class='add'>+extern double *SLcomplex_asinh (double *, double *);</div><div class='add'>+extern double *SLcomplex_acosh (double *, double *);</div><div class='add'>+extern double *SLcomplex_atanh (double *, double *);</div><div class='add'>+</div><div class='add'>+#ifdef _SLANG_SOURCE_</div><div class='add'>+typedef struct _SLang_MMT_Type SLang_MMT_Type;</div><div class='add'>+#else</div><div class='add'>+typedef int SLang_MMT_Type;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern void SLang_free_mmt (SLang_MMT_Type *);</div><div class='add'>+extern VOID_STAR SLang_object_from_mmt (SLang_MMT_Type *);</div><div class='add'>+extern SLang_MMT_Type *SLang_create_mmt (unsigned char, VOID_STAR);</div><div class='add'>+extern int SLang_push_mmt (SLang_MMT_Type *);</div><div class='add'>+extern SLang_MMT_Type *SLang_pop_mmt (unsigned char);</div><div class='add'>+extern void SLang_inc_mmt (SLang_MMT_Type *);</div><div class='add'>+</div><div class='add'>+/* Maximum number of dimensions of an array. */</div><div class='add'>+#define SLARRAY_MAX_DIMS 7</div><div class='add'>+typedef struct _SLang_Array_Type</div><div class='add'>+{</div><div class='add'>+ unsigned char data_type;</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+ VOID_STAR data;</div><div class='add'>+ unsigned int num_elements;</div><div class='add'>+ unsigned int num_dims;</div><div class='add'>+ int dims [SLARRAY_MAX_DIMS];</div><div class='add'>+ VOID_STAR (*index_fun)_PROTO((struct _SLang_Array_Type *, int *));</div><div class='add'>+ /* This function is designed to allow a type to store an array in</div><div class='add'>+ * any manner it chooses. This function returns the address of the data</div><div class='add'>+ * value at the specified index location.</div><div class='add'>+ */</div><div class='add'>+ unsigned int flags;</div><div class='add'>+#define SLARR_DATA_VALUE_IS_READ_ONLY 1</div><div class='add'>+#define SLARR_DATA_VALUE_IS_POINTER 2</div><div class='add'>+#define SLARR_DATA_VALUE_IS_RANGE 4</div><div class='add'>+#define SLARR_DATA_VALUE_IS_INTRINSIC 8</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ unsigned int num_refs;</div><div class='add'>+}</div><div class='add'>+SLang_Array_Type;</div><div class='add'>+</div><div class='add'>+extern int SLang_pop_array_of_type (SLang_Array_Type **, unsigned char);</div><div class='add'>+extern int SLang_pop_array (SLang_Array_Type **, int);</div><div class='add'>+extern int SLang_push_array (SLang_Array_Type *, int);</div><div class='add'>+extern void SLang_free_array (SLang_Array_Type *);</div><div class='add'>+extern SLang_Array_Type *SLang_create_array (unsigned char, int, VOID_STAR, int *, unsigned int);</div><div class='add'>+extern SLang_Array_Type *SLang_duplicate_array (SLang_Array_Type *);</div><div class='add'>+extern int SLang_get_array_element (SLang_Array_Type *, int *, VOID_STAR);</div><div class='add'>+extern int SLang_set_array_element (SLang_Array_Type *, int *, VOID_STAR);</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Interpreter Function Prototypes */</div><div class='add'>+</div><div class='add'>+ extern volatile int SLang_Error;</div><div class='add'>+/* Non zero if error occurs. Must be reset to zero to continue. */</div><div class='add'>+/* error codes, severe errors are less than 0 */</div><div class='add'>+#define SL_APPLICATION_ERROR -2</div><div class='add'>+#define SL_VARIABLE_UNINITIALIZED -3</div><div class='add'>+#define SL_INTERNAL_ERROR -5</div><div class='add'>+#define SL_STACK_OVERFLOW -6</div><div class='add'>+#define SL_STACK_UNDERFLOW -7</div><div class='add'>+#define SL_UNDEFINED_NAME -8</div><div class='add'>+#define SL_SYNTAX_ERROR -9</div><div class='add'>+#define SL_DUPLICATE_DEFINITION -10</div><div class='add'>+#define SL_TYPE_MISMATCH -11</div><div class='add'>+#define SL_OBJ_UNKNOWN -13</div><div class='add'>+#define SL_UNKNOWN_ERROR -14</div><div class='add'>+#define SL_TYPE_UNDEFINED_OP_ERROR -16</div><div class='add'>+</div><div class='add'>+#define SL_INTRINSIC_ERROR 1</div><div class='add'>+/* Intrinsic error is an error generated by intrinsic functions */</div><div class='add'>+#define SL_USER_BREAK 2</div><div class='add'>+#define SL_DIVIDE_ERROR 3</div><div class='add'>+#define SL_OBJ_NOPEN 4</div><div class='add'>+#define SL_USER_ERROR 5</div><div class='add'>+#define SL_USAGE_ERROR 6</div><div class='add'>+#define SL_READONLY_ERROR 7</div><div class='add'>+#define SL_INVALID_PARM 8</div><div class='add'>+#define SL_NOT_IMPLEMENTED 9</div><div class='add'>+#define SL_MALLOC_ERROR 10</div><div class='add'>+#define SL_OVERFLOW 11</div><div class='add'>+#define SL_FLOATING_EXCEPTION 12</div><div class='add'>+</div><div class='add'>+/* Compatibility */</div><div class='add'>+#define USER_BREAK SL_USER_BREAK</div><div class='add'>+#define INTRINSIC_ERROR SL_INTRINSIC_ERROR</div><div class='add'>+</div><div class='add'>+ extern int SLang_Traceback;</div><div class='add'>+ /* If non-zero, dump an S-Lang traceback upon error. Available as</div><div class='add'>+ _traceback in S-Lang. */</div><div class='add'>+</div><div class='add'>+ extern char *SLang_User_Prompt;</div><div class='add'>+ /* Prompt to use when reading from stdin */</div><div class='add'>+ extern int SLang_Version;</div><div class='add'>+ extern char *SLang_Version_String;</div><div class='add'>+extern char *SLang_Doc_Dir;</div><div class='add'>+</div><div class='add'>+extern void (*SLang_VMessage_Hook) (char *, va_list);</div><div class='add'>+extern void SLang_vmessage (char *, ...);</div><div class='add'>+</div><div class='add'>+ extern void (*SLang_Error_Hook)(char *);</div><div class='add'>+ /* Pointer to application dependent error messaging routine. By default,</div><div class='add'>+ messages are displayed on stderr. */</div><div class='add'>+</div><div class='add'>+ extern void (*SLang_Exit_Error_Hook)(char *, va_list);</div><div class='add'>+ extern void SLang_exit_error (char *, ...);</div><div class='add'>+ extern void (*SLang_Dump_Routine)(char *);</div><div class='add'>+ /* Called if S-Lang traceback is enabled as well as other debugging</div><div class='add'>+ routines (e.g., trace). By default, these messages go to stderr. */</div><div class='add'>+</div><div class='add'>+ extern void (*SLang_Interrupt)(void);</div><div class='add'>+ /* function to call whenever inner interpreter is entered. This is</div><div class='add'>+ a good place to set SLang_Error to USER_BREAK. */</div><div class='add'>+</div><div class='add'>+ extern void (*SLang_User_Clear_Error)(void);</div><div class='add'>+ /* function that gets called when '_clear_error' is called. */</div><div class='add'>+</div><div class='add'>+ /* If non null, these call C functions before and after a slang function. */</div><div class='add'>+ extern void (*SLang_Enter_Function)(char *);</div><div class='add'>+extern void (*SLang_Exit_Function)(char *);</div><div class='add'>+</div><div class='add'>+extern int SLang_Num_Function_Args;</div><div class='add'>+</div><div class='add'>+/* Functions: */</div><div class='add'>+</div><div class='add'>+extern int SLang_init_all (void);</div><div class='add'>+/* Initializes interpreter and all modules */</div><div class='add'>+</div><div class='add'>+extern int SLang_init_slang (void);</div><div class='add'>+/* This function is mandatory and must be called by all applications that</div><div class='add'>+ * use the interpreter</div><div class='add'>+ */</div><div class='add'>+extern int SLang_init_posix_process (void); /* process specific intrinsics */</div><div class='add'>+extern int SLang_init_stdio (void); /* fgets, etc. stdio functions */</div><div class='add'>+extern int SLang_init_posix_dir (void);</div><div class='add'>+extern int SLang_init_ospath (void);</div><div class='add'>+</div><div class='add'>+extern int SLang_init_slmath (void);</div><div class='add'>+/* called if math functions sin, cos, etc... are needed. */</div><div class='add'>+</div><div class='add'>+ extern int SLang_init_slfile (void);</div><div class='add'>+ extern int SLang_init_slunix (void);</div><div class='add'>+ /* These functions are obsolte. Use init_stdio, posix_process, etc. */</div><div class='add'>+</div><div class='add'>+extern int SLang_init_slassoc (void);</div><div class='add'>+/* Assoc Arrays (Hashes) */</div><div class='add'>+</div><div class='add'>+extern int SLang_init_array (void);</div><div class='add'>+/* Additional arrays functions: transpose, etc... */</div><div class='add'>+</div><div class='add'>+/* Dynamic linking facility */</div><div class='add'>+extern int SLang_init_import (void);</div><div class='add'>+</div><div class='add'>+ extern int SLang_load_file (char *);</div><div class='add'>+ /* Load a file of S-Lang code for interpreting. If the parameter is</div><div class='add'>+ * NULL, input comes from stdin. */</div><div class='add'>+</div><div class='add'>+ extern void SLang_restart(int);</div><div class='add'>+ /* should be called if an error occurs. If the passed integer is</div><div class='add'>+ * non-zero, items are popped off the stack; otherwise, the stack is</div><div class='add'>+ * left intact. Any time the stack is believed to be trashed, this routine</div><div class='add'>+ * should be called with a non-zero argument (e.g., if setjmp/longjmp is</div><div class='add'>+ * called). */</div><div class='add'>+</div><div class='add'>+ extern int SLang_byte_compile_file(char *, int);</div><div class='add'>+ /* takes a file of S-Lang code and ``byte-compiles'' it for faster</div><div class='add'>+ * loading. The new filename is equivalent to the old except that a `c' is</div><div class='add'>+ * appended to the name. (e.g., init.sl --> init.slc). The second</div><div class='add'>+ * specified the method; currently, it is not used.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ extern int SLang_autoload(char *, char *);</div><div class='add'>+ /* Automatically load S-Lang function p1 from file p2. This function</div><div class='add'>+ is also available via S-Lang */</div><div class='add'>+</div><div class='add'>+ extern int SLang_load_string(char *);</div><div class='add'>+ /* Like SLang_load_file except input is from a null terminated string. */</div><div class='add'>+</div><div class='add'>+ extern int SLdo_pop(void);</div><div class='add'>+ /* pops item off stack and frees any memory associated with it */</div><div class='add'>+ extern int SLdo_pop_n(unsigned int);</div><div class='add'>+ /* pops n items off stack and frees any memory associated with them */</div><div class='add'>+</div><div class='add'>+extern int SLang_pop_integer(int *);</div><div class='add'>+extern int SLang_pop_uinteger(unsigned int *);</div><div class='add'>+ /* pops integer *p0 from the stack. Returns 0 upon success and non-zero</div><div class='add'>+ * if the stack is empty or a type mismatch occurs, setting SLang_Error.</div><div class='add'>+ */</div><div class='add'>+extern int SLang_pop_char (char *);</div><div class='add'>+extern int SLang_pop_uchar (unsigned char *);</div><div class='add'>+extern int SLang_pop_short(short *);</div><div class='add'>+extern int SLang_pop_ushort(unsigned short *);</div><div class='add'>+extern int SLang_pop_long(long *);</div><div class='add'>+extern int SLang_pop_ulong(unsigned long *);</div><div class='add'>+</div><div class='add'>+extern int SLang_pop_float(float *);</div><div class='add'>+extern int SLang_pop_double(double *, int *, int *);</div><div class='add'>+ /* Pops double *p1 from stack. If *p3 is non-zero, *p1 was derived</div><div class='add'>+ from the integer *p2. Returns zero upon success. */</div><div class='add'>+</div><div class='add'>+ extern int SLang_pop_complex (double *, double *);</div><div class='add'>+</div><div class='add'>+ extern int SLpop_string (char **);</div><div class='add'>+ extern int SLang_pop_string(char **, int *);</div><div class='add'>+ /* pops string *p0 from stack. If *p1 is non-zero, the string must be</div><div class='add'>+ * freed after its use. DO NOT FREE p0 if *p1 IS ZERO! Returns 0 upon</div><div class='add'>+ * success */</div><div class='add'>+</div><div class='add'>+ extern int SLang_push_complex (double, double);</div><div class='add'>+</div><div class='add'>+ extern int SLang_push_char (char);</div><div class='add'>+ extern int SLang_push_uchar (unsigned char);</div><div class='add'>+</div><div class='add'>+ extern int SLang_push_integer(int);</div><div class='add'>+ extern int SLang_push_uinteger(unsigned int);</div><div class='add'>+ /* push integer p1 on stack */</div><div class='add'>+</div><div class='add'>+ extern int SLang_push_short(short);</div><div class='add'>+ extern int SLang_push_ushort(unsigned short);</div><div class='add'>+ extern int SLang_push_long(long);</div><div class='add'>+ extern int SLang_push_ulong(unsigned long);</div><div class='add'>+ extern int SLang_push_float(float);</div><div class='add'>+ extern int SLang_push_double(double);</div><div class='add'>+ /* Push double onto stack */</div><div class='add'>+</div><div class='add'>+ extern int SLang_push_string(char *);</div><div class='add'>+ /* Push string p1 onto stack */</div><div class='add'>+</div><div class='add'>+ extern int SLang_push_malloced_string(char *);</div><div class='add'>+ /* The normal SLang_push_string pushes an slstring. This one converts</div><div class='add'>+ * a normally malloced string to an slstring, and then frees the </div><div class='add'>+ * malloced string. So, do NOT use the malloced string after calling</div><div class='add'>+ * this routine because it will be freed! The routine returns -1 upon </div><div class='add'>+ * error, but the string will be freed.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+extern int SLang_push_null (void);</div><div class='add'>+extern int SLang_pop_null (void);</div><div class='add'>+</div><div class='add'>+extern int SLang_push_value (unsigned char type, VOID_STAR);</div><div class='add'>+extern int SLang_pop_value (unsigned char type, VOID_STAR);</div><div class='add'>+extern void SLang_free_value (unsigned char type, VOID_STAR);</div><div class='add'>+</div><div class='add'>+typedef struct _SLang_Object_Type SLang_Any_Type;</div><div class='add'>+</div><div class='add'>+extern int SLang_pop_anytype (SLang_Any_Type **);</div><div class='add'>+extern int SLang_push_anytype (SLang_Any_Type *);</div><div class='add'>+extern void SLang_free_anytype (SLang_Any_Type *);</div><div class='add'>+</div><div class='add'>+#ifdef _SLANG_SOURCE_</div><div class='add'>+typedef struct _SLang_Ref_Type SLang_Ref_Type;</div><div class='add'>+#else</div><div class='add'>+typedef int SLang_Ref_Type;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern int SLang_pop_ref (SLang_Ref_Type **);</div><div class='add'>+extern void SLang_free_ref (SLang_Ref_Type *);</div><div class='add'>+extern int SLang_assign_to_ref (SLang_Ref_Type *, unsigned char, VOID_STAR);</div><div class='add'>+extern SLang_Name_Type *SLang_pop_function (void);</div><div class='add'>+extern SLang_Name_Type *SLang_get_fun_from_ref (SLang_Ref_Type *);</div><div class='add'>+extern void SLang_free_function (SLang_Name_Type *f);</div><div class='add'>+</div><div class='add'>+ extern int SLang_is_defined(char *);</div><div class='add'>+ /* Return non-zero is p1 is defined otherwise returns 0. */</div><div class='add'>+</div><div class='add'>+ extern int SLang_run_hooks(char *, unsigned int, ...);</div><div class='add'>+ /* calls S-Lang function p1 pushing p2 strings in the variable argument</div><div class='add'>+ * list onto the stack first.</div><div class='add'>+ * Returns -1 upon error, 1 if hooks exists and it ran,</div><div class='add'>+ * or 0 if hook does not exist. Thus it returns non-zero is hook was called.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* These functions return 1 if the indicated function exists and the function</div><div class='add'>+ * runs without error. If the function does not exist, the function returns</div><div class='add'>+ * 0. Otherwise -1 is returned with SLang_Error set appropriately.</div><div class='add'>+ */</div><div class='add'>+extern int SLexecute_function (SLang_Name_Type *);</div><div class='add'>+extern int SLang_execute_function(char *);</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+extern int SLang_end_arg_list (void);</div><div class='add'>+extern int SLang_start_arg_list (void);</div><div class='add'>+</div><div class='add'>+extern void SLang_verror (int, char *, ...);</div><div class='add'>+</div><div class='add'>+extern void SLang_doerror(char *);</div><div class='add'>+ /* set SLang_Error and display p1 as error message */</div><div class='add'>+</div><div class='add'>+extern int SLang_add_intrinsic_array (char *, /* name */</div><div class='add'>+ unsigned char, /* type */</div><div class='add'>+ int, /* readonly */</div><div class='add'>+ VOID_STAR, /* data */</div><div class='add'>+ unsigned int, ...); /* num dims */</div><div class='add'>+</div><div class='add'>+extern int SLextract_list_element (char *, unsigned int, char,</div><div class='add'>+ char *, unsigned int);</div><div class='add'>+</div><div class='add'>+extern void SLexpand_escaped_string (register char *, register char *,</div><div class='add'>+ register char *);</div><div class='add'>+</div><div class='add'>+extern SLang_Name_Type *SLang_get_function (char *);</div><div class='add'>+extern void SLang_release_function (SLang_Name_Type *);</div><div class='add'>+</div><div class='add'>+extern int SLreverse_stack (int);</div><div class='add'>+extern int SLroll_stack (int);</div><div class='add'>+/* If argument p is positive, the top p objects on the stack are rolled</div><div class='add'>+ * up. If negative, the stack is rolled down.</div><div class='add'>+ */</div><div class='add'>+extern int SLdup_n (int n);</div><div class='add'>+/* Duplicate top n elements of stack */</div><div class='add'>+</div><div class='add'>+extern int SLang_peek_at_stack1 (void);</div><div class='add'>+extern int SLang_peek_at_stack (void);</div><div class='add'>+/* Returns type of next object on stack-- -1 upon stack underflow. */</div><div class='add'>+extern void SLmake_lut (unsigned char *, unsigned char *, unsigned char);</div><div class='add'>+</div><div class='add'>+ extern int SLang_guess_type (char *);</div><div class='add'>+</div><div class='add'>+extern int SLstruct_create_struct (unsigned int,</div><div class='add'>+ char **,</div><div class='add'>+ unsigned char *,</div><div class='add'>+ VOID_STAR *);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Misc Functions */</div><div class='add'>+</div><div class='add'>+/* This is an interface to atexit */</div><div class='add'>+extern int SLang_add_cleanup_function (void (*)(void));</div><div class='add'>+</div><div class='add'>+extern char *SLmake_string (char *);</div><div class='add'>+extern char *SLmake_nstring (char *, unsigned int);</div><div class='add'>+/* Returns a null terminated string made from the first n characters of the</div><div class='add'>+ * string.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* The string created by this routine must be freed by SLang_free_slstring</div><div class='add'>+ * and nothing else!! Also these strings must not be modified. Use</div><div class='add'>+ * SLmake_string if you intend to modify them!!</div><div class='add'>+ */</div><div class='add'>+extern char *SLang_create_nslstring (char *, unsigned int);</div><div class='add'>+extern char *SLang_create_slstring (char *);</div><div class='add'>+extern void SLang_free_slstring (char *); /* handles NULL */</div><div class='add'>+extern int SLang_pop_slstring (char **); /* free with SLang_free_slstring */</div><div class='add'>+extern char *SLang_concat_slstrings (char *a, char *b);</div><div class='add'>+extern char *SLang_create_static_slstring (char *); /* adds a string that will not get deleted */</div><div class='add'>+extern void SLstring_dump_stats (void);</div><div class='add'>+</div><div class='add'>+/* Binary strings */</div><div class='add'>+/* The binary string is an opaque type. Use the SLbstring_get_pointer function</div><div class='add'>+ * to get a pointer and length.</div><div class='add'>+ */</div><div class='add'>+typedef struct _SLang_BString_Type SLang_BString_Type;</div><div class='add'>+extern unsigned char *SLbstring_get_pointer (SLang_BString_Type *, unsigned int *);</div><div class='add'>+</div><div class='add'>+extern SLang_BString_Type *SLbstring_dup (SLang_BString_Type *);</div><div class='add'>+extern SLang_BString_Type *SLbstring_create (unsigned char *, unsigned int);</div><div class='add'>+</div><div class='add'>+/* The create_malloced function used the first argument which is assumed</div><div class='add'>+ * to be a pointer to a len + 1 malloced string. The extra byte is for</div><div class='add'>+ * \0 termination.</div><div class='add'>+ */</div><div class='add'>+extern SLang_BString_Type *SLbstring_create_malloced (unsigned char *, unsigned int, int);</div><div class='add'>+</div><div class='add'>+/* Create a bstring from an slstring */</div><div class='add'>+extern SLang_BString_Type *SLbstring_create_slstring (char *);</div><div class='add'>+</div><div class='add'>+extern void SLbstring_free (SLang_BString_Type *);</div><div class='add'>+extern int SLang_pop_bstring (SLang_BString_Type **);</div><div class='add'>+extern int SLang_push_bstring (SLang_BString_Type *);</div><div class='add'>+</div><div class='add'>+extern char *SLmalloc (unsigned int);</div><div class='add'>+extern char *SLcalloc (unsigned int, unsigned int);</div><div class='add'>+extern void SLfree(char *); /* This function handles NULL */</div><div class='add'>+extern char *SLrealloc (char *, unsigned int);</div><div class='add'>+</div><div class='add'>+extern char *SLcurrent_time_string (void);</div><div class='add'>+</div><div class='add'>+extern int SLatoi(unsigned char *);</div><div class='add'>+extern long SLatol (unsigned char *);</div><div class='add'>+extern unsigned long SLatoul (unsigned char *);</div><div class='add'>+</div><div class='add'>+extern int SLang_pop_fileptr (SLang_MMT_Type **, FILE **);</div><div class='add'>+extern char *SLang_get_name_from_fileptr (SLang_MMT_Type *);</div><div class='add'>+</div><div class='add'>+typedef struct _SLFile_FD_Type SLFile_FD_Type;</div><div class='add'>+extern SLFile_FD_Type *SLfile_create_fd (char *, int);</div><div class='add'>+extern void SLfile_free_fd (SLFile_FD_Type *);</div><div class='add'>+extern int SLfile_push_fd (SLFile_FD_Type *);</div><div class='add'>+extern int SLfile_pop_fd (SLFile_FD_Type **);</div><div class='add'>+extern int SLfile_get_fd (SLFile_FD_Type *, int *);</div><div class='add'>+extern SLFile_FD_Type *SLfile_dup_fd (SLFile_FD_Type *f0);</div><div class='add'>+extern int SLang_init_posix_io (void);</div><div class='add'>+</div><div class='add'>+typedef double (*SLang_To_Double_Fun_Type)(VOID_STAR);</div><div class='add'>+extern SLang_To_Double_Fun_Type SLarith_get_to_double_fun (unsigned char, unsigned int *);</div><div class='add'>+</div><div class='add'>+extern int SLang_set_argc_argv (int, char **);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang getkey interface Functions */</div><div class='add'>+</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+extern int SLang_TT_Baud_Rate;</div><div class='add'>+extern int SLang_TT_Read_FD;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern int SLang_init_tty (int, int, int);</div><div class='add'>+/* Initializes the tty for single character input. If the first parameter *p1</div><div class='add'>+ * is in the range 0-255, it will be used for the abort character;</div><div class='add'>+ * otherwise, (unix only) if it is -1, the abort character will be the one</div><div class='add'>+ * used by the terminal. If the second parameter p2 is non-zero, flow</div><div class='add'>+ * control is enabled. If the last parmeter p3 is zero, output processing</div><div class='add'>+ * is NOT turned on. A value of zero is required for the screen management</div><div class='add'>+ * routines. Returns 0 upon success. In addition, if SLang_TT_Baud_Rate ==</div><div class='add'>+ * 0 when this function is called, SLang will attempt to determine the</div><div class='add'>+ * terminals baud rate. As far as the SLang library is concerned, if</div><div class='add'>+ * SLang_TT_Baud_Rate is less than or equal to zero, the baud rate is</div><div class='add'>+ * effectively infinite.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+extern void SLang_reset_tty (void);</div><div class='add'>+/* Resets tty to what it was prior to a call to SLang_init_tty */</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+extern void SLtty_set_suspend_state (int);</div><div class='add'>+ /* If non-zero argument, terminal driver will be told to react to the</div><div class='add'>+ * suspend character. If 0, it will not.</div><div class='add'>+ */</div><div class='add'>+extern int (*SLang_getkey_intr_hook) (void);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define SLANG_GETKEY_ERROR 0xFFFF</div><div class='add'>+extern unsigned int SLang_getkey (void);</div><div class='add'>+/* reads a single key from the tty. If the read fails, 0xFFFF is returned. */</div><div class='add'>+</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+extern int SLgetkey_map_to_ansi (int);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern int SLang_ungetkey_string (unsigned char *, unsigned int);</div><div class='add'>+extern int SLang_buffer_keystring (unsigned char *, unsigned int);</div><div class='add'>+extern int SLang_ungetkey (unsigned char);</div><div class='add'>+extern void SLang_flush_input (void);</div><div class='add'>+extern int SLang_input_pending (int);</div><div class='add'>+extern int SLang_Abort_Char;</div><div class='add'>+/* The value of the character (0-255) used to trigger SIGINT */</div><div class='add'>+extern int SLang_Ignore_User_Abort;</div><div class='add'>+/* If non-zero, pressing the abort character will not result in USER_BREAK</div><div class='add'>+ * SLang_Error. */</div><div class='add'>+</div><div class='add'>+extern int SLang_set_abort_signal (void (*)(int));</div><div class='add'>+/* If SIGINT is generated, the function p1 will be called. If p1 is NULL</div><div class='add'>+ * the SLang_default signal handler is called. This sets SLang_Error to</div><div class='add'>+ * USER_BREAK. I suspect most users will simply want to pass NULL.</div><div class='add'>+ */</div><div class='add'>+extern unsigned int SLang_Input_Buffer_Len;</div><div class='add'>+</div><div class='add'>+extern volatile int SLKeyBoard_Quit;</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+/* If this function returns -1, ^Y will be added to input buffer. */</div><div class='add'>+extern int (*SLtty_VMS_Ctrl_Y_Hook) (void);</div><div class='add'>+#endif</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Keymap routines */</div><div class='add'>+</div><div class='add'>+typedef struct SLKeymap_Function_Type</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ int (*f)(void);</div><div class='add'>+}</div><div class='add'>+SLKeymap_Function_Type;</div><div class='add'>+</div><div class='add'>+#define SLANG_MAX_KEYMAP_KEY_SEQ 14</div><div class='add'>+typedef struct SLang_Key_Type</div><div class='add'>+{</div><div class='add'>+ struct SLang_Key_Type *next;</div><div class='add'>+ union</div><div class='add'>+ {</div><div class='add'>+ char *s;</div><div class='add'>+ FVOID_STAR f;</div><div class='add'>+ unsigned int keysym;</div><div class='add'>+ }</div><div class='add'>+ f;</div><div class='add'>+ unsigned char type; /* type of function */</div><div class='add'>+#define SLKEY_F_INTERPRET 0x01</div><div class='add'>+#define SLKEY_F_INTRINSIC 0x02</div><div class='add'>+#define SLKEY_F_KEYSYM 0x03</div><div class='add'>+ unsigned char str[SLANG_MAX_KEYMAP_KEY_SEQ + 1];/* key sequence */</div><div class='add'>+}</div><div class='add'>+SLang_Key_Type;</div><div class='add'>+</div><div class='add'>+typedef struct SLKeyMap_List_Type</div><div class='add'>+{</div><div class='add'>+ char *name; /* hashed string */</div><div class='add'>+ SLang_Key_Type *keymap;</div><div class='add'>+ SLKeymap_Function_Type *functions; /* intrinsic functions */</div><div class='add'>+}</div><div class='add'>+SLKeyMap_List_Type;</div><div class='add'>+</div><div class='add'>+/* This is arbitrary but I have got to start somewhere */</div><div class='add'>+#define SLANG_MAX_KEYMAPS 30</div><div class='add'>+extern SLKeyMap_List_Type SLKeyMap_List[SLANG_MAX_KEYMAPS];</div><div class='add'>+</div><div class='add'>+extern char *SLang_process_keystring(char *);</div><div class='add'>+</div><div class='add'>+extern int SLkm_define_key (char *, FVOID_STAR, SLKeyMap_List_Type *);</div><div class='add'>+</div><div class='add'>+extern int SLang_define_key(char *, char *, SLKeyMap_List_Type *);</div><div class='add'>+/* Like define_key1 except that p2 is a string that is to be associated with</div><div class='add'>+ * a function in the functions field of p3. This routine calls define_key1.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+extern int SLkm_define_keysym (char *, unsigned int, SLKeyMap_List_Type *);</div><div class='add'>+</div><div class='add'>+extern void SLang_undefine_key(char *, SLKeyMap_List_Type *);</div><div class='add'>+</div><div class='add'>+extern SLKeyMap_List_Type *SLang_create_keymap(char *, SLKeyMap_List_Type *);</div><div class='add'>+/* create and returns a pointer to a new keymap named p1 created by copying</div><div class='add'>+ * keymap p2. If p2 is NULL, it is up to the calling routine to initialize</div><div class='add'>+ * the keymap.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+extern char *SLang_make_keystring(unsigned char *);</div><div class='add'>+</div><div class='add'>+extern SLang_Key_Type *SLang_do_key(SLKeyMap_List_Type *, int (*)(void));</div><div class='add'>+/* read a key using keymap p1 with getkey function p2 */</div><div class='add'>+</div><div class='add'>+extern</div><div class='add'>+ FVOID_STAR</div><div class='add'>+ SLang_find_key_function(char *, SLKeyMap_List_Type *);</div><div class='add'>+</div><div class='add'>+extern SLKeyMap_List_Type *SLang_find_keymap(char *);</div><div class='add'>+</div><div class='add'>+extern int SLang_Last_Key_Char;</div><div class='add'>+extern int SLang_Key_TimeOut_Flag;</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Readline Interface */</div><div class='add'>+</div><div class='add'>+typedef struct SLang_Read_Line_Type</div><div class='add'>+{</div><div class='add'>+ struct SLang_Read_Line_Type *prev, *next;</div><div class='add'>+ unsigned char *buf;</div><div class='add'>+ int buf_len; /* number of chars in the buffer */</div><div class='add'>+ int num; /* num and misc are application specific*/</div><div class='add'>+ int misc;</div><div class='add'>+} SLang_Read_Line_Type;</div><div class='add'>+</div><div class='add'>+/* Maximum size of display */</div><div class='add'>+#define SLRL_DISPLAY_BUFFER_SIZE 256</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ SLang_Read_Line_Type *root, *tail, *last;</div><div class='add'>+ unsigned char *buf; /* edit buffer */</div><div class='add'>+ int buf_len; /* sizeof buffer */</div><div class='add'>+ int point; /* current editing point */</div><div class='add'>+ int tab; /* tab width */</div><div class='add'>+ int len; /* current line size */</div><div class='add'>+</div><div class='add'>+ /* display variables */</div><div class='add'>+ int edit_width; /* length of display field */</div><div class='add'>+ int curs_pos; /* current column */</div><div class='add'>+ int start_column; /* column offset of display */</div><div class='add'>+ int dhscroll; /* amount to use for horiz scroll */</div><div class='add'>+ char *prompt;</div><div class='add'>+</div><div class='add'>+ FVOID_STAR last_fun; /* last function executed by rl */</div><div class='add'>+</div><div class='add'>+ /* These two contain an image of what is on the display */</div><div class='add'>+ unsigned char upd_buf1[SLRL_DISPLAY_BUFFER_SIZE];</div><div class='add'>+ unsigned char upd_buf2[SLRL_DISPLAY_BUFFER_SIZE];</div><div class='add'>+ unsigned char *old_upd, *new_upd; /* pointers to previous two buffers */</div><div class='add'>+ int new_upd_len, old_upd_len; /* length of output buffers */</div><div class='add'>+</div><div class='add'>+ SLKeyMap_List_Type *keymap;</div><div class='add'>+</div><div class='add'>+ /* tty variables */</div><div class='add'>+ unsigned int flags; /* */</div><div class='add'>+#define SL_RLINE_NO_ECHO 1</div><div class='add'>+#define SL_RLINE_USE_ANSI 2</div><div class='add'>+#define SL_RLINE_BLINK_MATCH 4</div><div class='add'>+ unsigned int (*getkey)(void); /* getkey function -- required */</div><div class='add'>+ void (*tt_goto_column)(int);</div><div class='add'>+ void (*tt_insert)(char);</div><div class='add'>+ void (*update_hook)(unsigned char *, int, int);</div><div class='add'>+ /* The update hook is called with a pointer to a buffer p1 that contains</div><div class='add'>+ * an image of what the update hook is suppoed to produce. The length</div><div class='add'>+ * of the buffer is p2 and after the update, the cursor is to be placed</div><div class='add'>+ * in column p3.</div><div class='add'>+ */</div><div class='add'>+ /* This function is only called when blinking matches */</div><div class='add'>+ int (*input_pending)(int);</div><div class='add'>+ unsigned long reserved[4];</div><div class='add'>+} SLang_RLine_Info_Type;</div><div class='add'>+</div><div class='add'>+extern int SLang_RL_EOF_Char;</div><div class='add'>+</div><div class='add'>+extern SLang_Read_Line_Type * SLang_rline_save_line (SLang_RLine_Info_Type *);</div><div class='add'>+extern int SLang_init_readline (SLang_RLine_Info_Type *);</div><div class='add'>+extern int SLang_read_line (SLang_RLine_Info_Type *);</div><div class='add'>+extern int SLang_rline_insert (char *);</div><div class='add'>+extern void SLrline_redraw (SLang_RLine_Info_Type *);</div><div class='add'>+extern int SLang_Rline_Quit;</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Low Level Screen Output Interface */</div><div class='add'>+</div><div class='add'>+extern unsigned long SLtt_Num_Chars_Output;</div><div class='add'>+extern int SLtt_Baud_Rate;</div><div class='add'>+</div><div class='add'>+typedef unsigned long SLtt_Char_Type;</div><div class='add'>+</div><div class='add'>+#define SLTT_BOLD_MASK 0x01000000UL</div><div class='add'>+#define SLTT_BLINK_MASK 0x02000000UL</div><div class='add'>+#define SLTT_ULINE_MASK 0x04000000UL</div><div class='add'>+#define SLTT_REV_MASK 0x08000000UL</div><div class='add'>+#define SLTT_ALTC_MASK 0x10000000UL</div><div class='add'>+</div><div class='add'>+extern int SLtt_Screen_Rows;</div><div class='add'>+extern int SLtt_Screen_Cols;</div><div class='add'>+extern int SLtt_Term_Cannot_Insert;</div><div class='add'>+extern int SLtt_Term_Cannot_Scroll;</div><div class='add'>+extern int SLtt_Use_Ansi_Colors;</div><div class='add'>+extern int SLtt_Ignore_Beep;</div><div class='add'>+#if defined(REAL_UNIX_SYSTEM)</div><div class='add'>+extern int SLtt_Force_Keypad_Init;</div><div class='add'>+extern int SLang_TT_Write_FD;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+extern char *SLtt_Graphics_Char_Pairs;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef __GO32__</div><div class='add'>+#if defined(VMS) || defined(REAL_UNIX_SYSTEM)</div><div class='add'>+extern int SLtt_Blink_Mode;</div><div class='add'>+extern int SLtt_Use_Blink_For_ACS;</div><div class='add'>+extern int SLtt_Newline_Ok;</div><div class='add'>+extern int SLtt_Has_Alt_Charset;</div><div class='add'>+extern int SLtt_Has_Status_Line; /* if 0, NO. If > 0, YES, IF -1, ?? */</div><div class='add'>+# ifndef VMS</div><div class='add'>+extern int SLtt_Try_Termcap;</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(IBMPC_SYSTEM)</div><div class='add'>+extern int SLtt_Msdos_Cheap_Video;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef unsigned short SLsmg_Char_Type;</div><div class='add'>+#define SLSMG_EXTRACT_CHAR(x) ((x) & 0xFF)</div><div class='add'>+#define SLSMG_EXTRACT_COLOR(x) (((x)>>8)&0xFF)</div><div class='add'>+#define SLSMG_BUILD_CHAR(ch,color) (((SLsmg_Char_Type)(unsigned char)(ch))|((color)<<8))</div><div class='add'>+</div><div class='add'>+extern int SLtt_flush_output (void);</div><div class='add'>+extern void SLtt_set_scroll_region(int, int);</div><div class='add'>+extern void SLtt_reset_scroll_region(void);</div><div class='add'>+extern void SLtt_reverse_video (int);</div><div class='add'>+extern void SLtt_bold_video (void);</div><div class='add'>+extern void SLtt_begin_insert(void);</div><div class='add'>+extern void SLtt_end_insert(void);</div><div class='add'>+extern void SLtt_del_eol(void);</div><div class='add'>+extern void SLtt_goto_rc (int, int);</div><div class='add'>+extern void SLtt_delete_nlines(int);</div><div class='add'>+extern void SLtt_delete_char(void);</div><div class='add'>+extern void SLtt_erase_line(void);</div><div class='add'>+extern void SLtt_normal_video(void);</div><div class='add'>+extern void SLtt_cls(void);</div><div class='add'>+extern void SLtt_beep(void);</div><div class='add'>+extern void SLtt_reverse_index(int);</div><div class='add'>+extern void SLtt_smart_puts(SLsmg_Char_Type *, SLsmg_Char_Type *, int, int);</div><div class='add'>+extern void SLtt_write_string (char *);</div><div class='add'>+extern void SLtt_putchar(char);</div><div class='add'>+extern int SLtt_init_video (void);</div><div class='add'>+extern int SLtt_reset_video (void);</div><div class='add'>+extern void SLtt_get_terminfo(void);</div><div class='add'>+extern void SLtt_get_screen_size (void);</div><div class='add'>+extern int SLtt_set_cursor_visibility (int);</div><div class='add'>+</div><div class='add'>+extern int SLtt_set_mouse_mode (int, int);</div><div class='add'>+</div><div class='add'>+#if defined(VMS) || defined(REAL_UNIX_SYSTEM)</div><div class='add'>+extern int SLtt_initialize (char *);</div><div class='add'>+extern void SLtt_enable_cursor_keys(void);</div><div class='add'>+extern void SLtt_set_term_vtxxx(int *);</div><div class='add'>+extern void SLtt_set_color_esc (int, char *);</div><div class='add'>+extern void SLtt_wide_width(void);</div><div class='add'>+extern void SLtt_narrow_width(void);</div><div class='add'>+extern void SLtt_set_alt_char_set (int);</div><div class='add'>+extern int SLtt_write_to_status_line (char *, int);</div><div class='add'>+extern void SLtt_disable_status_line (void);</div><div class='add'>+# ifdef REAL_UNIX_SYSTEM</div><div class='add'>+/* These are termcap/terminfo routines that assume SLtt_initialize has</div><div class='add'>+ * been called.</div><div class='add'>+ */</div><div class='add'>+extern char *SLtt_tgetstr (char *);</div><div class='add'>+extern int SLtt_tgetnum (char *);</div><div class='add'>+extern int SLtt_tgetflag (char *);</div><div class='add'>+</div><div class='add'>+/* The following are terminfo-only routines -- these prototypes will change</div><div class='add'>+ * in V2.x.</div><div class='add'>+ */</div><div class='add'>+extern char *SLtt_tigetent (char *);</div><div class='add'>+extern char *SLtt_tigetstr (char *, char **);</div><div class='add'>+extern int SLtt_tigetnum (char *, char **);</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern SLtt_Char_Type SLtt_get_color_object (int);</div><div class='add'>+extern void SLtt_set_color_object (int, SLtt_Char_Type);</div><div class='add'>+extern void SLtt_set_color (int, char *, char *, char *);</div><div class='add'>+extern void SLtt_set_mono (int, char *, SLtt_Char_Type);</div><div class='add'>+extern void SLtt_add_color_attribute (int, SLtt_Char_Type);</div><div class='add'>+extern void SLtt_set_color_fgbg (int, SLtt_Char_Type, SLtt_Char_Type);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Preprocessor Interface */</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ int this_level;</div><div class='add'>+ int exec_level;</div><div class='add'>+ int prev_exec_level;</div><div class='add'>+ char preprocess_char;</div><div class='add'>+ char comment_char;</div><div class='add'>+ unsigned char flags;</div><div class='add'>+#define SLPREP_BLANK_LINES_OK 1</div><div class='add'>+#define SLPREP_COMMENT_LINES_OK 2</div><div class='add'>+}</div><div class='add'>+SLPreprocess_Type;</div><div class='add'>+</div><div class='add'>+extern int SLprep_open_prep (SLPreprocess_Type *);</div><div class='add'>+extern void SLprep_close_prep (SLPreprocess_Type *);</div><div class='add'>+extern int SLprep_line_ok (char *, SLPreprocess_Type *);</div><div class='add'>+ extern int SLdefine_for_ifdef (char *);</div><div class='add'>+ /* Adds a string to the SLang #ifdef preparsing defines. SLang already</div><div class='add'>+ defines MSDOS, UNIX, and VMS on the appropriate system. */</div><div class='add'>+extern int (*SLprep_exists_hook) (char *, char);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLsmg Screen Management Functions */</div><div class='add'>+</div><div class='add'>+extern void SLsmg_fill_region (int, int, unsigned int, unsigned int, unsigned char);</div><div class='add'>+extern void SLsmg_set_char_set (int);</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+extern int SLsmg_Scroll_Hash_Border;</div><div class='add'>+#endif</div><div class='add'>+extern int SLsmg_suspend_smg (void);</div><div class='add'>+extern int SLsmg_resume_smg (void);</div><div class='add'>+extern void SLsmg_erase_eol (void);</div><div class='add'>+extern void SLsmg_gotorc (int, int);</div><div class='add'>+extern void SLsmg_erase_eos (void);</div><div class='add'>+extern void SLsmg_reverse_video (void);</div><div class='add'>+extern void SLsmg_set_color (int);</div><div class='add'>+extern void SLsmg_normal_video (void);</div><div class='add'>+extern void SLsmg_printf (char *, ...);</div><div class='add'>+extern void SLsmg_vprintf (char *, va_list);</div><div class='add'>+extern void SLsmg_write_string (char *);</div><div class='add'>+extern void SLsmg_write_nstring (char *, unsigned int);</div><div class='add'>+extern void SLsmg_write_char (char);</div><div class='add'>+extern void SLsmg_write_nchars (char *, unsigned int);</div><div class='add'>+extern void SLsmg_write_wrapped_string (char *, int, int, unsigned int, unsigned int, int);</div><div class='add'>+extern void SLsmg_cls (void);</div><div class='add'>+extern void SLsmg_refresh (void);</div><div class='add'>+extern void SLsmg_touch_lines (int, unsigned int);</div><div class='add'>+extern void SLsmg_touch_screen (void);</div><div class='add'>+extern int SLsmg_init_smg (void);</div><div class='add'>+extern int SLsmg_reinit_smg (void);</div><div class='add'>+extern void SLsmg_reset_smg (void);</div><div class='add'>+extern SLsmg_Char_Type SLsmg_char_at(void);</div><div class='add'>+extern void SLsmg_set_screen_start (int *, int *);</div><div class='add'>+extern void SLsmg_draw_hline (unsigned int);</div><div class='add'>+extern void SLsmg_draw_vline (int);</div><div class='add'>+extern void SLsmg_draw_object (int, int, unsigned char);</div><div class='add'>+extern void SLsmg_draw_box (int, int, unsigned int, unsigned int);</div><div class='add'>+extern int SLsmg_get_column(void);</div><div class='add'>+extern int SLsmg_get_row(void);</div><div class='add'>+extern void SLsmg_forward (int);</div><div class='add'>+extern void SLsmg_write_color_chars (SLsmg_Char_Type *, unsigned int);</div><div class='add'>+extern unsigned int SLsmg_read_raw (SLsmg_Char_Type *, unsigned int);</div><div class='add'>+extern unsigned int SLsmg_write_raw (SLsmg_Char_Type *, unsigned int);</div><div class='add'>+extern void SLsmg_set_color_in_region (int, int, int, unsigned int, unsigned int);</div><div class='add'>+extern int SLsmg_Display_Eight_Bit;</div><div class='add'>+extern int SLsmg_Tab_Width;</div><div class='add'>+</div><div class='add'>+#define SLSMG_NEWLINE_IGNORED 0 /* default */</div><div class='add'>+#define SLSMG_NEWLINE_MOVES 1 /* moves to next line, column 0 */</div><div class='add'>+#define SLSMG_NEWLINE_SCROLLS 2 /* moves but scrolls at bottom of screen */</div><div class='add'>+#define SLSMG_NEWLINE_PRINTABLE 3 /* prints as ^J */</div><div class='add'>+extern int SLsmg_Newline_Behavior;</div><div class='add'>+</div><div class='add'>+extern int SLsmg_Backspace_Moves;</div><div class='add'>+</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+# define SLSMG_HLINE_CHAR 0xC4</div><div class='add'>+# define SLSMG_VLINE_CHAR 0xB3</div><div class='add'>+# define SLSMG_ULCORN_CHAR 0xDA</div><div class='add'>+# define SLSMG_URCORN_CHAR 0xBF</div><div class='add'>+# define SLSMG_LLCORN_CHAR 0xC0</div><div class='add'>+# define SLSMG_LRCORN_CHAR 0xD9</div><div class='add'>+# define SLSMG_RTEE_CHAR 0xB4</div><div class='add'>+# define SLSMG_LTEE_CHAR 0xC3</div><div class='add'>+# define SLSMG_UTEE_CHAR 0xC2</div><div class='add'>+# define SLSMG_DTEE_CHAR 0xC1</div><div class='add'>+# define SLSMG_PLUS_CHAR 0xC5</div><div class='add'>+/* There are several to choose from: 0xB0, 0xB1, and 0xB2 */</div><div class='add'>+# define SLSMG_CKBRD_CHAR 0xB0</div><div class='add'>+# define SLSMG_DIAMOND_CHAR 0x04</div><div class='add'>+# define SLSMG_DEGREE_CHAR 0xF8</div><div class='add'>+# define SLSMG_PLMINUS_CHAR 0xF1</div><div class='add'>+# define SLSMG_BULLET_CHAR 0xF9</div><div class='add'>+# define SLSMG_LARROW_CHAR 0x1B</div><div class='add'>+# define SLSMG_RARROW_CHAR 0x1A</div><div class='add'>+# define SLSMG_DARROW_CHAR 0x19</div><div class='add'>+# define SLSMG_UARROW_CHAR 0x18</div><div class='add'>+# define SLSMG_BOARD_CHAR 0xB2</div><div class='add'>+# define SLSMG_BLOCK_CHAR 0xDB</div><div class='add'>+#else</div><div class='add'>+# if defined(AMIGA)</div><div class='add'>+# define SLSMG_HLINE_CHAR '-'</div><div class='add'>+# define SLSMG_VLINE_CHAR '|'</div><div class='add'>+# define SLSMG_ULCORN_CHAR '+'</div><div class='add'>+# define SLSMG_URCORN_CHAR '+'</div><div class='add'>+# define SLSMG_LLCORN_CHAR '+'</div><div class='add'>+# define SLSMG_LRCORN_CHAR '+'</div><div class='add'>+# define SLSMG_CKBRD_CHAR '#'</div><div class='add'>+# define SLSMG_RTEE_CHAR '+'</div><div class='add'>+# define SLSMG_LTEE_CHAR '+'</div><div class='add'>+# define SLSMG_UTEE_CHAR '+'</div><div class='add'>+# define SLSMG_DTEE_CHAR '+'</div><div class='add'>+# define SLSMG_PLUS_CHAR '+'</div><div class='add'>+# define SLSMG_DIAMOND_CHAR '+'</div><div class='add'>+# define SLSMG_DEGREE_CHAR '\\'</div><div class='add'>+# define SLSMG_PLMINUS_CHAR '#'</div><div class='add'>+# define SLSMG_BULLET_CHAR 'o'</div><div class='add'>+# define SLSMG_LARROW_CHAR '<'</div><div class='add'>+# define SLSMG_RARROW_CHAR '>'</div><div class='add'>+# define SLSMG_DARROW_CHAR 'v'</div><div class='add'>+# define SLSMG_UARROW_CHAR '^'</div><div class='add'>+# define SLSMG_BOARD_CHAR '#'</div><div class='add'>+# define SLSMG_BLOCK_CHAR '#'</div><div class='add'>+# else</div><div class='add'>+# define SLSMG_HLINE_CHAR 'q'</div><div class='add'>+# define SLSMG_VLINE_CHAR 'x'</div><div class='add'>+# define SLSMG_ULCORN_CHAR 'l'</div><div class='add'>+# define SLSMG_URCORN_CHAR 'k'</div><div class='add'>+# define SLSMG_LLCORN_CHAR 'm'</div><div class='add'>+# define SLSMG_LRCORN_CHAR 'j'</div><div class='add'>+# define SLSMG_CKBRD_CHAR 'a'</div><div class='add'>+# define SLSMG_RTEE_CHAR 'u'</div><div class='add'>+# define SLSMG_LTEE_CHAR 't'</div><div class='add'>+# define SLSMG_UTEE_CHAR 'w'</div><div class='add'>+# define SLSMG_DTEE_CHAR 'v'</div><div class='add'>+# define SLSMG_PLUS_CHAR 'n'</div><div class='add'>+# define SLSMG_DIAMOND_CHAR '`'</div><div class='add'>+# define SLSMG_DEGREE_CHAR 'f'</div><div class='add'>+# define SLSMG_PLMINUS_CHAR 'g'</div><div class='add'>+# define SLSMG_BULLET_CHAR '~'</div><div class='add'>+# define SLSMG_LARROW_CHAR ','</div><div class='add'>+# define SLSMG_RARROW_CHAR '+'</div><div class='add'>+# define SLSMG_DARROW_CHAR '.'</div><div class='add'>+# define SLSMG_UARROW_CHAR '-'</div><div class='add'>+# define SLSMG_BOARD_CHAR 'h'</div><div class='add'>+# define SLSMG_BLOCK_CHAR '0'</div><div class='add'>+# endif /* AMIGA */</div><div class='add'>+#endif /* IBMPC_SYSTEM */</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+# define SLSMG_COLOR_BLACK 0x000000</div><div class='add'>+# define SLSMG_COLOR_RED 0x000001</div><div class='add'>+# define SLSMG_COLOR_GREEN 0x000002</div><div class='add'>+# define SLSMG_COLOR_BROWN 0x000003</div><div class='add'>+# define SLSMG_COLOR_BLUE 0x000004</div><div class='add'>+# define SLSMG_COLOR_MAGENTA 0x000005</div><div class='add'>+# define SLSMG_COLOR_CYAN 0x000006</div><div class='add'>+# define SLSMG_COLOR_LGRAY 0x000007</div><div class='add'>+# define SLSMG_COLOR_GRAY 0x000008</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_RED 0x000009</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_GREEN 0x00000A</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_BROWN 0x00000B</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_BLUE 0x00000C</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_CYAN 0x00000D</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_MAGENTA 0x00000E</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_WHITE 0x00000F</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ void (*tt_normal_video)(void);</div><div class='add'>+ void (*tt_set_scroll_region)(int, int);</div><div class='add'>+ void (*tt_goto_rc)(int, int);</div><div class='add'>+ void (*tt_reverse_index)(int);</div><div class='add'>+ void (*tt_reset_scroll_region)(void);</div><div class='add'>+ void (*tt_delete_nlines)(int);</div><div class='add'>+ void (*tt_cls) (void);</div><div class='add'>+ void (*tt_del_eol) (void);</div><div class='add'>+ void (*tt_smart_puts) (SLsmg_Char_Type *, SLsmg_Char_Type *, int, int);</div><div class='add'>+ int (*tt_flush_output) (void);</div><div class='add'>+ int (*tt_reset_video) (void);</div><div class='add'>+ int (*tt_init_video) (void);</div><div class='add'>+</div><div class='add'>+ int *tt_screen_rows;</div><div class='add'>+ int *tt_screen_cols;</div><div class='add'>+</div><div class='add'>+ int *tt_term_cannot_scroll;</div><div class='add'>+ int *tt_has_alt_charset;</div><div class='add'>+ int *tt_use_blink_for_acs;</div><div class='add'>+ char **tt_graphic_char_pairs;</div><div class='add'>+</div><div class='add'>+ long reserved[4];</div><div class='add'>+}</div><div class='add'>+SLsmg_Term_Type;</div><div class='add'>+extern void SLsmg_set_terminal_info (SLsmg_Term_Type *);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Keypad Interface */</div><div class='add'>+</div><div class='add'>+#define SL_KEY_ERR 0xFFFF</div><div class='add'>+</div><div class='add'>+#define SL_KEY_UP 0x101</div><div class='add'>+#define SL_KEY_DOWN 0x102</div><div class='add'>+#define SL_KEY_LEFT 0x103</div><div class='add'>+#define SL_KEY_RIGHT 0x104</div><div class='add'>+#define SL_KEY_PPAGE 0x105</div><div class='add'>+#define SL_KEY_NPAGE 0x106</div><div class='add'>+#define SL_KEY_HOME 0x107</div><div class='add'>+#define SL_KEY_END 0x108</div><div class='add'>+#define SL_KEY_A1 0x109</div><div class='add'>+#define SL_KEY_A3 0x10A</div><div class='add'>+#define SL_KEY_B2 0x10B</div><div class='add'>+#define SL_KEY_C1 0x10C</div><div class='add'>+#define SL_KEY_C3 0x10D</div><div class='add'>+#define SL_KEY_REDO 0x10E</div><div class='add'>+#define SL_KEY_UNDO 0x10F</div><div class='add'>+#define SL_KEY_BACKSPACE 0x110</div><div class='add'>+#define SL_KEY_ENTER 0x111</div><div class='add'>+#define SL_KEY_IC 0x112</div><div class='add'>+#define SL_KEY_DELETE 0x113</div><div class='add'>+</div><div class='add'>+#define SL_KEY_F0 0x200</div><div class='add'>+#define SL_KEY_F(X) (SL_KEY_F0 + X)</div><div class='add'>+</div><div class='add'>+/* I do not intend to use keysymps > 0x1000. Applications can use those. */</div><div class='add'>+/* Returns 0 upon success or -1 upon error. */</div><div class='add'>+extern int SLkp_define_keysym (char *, unsigned int);</div><div class='add'>+</div><div class='add'>+/* This function must be called AFTER SLtt_get_terminfo and not before. */</div><div class='add'>+extern int SLkp_init (void);</div><div class='add'>+</div><div class='add'>+/* This function uses SLang_getkey and assumes that what ever initialization</div><div class='add'>+ * is required for SLang_getkey has been performed.</div><div class='add'>+ */</div><div class='add'>+extern int SLkp_getkey (void);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Scroll Interface */</div><div class='add'>+</div><div class='add'>+typedef struct _SLscroll_Type</div><div class='add'>+{</div><div class='add'>+ struct _SLscroll_Type *next;</div><div class='add'>+ struct _SLscroll_Type *prev;</div><div class='add'>+ unsigned int flags;</div><div class='add'>+}</div><div class='add'>+SLscroll_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ unsigned int flags;</div><div class='add'>+ SLscroll_Type *top_window_line; /* list element at top of window */</div><div class='add'>+ SLscroll_Type *bot_window_line; /* list element at bottom of window */</div><div class='add'>+ SLscroll_Type *current_line; /* current list element */</div><div class='add'>+ SLscroll_Type *lines; /* first list element */</div><div class='add'>+ unsigned int nrows; /* number of rows in window */</div><div class='add'>+ unsigned int hidden_mask; /* applied to flags in SLscroll_Type */</div><div class='add'>+ unsigned int line_num; /* current line number (visible) */</div><div class='add'>+ unsigned int num_lines; /* total number of lines (visible) */</div><div class='add'>+ unsigned int window_row; /* row of current_line in window */</div><div class='add'>+ unsigned int border; /* number of rows that form scroll border */</div><div class='add'>+ int cannot_scroll; /* should window scroll or recenter */</div><div class='add'>+}</div><div class='add'>+SLscroll_Window_Type;</div><div class='add'>+</div><div class='add'>+extern int SLscroll_find_top (SLscroll_Window_Type *);</div><div class='add'>+extern int SLscroll_find_line_num (SLscroll_Window_Type *);</div><div class='add'>+extern unsigned int SLscroll_next_n (SLscroll_Window_Type *, unsigned int);</div><div class='add'>+extern unsigned int SLscroll_prev_n (SLscroll_Window_Type *, unsigned int);</div><div class='add'>+extern int SLscroll_pageup (SLscroll_Window_Type *);</div><div class='add'>+extern int SLscroll_pagedown (SLscroll_Window_Type *);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Signal Routines */</div><div class='add'>+</div><div class='add'>+typedef void SLSig_Fun_Type (int);</div><div class='add'>+extern SLSig_Fun_Type *SLsignal (int, SLSig_Fun_Type *);</div><div class='add'>+extern SLSig_Fun_Type *SLsignal_intr (int, SLSig_Fun_Type *);</div><div class='add'>+extern int SLsig_block_signals (void);</div><div class='add'>+extern int SLsig_unblock_signals (void);</div><div class='add'>+extern int SLsystem (char *);</div><div class='add'>+</div><div class='add'>+extern char *SLerrno_strerror (int);</div><div class='add'>+extern int SLerrno_set_errno (int);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Interpreter Macro Definitions */</div><div class='add'>+</div><div class='add'>+/* The definitions here are for objects that may be on the run-time stack.</div><div class='add'>+ * They are actually sub_types of literal and data main_types. The actual</div><div class='add'>+ * numbers are historical.</div><div class='add'>+ */</div><div class='add'>+#define SLANG_UNDEFINED_TYPE 0x00 /* MUST be 0 */</div><div class='add'>+#define SLANG_VOID_TYPE 0x01 /* also matches ANY type */</div><div class='add'>+#define SLANG_INT_TYPE 0x02</div><div class='add'>+#define SLANG_DOUBLE_TYPE 0x03</div><div class='add'>+#define SLANG_CHAR_TYPE 0x04</div><div class='add'>+#define SLANG_INTP_TYPE 0x05</div><div class='add'>+/* An object of SLANG_INTP_TYPE should never really occur on the stack. Rather,</div><div class='add'>+ * the integer to which it refers will be there instead. It is defined here</div><div class='add'>+ * because it is a valid type for MAKE_VARIABLE.</div><div class='add'>+ */</div><div class='add'>+#define SLANG_REF_TYPE 0x06</div><div class='add'>+/* SLANG_REF_TYPE refers to an object on the stack that is a pointer (reference)</div><div class='add'>+ * to some other object.</div><div class='add'>+ */</div><div class='add'>+#define SLANG_COMPLEX_TYPE 0x07</div><div class='add'>+#define SLANG_NULL_TYPE 0x08</div><div class='add'>+#define SLANG_UCHAR_TYPE 0x09</div><div class='add'>+#define SLANG_SHORT_TYPE 0x0A</div><div class='add'>+#define SLANG_USHORT_TYPE 0x0B</div><div class='add'>+#define SLANG_UINT_TYPE 0x0C</div><div class='add'>+#define SLANG_LONG_TYPE 0x0D</div><div class='add'>+#define SLANG_ULONG_TYPE 0x0E</div><div class='add'>+#define SLANG_STRING_TYPE 0x0F</div><div class='add'>+#define SLANG_FLOAT_TYPE 0x10</div><div class='add'>+#define SLANG_STRUCT_TYPE 0x11</div><div class='add'>+#define SLANG_ISTRUCT_TYPE 0x12</div><div class='add'>+#define SLANG_ARRAY_TYPE 0x20</div><div class='add'>+#define SLANG_DATATYPE_TYPE 0x21</div><div class='add'>+#define SLANG_FILE_PTR_TYPE 0x22</div><div class='add'>+#define SLANG_ASSOC_TYPE 0x23</div><div class='add'>+#define SLANG_ANY_TYPE 0x24</div><div class='add'>+#define SLANG_BSTRING_TYPE 0x25</div><div class='add'>+#define SLANG_FILE_FD_TYPE 0x26</div><div class='add'>+</div><div class='add'>+/* Compatibility */</div><div class='add'>+#ifdef FLOAT_TYPE</div><div class='add'>+# undef FLOAT_TYPE</div><div class='add'>+#endif</div><div class='add'>+#define VOID_TYPE SLANG_VOID_TYPE</div><div class='add'>+#define INT_TYPE SLANG_INT_TYPE</div><div class='add'>+#define INTP_TYPE SLANG_INTP_TYPE</div><div class='add'>+#define FLOAT_TYPE SLANG_DOUBLE_TYPE</div><div class='add'>+#define ARRAY_TYPE SLANG_ARRAY_TYPE</div><div class='add'>+#define CHAR_TYPE SLANG_CHAR_TYPE</div><div class='add'>+#define STRING_TYPE SLANG_STRING_TYPE</div><div class='add'>+</div><div class='add'>+/* I am reserving values greater than or equal to 128 for user applications.</div><div class='add'>+ * The first 127 are reserved for S-Lang.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Binary and Unary Subtypes */</div><div class='add'>+/* Since the application can define new types and can overload the binary</div><div class='add'>+ * and unary operators, these definitions must be present in this file.</div><div class='add'>+ * The current implementation assumes both unary and binary are distinct.</div><div class='add'>+ */</div><div class='add'>+#define SLANG_PLUS 0x01</div><div class='add'>+#define SLANG_MINUS 0x02</div><div class='add'>+#define SLANG_TIMES 0x03</div><div class='add'>+#define SLANG_DIVIDE 0x04</div><div class='add'>+#define SLANG_EQ 0x05</div><div class='add'>+#define SLANG_NE 0x06</div><div class='add'>+#define SLANG_GT 0x07</div><div class='add'>+#define SLANG_GE 0x08</div><div class='add'>+#define SLANG_LT 0x09</div><div class='add'>+#define SLANG_LE 0x0A</div><div class='add'>+#define SLANG_POW 0x0B</div><div class='add'>+#define SLANG_OR 0x0C</div><div class='add'>+#define SLANG_AND 0x0D</div><div class='add'>+#define SLANG_BAND 0x0E</div><div class='add'>+#define SLANG_BOR 0x0F</div><div class='add'>+#define SLANG_BXOR 0x10</div><div class='add'>+#define SLANG_SHL 0x11</div><div class='add'>+#define SLANG_SHR 0x12</div><div class='add'>+#define SLANG_MOD 0x13</div><div class='add'>+</div><div class='add'>+/* UNARY subtypes (may be overloaded) */</div><div class='add'>+#define SLANG_PLUSPLUS 0x20</div><div class='add'>+#define SLANG_MINUSMINUS 0x21</div><div class='add'>+#define SLANG_ABS 0x22</div><div class='add'>+#define SLANG_SIGN 0x23</div><div class='add'>+#define SLANG_SQR 0x24</div><div class='add'>+#define SLANG_MUL2 0x25</div><div class='add'>+#define SLANG_CHS 0x26</div><div class='add'>+#define SLANG_NOT 0x27</div><div class='add'>+#define SLANG_BNOT 0x28</div><div class='add'>+</div><div class='add'>+extern char *SLang_Error_Message;</div><div class='add'>+</div><div class='add'>+int SLadd_intrinsic_variable (char *, VOID_STAR, unsigned char, int);</div><div class='add'>+int SLadd_intrinsic_function (char *, FVOID_STAR, unsigned char, unsigned int,...);</div><div class='add'>+</div><div class='add'>+int SLns_add_intrinsic_variable (SLang_NameSpace_Type *, char *, VOID_STAR, unsigned char, int);</div><div class='add'>+int SLns_add_intrinsic_function (SLang_NameSpace_Type *, char *, FVOID_STAR, unsigned char, unsigned int,...);</div><div class='add'>+</div><div class='add'>+extern void SLadd_at_handler (long *, char *);</div><div class='add'>+</div><div class='add'>+#define MAKE_INTRINSIC_N(n,f,out,in,a1,a2,a3,a4,a5,a6,a7) \</div><div class='add'>+ {(n), NULL, SLANG_INTRINSIC, (FVOID_STAR) (f), \</div><div class='add'>+ {a1,a2,a3,a4,a5,a6,a7}, (in), (out)}</div><div class='add'>+</div><div class='add'>+#define MAKE_INTRINSIC_7(n,f,out,a1,a2,a3,a4,a5,a6,a7) \</div><div class='add'>+ MAKE_INTRINSIC_N(n,f,out,7,a1,a2,a3,a4,a5,a6,a7)</div><div class='add'>+#define MAKE_INTRINSIC_6(n,f,out,a1,a2,a3,a4,a5,a6) \</div><div class='add'>+ MAKE_INTRINSIC_N(n,f,out,6,a1,a2,a3,a4,a5,a6,0)</div><div class='add'>+#define MAKE_INTRINSIC_5(n,f,out,a1,a2,a3,a4,a5) \</div><div class='add'>+ MAKE_INTRINSIC_N(n,f,out,5,a1,a2,a3,a4,a5,0,0)</div><div class='add'>+#define MAKE_INTRINSIC_4(n,f,out,a1,a2,a3,a4) \</div><div class='add'>+ MAKE_INTRINSIC_N(n,f,out,4,a1,a2,a3,a4,0,0,0)</div><div class='add'>+#define MAKE_INTRINSIC_3(n,f,out,a1,a2,a3) \</div><div class='add'>+ MAKE_INTRINSIC_N(n,f,out,3,a1,a2,a3,0,0,0,0)</div><div class='add'>+#define MAKE_INTRINSIC_2(n,f,out,a1,a2) \</div><div class='add'>+ MAKE_INTRINSIC_N(n,f,out,2,a1,a2,0,0,0,0,0)</div><div class='add'>+#define MAKE_INTRINSIC_1(n,f,out,a1) \</div><div class='add'>+ MAKE_INTRINSIC_N(n,f,out,1,a1,0,0,0,0,0,0)</div><div class='add'>+#define MAKE_INTRINSIC_0(n,f,out) \</div><div class='add'>+ MAKE_INTRINSIC_N(n,f,out,0,0,0,0,0,0,0,0)</div><div class='add'>+</div><div class='add'>+#define MAKE_INTRINSIC_S(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_1(n,f,r,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_I(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_1(n,f,r,SLANG_INT_TYPE)</div><div class='add'>+</div><div class='add'>+#define MAKE_INTRINSIC_SS(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_2(n,f,r,SLANG_STRING_TYPE,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_SI(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_2(n,f,r,SLANG_STRING_TYPE,SLANG_INT_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_IS(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_2(n,f,r,SLANG_INT_TYPE,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_II(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_2(n,f,r,SLANG_INT_TYPE,SLANG_INT_TYPE)</div><div class='add'>+</div><div class='add'>+#define MAKE_INTRINSIC_SSS(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_STRING_TYPE,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_SSI(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_STRING_TYPE,SLANG_INT_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_SIS(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_INT_TYPE,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_SII(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_INT_TYPE,SLANG_INT_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_ISS(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_STRING_TYPE,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_ISI(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_STRING_TYPE,SLANG_INT_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_IIS(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_INT_TYPE,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_III(n,f,r) \</div><div class='add'>+ MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_INT_TYPE,SLANG_INT_TYPE)</div><div class='add'>+</div><div class='add'>+#define MAKE_INTRINSIC(n, f, out, in) \</div><div class='add'>+ MAKE_INTRINSIC_N(n,f,out,in,0,0,0,0,0,0,0)</div><div class='add'>+</div><div class='add'>+#define MAKE_VARIABLE(n, v, t, r) \</div><div class='add'>+ {n, NULL, SLANG_IVARIABLE + (r), (VOID_STAR)(v), (t)}</div><div class='add'>+</div><div class='add'>+#define MAKE_APP_UNARY(n,op) \</div><div class='add'>+ {(n), NULL, SLANG_APP_UNARY, (op)}</div><div class='add'>+</div><div class='add'>+#define MAKE_MATH_UNARY(n,op) \</div><div class='add'>+ {(n), NULL, SLANG_MATH_UNARY, (op)}</div><div class='add'>+</div><div class='add'>+#define MAKE_ICONSTANT(n,val) \</div><div class='add'>+ {(n),NULL, SLANG_ICONSTANT, (val)}</div><div class='add'>+</div><div class='add'>+#define MAKE_DCONSTANT(n,val) \</div><div class='add'>+ {(n),NULL, SLANG_DCONSTANT, (val)}</div><div class='add'>+</div><div class='add'>+#ifndef offsetof</div><div class='add'>+# define offsetof(T,F) ((unsigned int)((char *)&((T *)0L)->F - (char *)0L))</div><div class='add'>+#endif</div><div class='add'>+#define MAKE_ISTRUCT_FIELD(s,f,n,t,r) {(n), offsetof(s,f), (t), (r)}</div><div class='add'>+</div><div class='add'>+#define SLANG_END_TABLE {NULL}</div><div class='add'>+#define SLANG_END_INTRIN_FUN_TABLE MAKE_INTRINSIC_0(NULL,NULL,0)</div><div class='add'>+#define SLANG_END_DCONST_TABLE MAKE_DCONSTANT(NULL,0)</div><div class='add'>+#define SLANG_END_MATH_UNARY_TABLE MAKE_MATH_UNARY(NULL,0)</div><div class='add'>+#define SLANG_END_INTRIN_VAR_TABLE MAKE_VARIABLE(NULL,NULL,0,0)</div><div class='add'>+#define SLANG_END_ICONST_TABLE MAKE_ICONSTANT(NULL,0)</div><div class='add'>+#define SLANG_END_ISTRUCT_TABLE {NULL, 0, 0, 0}</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Upper/Lowercase Functions */</div><div class='add'>+</div><div class='add'>+extern void SLang_define_case(int *, int *);</div><div class='add'>+extern void SLang_init_case_tables (void);</div><div class='add'>+</div><div class='add'>+extern unsigned char _SLChg_UCase_Lut[256];</div><div class='add'>+extern unsigned char _SLChg_LCase_Lut[256];</div><div class='add'>+#define UPPER_CASE(x) (_SLChg_UCase_Lut[(unsigned char) (x)])</div><div class='add'>+#define LOWER_CASE(x) (_SLChg_LCase_Lut[(unsigned char) (x)])</div><div class='add'>+#define CHANGE_CASE(x) (((x) == _SLChg_LCase_Lut[(unsigned char) (x)]) ?\</div><div class='add'>+ _SLChg_UCase_Lut[(unsigned char) (x)] : _SLChg_LCase_Lut[(unsigned char) (x)])</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Regular Expression Interface */</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ /* These must be set by calling routine. */</div><div class='add'>+ unsigned char *pat; /* regular expression pattern */</div><div class='add'>+ unsigned char *buf; /* buffer for compiled regexp */</div><div class='add'>+ unsigned int buf_len; /* length of buffer */</div><div class='add'>+ int case_sensitive; /* 1 if match is case sensitive */</div><div class='add'>+</div><div class='add'>+ /* The rest are set by SLang_regexp_compile */</div><div class='add'>+</div><div class='add'>+ int must_match; /* 1 if line must contain substring */</div><div class='add'>+ int must_match_bol; /* true if it must match beginning of line */</div><div class='add'>+ unsigned char must_match_str[16]; /* 15 char null term substring */</div><div class='add'>+ int osearch; /* 1 if ordinary search suffices */</div><div class='add'>+ unsigned int min_length; /* minimum length the match must be */</div><div class='add'>+ int beg_matches[10]; /* offset of start of \( */</div><div class='add'>+ unsigned int end_matches[10]; /* length of nth submatch</div><div class='add'>+ * Note that the entire match corresponds</div><div class='add'>+ * to \0</div><div class='add'>+ */</div><div class='add'>+ int offset; /* offset to be added to beg_matches */</div><div class='add'>+ int reserved[10];</div><div class='add'>+} SLRegexp_Type;</div><div class='add'>+</div><div class='add'>+extern unsigned char *SLang_regexp_match(unsigned char *,</div><div class='add'>+ unsigned int,</div><div class='add'>+ SLRegexp_Type *);</div><div class='add'>+</div><div class='add'>+/* Returns 0 upon success. If failure, the offset into the</div><div class='add'>+ * pattern is returned (start = 1).</div><div class='add'>+ */</div><div class='add'>+extern int SLang_regexp_compile (SLRegexp_Type *);</div><div class='add'>+extern char *SLregexp_quote_string (char *, char *, unsigned int);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Command Interface */</div><div class='add'>+</div><div class='add'>+struct _SLcmd_Cmd_Type; /* Pre-declaration is needed below */</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ struct _SLcmd_Cmd_Type *table;</div><div class='add'>+ int argc;</div><div class='add'>+ /* Version 2.0 needs to use a union!! */</div><div class='add'>+ char **string_args;</div><div class='add'>+ int *int_args;</div><div class='add'>+ double *double_args;</div><div class='add'>+ unsigned char *arg_type;</div><div class='add'>+ unsigned long reserved[4];</div><div class='add'>+} SLcmd_Cmd_Table_Type;</div><div class='add'>+</div><div class='add'>+typedef struct _SLcmd_Cmd_Type</div><div class='add'>+{</div><div class='add'>+ int (*cmdfun)(int, SLcmd_Cmd_Table_Type *);</div><div class='add'>+ char *cmd;</div><div class='add'>+ char *arg_type;</div><div class='add'>+} SLcmd_Cmd_Type;</div><div class='add'>+</div><div class='add'>+extern int SLcmd_execute_string (char *, SLcmd_Cmd_Table_Type *);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Search Interface */</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ int cs; /* case sensitive */</div><div class='add'>+ unsigned char key[256];</div><div class='add'>+ int ind[256];</div><div class='add'>+ int key_len;</div><div class='add'>+ int dir;</div><div class='add'>+} SLsearch_Type;</div><div class='add'>+</div><div class='add'>+extern int SLsearch_init (char *, int, int, SLsearch_Type *);</div><div class='add'>+/* This routine must first be called before any search can take place.</div><div class='add'>+ * The second parameter specifies the direction of the search: greater than</div><div class='add'>+ * zero for a forwrd search and less than zero for a backward search. The</div><div class='add'>+ * third parameter specifies whether the search is case sensitive or not.</div><div class='add'>+ * The last parameter is a pointer to a structure that is filled by this</div><div class='add'>+ * function and it is this structure that must be passed to SLsearch.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+extern unsigned char *SLsearch (unsigned char *, unsigned char *, SLsearch_Type *);</div><div class='add'>+/* To use this routine, you must first call 'SLsearch_init'. Then the first</div><div class='add'>+ * two parameters p1 and p2 serve to define the region over which the search</div><div class='add'>+ * is to take place. The third parameter is the structure that was previously</div><div class='add'>+ * initialized by SLsearch_init.</div><div class='add'>+ *</div><div class='add'>+ * The routine returns a pointer to the match if found otherwise it returns</div><div class='add'>+ * NULL.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Pathname Interface */</div><div class='add'>+</div><div class='add'>+/* These function return pointers to the original space */</div><div class='add'>+extern char *SLpath_basename (char *);</div><div class='add'>+extern char *SLpath_extname (char *);</div><div class='add'>+extern int SLpath_is_absolute_path (char *);</div><div class='add'>+</div><div class='add'>+/* These return malloced strings--- NOT slstrings */</div><div class='add'>+extern char *SLpath_dircat (char *, char *);</div><div class='add'>+extern char *SLpath_find_file_in_path (char *, char *);</div><div class='add'>+extern char *SLpath_dirname (char *);</div><div class='add'>+extern int SLpath_file_exists (char *);</div><div class='add'>+extern char *SLpath_pathname_sans_extname (char *);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+extern int SLang_set_module_load_path (char *);</div><div class='add'>+</div><div class='add'>+#define SLANG_MODULE(name) \</div><div class='add'>+ extern int init_##name##_module_ns (char *); \</div><div class='add'>+ extern void deinit_##name##_module (void)</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+{</div><div class='add'>+#endif</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* _DAVIS_SLANG_H_ */</div><div class='head'>diff --git a/mdk-stage1/slang/slarith.c b/mdk-stage1/slang/slarith.c<br/>new file mode 100644<br/>index 000000000..07ad68687<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slarith.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarith.c</a></div><div class='hunk'>@@ -0,0 +1,1656 @@</div><div class='add'>+</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include <math.h></div><div class='add'>+</div><div class='add'>+#ifdef HAVE_LOCALE_H</div><div class='add'>+# include <locale.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This file defines binary and unary operations on all integer types.</div><div class='add'>+ * Supported types include:</div><div class='add'>+ *</div><div class='add'>+ * SLANG_CHAR_TYPE (char)</div><div class='add'>+ * SLANG_SHORT_TYPE (short)</div><div class='add'>+ * SLANG_INT_TYPE (int)</div><div class='add'>+ * SLANG_LONG_TYPE (long)</div><div class='add'>+ * SLANG_FLOAT_TYPE (float)</div><div class='add'>+ * SLANG_DOUBLE_TYPE (double)</div><div class='add'>+ *</div><div class='add'>+ * as well as unsigned types. The result-type of an arithmentic operation</div><div class='add'>+ * will depend upon the data types involved. I am going to distinguish</div><div class='add'>+ * between the boolean operations such as `and' and `or' from the arithmetic</div><div class='add'>+ * operations such as `plus'. Since the result of a boolean operation is</div><div class='add'>+ * either 1 or 0, a boolean result will be represented by SLANG_CHAR_TYPE.</div><div class='add'>+ * Ordinarily I would use an integer but for arrays it makes more sense to</div><div class='add'>+ * use a character data type.</div><div class='add'>+ *</div><div class='add'>+ * So, the following will be assumed (`+' is any arithmetic operator)</div><div class='add'>+ *</div><div class='add'>+ * char + char = int</div><div class='add'>+ * char|short + short = int</div><div class='add'>+ * char|short|int + int = int</div><div class='add'>+ * char|short|int|long + long = long</div><div class='add'>+ * char|short|int|long|float + float = float</div><div class='add'>+ * char|short|int|long|float|double + double = double</div><div class='add'>+ *</div><div class='add'>+ * In the actual implementation, a brute force approach is avoided. Such</div><div class='add'>+ * an approach would mean defining different functions for all possible</div><div class='add'>+ * combinations of types. Including the unsigned types, and not including</div><div class='add'>+ * the complex number type, there are 10 arithmetic types and 10*10=100</div><div class='add'>+ * different combinations of types. Clearly this would be too much.</div><div class='add'>+ *</div><div class='add'>+ * One approach would be to define binary functions only between operands of</div><div class='add'>+ * the same type and then convert types as appropriate. This would require</div><div class='add'>+ * just 6 such functions (int, uint, long, ulong, float, double).</div><div class='add'>+ * However, many conversion functions are going to be required, particularly</div><div class='add'>+ * since we are going to allow typecasting from one arithmetic to another.</div><div class='add'>+ * Since the bit pattern of signed and unsigned types are the same, and only</div><div class='add'>+ * the interpretation differs, there will be no functions to convert between</div><div class='add'>+ * signed and unsigned forms of a given type.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define MAX_ARITHMETIC_TYPES 10</div><div class='add'>+</div><div class='add'>+unsigned char _SLarith_Is_Arith_Type [256];</div><div class='add'>+</div><div class='add'>+unsigned char _SLarith_Arith_Types[] =</div><div class='add'>+{</div><div class='add'>+ SLANG_CHAR_TYPE,</div><div class='add'>+ SLANG_UCHAR_TYPE,</div><div class='add'>+ SLANG_SHORT_TYPE,</div><div class='add'>+ SLANG_USHORT_TYPE,</div><div class='add'>+ SLANG_INT_TYPE,</div><div class='add'>+ SLANG_UINT_TYPE,</div><div class='add'>+ SLANG_LONG_TYPE,</div><div class='add'>+ SLANG_ULONG_TYPE,</div><div class='add'>+ SLANG_FLOAT_TYPE,</div><div class='add'>+ SLANG_DOUBLE_TYPE,</div><div class='add'>+ 0</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Here are a bunch of functions to convert from one type to another. To</div><div class='add'>+ * facilitate the process, a macros will be used.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define DEFUN_1(f,from_type,to_type) \</div><div class='add'>+static void f (to_type *y, from_type *x, unsigned int n) \</div><div class='add'>+{ \</div><div class='add'>+ unsigned int i; \</div><div class='add'>+ for (i = 0; i < n; i++) y[i] = (to_type) x[i]; \</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define DEFUN_2(f,from_type,to_type,copy_fun) \</div><div class='add'>+static VOID_STAR f (VOID_STAR xp, unsigned int n) \</div><div class='add'>+{ \</div><div class='add'>+ from_type *x; \</div><div class='add'>+ to_type *y; \</div><div class='add'>+ x = (from_type *) xp; \</div><div class='add'>+ if (NULL == (y = (to_type *) SLmalloc (sizeof (to_type) * n))) return NULL; \</div><div class='add'>+ copy_fun (y, x, n); \</div><div class='add'>+ return (VOID_STAR) y; \</div><div class='add'>+}</div><div class='add'>+typedef VOID_STAR (*Convert_Fun_Type)(VOID_STAR, unsigned int);</div><div class='add'>+</div><div class='add'>+DEFUN_1(copy_char_to_char,char,char)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_1(copy_char_to_short,char,short)</div><div class='add'>+DEFUN_1(copy_char_to_ushort,char,unsigned short)</div><div class='add'>+#else</div><div class='add'>+# define copy_char_to_short copy_char_to_int</div><div class='add'>+# define copy_char_to_ushort copy_char_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_char_to_int,char,int)</div><div class='add'>+DEFUN_1(copy_char_to_uint,char,unsigned int)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_1(copy_char_to_long,char,long)</div><div class='add'>+DEFUN_1(copy_char_to_ulong,char,unsigned long)</div><div class='add'>+#else</div><div class='add'>+# define copy_char_to_long copy_char_to_int</div><div class='add'>+# define copy_char_to_ulong copy_char_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_char_to_float,char,float)</div><div class='add'>+DEFUN_1(copy_char_to_double,char,double)</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_1(copy_uchar_to_short,unsigned char,short)</div><div class='add'>+DEFUN_1(copy_uchar_to_ushort,unsigned char,unsigned short)</div><div class='add'>+#else</div><div class='add'>+# define copy_uchar_to_short copy_uchar_to_int</div><div class='add'>+# define copy_uchar_to_ushort copy_uchar_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_uchar_to_int,unsigned char,int)</div><div class='add'>+DEFUN_1(copy_uchar_to_uint,unsigned char,unsigned int)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_1(copy_uchar_to_long,unsigned char,long)</div><div class='add'>+DEFUN_1(copy_uchar_to_ulong,unsigned char,unsigned long)</div><div class='add'>+#else</div><div class='add'>+# define copy_uchar_to_long copy_uchar_to_int</div><div class='add'>+# define copy_uchar_to_ulong copy_uchar_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_uchar_to_float,unsigned char,float)</div><div class='add'>+DEFUN_1(copy_uchar_to_double,unsigned char,double)</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_1(copy_short_to_char,short,char)</div><div class='add'>+DEFUN_1(copy_short_to_uchar,short,unsigned char)</div><div class='add'>+DEFUN_1(copy_short_to_short,short,short)</div><div class='add'>+DEFUN_1(copy_short_to_int,short,int)</div><div class='add'>+DEFUN_1(copy_short_to_uint,short,unsigned int)</div><div class='add'>+DEFUN_1(copy_short_to_long,short,long)</div><div class='add'>+DEFUN_1(copy_short_to_ulong,short,unsigned long)</div><div class='add'>+DEFUN_1(copy_short_to_float,short,float)</div><div class='add'>+DEFUN_1(copy_short_to_double,short,double)</div><div class='add'>+DEFUN_1(copy_ushort_to_char,unsigned short,char)</div><div class='add'>+DEFUN_1(copy_ushort_to_uchar,unsigned short,unsigned char)</div><div class='add'>+DEFUN_1(copy_ushort_to_int,unsigned short,int)</div><div class='add'>+DEFUN_1(copy_ushort_to_uint,unsigned short,unsigned int)</div><div class='add'>+DEFUN_1(copy_ushort_to_long,unsigned short,long)</div><div class='add'>+DEFUN_1(copy_ushort_to_ulong,unsigned short,unsigned long)</div><div class='add'>+DEFUN_1(copy_ushort_to_float,unsigned short,float)</div><div class='add'>+DEFUN_1(copy_ushort_to_double,unsigned short,double)</div><div class='add'>+#else</div><div class='add'>+# define copy_short_to_char copy_int_to_char</div><div class='add'>+# define copy_short_to_uchar copy_int_to_uchar</div><div class='add'>+# define copy_short_to_short copy_int_to_int</div><div class='add'>+# define copy_short_to_int copy_int_to_int</div><div class='add'>+# define copy_short_to_uint copy_int_to_int</div><div class='add'>+# define copy_short_to_long copy_int_to_long</div><div class='add'>+# define copy_short_to_ulong copy_int_to_ulong</div><div class='add'>+# define copy_short_to_float copy_int_to_float</div><div class='add'>+# define copy_short_to_double copy_int_to_double</div><div class='add'>+# define copy_ushort_to_char copy_uint_to_char</div><div class='add'>+# define copy_ushort_to_uchar copy_uint_to_uchar</div><div class='add'>+# define copy_ushort_to_int copy_int_to_int</div><div class='add'>+# define copy_ushort_to_uint copy_int_to_int</div><div class='add'>+# define copy_ushort_to_long copy_uint_to_long</div><div class='add'>+# define copy_ushort_to_ulong copy_uint_to_ulong</div><div class='add'>+# define copy_ushort_to_float copy_uint_to_float</div><div class='add'>+# define copy_ushort_to_double copy_uint_to_double</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+DEFUN_1(copy_int_to_char,int,char)</div><div class='add'>+DEFUN_1(copy_int_to_uchar,int,unsigned char)</div><div class='add'>+DEFUN_1(copy_uint_to_char,unsigned int,char)</div><div class='add'>+DEFUN_1(copy_uint_to_uchar,unsigned int,unsigned char)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_1(copy_int_to_short,int,short)</div><div class='add'>+DEFUN_1(copy_int_to_ushort,int,unsigned short)</div><div class='add'>+DEFUN_1(copy_uint_to_short,unsigned int,short)</div><div class='add'>+DEFUN_1(copy_uint_to_ushort,unsigned int,unsigned short)</div><div class='add'>+#else</div><div class='add'>+# define copy_int_to_short copy_int_to_int</div><div class='add'>+# define copy_int_to_ushort copy_int_to_int</div><div class='add'>+# define copy_uint_to_short copy_int_to_int</div><div class='add'>+# define copy_uint_to_ushort copy_int_to_int</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_int_to_int,int,int)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_1(copy_int_to_long,int,long)</div><div class='add'>+DEFUN_1(copy_int_to_ulong,int,unsigned long)</div><div class='add'>+DEFUN_1(copy_uint_to_long,unsigned int,long)</div><div class='add'>+DEFUN_1(copy_uint_to_ulong,unsigned int,unsigned long)</div><div class='add'>+#else</div><div class='add'>+# define copy_int_to_long copy_int_to_int</div><div class='add'>+# define copy_int_to_ulong copy_int_to_int</div><div class='add'>+# define copy_uint_to_long copy_int_to_int</div><div class='add'>+# define copy_uint_to_ulong copy_int_to_int</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_int_to_float,int,float)</div><div class='add'>+DEFUN_1(copy_int_to_double,int,double)</div><div class='add'>+DEFUN_1(copy_uint_to_float,unsigned int,float)</div><div class='add'>+DEFUN_1(copy_uint_to_double,unsigned int,double)</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_1(copy_long_to_char,long,char)</div><div class='add'>+DEFUN_1(copy_long_to_uchar,long,unsigned char)</div><div class='add'>+DEFUN_1(copy_long_to_short,long,short)</div><div class='add'>+DEFUN_1(copy_long_to_ushort,long,unsigned short)</div><div class='add'>+DEFUN_1(copy_long_to_int,long,int)</div><div class='add'>+DEFUN_1(copy_long_to_uint,long,unsigned int)</div><div class='add'>+DEFUN_1(copy_long_to_long,long,long)</div><div class='add'>+DEFUN_1(copy_long_to_float,long,float)</div><div class='add'>+DEFUN_1(copy_long_to_double,long,double)</div><div class='add'>+DEFUN_1(copy_ulong_to_char,unsigned long,char)</div><div class='add'>+DEFUN_1(copy_ulong_to_uchar,unsigned long,unsigned char)</div><div class='add'>+DEFUN_1(copy_ulong_to_short,unsigned long,short)</div><div class='add'>+DEFUN_1(copy_ulong_to_ushort,unsigned long,unsigned short)</div><div class='add'>+DEFUN_1(copy_ulong_to_int,unsigned long,int)</div><div class='add'>+DEFUN_1(copy_ulong_to_uint,unsigned long,unsigned int)</div><div class='add'>+DEFUN_1(copy_ulong_to_float,unsigned long,float)</div><div class='add'>+DEFUN_1(copy_ulong_to_double,unsigned long,double)</div><div class='add'>+#else</div><div class='add'>+#define copy_long_to_char copy_int_to_char</div><div class='add'>+#define copy_long_to_uchar copy_int_to_uchar</div><div class='add'>+#define copy_long_to_short copy_int_to_short</div><div class='add'>+#define copy_long_to_ushort copy_int_to_ushort</div><div class='add'>+#define copy_long_to_int copy_int_to_int</div><div class='add'>+#define copy_long_to_uint copy_int_to_int</div><div class='add'>+#define copy_long_to_long copy_int_to_int</div><div class='add'>+#define copy_long_to_float copy_int_to_float</div><div class='add'>+#define copy_long_to_double copy_int_to_double</div><div class='add'>+#define copy_ulong_to_char copy_uint_to_char</div><div class='add'>+#define copy_ulong_to_uchar copy_uint_to_uchar</div><div class='add'>+#define copy_ulong_to_short copy_uint_to_short</div><div class='add'>+#define copy_ulong_to_ushort copy_uint_to_ushort</div><div class='add'>+#define copy_ulong_to_int copy_int_to_int</div><div class='add'>+#define copy_ulong_to_uint copy_int_to_int</div><div class='add'>+#define copy_ulong_to_float copy_uint_to_float</div><div class='add'>+#define copy_ulong_to_double copy_uint_to_double</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+DEFUN_1(copy_float_to_char,float,char)</div><div class='add'>+DEFUN_1(copy_float_to_uchar,float,unsigned char)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_1(copy_float_to_short,float,short)</div><div class='add'>+DEFUN_1(copy_float_to_ushort,float,unsigned short)</div><div class='add'>+#else</div><div class='add'>+# define copy_float_to_short copy_float_to_int</div><div class='add'>+# define copy_float_to_ushort copy_float_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_float_to_int,float,int)</div><div class='add'>+DEFUN_1(copy_float_to_uint,float,unsigned int)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_1(copy_float_to_long,float,long)</div><div class='add'>+DEFUN_1(copy_float_to_ulong,float,unsigned long)</div><div class='add'>+#else</div><div class='add'>+# define copy_float_to_long copy_float_to_int</div><div class='add'>+# define copy_float_to_ulong copy_float_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_float_to_float,float,float)</div><div class='add'>+DEFUN_1(copy_float_to_double,float,double)</div><div class='add'>+</div><div class='add'>+DEFUN_1(copy_double_to_char,double,char)</div><div class='add'>+DEFUN_1(copy_double_to_uchar,double,unsigned char)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_1(copy_double_to_short,double,short)</div><div class='add'>+DEFUN_1(copy_double_to_ushort,double,unsigned short)</div><div class='add'>+#else</div><div class='add'>+# define copy_double_to_short copy_double_to_int</div><div class='add'>+# define copy_double_to_ushort copy_double_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_double_to_int,double,int)</div><div class='add'>+DEFUN_1(copy_double_to_uint,double,unsigned int)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_1(copy_double_to_long,double,long)</div><div class='add'>+DEFUN_1(copy_double_to_ulong,double,unsigned long)</div><div class='add'>+#else</div><div class='add'>+# define copy_double_to_long copy_double_to_int</div><div class='add'>+# define copy_double_to_ulong copy_double_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_double_to_float,double,float)</div><div class='add'>+DEFUN_1(copy_double_to_double,double,double)</div><div class='add'>+</div><div class='add'>+DEFUN_2(char_to_int,char,int,copy_char_to_int)</div><div class='add'>+DEFUN_2(char_to_uint,char,unsigned int,copy_char_to_uint)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_2(char_to_long,char,long,copy_char_to_long)</div><div class='add'>+DEFUN_2(char_to_ulong,char,unsigned long,copy_char_to_ulong)</div><div class='add'>+#else</div><div class='add'>+# define char_to_long char_to_int</div><div class='add'>+# define char_to_ulong char_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_2(char_to_float,char,float,copy_char_to_float)</div><div class='add'>+DEFUN_2(char_to_double,char,double,copy_char_to_double)</div><div class='add'>+</div><div class='add'>+DEFUN_2(uchar_to_int,unsigned char,int,copy_uchar_to_int)</div><div class='add'>+DEFUN_2(uchar_to_uint,unsigned char,unsigned int,copy_uchar_to_uint)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_2(uchar_to_long,unsigned char,long,copy_uchar_to_long)</div><div class='add'>+DEFUN_2(uchar_to_ulong,unsigned char,unsigned long,copy_uchar_to_ulong)</div><div class='add'>+#else</div><div class='add'>+# define uchar_to_long uchar_to_int</div><div class='add'>+# define uchar_to_ulong uchar_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_2(uchar_to_float,unsigned char,float,copy_uchar_to_float)</div><div class='add'>+DEFUN_2(uchar_to_double,unsigned char,double,copy_uchar_to_double)</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_2(short_to_int,short,int,copy_short_to_int)</div><div class='add'>+DEFUN_2(short_to_uint,short,unsigned int,copy_short_to_uint)</div><div class='add'>+DEFUN_2(short_to_long,short,long,copy_short_to_long)</div><div class='add'>+DEFUN_2(short_to_ulong,short,unsigned long,copy_short_to_ulong)</div><div class='add'>+DEFUN_2(short_to_float,short,float,copy_short_to_float)</div><div class='add'>+DEFUN_2(short_to_double,short,double,copy_short_to_double)</div><div class='add'>+DEFUN_2(ushort_to_int,unsigned short,int,copy_ushort_to_int)</div><div class='add'>+DEFUN_2(ushort_to_uint,unsigned short,unsigned int,copy_ushort_to_uint)</div><div class='add'>+DEFUN_2(ushort_to_long,unsigned short,long,copy_ushort_to_long)</div><div class='add'>+DEFUN_2(ushort_to_ulong,unsigned short,unsigned long,copy_ushort_to_ulong)</div><div class='add'>+DEFUN_2(ushort_to_float,unsigned short,float,copy_ushort_to_float)</div><div class='add'>+DEFUN_2(ushort_to_double,unsigned short,double,copy_ushort_to_double)</div><div class='add'>+#else</div><div class='add'>+# define short_to_int NULL</div><div class='add'>+# define short_to_uint NULL</div><div class='add'>+# define short_to_long int_to_long</div><div class='add'>+# define short_to_ulong int_to_ulong</div><div class='add'>+# define short_to_float int_to_float</div><div class='add'>+# define short_to_double int_to_double</div><div class='add'>+# define ushort_to_int NULL</div><div class='add'>+# define ushort_to_uint NULL</div><div class='add'>+# define ushort_to_long uint_to_long</div><div class='add'>+# define ushort_to_ulong uint_to_ulong</div><div class='add'>+# define ushort_to_float uint_to_float</div><div class='add'>+# define ushort_to_double uint_to_double</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_2(int_to_long,int,long,copy_int_to_long)</div><div class='add'>+DEFUN_2(int_to_ulong,int,unsigned long,copy_int_to_ulong)</div><div class='add'>+#else</div><div class='add'>+# define int_to_long NULL</div><div class='add'>+# define int_to_ulong NULL</div><div class='add'>+#endif</div><div class='add'>+DEFUN_2(int_to_float,int,float,copy_int_to_float)</div><div class='add'>+DEFUN_2(int_to_double,int,double,copy_int_to_double)</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_2(uint_to_long,unsigned int,long,copy_uint_to_long)</div><div class='add'>+DEFUN_2(uint_to_ulong,unsigned int,unsigned long,copy_uint_to_ulong)</div><div class='add'>+#else</div><div class='add'>+# define uint_to_long NULL</div><div class='add'>+# define uint_to_ulong NULL</div><div class='add'>+#endif</div><div class='add'>+DEFUN_2(uint_to_float,unsigned int,float,copy_uint_to_float)</div><div class='add'>+DEFUN_2(uint_to_double,unsigned int,double,copy_uint_to_double)</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_2(long_to_float,long,float,copy_long_to_float)</div><div class='add'>+DEFUN_2(long_to_double,long,double,copy_long_to_double)</div><div class='add'>+DEFUN_2(ulong_to_float,unsigned long,float,copy_ulong_to_float)</div><div class='add'>+DEFUN_2(ulong_to_double,unsigned long,double,copy_ulong_to_double)</div><div class='add'>+#else</div><div class='add'>+# define long_to_float int_to_float</div><div class='add'>+# define long_to_double int_to_double</div><div class='add'>+# define ulong_to_float uint_to_float</div><div class='add'>+# define ulong_to_double uint_to_double</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+DEFUN_2(float_to_double,float,double,copy_float_to_double)</div><div class='add'>+</div><div class='add'>+#define TO_DOUBLE_FUN(name,type) \</div><div class='add'>+static double name (VOID_STAR x) { return (double) *(type *) x; }</div><div class='add'>+TO_DOUBLE_FUN(char_to_one_double,char)</div><div class='add'>+TO_DOUBLE_FUN(uchar_to_one_double,unsigned char)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+TO_DOUBLE_FUN(short_to_one_double,short)</div><div class='add'>+TO_DOUBLE_FUN(ushort_to_one_double,unsigned short)</div><div class='add'>+#else</div><div class='add'>+# define short_to_one_double int_to_one_double</div><div class='add'>+# define ushort_to_one_double uint_to_one_double</div><div class='add'>+#endif</div><div class='add'>+TO_DOUBLE_FUN(int_to_one_double,int)</div><div class='add'>+TO_DOUBLE_FUN(uint_to_one_double,unsigned int)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+TO_DOUBLE_FUN(long_to_one_double,long)</div><div class='add'>+TO_DOUBLE_FUN(ulong_to_one_double,unsigned long)</div><div class='add'>+#else</div><div class='add'>+# define long_to_one_double int_to_one_double</div><div class='add'>+# define ulong_to_one_double uint_to_one_double</div><div class='add'>+#endif</div><div class='add'>+TO_DOUBLE_FUN(float_to_one_double,float)</div><div class='add'>+TO_DOUBLE_FUN(double_to_one_double,double)</div><div class='add'>+</div><div class='add'>+SLang_To_Double_Fun_Type</div><div class='add'>+SLarith_get_to_double_fun (unsigned char type, unsigned int *sizeof_type)</div><div class='add'>+{</div><div class='add'>+ unsigned int da;</div><div class='add'>+ SLang_To_Double_Fun_Type to_double;</div><div class='add'>+</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ case SLANG_CHAR_TYPE:</div><div class='add'>+ da = sizeof (char); to_double = char_to_one_double;</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_UCHAR_TYPE:</div><div class='add'>+ da = sizeof (unsigned char); to_double = uchar_to_one_double;</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_SHORT_TYPE:</div><div class='add'>+ da = sizeof (short); to_double = short_to_one_double;</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_USHORT_TYPE:</div><div class='add'>+ da = sizeof (unsigned short); to_double = ushort_to_one_double;</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_INT_TYPE:</div><div class='add'>+ da = sizeof (int); to_double = int_to_one_double;</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_UINT_TYPE:</div><div class='add'>+ da = sizeof (unsigned int); to_double = uint_to_one_double;</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_LONG_TYPE:</div><div class='add'>+ da = sizeof (long); to_double = long_to_one_double;</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_ULONG_TYPE:</div><div class='add'>+ da = sizeof (unsigned long); to_double = ulong_to_one_double;</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ da = sizeof (float); to_double = float_to_one_double;</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ da = sizeof (double); to_double = double_to_one_double;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (sizeof_type != NULL) *sizeof_type = da;</div><div class='add'>+ return to_double;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Each element of the matrix determines how the row maps onto the column.</div><div class='add'>+ * That is, let the matrix be B_ij. Where the i,j indices refer to</div><div class='add'>+ * precedence of the type. Then,</div><div class='add'>+ * B_ij->copy_function copies type i to type j. Similarly,</div><div class='add'>+ * B_ij->convert_function mallocs a new array of type j and copies i to it.</div><div class='add'>+ *</div><div class='add'>+ * Since types are always converted to higher levels of precedence for binary</div><div class='add'>+ * operations, many of the elements are NULL.</div><div class='add'>+ *</div><div class='add'>+ * Is the idea clear?</div><div class='add'>+ */</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ FVOID_STAR copy_function;</div><div class='add'>+ Convert_Fun_Type convert_function;</div><div class='add'>+}</div><div class='add'>+Binary_Matrix_Type;</div><div class='add'>+</div><div class='add'>+static Binary_Matrix_Type Binary_Matrix [MAX_ARITHMETIC_TYPES][MAX_ARITHMETIC_TYPES] =</div><div class='add'>+{</div><div class='add'>+ {</div><div class='add'>+ {(FVOID_STAR)copy_char_to_char, NULL},</div><div class='add'>+ {(FVOID_STAR)copy_char_to_char, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_char_to_short, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_char_to_ushort, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_char_to_int, char_to_int},</div><div class='add'>+ {(FVOID_STAR) copy_char_to_uint, char_to_uint},</div><div class='add'>+ {(FVOID_STAR) copy_char_to_long, char_to_long},</div><div class='add'>+ {(FVOID_STAR) copy_char_to_ulong, char_to_ulong},</div><div class='add'>+ {(FVOID_STAR) copy_char_to_float, char_to_float},</div><div class='add'>+ {(FVOID_STAR) copy_char_to_double, char_to_double},</div><div class='add'>+ },</div><div class='add'>+</div><div class='add'>+ {</div><div class='add'>+ {(FVOID_STAR)copy_char_to_char, NULL},</div><div class='add'>+ {(FVOID_STAR)copy_char_to_char, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_uchar_to_short, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_uchar_to_ushort, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_uchar_to_int, uchar_to_int},</div><div class='add'>+ {(FVOID_STAR) copy_uchar_to_uint, uchar_to_uint},</div><div class='add'>+ {(FVOID_STAR) copy_uchar_to_long, uchar_to_long},</div><div class='add'>+ {(FVOID_STAR) copy_uchar_to_ulong, uchar_to_ulong},</div><div class='add'>+ {(FVOID_STAR) copy_uchar_to_float, uchar_to_float},</div><div class='add'>+ {(FVOID_STAR) copy_uchar_to_double, uchar_to_double},</div><div class='add'>+ },</div><div class='add'>+</div><div class='add'>+ {</div><div class='add'>+ {(FVOID_STAR) copy_short_to_char, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_short_to_uchar, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_short_to_short, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_short_to_short, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_short_to_int, short_to_int},</div><div class='add'>+ {(FVOID_STAR) copy_short_to_uint, short_to_uint},</div><div class='add'>+ {(FVOID_STAR) copy_short_to_long, short_to_long},</div><div class='add'>+ {(FVOID_STAR) copy_short_to_ulong, short_to_ulong},</div><div class='add'>+ {(FVOID_STAR) copy_short_to_float, short_to_float},</div><div class='add'>+ {(FVOID_STAR) copy_short_to_double, short_to_double},</div><div class='add'>+ },</div><div class='add'>+</div><div class='add'>+ {</div><div class='add'>+ {(FVOID_STAR) copy_ushort_to_char, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_ushort_to_uchar, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_short_to_short, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_short_to_short, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_ushort_to_int, ushort_to_int},</div><div class='add'>+ {(FVOID_STAR) copy_ushort_to_uint, ushort_to_uint},</div><div class='add'>+ {(FVOID_STAR) copy_ushort_to_long, ushort_to_long},</div><div class='add'>+ {(FVOID_STAR) copy_ushort_to_ulong, ushort_to_ulong},</div><div class='add'>+ {(FVOID_STAR) copy_ushort_to_float, ushort_to_float},</div><div class='add'>+ {(FVOID_STAR) copy_ushort_to_double, ushort_to_double},</div><div class='add'>+ },</div><div class='add'>+</div><div class='add'>+ {</div><div class='add'>+ {(FVOID_STAR) copy_int_to_char, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_int_to_uchar, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_int_to_short, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_int_to_ushort, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_int_to_int, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_int_to_int, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_int_to_long, int_to_long},</div><div class='add'>+ {(FVOID_STAR) copy_int_to_ulong, int_to_ulong},</div><div class='add'>+ {(FVOID_STAR) copy_int_to_float, int_to_float},</div><div class='add'>+ {(FVOID_STAR) copy_int_to_double, int_to_double},</div><div class='add'>+ },</div><div class='add'>+</div><div class='add'>+ {</div><div class='add'>+ {(FVOID_STAR) copy_uint_to_char, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_uint_to_uchar, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_uint_to_short, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_uint_to_ushort, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_int_to_int, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_int_to_int, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_uint_to_long, uint_to_long},</div><div class='add'>+ {(FVOID_STAR) copy_uint_to_ulong, uint_to_ulong},</div><div class='add'>+ {(FVOID_STAR) copy_uint_to_float, uint_to_float},</div><div class='add'>+ {(FVOID_STAR) copy_uint_to_double, uint_to_double},</div><div class='add'>+ },</div><div class='add'>+</div><div class='add'>+ {</div><div class='add'>+ {(FVOID_STAR) copy_long_to_char, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_long_to_uchar, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_long_to_short, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_long_to_ushort, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_long_to_int, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_long_to_uint, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_long_to_long, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_long_to_long, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_long_to_float, long_to_float},</div><div class='add'>+ {(FVOID_STAR) copy_long_to_double, long_to_double},</div><div class='add'>+ },</div><div class='add'>+</div><div class='add'>+ {</div><div class='add'>+ {(FVOID_STAR) copy_ulong_to_char, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_ulong_to_uchar, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_ulong_to_short, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_ulong_to_ushort, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_ulong_to_int, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_ulong_to_uint, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_long_to_long, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_long_to_long, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_ulong_to_float, ulong_to_float},</div><div class='add'>+ {(FVOID_STAR) copy_ulong_to_double, ulong_to_double},</div><div class='add'>+ },</div><div class='add'>+</div><div class='add'>+ {</div><div class='add'>+ {(FVOID_STAR) copy_float_to_char, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_float_to_uchar, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_float_to_short, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_float_to_ushort, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_float_to_int, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_float_to_uint, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_float_to_long, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_float_to_ulong, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_float_to_float, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_float_to_double, float_to_double},</div><div class='add'>+ },</div><div class='add'>+</div><div class='add'>+ {</div><div class='add'>+ {(FVOID_STAR) copy_double_to_char, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_double_to_uchar, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_double_to_short, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_double_to_ushort, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_double_to_int, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_double_to_uint, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_double_to_long, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_double_to_ulong, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_double_to_float, NULL},</div><div class='add'>+ {(FVOID_STAR) copy_double_to_double, NULL},</div><div class='add'>+ }</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define GENERIC_BINARY_FUNCTION int_int_bin_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE int</div><div class='add'>+#define POW_FUNCTION(a,b) pow((double)(a),(double)(b))</div><div class='add'>+#define POW_RESULT_TYPE double</div><div class='add'>+#define ABS_FUNCTION abs</div><div class='add'>+#define MOD_FUNCTION(a,b) ((a) % (b))</div><div class='add'>+#define GENERIC_UNARY_FUNCTION int_unary_op</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : (((x) < 0) ? -1 : 0))</div><div class='add'>+#define SCALAR_BINARY_FUNCTION int_int_scalar_bin_op</div><div class='add'>+#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_int_obj(SLANG_INT_TYPE,(x))</div><div class='add'>+#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x))</div><div class='add'>+#define CMP_FUNCTION int_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_BINARY_FUNCTION uint_uint_bin_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE unsigned int</div><div class='add'>+#define POW_FUNCTION(a,b) pow((double)(a),(double)(b))</div><div class='add'>+#define POW_RESULT_TYPE double</div><div class='add'>+#define MOD_FUNCTION(a,b) ((a) % (b))</div><div class='add'>+#define GENERIC_UNARY_FUNCTION uint_unary_op</div><div class='add'>+#define ABS_FUNCTION(a) (a)</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : 0)</div><div class='add'>+#define SCALAR_BINARY_FUNCTION uint_uint_scalar_bin_op</div><div class='add'>+#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_int_obj(SLANG_UINT_TYPE,(int)(x))</div><div class='add'>+#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x))</div><div class='add'>+#define CMP_FUNCTION uint_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#if SIZEOF_LONG != SIZEOF_INT</div><div class='add'>+#define GENERIC_BINARY_FUNCTION long_long_bin_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE long</div><div class='add'>+#define POW_FUNCTION(a,b) pow((double)(a),(double)(b))</div><div class='add'>+#define POW_RESULT_TYPE double</div><div class='add'>+#define MOD_FUNCTION(a,b) ((a) % (b))</div><div class='add'>+#define GENERIC_UNARY_FUNCTION long_unary_op</div><div class='add'>+#define ABS_FUNCTION(a) (((a) >= 0) ? (a) : -(a))</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : (((x) < 0) ? -1 : 0))</div><div class='add'>+#define SCALAR_BINARY_FUNCTION long_long_scalar_bin_op</div><div class='add'>+#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_long_obj(SLANG_LONG_TYPE,(x))</div><div class='add'>+#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x))</div><div class='add'>+#define CMP_FUNCTION long_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_BINARY_FUNCTION ulong_ulong_bin_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE unsigned long</div><div class='add'>+#define POW_FUNCTION(a,b) pow((double)(a),(double)(b))</div><div class='add'>+#define POW_RESULT_TYPE double</div><div class='add'>+#define MOD_FUNCTION(a,b) ((a) % (b))</div><div class='add'>+#define GENERIC_UNARY_FUNCTION ulong_unary_op</div><div class='add'>+#define ABS_FUNCTION(a) (a)</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : 0)</div><div class='add'>+#define SCALAR_BINARY_FUNCTION ulong_ulong_scalar_bin_op</div><div class='add'>+#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_long_obj(SLANG_ULONG_TYPE,(long)(x))</div><div class='add'>+#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x))</div><div class='add'>+#define CMP_FUNCTION ulong_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+#else</div><div class='add'>+#define long_long_bin_op int_int_bin_op</div><div class='add'>+#define ulong_ulong_bin_op uint_uint_bin_op</div><div class='add'>+#define long_unary_op int_unary_op</div><div class='add'>+#define ulong_unary_op uint_unary_op</div><div class='add'>+#define long_cmp_function int_cmp_function</div><div class='add'>+#define ulong_cmp_function uint_cmp_function</div><div class='add'>+#endif /* SIZEOF_INT != SIZEOF_LONG */</div><div class='add'>+</div><div class='add'>+#define GENERIC_BINARY_FUNCTION float_float_bin_op</div><div class='add'>+#define GENERIC_TYPE float</div><div class='add'>+#define POW_FUNCTION(a,b) (float)pow((double)(a),(double)(b))</div><div class='add'>+#define POW_RESULT_TYPE float</div><div class='add'>+#define MOD_FUNCTION(a,b) (float)fmod((a),(b))</div><div class='add'>+#define GENERIC_UNARY_FUNCTION float_unary_op</div><div class='add'>+#define ABS_FUNCTION(a) (float)fabs((double) a)</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : (((x) < 0) ? -1 : 0))</div><div class='add'>+#define SCALAR_BINARY_FUNCTION float_float_scalar_bin_op</div><div class='add'>+#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_float_obj(SLANG_FLOAT_TYPE,(x))</div><div class='add'>+#define PUSH_POW_OBJ_FUN(x) SLclass_push_float_obj(SLANG_FLOAT_TYPE, (x))</div><div class='add'>+#define CMP_FUNCTION float_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_BINARY_FUNCTION double_double_bin_op</div><div class='add'>+#define GENERIC_TYPE double</div><div class='add'>+#define POW_FUNCTION(a,b) pow((double)(a),(double)(b))</div><div class='add'>+#define POW_RESULT_TYPE double</div><div class='add'>+#define MOD_FUNCTION(a,b) (float)fmod((a),(b))</div><div class='add'>+#define GENERIC_UNARY_FUNCTION double_unary_op</div><div class='add'>+#define ABS_FUNCTION(a) fabs(a)</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : (((x) < 0) ? -1 : 0))</div><div class='add'>+#define SCALAR_BINARY_FUNCTION double_double_scalar_bin_op</div><div class='add'>+#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE,(x))</div><div class='add'>+#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x))</div><div class='add'>+#define CMP_FUNCTION double_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_UNARY_FUNCTION char_unary_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE signed char</div><div class='add'>+#define ABS_FUNCTION abs</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : (((x) < 0) ? -1 : 0))</div><div class='add'>+#define CMP_FUNCTION char_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_UNARY_FUNCTION uchar_unary_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE unsigned char</div><div class='add'>+#define ABS_FUNCTION(x) (x)</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : 0)</div><div class='add'>+#define CMP_FUNCTION uchar_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#if SIZEOF_SHORT != SIZEOF_INT</div><div class='add'>+#define GENERIC_UNARY_FUNCTION short_unary_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE short</div><div class='add'>+#define ABS_FUNCTION abs</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : (((x) < 0) ? -1 : 0))</div><div class='add'>+#define CMP_FUNCTION short_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_UNARY_FUNCTION ushort_unary_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE unsigned short</div><div class='add'>+#define ABS_FUNCTION(x) (x)</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : 0)</div><div class='add'>+#define CMP_FUNCTION ushort_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+#endif /* SIZEOF_INT != SIZEOF_SHORT */</div><div class='add'>+</div><div class='add'>+/* Unfortunately, the numbers that were assigned to the data-types were</div><div class='add'>+ * not well thought out. So, I need to use the following table.</div><div class='add'>+ */</div><div class='add'>+#define MAXIMUM_ARITH_TYPE_VALUE SLANG_FLOAT_TYPE</div><div class='add'>+#define IS_INTEGER_TYPE(x) \</div><div class='add'>+ (((x) <= MAXIMUM_ARITH_TYPE_VALUE) \</div><div class='add'>+ && (Type_Precedence_Table[x] < 8) && (Type_Precedence_Table[x] != -1))</div><div class='add'>+#define IS_ARITHMETIC_TYPE(x) \</div><div class='add'>+ (((x) <= MAXIMUM_ARITH_TYPE_VALUE) && (Type_Precedence_Table[x] != -1))</div><div class='add'>+</div><div class='add'>+#define LONG_PRECEDENCE_VALUE 6</div><div class='add'>+#define FLOAT_PRECEDENCE_VALUE 8</div><div class='add'>+</div><div class='add'>+static signed char Type_Precedence_Table [MAXIMUM_ARITH_TYPE_VALUE + 1] =</div><div class='add'>+{</div><div class='add'>+ -1, /* SLANG_UNDEFINED_TYPE */</div><div class='add'>+ -1, /* SLANG_VOID_TYPE */</div><div class='add'>+ 4, /* SLANG_INT_TYPE */</div><div class='add'>+ 9, /* SLANG_DOUBLE_TYPE */</div><div class='add'>+ 0, /* SLANG_CHAR_TYPE */</div><div class='add'>+ -1, /* SLANG_INTP_TYPE */</div><div class='add'>+ -1, /* SLANG_REF_TYPE */</div><div class='add'>+ -1, /* SLANG_COMPLEX_TYPE */</div><div class='add'>+ -1, /* SLANG_NULL_TYPE */</div><div class='add'>+ 1, /* SLANG_UCHAR_TYPE */</div><div class='add'>+ 2, /* SLANG_SHORT_TYPE */</div><div class='add'>+ 3, /* SLANG_USHORT_TYPE */</div><div class='add'>+ 5, /* SLANG_UINT_TYPE */</div><div class='add'>+ 6, /* SLANG_LONG_TYPE */</div><div class='add'>+ 7, /* SLANG_ULONG_TYPE */</div><div class='add'>+ -1, /* SLANG_STRING_TYPE */</div><div class='add'>+ 8 /* SLANG_FLOAT_TYPE */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLarith_get_precedence (unsigned char type)</div><div class='add'>+{</div><div class='add'>+ if (type > MAXIMUM_ARITH_TYPE_VALUE)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return Type_Precedence_Table[type];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned char _SLarith_promote_type (unsigned char t)</div><div class='add'>+{</div><div class='add'>+ switch (t)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ case SLANG_LONG_TYPE:</div><div class='add'>+ case SLANG_ULONG_TYPE:</div><div class='add'>+ case SLANG_INT_TYPE:</div><div class='add'>+ case SLANG_UINT_TYPE:</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_USHORT_TYPE:</div><div class='add'>+#if SIZEOF_INT == SIZEOF_SHORT</div><div class='add'>+ t = SLANG_UINT_TYPE;</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ /* drop */</div><div class='add'>+ case SLANG_CHAR_TYPE:</div><div class='add'>+ case SLANG_UCHAR_TYPE:</div><div class='add'>+ case SLANG_SHORT_TYPE:</div><div class='add'>+ default:</div><div class='add'>+ t = SLANG_INT_TYPE;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return t;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char promote_to_common_type (unsigned char a, unsigned char b)</div><div class='add'>+{</div><div class='add'>+ a = _SLarith_promote_type (a);</div><div class='add'>+ b = _SLarith_promote_type (b);</div><div class='add'>+</div><div class='add'>+ return (Type_Precedence_Table[a] > Type_Precedence_Table[b]) ? a : b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int arith_bin_op_result (int op, unsigned char a_type, unsigned char b_type,</div><div class='add'>+ unsigned char *c_type)</div><div class='add'>+{</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_EQ:</div><div class='add'>+ case SLANG_NE:</div><div class='add'>+ case SLANG_GT:</div><div class='add'>+ case SLANG_GE:</div><div class='add'>+ case SLANG_LT:</div><div class='add'>+ case SLANG_LE:</div><div class='add'>+ case SLANG_OR:</div><div class='add'>+ case SLANG_AND:</div><div class='add'>+ *c_type = SLANG_CHAR_TYPE;</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+ case SLANG_POW:</div><div class='add'>+ if (SLANG_FLOAT_TYPE == promote_to_common_type (a_type, b_type))</div><div class='add'>+ *c_type = SLANG_FLOAT_TYPE;</div><div class='add'>+ else</div><div class='add'>+ *c_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+ case SLANG_BAND:</div><div class='add'>+ case SLANG_BXOR:</div><div class='add'>+ case SLANG_BOR:</div><div class='add'>+ case SLANG_SHL:</div><div class='add'>+ case SLANG_SHR:</div><div class='add'>+ /* The bit-level operations are defined just for integer types */</div><div class='add'>+ if ((0 == IS_INTEGER_TYPE (a_type))</div><div class='add'>+ || (0 == IS_INTEGER_TYPE(b_type)))</div><div class='add'>+ return 0;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *c_type = promote_to_common_type (a_type, b_type);</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef int (*Bin_Fun_Type) (int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR);</div><div class='add'>+</div><div class='add'>+/* This array of functions must be indexed by precedence after arithmetic</div><div class='add'>+ * promotions.</div><div class='add'>+ */</div><div class='add'>+static Bin_Fun_Type Bin_Fun_Map [MAX_ARITHMETIC_TYPES] =</div><div class='add'>+{</div><div class='add'>+ NULL,</div><div class='add'>+ NULL,</div><div class='add'>+ NULL,</div><div class='add'>+ NULL,</div><div class='add'>+ int_int_bin_op,</div><div class='add'>+ uint_uint_bin_op,</div><div class='add'>+ long_long_bin_op,</div><div class='add'>+ ulong_ulong_bin_op,</div><div class='add'>+ float_float_bin_op,</div><div class='add'>+ double_double_bin_op</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int arith_bin_op (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ Convert_Fun_Type af, bf;</div><div class='add'>+ Bin_Fun_Type binfun;</div><div class='add'>+ int a_indx, b_indx, c_indx;</div><div class='add'>+ unsigned char c_type;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ c_type = promote_to_common_type (a_type, b_type);</div><div class='add'>+</div><div class='add'>+ a_indx = Type_Precedence_Table [a_type];</div><div class='add'>+ b_indx = Type_Precedence_Table [b_type];</div><div class='add'>+ c_indx = Type_Precedence_Table [c_type];</div><div class='add'>+</div><div class='add'>+ af = Binary_Matrix[a_indx][c_indx].convert_function;</div><div class='add'>+ bf = Binary_Matrix[b_indx][c_indx].convert_function;</div><div class='add'>+ binfun = Bin_Fun_Map[c_indx];</div><div class='add'>+</div><div class='add'>+ if ((af != NULL)</div><div class='add'>+ && (NULL == (ap = (VOID_STAR) (*af) (ap, na))))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((bf != NULL)</div><div class='add'>+ && (NULL == (bp = (VOID_STAR) (*bf) (bp, nb))))</div><div class='add'>+ {</div><div class='add'>+ if (af != NULL) SLfree ((char *) ap);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ret = (*binfun) (op, a_type, ap, na, b_type, bp, nb, cp);</div><div class='add'>+ if (af != NULL) SLfree ((char *) ap);</div><div class='add'>+ if (bf != NULL) SLfree ((char *) bp);</div><div class='add'>+</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int arith_unary_op_result (int op, unsigned char a, unsigned char *b)</div><div class='add'>+{</div><div class='add'>+ (void) a;</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLANG_SQR:</div><div class='add'>+ case SLANG_MUL2:</div><div class='add'>+ case SLANG_PLUSPLUS:</div><div class='add'>+ case SLANG_MINUSMINUS:</div><div class='add'>+ case SLANG_CHS:</div><div class='add'>+ case SLANG_ABS:</div><div class='add'>+ *b = a;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_NOT:</div><div class='add'>+ case SLANG_BNOT:</div><div class='add'>+ if (0 == IS_INTEGER_TYPE(a))</div><div class='add'>+ return 0;</div><div class='add'>+ *b = a;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_SIGN:</div><div class='add'>+ *b = SLANG_INT_TYPE;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int integer_pop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ int i, j;</div><div class='add'>+ void (*f)(VOID_STAR, VOID_STAR, unsigned int);</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&obj))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((obj.data_type > MAXIMUM_ARITH_TYPE_VALUE)</div><div class='add'>+ || ((j = Type_Precedence_Table[obj.data_type]) == -1)</div><div class='add'>+ || (j >= FLOAT_PRECEDENCE_VALUE))</div><div class='add'>+ {</div><div class='add'>+ _SLclass_type_mismatch_error (type, obj.data_type);</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ i = Type_Precedence_Table[type];</div><div class='add'>+ f = (void (*)(VOID_STAR, VOID_STAR, unsigned int))</div><div class='add'>+ Binary_Matrix[j][i].copy_function;</div><div class='add'>+</div><div class='add'>+ (*f) (ptr, (VOID_STAR)&obj.v, 1);</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int integer_push (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ int i;</div><div class='add'>+ void (*f)(VOID_STAR, VOID_STAR, unsigned int);</div><div class='add'>+</div><div class='add'>+ i = Type_Precedence_Table[type];</div><div class='add'>+ f = (void (*)(VOID_STAR, VOID_STAR, unsigned int))</div><div class='add'>+ Binary_Matrix[i][i].copy_function;</div><div class='add'>+</div><div class='add'>+ obj.data_type = type;</div><div class='add'>+</div><div class='add'>+ (*f) ((VOID_STAR)&obj.v, ptr, 1);</div><div class='add'>+</div><div class='add'>+ return SLang_push (&obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_char (char *i)</div><div class='add'>+{</div><div class='add'>+ return integer_pop (SLANG_CHAR_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_uchar (unsigned char *i)</div><div class='add'>+{</div><div class='add'>+ return integer_pop (SLANG_UCHAR_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_short (short *i)</div><div class='add'>+{</div><div class='add'>+ return integer_pop (SLANG_SHORT_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_ushort (unsigned short *i)</div><div class='add'>+{</div><div class='add'>+ return integer_pop (SLANG_USHORT_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_long (long *i)</div><div class='add'>+{</div><div class='add'>+ return integer_pop (SLANG_LONG_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_ulong (unsigned long *i)</div><div class='add'>+{</div><div class='add'>+ return integer_pop (SLANG_ULONG_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_integer (int *i)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_object_of_type (SLANG_INT_TYPE, &obj, 0))</div><div class='add'>+ return -1;</div><div class='add'>+ *i = obj.v.int_val;</div><div class='add'>+ return 0;</div><div class='add'>+#else</div><div class='add'>+ return integer_pop (SLANG_INT_TYPE, (VOID_STAR) i);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_uinteger (unsigned int *i)</div><div class='add'>+{</div><div class='add'>+ return integer_pop (SLANG_UINT_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_integer (int i)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_int_obj (SLANG_INT_TYPE, i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_uinteger (unsigned int i)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_int_obj (SLANG_UINT_TYPE, (int) i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_char (char i)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_char_obj (SLANG_CHAR_TYPE, i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_uchar (unsigned char i)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_char_obj (SLANG_UCHAR_TYPE, (char) i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_short (short i)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_short_obj (SLANG_SHORT_TYPE, i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_ushort (unsigned short i)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_short_obj (SLANG_USHORT_TYPE, (unsigned short) i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_long (long i)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_long_obj (SLANG_LONG_TYPE, i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_ulong (unsigned long i)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_long_obj (SLANG_ULONG_TYPE, (long) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int _SLarith_typecast (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ int i, j;</div><div class='add'>+</div><div class='add'>+ void (*copy)(VOID_STAR, VOID_STAR, unsigned int);</div><div class='add'>+</div><div class='add'>+ i = Type_Precedence_Table[a_type];</div><div class='add'>+ j = Type_Precedence_Table[b_type];</div><div class='add'>+</div><div class='add'>+ copy = (void (*)(VOID_STAR, VOID_STAR, unsigned int))</div><div class='add'>+ Binary_Matrix[i][j].copy_function;</div><div class='add'>+</div><div class='add'>+ (*copy) (bp, ap, na);</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+</div><div class='add'>+int SLang_pop_double(double *x, int *convertp, int *ip)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ int i, convert;</div><div class='add'>+</div><div class='add'>+ if (0 != SLang_pop (&obj))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ convert = 0;</div><div class='add'>+</div><div class='add'>+ switch (obj.data_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ *x = (double) obj.v.float_val;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ *x = obj.v.double_val;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_INT_TYPE:</div><div class='add'>+ i = (int) obj.v.long_val;</div><div class='add'>+ *x = (double) i;</div><div class='add'>+ convert = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_CHAR_TYPE: *x = (double) obj.v.char_val; break;</div><div class='add'>+ case SLANG_UCHAR_TYPE: *x = (double) obj.v.uchar_val; break;</div><div class='add'>+ case SLANG_SHORT_TYPE: *x = (double) obj.v.short_val; break;</div><div class='add'>+ case SLANG_USHORT_TYPE: *x = (double) obj.v.ushort_val; break;</div><div class='add'>+ case SLANG_UINT_TYPE: *x = (double) obj.v.uint_val; break;</div><div class='add'>+ case SLANG_LONG_TYPE: *x = (double) obj.v.long_val; break;</div><div class='add'>+ case SLANG_ULONG_TYPE: *x = (double) obj.v.ulong_val; break;</div><div class='add'>+ </div><div class='add'>+ default:</div><div class='add'>+ _SLclass_type_mismatch_error (SLANG_DOUBLE_TYPE, obj.data_type);</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (convertp != NULL) *convertp = convert;</div><div class='add'>+ if (ip != NULL) *ip = i;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_double (double x)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_double_obj (SLANG_DOUBLE_TYPE, x);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_float (float *x)</div><div class='add'>+{</div><div class='add'>+ double d;</div><div class='add'>+</div><div class='add'>+ /* Pop it as a double and let the double function do all the typcasting */</div><div class='add'>+ if (-1 == SLang_pop_double (&d, NULL, NULL))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ *x = (float) d;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_float (float f)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_float_obj (SLANG_FLOAT_TYPE, (double) f);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Double */</div><div class='add'>+static int double_push (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) unused;</div><div class='add'>+ SLang_push_double (*(double *) ptr);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int double_push_literal (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ return SLang_push_double (**(double **)ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int double_pop (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) unused;</div><div class='add'>+ return SLang_pop_double ((double *) ptr, NULL, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void double_byte_code_destroy (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) unused;</div><div class='add'>+ SLfree (*(char **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int float_push (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) unused;</div><div class='add'>+ SLang_push_float (*(float *) ptr);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int float_pop (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) unused;</div><div class='add'>+ return SLang_pop_float ((float *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* SLANG_HAS_FLOAT */</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+static char Double_Format[16] = "%g";</div><div class='add'>+</div><div class='add'>+void _SLset_double_format (char *s)</div><div class='add'>+{</div><div class='add'>+ strncpy (Double_Format, s, 15);</div><div class='add'>+ Double_Format[15] = 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static char *arith_string (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+ char buf [256];</div><div class='add'>+ char *s;</div><div class='add'>+</div><div class='add'>+ s = buf;</div><div class='add'>+</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ s = SLclass_get_datatype_name (type);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_CHAR_TYPE:</div><div class='add'>+ sprintf (s, "%d", *(char *) v);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_UCHAR_TYPE:</div><div class='add'>+ sprintf (s, "%u", *(unsigned char *) v);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_SHORT_TYPE:</div><div class='add'>+ sprintf (s, "%d", *(short *) v);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_USHORT_TYPE:</div><div class='add'>+ sprintf (s, "%u", *(unsigned short *) v);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_INT_TYPE:</div><div class='add'>+ sprintf (s, "%d", *(int *) v);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_UINT_TYPE:</div><div class='add'>+ sprintf (s, "%u", *(unsigned int *) v);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_LONG_TYPE:</div><div class='add'>+ sprintf (s, "%ld", *(long *) v);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_ULONG_TYPE:</div><div class='add'>+ sprintf (s, "%lu", *(unsigned long *) v);</div><div class='add'>+ break;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ if (EOF == _SLsnprintf (buf, sizeof (buf), Double_Format, *(float *) v))</div><div class='add'>+ sprintf (s, "%e", *(float *) v);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ if (EOF == _SLsnprintf (buf, sizeof (buf), Double_Format, *(double *) v))</div><div class='add'>+ sprintf (s, "%e", *(double *) v);</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return SLmake_string (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int integer_to_bool (unsigned char type, int *t)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ return SLang_pop_integer (t);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_int_literal (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_int_obj (type, (int) *(long *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_char_literal (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_char_obj (type, (char) *(long *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SIZEOF_SHORT != SIZEOF_INT</div><div class='add'>+static int push_short_literal (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_short_obj (type, (short) *(long *) ptr);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+static int push_long_literal (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_long_obj (type, *(long *) ptr);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ unsigned char data_type;</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+ int (*unary_fun)(int, unsigned char, VOID_STAR, unsigned int, VOID_STAR);</div><div class='add'>+ int (*push_literal) (unsigned char, VOID_STAR);</div><div class='add'>+ int (*cmp_fun) (unsigned char, VOID_STAR, VOID_STAR, int *);</div><div class='add'>+}</div><div class='add'>+Integer_Info_Type;</div><div class='add'>+</div><div class='add'>+static Integer_Info_Type Integer_Types [8] =</div><div class='add'>+{</div><div class='add'>+ {"Char_Type", SLANG_CHAR_TYPE, sizeof (char), char_unary_op, push_char_literal, char_cmp_function},</div><div class='add'>+ {"UChar_Type", SLANG_UCHAR_TYPE, sizeof (unsigned char), uchar_unary_op, push_char_literal, uchar_cmp_function},</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+ {"Short_Type", SLANG_SHORT_TYPE, sizeof (short), short_unary_op, push_short_literal, short_cmp_function},</div><div class='add'>+ {"UShort_Type", SLANG_USHORT_TYPE, sizeof (unsigned short), ushort_unary_op, push_short_literal, ushort_cmp_function},</div><div class='add'>+#else</div><div class='add'>+ {NULL, SLANG_SHORT_TYPE},</div><div class='add'>+ {NULL, SLANG_USHORT_TYPE},</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ {"Integer_Type", SLANG_INT_TYPE, sizeof (int), int_unary_op, push_int_literal, int_cmp_function},</div><div class='add'>+ {"UInteger_Type", SLANG_UINT_TYPE, sizeof (unsigned int), uint_unary_op, push_int_literal, uint_cmp_function},</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+ {"Long_Type", SLANG_LONG_TYPE, sizeof (long), long_unary_op, push_long_literal, long_cmp_function},</div><div class='add'>+ {"ULong_Type", SLANG_ULONG_TYPE, sizeof (unsigned long), ulong_unary_op, push_long_literal, ulong_cmp_function}</div><div class='add'>+#else</div><div class='add'>+ {NULL, SLANG_LONG_TYPE, 0, NULL, NULL, NULL},</div><div class='add'>+ {NULL, SLANG_ULONG_TYPE, 0, NULL, NULL, NULL}</div><div class='add'>+#endif</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int create_synonyms (void)</div><div class='add'>+{</div><div class='add'>+ static char *names[8] =</div><div class='add'>+ {</div><div class='add'>+ "Int16_Type", "UInt16_Type", "Int32_Type", "UInt32_Type",</div><div class='add'>+ "Int64_Type", "UInt64_Type",</div><div class='add'>+ "Float32_Type", "Float64_Type"</div><div class='add'>+ };</div><div class='add'>+ int types[8];</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ memset ((char *) types, 0, sizeof (types));</div><div class='add'>+</div><div class='add'>+ /* The assumption is that sizeof(unsigned X) == sizeof (X) */</div><div class='add'>+#if SIZEOF_INT == 2</div><div class='add'>+ types[0] = SLANG_INT_TYPE;</div><div class='add'>+ types[1] = SLANG_UINT_TYPE;</div><div class='add'>+#else</div><div class='add'>+# if SIZEOF_SHORT == 2</div><div class='add'>+ types[0] = SLANG_SHORT_TYPE;</div><div class='add'>+ types[1] = SLANG_USHORT_TYPE;</div><div class='add'>+# else</div><div class='add'>+# if SIZEOF_LONG == 2</div><div class='add'>+ types[0] = SLANG_LONG_TYPE;</div><div class='add'>+ types[1] = SLANG_ULONG_TYPE;</div><div class='add'>+# endif</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT == 4</div><div class='add'>+ types[2] = SLANG_INT_TYPE;</div><div class='add'>+ types[3] = SLANG_UINT_TYPE;</div><div class='add'>+#else</div><div class='add'>+# if SIZEOF_SHORT == 4</div><div class='add'>+ types[2] = SLANG_SHORT_TYPE;</div><div class='add'>+ types[3] = SLANG_USHORT_TYPE;</div><div class='add'>+# else</div><div class='add'>+# if SIZEOF_LONG == 4</div><div class='add'>+ types[2] = SLANG_LONG_TYPE;</div><div class='add'>+ types[3] = SLANG_ULONG_TYPE;</div><div class='add'>+# endif</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT == 8</div><div class='add'>+ types[4] = SLANG_INT_TYPE;</div><div class='add'>+ types[5] = SLANG_UINT_TYPE;</div><div class='add'>+#else</div><div class='add'>+# if SIZEOF_SHORT == 8</div><div class='add'>+ types[4] = SLANG_SHORT_TYPE;</div><div class='add'>+ types[5] = SLANG_USHORT_TYPE;</div><div class='add'>+# else</div><div class='add'>+# if SIZEOF_LONG == 8</div><div class='add'>+ types[4] = SLANG_LONG_TYPE;</div><div class='add'>+ types[5] = SLANG_ULONG_TYPE;</div><div class='add'>+# endif</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+</div><div class='add'>+#if SIZEOF_FLOAT == 4</div><div class='add'>+ types[6] = SLANG_FLOAT_TYPE;</div><div class='add'>+#else</div><div class='add'>+# if SIZEOF_DOUBLE == 4</div><div class='add'>+ types[6] = SLANG_DOUBLE_TYPE;</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+#if SIZEOF_FLOAT == 8</div><div class='add'>+ types[7] = SLANG_FLOAT_TYPE;</div><div class='add'>+#else</div><div class='add'>+# if SIZEOF_DOUBLE == 8</div><div class='add'>+ types[7] = SLANG_DOUBLE_TYPE;</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLclass_create_synonym ("Int_Type", SLANG_INT_TYPE))</div><div class='add'>+ || (-1 == SLclass_create_synonym ("UInt_Type", SLANG_UINT_TYPE)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 8; i++)</div><div class='add'>+ {</div><div class='add'>+ if (types[i] == 0) continue;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_create_synonym (names[i], types[i]))</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT == SIZEOF_SHORT</div><div class='add'>+ if ((-1 == SLclass_create_synonym ("Short_Type", SLANG_INT_TYPE))</div><div class='add'>+ || (-1 == SLclass_create_synonym ("UShort_Type", SLANG_UINT_TYPE))</div><div class='add'>+ || (-1 == _SLclass_copy_class (SLANG_SHORT_TYPE, SLANG_INT_TYPE))</div><div class='add'>+ || (-1 == _SLclass_copy_class (SLANG_USHORT_TYPE, SLANG_UINT_TYPE)))</div><div class='add'>+ return -1;</div><div class='add'>+#endif</div><div class='add'>+#if SIZEOF_INT == SIZEOF_LONG</div><div class='add'>+ if ((-1 == SLclass_create_synonym ("Long_Type", SLANG_INT_TYPE))</div><div class='add'>+ || (-1 == SLclass_create_synonym ("ULong_Type", SLANG_UINT_TYPE))</div><div class='add'>+ || (-1 == _SLclass_copy_class (SLANG_LONG_TYPE, SLANG_INT_TYPE))</div><div class='add'>+ || (-1 == _SLclass_copy_class (SLANG_ULONG_TYPE, SLANG_UINT_TYPE)))</div><div class='add'>+ return -1;</div><div class='add'>+#endif</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLarith_register_types (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ int a_type, b_type;</div><div class='add'>+ int i, j;</div><div class='add'>+</div><div class='add'>+#if defined(HAVE_SETLOCALE) && defined(LC_NUMERIC)</div><div class='add'>+ /* make sure decimal point it used --- the parser requires it */</div><div class='add'>+ (void) setlocale (LC_NUMERIC, "C"); </div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 8; i++)</div><div class='add'>+ {</div><div class='add'>+ Integer_Info_Type *info;</div><div class='add'>+</div><div class='add'>+ info = Integer_Types + i;</div><div class='add'>+</div><div class='add'>+ if (info->name == NULL)</div><div class='add'>+ {</div><div class='add'>+ /* This happens when the object is the same size as an integer</div><div class='add'>+ * For this case, we really want to copy the integer class.</div><div class='add'>+ * We will handle that when the synonym is created.</div><div class='add'>+ */</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class (info->name)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ (void) SLclass_set_string_function (cl, arith_string);</div><div class='add'>+ (void) SLclass_set_push_function (cl, integer_push);</div><div class='add'>+ (void) SLclass_set_pop_function (cl, integer_pop);</div><div class='add'>+ cl->cl_push_literal = info->push_literal;</div><div class='add'>+ cl->cl_to_bool = integer_to_bool;</div><div class='add'>+</div><div class='add'>+ cl->cl_cmp = info->cmp_fun;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_register_class (cl, info->data_type, info->sizeof_type,</div><div class='add'>+ SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+ return -1;</div><div class='add'>+ if (-1 == SLclass_add_unary_op (info->data_type, info->unary_fun, arith_unary_op_result))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ _SLarith_Is_Arith_Type [info->data_type] = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("Double_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+ (void) SLclass_set_push_function (cl, double_push);</div><div class='add'>+ (void) SLclass_set_pop_function (cl, double_pop);</div><div class='add'>+ (void) SLclass_set_string_function (cl, arith_string);</div><div class='add'>+ cl->cl_byte_code_destroy = double_byte_code_destroy;</div><div class='add'>+ cl->cl_push_literal = double_push_literal;</div><div class='add'>+ cl->cl_cmp = double_cmp_function;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_DOUBLE_TYPE, sizeof (double),</div><div class='add'>+ SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+ return -1;</div><div class='add'>+ if (-1 == SLclass_add_unary_op (SLANG_DOUBLE_TYPE, double_unary_op, arith_unary_op_result))</div><div class='add'>+ return -1;</div><div class='add'>+ _SLarith_Is_Arith_Type [SLANG_DOUBLE_TYPE] = 2;</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("Float_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+ (void) SLclass_set_string_function (cl, arith_string);</div><div class='add'>+ (void) SLclass_set_push_function (cl, float_push);</div><div class='add'>+ (void) SLclass_set_pop_function (cl, float_pop);</div><div class='add'>+ cl->cl_cmp = float_cmp_function;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_FLOAT_TYPE, sizeof (float),</div><div class='add'>+ SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+ return -1;</div><div class='add'>+ if (-1 == SLclass_add_unary_op (SLANG_FLOAT_TYPE, float_unary_op, arith_unary_op_result))</div><div class='add'>+ return -1;</div><div class='add'>+ _SLarith_Is_Arith_Type [SLANG_FLOAT_TYPE] = 2;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (-1 == create_synonyms ())</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ for (a_type = 0; a_type <= MAXIMUM_ARITH_TYPE_VALUE; a_type++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (i = Type_Precedence_Table [a_type]))</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ for (b_type = 0; b_type <= MAXIMUM_ARITH_TYPE_VALUE; b_type++)</div><div class='add'>+ {</div><div class='add'>+ int implicit_ok;</div><div class='add'>+</div><div class='add'>+ if (-1 == (j = Type_Precedence_Table [b_type]))</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ /* Allow implicit typecast, except from into to float */</div><div class='add'>+ implicit_ok = ((j >= FLOAT_PRECEDENCE_VALUE)</div><div class='add'>+ || (i < FLOAT_PRECEDENCE_VALUE));</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_add_binary_op (a_type, b_type, arith_bin_op, arith_bin_op_result))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (i != j)</div><div class='add'>+ if (-1 == SLclass_add_typecast (a_type, b_type, _SLarith_typecast, implicit_ok))</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+</div><div class='add'>+static void promote_objs (SLang_Object_Type *a, SLang_Object_Type *b,</div><div class='add'>+ SLang_Object_Type *c, SLang_Object_Type *d)</div><div class='add'>+{</div><div class='add'>+ unsigned char ia, ib, ic, id;</div><div class='add'>+ int i, j;</div><div class='add'>+ void (*copy)(VOID_STAR, VOID_STAR, unsigned int);</div><div class='add'>+</div><div class='add'>+ ia = a->data_type;</div><div class='add'>+ ib = b->data_type;</div><div class='add'>+ </div><div class='add'>+ ic = _SLarith_promote_type (ia);</div><div class='add'>+</div><div class='add'>+ if (ic == ib) id = ic; /* already promoted */</div><div class='add'>+ else id = _SLarith_promote_type (ib);</div><div class='add'>+</div><div class='add'>+ i = Type_Precedence_Table[ic];</div><div class='add'>+ j = Type_Precedence_Table[id];</div><div class='add'>+ if (i > j)</div><div class='add'>+ {</div><div class='add'>+ id = ic;</div><div class='add'>+ j = i;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ c->data_type = d->data_type = id;</div><div class='add'>+</div><div class='add'>+ i = Type_Precedence_Table[ia];</div><div class='add'>+ copy = (void (*)(VOID_STAR, VOID_STAR, unsigned int))</div><div class='add'>+ Binary_Matrix[i][j].copy_function;</div><div class='add'>+ (*copy) ((VOID_STAR) &c->v, (VOID_STAR)&a->v, 1);</div><div class='add'>+</div><div class='add'>+ i = Type_Precedence_Table[ib];</div><div class='add'>+ copy = (void (*)(VOID_STAR, VOID_STAR, unsigned int))</div><div class='add'>+ Binary_Matrix[i][j].copy_function;</div><div class='add'>+ (*copy) ((VOID_STAR) &d->v, (VOID_STAR)&b->v, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLarith_bin_op (SLang_Object_Type *oa, SLang_Object_Type *ob, int op)</div><div class='add'>+{</div><div class='add'>+ unsigned char a_type, b_type;</div><div class='add'>+</div><div class='add'>+ a_type = oa->data_type;</div><div class='add'>+ b_type = ob->data_type;</div><div class='add'>+</div><div class='add'>+ if (a_type != b_type)</div><div class='add'>+ {</div><div class='add'>+ SLang_Object_Type obj_a, obj_b;</div><div class='add'>+ </div><div class='add'>+ /* Handle common cases */</div><div class='add'>+ if ((a_type == SLANG_INT_TYPE)</div><div class='add'>+ && (b_type == SLANG_DOUBLE_TYPE))</div><div class='add'>+ return double_double_scalar_bin_op (oa->v.int_val, ob->v.double_val, op);</div><div class='add'>+</div><div class='add'>+ if ((a_type == SLANG_DOUBLE_TYPE)</div><div class='add'>+ && (b_type == SLANG_INT_TYPE))</div><div class='add'>+ return double_double_scalar_bin_op (oa->v.double_val, ob->v.int_val, op);</div><div class='add'>+</div><div class='add'>+ /* Otherwise do it the hard way */</div><div class='add'>+ promote_objs (oa, ob, &obj_a, &obj_b);</div><div class='add'>+ oa = &obj_a;</div><div class='add'>+ ob = &obj_b;</div><div class='add'>+ </div><div class='add'>+ a_type = oa->data_type;</div><div class='add'>+ b_type = ob->data_type;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ </div><div class='add'>+ switch (a_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_CHAR_TYPE:</div><div class='add'>+ return int_int_scalar_bin_op (oa->v.char_val, ob->v.char_val, op);</div><div class='add'>+</div><div class='add'>+ case SLANG_UCHAR_TYPE:</div><div class='add'>+ return int_int_scalar_bin_op (oa->v.uchar_val, ob->v.uchar_val, op);</div><div class='add'>+</div><div class='add'>+ case SLANG_SHORT_TYPE:</div><div class='add'>+ return int_int_scalar_bin_op (oa->v.short_val, ob->v.short_val, op);</div><div class='add'>+</div><div class='add'>+ case SLANG_USHORT_TYPE:</div><div class='add'>+# if SIZEOF_INT == SIZEOF_SHORT</div><div class='add'>+ return uint_uint_scalar_bin_op (oa->v.ushort_val, ob->v.ushort_val, op);</div><div class='add'>+# else</div><div class='add'>+ return int_int_scalar_bin_op ((int)oa->v.ushort_val, (int)ob->v.ushort_val, op);</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+#if SIZEOF_LONG == SIZEOF_INT</div><div class='add'>+ case SLANG_LONG_TYPE:</div><div class='add'>+#endif</div><div class='add'>+ case SLANG_INT_TYPE:</div><div class='add'>+ return int_int_scalar_bin_op (oa->v.int_val, ob->v.int_val, op);</div><div class='add'>+</div><div class='add'>+#if SIZEOF_LONG == SIZEOF_INT</div><div class='add'>+ case SLANG_ULONG_TYPE:</div><div class='add'>+#endif</div><div class='add'>+ case SLANG_UINT_TYPE:</div><div class='add'>+ return uint_uint_scalar_bin_op (oa->v.uint_val, ob->v.uint_val, op);</div><div class='add'>+ </div><div class='add'>+#if SIZEOF_LONG != SIZEOF_INT</div><div class='add'>+ case SLANG_LONG_TYPE:</div><div class='add'>+ return long_long_scalar_bin_op (oa->v.long_val, ob->v.long_val, op);</div><div class='add'>+ case SLANG_ULONG_TYPE:</div><div class='add'>+ return ulong_ulong_scalar_bin_op (oa->v.ulong_val, ob->v.ulong_val, op);</div><div class='add'>+#endif</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ return float_float_scalar_bin_op (oa->v.float_val, ob->v.float_val, op);</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ return double_double_scalar_bin_op (oa->v.double_val, ob->v.double_val, op);</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slarith.inc b/mdk-stage1/slang/slarith.inc<br/>new file mode 100644<br/>index 000000000..efa8a5e04<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slarith.inc?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarith.inc</a></div><div class='hunk'>@@ -0,0 +1,783 @@</div><div class='add'>+/* -*- c -*- */</div><div class='add'>+</div><div class='add'>+/* This include file is a template for defining arithmetic binary operations </div><div class='add'>+ * on arithmetic types. I realize that doing it this way is not very</div><div class='add'>+ * elegant but it minimizes the number of lines of code and I believe it </div><div class='add'>+ * promotes clarity.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* The following macros should be properly defined before including this file:</div><div class='add'>+ *</div><div class='add'>+ * GENERIC_BINARY_FUNCTION: The name of the binary function</div><div class='add'>+ * GENERIC_TYPE: The class data type</div><div class='add'>+ * MOD_FUNCTION: The function to use for mod</div><div class='add'>+ * ABS_FUNCTION: Name of the abs function</div><div class='add'>+ * SIGN_FUNCTION: Name of the sign function</div><div class='add'>+ * GENERIC_UNARY_FUNCTION Name of the unary function</div><div class='add'>+ *</div><div class='add'>+ * If GENERIC_BIT_OPERATIONS is defined, the bit-level binary operators </div><div class='add'>+ * will get included. If the data type has a power operation (SLANG_POW), </div><div class='add'>+ * then POW_FUNCTION should be defined to return POW_RESULT_TYPE.</div><div class='add'>+ */</div><div class='add'>+#ifdef GENERIC_BINARY_FUNCTION</div><div class='add'>+</div><div class='add'>+static int GENERIC_BINARY_FUNCTION </div><div class='add'>+(int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ GENERIC_TYPE *c, *a, *b;</div><div class='add'>+#ifdef POW_FUNCTION</div><div class='add'>+ POW_RESULT_TYPE *d;</div><div class='add'>+#endif</div><div class='add'>+ unsigned int n;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ unsigned int n_max, da, db;</div><div class='add'>+#endif</div><div class='add'>+ char *cc;</div><div class='add'>+</div><div class='add'>+ (void) a_type; /* Both SLANG_INT_TYPE */</div><div class='add'>+ (void) b_type;</div><div class='add'>+</div><div class='add'>+ a = (GENERIC_TYPE *) ap;</div><div class='add'>+ b = (GENERIC_TYPE *) bp;</div><div class='add'>+ c = (GENERIC_TYPE *) cp;</div><div class='add'>+ cc = (char *) cp;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ if (na == 1) da = 0; else da = 1;</div><div class='add'>+ if (nb == 1) db = 0; else db = 1;</div><div class='add'>+</div><div class='add'>+ if (na > nb) n_max = na; else n_max = nb;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+#ifdef POW_FUNCTION</div><div class='add'>+ case SLANG_POW:</div><div class='add'>+ d = (POW_RESULT_TYPE *) cp;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ d[n] = POW_FUNCTION(*a, *b);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ d[n] = POW_FUNCTION(a[n],b[n]);</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ if (xb == 2)</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ d[n] = a[n] * a[n];</div><div class='add'>+ else</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ d[n] = POW_FUNCTION(a[n], xb);</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ d[n] = POW_FUNCTION(xa, b[n]);</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ case SLANG_PLUS:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ c[n] = (*a + *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] + b[n];</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] + xb;</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ c[n] = xa + b[n];</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_MINUS:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ c[n] = (*a - *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] - b[n];</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] - xb;</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ c[n] = xa - b[n];</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_TIMES:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ c[n] = (*a * *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] * b[n];</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] * xb;</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ c[n] = xa * b[n];</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_DIVIDE:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (*b == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ c[n] = (*a / *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ {</div><div class='add'>+ if (b[n] == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ c[n] = a[n] / b[n];</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ </div><div class='add'>+ if (xb == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] / xb;</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ {</div><div class='add'>+ if (b[n] == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ c[n] = xa / b[n];</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case SLANG_MOD:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (*b == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ c[n] = MOD_FUNCTION(*a, *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ {</div><div class='add'>+ if (b[n] == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ c[n] = MOD_FUNCTION(a[n],b[n]);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ if (xb == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = MOD_FUNCTION(a[n],xb);</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ {</div><div class='add'>+ if (b[n] == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ c[n] = MOD_FUNCTION(xa,b[n]);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+#ifdef GENERIC_BIT_OPERATIONS</div><div class='add'>+ case SLANG_BAND:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ c[n] = (*a & *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] & b[n];</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] & xb;</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ c[n] = xa & b[n];</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_BXOR:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ c[n] = (*a ^ *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] ^ b[n];</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] ^ xb;</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ c[n] = xa ^ b[n];</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_BOR:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ c[n] = (*a | *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] | b[n];</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] | xb;</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ c[n] = xa | b[n];</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_SHL:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ c[n] = (*a << *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] << b[n];</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] << xb;</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ c[n] = xa << b[n];</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_SHR:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ c[n] = (*a >> *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] >> b[n];</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ c[n] = a[n] >> xb;</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ c[n] = xa >> b[n];</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+#endif /* GENERIC_BIT_OPERATIONS */</div><div class='add'>+ case SLANG_EQ:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ cc[n] = (*a == *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] == b[n]);</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] == xb);</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ cc[n] = (xa == b[n]);</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_NE:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ cc[n] = (*a != *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] != b[n]);</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] != xb);</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ cc[n] = (xa != b[n]);</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_GT:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ cc[n] = (*a > *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] > b[n]);</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] > xb);</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ cc[n] = (xa > b[n]);</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_GE:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ cc[n] = (*a >= *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] >= b[n]);</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] >= xb);</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ cc[n] = (xa >= b[n]);</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_LT:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ cc[n] = (*a < *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] < b[n]);</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] < xb);</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ cc[n] = (xa < b[n]);</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_LE:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ cc[n] = (*a <= *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] <= b[n]);</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] <= xb);</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ cc[n] = (xa <= b[n]);</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_OR:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ cc[n] = (*a || *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] || b[n]);</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] || xb);</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ cc[n] = (xa || b[n]);</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_AND:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ cc[n] = (*a && *b); a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (na == nb)</div><div class='add'>+ {</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] && b[n]);</div><div class='add'>+ }</div><div class='add'>+ else if (nb == 1)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xb = *b;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ cc[n] = (a[n] && xb);</div><div class='add'>+ }</div><div class='add'>+ else /* if (na == 1) */</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE xa = *a;</div><div class='add'>+ for (n = 0; n < nb; n++)</div><div class='add'>+ cc[n] = (xa && b[n]);</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* GENERIC_BINARY_FUNCTION */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#ifdef GENERIC_UNARY_FUNCTION</div><div class='add'>+</div><div class='add'>+static int GENERIC_UNARY_FUNCTION</div><div class='add'>+(int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ VOID_STAR bp</div><div class='add'>+ )</div><div class='add'>+{</div><div class='add'>+ GENERIC_TYPE *a, *b;</div><div class='add'>+ unsigned int n;</div><div class='add'>+ int *ib;</div><div class='add'>+</div><div class='add'>+ (void) a_type;</div><div class='add'>+</div><div class='add'>+ a = (GENERIC_TYPE *) ap;</div><div class='add'>+ b = (GENERIC_TYPE *) bp;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLANG_PLUSPLUS:</div><div class='add'>+ for (n = 0; n < na; n++) b[n] = (a[n] + 1);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_MINUSMINUS:</div><div class='add'>+ for (n = 0; n < na; n++) b[n] = (a[n] - 1);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_CHS:</div><div class='add'>+ for (n = 0; n < na; n++) b[n] = (GENERIC_TYPE) -(a[n]);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_SQR:</div><div class='add'>+ for (n = 0; n < na; n++) b[n] = (a[n] * a[n]);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_MUL2:</div><div class='add'>+ for (n = 0; n < na; n++) b[n] = (2 * a[n]);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_ABS:</div><div class='add'>+ for (n = 0; n < na; n++) b[n] = ABS_FUNCTION (a[n]);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_SIGN:</div><div class='add'>+ ib = (int *) bp;</div><div class='add'>+ for (n = 0; n < na; n++)</div><div class='add'>+ ib[n] = SIGN_FUNCTION(a[n]);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+#ifdef GENERIC_BIT_OPERATIONS</div><div class='add'>+ case SLANG_NOT:</div><div class='add'>+ for (n = 0; n < na; n++) b[n] = !(a[n]);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_BNOT:</div><div class='add'>+ for (n = 0; n < na; n++) b[n] = ~(a[n]);</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+#endif /* GENERIC_UNARY_FUNCTION */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#ifdef SCALAR_BINARY_FUNCTION</div><div class='add'>+</div><div class='add'>+static int SCALAR_BINARY_FUNCTION (GENERIC_TYPE a, GENERIC_TYPE b, int op)</div><div class='add'>+{</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 1;</div><div class='add'>+ </div><div class='add'>+#ifdef POW_FUNCTION</div><div class='add'>+ case SLANG_POW:</div><div class='add'>+ return PUSH_POW_OBJ_FUN(POW_FUNCTION(a, b));</div><div class='add'>+#endif</div><div class='add'>+ case SLANG_PLUS:</div><div class='add'>+ return PUSH_SCALAR_OBJ_FUN (a + b);</div><div class='add'>+ case SLANG_MINUS:</div><div class='add'>+ return PUSH_SCALAR_OBJ_FUN (a - b);</div><div class='add'>+ case SLANG_TIMES:</div><div class='add'>+ return PUSH_SCALAR_OBJ_FUN (a * b);</div><div class='add'>+ case SLANG_DIVIDE:</div><div class='add'>+ if (b == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return PUSH_SCALAR_OBJ_FUN (a / b);</div><div class='add'>+ case SLANG_MOD:</div><div class='add'>+ if (b == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return PUSH_SCALAR_OBJ_FUN (MOD_FUNCTION(a,b));</div><div class='add'>+#ifdef GENERIC_BIT_OPERATIONS</div><div class='add'>+ case SLANG_BAND:</div><div class='add'>+ return PUSH_SCALAR_OBJ_FUN (a & b);</div><div class='add'>+ case SLANG_BXOR:</div><div class='add'>+ return PUSH_SCALAR_OBJ_FUN (a ^ b);</div><div class='add'>+ case SLANG_BOR:</div><div class='add'>+ return PUSH_SCALAR_OBJ_FUN (a | b);</div><div class='add'>+ case SLANG_SHL:</div><div class='add'>+ return PUSH_SCALAR_OBJ_FUN (a << b);</div><div class='add'>+ case SLANG_SHR:</div><div class='add'>+ return PUSH_SCALAR_OBJ_FUN (a >> b);</div><div class='add'>+#endif</div><div class='add'>+ case SLANG_GT: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a > b));</div><div class='add'>+ case SLANG_LT: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a < b));</div><div class='add'>+ case SLANG_GE: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a >= b));</div><div class='add'>+ case SLANG_LE: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a <= b));</div><div class='add'>+ case SLANG_EQ: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a == b));</div><div class='add'>+ case SLANG_NE: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a != b));</div><div class='add'>+ case SLANG_OR: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a || b));</div><div class='add'>+ case SLANG_AND: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a && b));</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* SCALAR_BINARY_FUNCTION */</div><div class='add'>+</div><div class='add'>+#ifdef CMP_FUNCTION</div><div class='add'>+static int CMP_FUNCTION (unsigned char unused, VOID_STAR a, VOID_STAR b, int *c)</div><div class='add'>+{</div><div class='add'>+ GENERIC_TYPE x, y;</div><div class='add'>+</div><div class='add'>+ (void) unused;</div><div class='add'>+ x = *(GENERIC_TYPE *) a;</div><div class='add'>+ y = *(GENERIC_TYPE *) b;</div><div class='add'>+ </div><div class='add'>+ if (x > y) *c = 1;</div><div class='add'>+ else if (x == y) *c = 0;</div><div class='add'>+ else *c = -1;</div><div class='add'>+ </div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#undef CMP_FUNCTION</div><div class='add'>+#undef SCALAR_BINARY_FUNCTION</div><div class='add'>+#undef PUSH_POW_OBJ_FUN</div><div class='add'>+#undef PUSH_SCALAR_OBJ_FUN</div><div class='add'>+#undef GENERIC_BINARY_FUNCTION</div><div class='add'>+#undef GENERIC_UNARY_FUNCTION</div><div class='add'>+#undef GENERIC_BIT_OPERATIONS</div><div class='add'>+#undef GENERIC_TYPE</div><div class='add'>+#undef POW_FUNCTION</div><div class='add'>+#undef POW_RESULT_TYPE</div><div class='add'>+#undef MOD_FUNCTION</div><div class='add'>+#undef ABS_FUNCTION</div><div class='add'>+#undef SIGN_FUNCTION</div><div class='head'>diff --git a/mdk-stage1/slang/slarray.c b/mdk-stage1/slang/slarray.c<br/>new file mode 100644<br/>index 000000000..0b9a1406c<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slarray.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarray.c</a></div><div class='hunk'>@@ -0,0 +1,3139 @@</div><div class='add'>+/* Array manipulation routines for S-Lang */</div><div class='add'>+/* Copyright (c) 1997, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#define SL_APP_WANTS_FOREACH</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ int first_index;</div><div class='add'>+ int last_index;</div><div class='add'>+ int delta;</div><div class='add'>+}</div><div class='add'>+SLarray_Range_Array_Type;</div><div class='add'>+</div><div class='add'>+/* Use SLang_pop_array when a linear array is required. */</div><div class='add'>+static int pop_array (SLang_Array_Type **at_ptr, int convert_scalar)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int one = 1;</div><div class='add'>+ int type;</div><div class='add'>+</div><div class='add'>+ *at_ptr = NULL;</div><div class='add'>+ type = SLang_peek_at_stack ();</div><div class='add'>+</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case -1:</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ case SLANG_ARRAY_TYPE:</div><div class='add'>+ return SLclass_pop_ptr_obj (SLANG_ARRAY_TYPE, (VOID_STAR *) at_ptr);</div><div class='add'>+</div><div class='add'>+ case SLANG_NULL_TYPE:</div><div class='add'>+ convert_scalar = 0;</div><div class='add'>+ /* drop */</div><div class='add'>+ default:</div><div class='add'>+ if (convert_scalar == 0)</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop ();</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "Context requires an array. Scalar not converted");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (at = SLang_create_array ((unsigned char) type, 0, NULL, &one, 1)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == at->cl->cl_apop ((unsigned char) type, at->data))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *at_ptr = at;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static VOID_STAR linear_get_data_addr (SLang_Array_Type *at, int *dims)</div><div class='add'>+{</div><div class='add'>+ unsigned int num_dims;</div><div class='add'>+ unsigned int ofs;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ int *max_dims;</div><div class='add'>+</div><div class='add'>+ ofs = 0;</div><div class='add'>+ max_dims = at->dims;</div><div class='add'>+ num_dims = at->num_dims;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < num_dims; i++)</div><div class='add'>+ {</div><div class='add'>+ int d = dims[i];</div><div class='add'>+</div><div class='add'>+ if (d < 0)</div><div class='add'>+ d = d + max_dims[i];</div><div class='add'>+</div><div class='add'>+ ofs = ofs * (unsigned int)max_dims [i] + (unsigned int) d;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return (VOID_STAR) ((char *)at->data + (ofs * at->sizeof_type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static VOID_STAR get_data_addr (SLang_Array_Type *at, int *dims)</div><div class='add'>+{</div><div class='add'>+ VOID_STAR data;</div><div class='add'>+</div><div class='add'>+ data = at->data;</div><div class='add'>+ if (data == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_UNKNOWN_ERROR, "Array has no data");</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ data = (*at->index_fun) (at, dims);</div><div class='add'>+</div><div class='add'>+ if (data == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_UNKNOWN_ERROR, "Unable to access array element");</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLarray_free_array_elements (SLang_Class_Type *cl, VOID_STAR s, unsigned int num)</div><div class='add'>+{</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+ void (*f) (unsigned char, VOID_STAR);</div><div class='add'>+ char *p;</div><div class='add'>+ unsigned char type;</div><div class='add'>+</div><div class='add'>+ if ((cl->cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+ || (cl->cl_class_type == SLANG_CLASS_TYPE_VECTOR))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ f = cl->cl_destroy;</div><div class='add'>+ sizeof_type = cl->cl_sizeof_type;</div><div class='add'>+ type = cl->cl_data_type;</div><div class='add'>+</div><div class='add'>+ p = (char *) s;</div><div class='add'>+ while (num != 0)</div><div class='add'>+ {</div><div class='add'>+ if (NULL != *(VOID_STAR *)p)</div><div class='add'>+ {</div><div class='add'>+ (*f) (type, (VOID_STAR)p);</div><div class='add'>+ *(VOID_STAR *) p = NULL;</div><div class='add'>+ }</div><div class='add'>+ p += sizeof_type;</div><div class='add'>+ num--;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int destroy_element (SLang_Array_Type *at,</div><div class='add'>+ int *dims,</div><div class='add'>+ VOID_STAR data)</div><div class='add'>+{</div><div class='add'>+ data = get_data_addr (at, dims);</div><div class='add'>+ if (data == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* This function should only get called for arrays that have</div><div class='add'>+ * pointer elements. Do not call the destroy method if the element</div><div class='add'>+ * is NULL.</div><div class='add'>+ */</div><div class='add'>+ if (NULL != *(VOID_STAR *)data)</div><div class='add'>+ {</div><div class='add'>+ (*at->cl->cl_destroy) (at->data_type, data);</div><div class='add'>+ *(VOID_STAR *) data = NULL;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function only gets called when a new array is created. Thus there</div><div class='add'>+ * is no need to destroy the object first.</div><div class='add'>+ */</div><div class='add'>+static int new_object_element (SLang_Array_Type *at,</div><div class='add'>+ int *dims,</div><div class='add'>+ VOID_STAR data)</div><div class='add'>+{</div><div class='add'>+ data = get_data_addr (at, dims);</div><div class='add'>+ if (data == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return (*at->cl->cl_init_array_object) (at->data_type, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int next_index (int *dims, int *max_dims, unsigned int num_dims)</div><div class='add'>+{</div><div class='add'>+ while (num_dims)</div><div class='add'>+ {</div><div class='add'>+ int dims_i;</div><div class='add'>+</div><div class='add'>+ num_dims--;</div><div class='add'>+</div><div class='add'>+ dims_i = dims [num_dims] + 1;</div><div class='add'>+ if (dims_i != (int) max_dims [num_dims])</div><div class='add'>+ {</div><div class='add'>+ dims [num_dims] = dims_i;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ dims [num_dims] = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int do_method_for_all_elements (SLang_Array_Type *at,</div><div class='add'>+ int (*method)(SLang_Array_Type *,</div><div class='add'>+ int *,</div><div class='add'>+ VOID_STAR),</div><div class='add'>+ VOID_STAR client_data)</div><div class='add'>+{</div><div class='add'>+ int dims [SLARRAY_MAX_DIMS];</div><div class='add'>+ int *max_dims;</div><div class='add'>+ unsigned int num_dims;</div><div class='add'>+</div><div class='add'>+ if (at->num_elements == 0)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ max_dims = at->dims;</div><div class='add'>+ num_dims = at->num_dims;</div><div class='add'>+</div><div class='add'>+ SLMEMSET((char *)dims, 0, sizeof(dims));</div><div class='add'>+</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*method) (at, dims, client_data))</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ while (0 == next_index (dims, max_dims, num_dims));</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_free_array (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+ VOID_STAR data;</div><div class='add'>+ unsigned int flags;</div><div class='add'>+</div><div class='add'>+ if (at == NULL) return;</div><div class='add'>+</div><div class='add'>+ if (at->num_refs > 1)</div><div class='add'>+ {</div><div class='add'>+ at->num_refs -= 1;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ data = at->data;</div><div class='add'>+ flags = at->flags;</div><div class='add'>+</div><div class='add'>+ if (flags & SLARR_DATA_VALUE_IS_INTRINSIC)</div><div class='add'>+ return; /* not to be freed */</div><div class='add'>+</div><div class='add'>+ if (flags & SLARR_DATA_VALUE_IS_POINTER)</div><div class='add'>+ (void) do_method_for_all_elements (at, destroy_element, NULL);</div><div class='add'>+</div><div class='add'>+ SLfree ((char *) data);</div><div class='add'>+ SLfree ((char *) at);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Array_Type *</div><div class='add'>+SLang_create_array1 (unsigned char type, int read_only, VOID_STAR data,</div><div class='add'>+ int *dims, unsigned int num_dims, int no_init)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ unsigned int num_elements;</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+ unsigned int size;</div><div class='add'>+</div><div class='add'>+ if (num_dims > SLARRAY_MAX_DIMS)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "%u dimensional arrays are not supported", num_dims);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < num_dims; i++)</div><div class='add'>+ {</div><div class='add'>+ if (dims[i] < 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Size of array dim %u is less than 0", i);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+ at = (SLang_Array_Type *) SLmalloc (sizeof(SLang_Array_Type));</div><div class='add'>+ if (at == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ SLMEMSET ((char*) at, 0, sizeof(SLang_Array_Type));</div><div class='add'>+</div><div class='add'>+ at->data_type = type;</div><div class='add'>+ at->cl = cl;</div><div class='add'>+ at->num_dims = num_dims;</div><div class='add'>+ at->num_refs = 1;</div><div class='add'>+</div><div class='add'>+ if (read_only) at->flags = SLARR_DATA_VALUE_IS_READ_ONLY;</div><div class='add'>+ switch (cl->cl_class_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_CLASS_TYPE_VECTOR:</div><div class='add'>+ case SLANG_CLASS_TYPE_SCALAR:</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ at->flags |= SLARR_DATA_VALUE_IS_POINTER;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ num_elements = 1;</div><div class='add'>+ for (i = 0; i < num_dims; i++)</div><div class='add'>+ {</div><div class='add'>+ at->dims [i] = dims[i];</div><div class='add'>+ num_elements = dims [i] * num_elements;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Now set the rest of the unused dimensions to 1. This makes it easier</div><div class='add'>+ * when transposing arrays.</div><div class='add'>+ */</div><div class='add'>+ while (i < SLARRAY_MAX_DIMS)</div><div class='add'>+ at->dims[i++] = 1;</div><div class='add'>+</div><div class='add'>+ at->num_elements = num_elements;</div><div class='add'>+ at->index_fun = linear_get_data_addr;</div><div class='add'>+ at->sizeof_type = sizeof_type = cl->cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+ if (data != NULL)</div><div class='add'>+ {</div><div class='add'>+ at->data = data;</div><div class='add'>+ return at;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ size = num_elements * sizeof_type;</div><div class='add'>+</div><div class='add'>+ if (size == 0) size = 1;</div><div class='add'>+</div><div class='add'>+ if (NULL == (data = (VOID_STAR) SLmalloc (size)))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (no_init == 0)</div><div class='add'>+ SLMEMSET ((char *) data, 0, size);</div><div class='add'>+</div><div class='add'>+ at->data = data;</div><div class='add'>+</div><div class='add'>+ if ((cl->cl_init_array_object != NULL)</div><div class='add'>+ && (-1 == do_method_for_all_elements (at, new_object_element, NULL)))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ return at;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Array_Type *</div><div class='add'>+SLang_create_array (unsigned char type, int read_only, VOID_STAR data,</div><div class='add'>+ int *dims, unsigned int num_dims)</div><div class='add'>+{</div><div class='add'>+ return SLang_create_array1 (type, read_only, data, dims, num_dims, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_add_intrinsic_array (char *name,</div><div class='add'>+ unsigned char type,</div><div class='add'>+ int read_only,</div><div class='add'>+ VOID_STAR data,</div><div class='add'>+ unsigned int num_dims, ...)</div><div class='add'>+{</div><div class='add'>+ va_list ap;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ int dims[SLARRAY_MAX_DIMS];</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ if ((num_dims > SLARRAY_MAX_DIMS)</div><div class='add'>+ || (name == NULL)</div><div class='add'>+ || (data == NULL))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Unable to create intrinsic array");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ va_start (ap, num_dims);</div><div class='add'>+ for (i = 0; i < num_dims; i++)</div><div class='add'>+ dims [i] = va_arg (ap, int);</div><div class='add'>+ va_end (ap);</div><div class='add'>+</div><div class='add'>+ at = SLang_create_array (type, read_only, data, dims, num_dims);</div><div class='add'>+ if (at == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+ at->flags |= SLARR_DATA_VALUE_IS_INTRINSIC;</div><div class='add'>+</div><div class='add'>+ /* Note: The variable that refers to the intrinsic array is regarded as</div><div class='add'>+ * read-only. That way, Array_Name = another_array; will fail.</div><div class='add'>+ */</div><div class='add'>+ if (-1 == SLadd_intrinsic_variable (name, (VOID_STAR) at, SLANG_ARRAY_TYPE, 1))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_array_indices (int *dims, unsigned int num_dims)</div><div class='add'>+{</div><div class='add'>+ unsigned int n;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if (num_dims > SLARRAY_MAX_DIMS)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Array size not supported");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ n = num_dims;</div><div class='add'>+ while (n != 0)</div><div class='add'>+ {</div><div class='add'>+ n--;</div><div class='add'>+ if (-1 == SLang_pop_integer (&i))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ dims[n] = i;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_array (SLang_Array_Type *at, int free_flag)</div><div class='add'>+{</div><div class='add'>+ if (at == NULL)</div><div class='add'>+ return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+ at->num_refs += 1;</div><div class='add'>+</div><div class='add'>+ if (0 == SLclass_push_ptr_obj (SLANG_ARRAY_TYPE, (VOID_STAR) at))</div><div class='add'>+ {</div><div class='add'>+ if (free_flag)</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ at->num_refs -= 1;</div><div class='add'>+</div><div class='add'>+ if (free_flag) SLang_free_array (at);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function gets called via expressions such as Double_Type[10, 20];</div><div class='add'>+ */</div><div class='add'>+static int push_create_new_array (void)</div><div class='add'>+{</div><div class='add'>+ unsigned int num_dims;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ unsigned char type;</div><div class='add'>+ int dims [SLARRAY_MAX_DIMS];</div><div class='add'>+ int (*anew) (unsigned char, unsigned int);</div><div class='add'>+</div><div class='add'>+ num_dims = (SLang_Num_Function_Args - 1);</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_datatype (&type))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ anew = (_SLclass_get_class (type))->cl_anew;</div><div class='add'>+ if (anew != NULL)</div><div class='add'>+ return (*anew) (type, num_dims);</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_array_indices (dims, num_dims))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (NULL == (at = SLang_create_array (type, 0, NULL, dims, num_dims)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_element_at_addr (SLang_Array_Type *at,</div><div class='add'>+ VOID_STAR data, int allow_null)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = at->cl;</div><div class='add'>+ if ((at->flags & SLARR_DATA_VALUE_IS_POINTER)</div><div class='add'>+ && (*(VOID_STAR *) data == NULL))</div><div class='add'>+ {</div><div class='add'>+ if (allow_null)</div><div class='add'>+ return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_VARIABLE_UNINITIALIZED,</div><div class='add'>+ "%s array has unitialized element", cl->cl_name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return (*cl->cl_apush)(at->data_type, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int coerse_array_to_linear (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+ SLarray_Range_Array_Type *range;</div><div class='add'>+ int *data;</div><div class='add'>+ int xmin, dx;</div><div class='add'>+ unsigned int i, imax;</div><div class='add'>+</div><div class='add'>+ /* FIXME: Priority = low. This assumes that if an array is not linear, then</div><div class='add'>+ * it is a range.</div><div class='add'>+ */</div><div class='add'>+ if (0 == (at->flags & SLARR_DATA_VALUE_IS_RANGE))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ range = (SLarray_Range_Array_Type *) at->data;</div><div class='add'>+ xmin = range->first_index;</div><div class='add'>+ dx = range->delta;</div><div class='add'>+</div><div class='add'>+ imax = at->num_elements;</div><div class='add'>+ data = (int *) SLmalloc ((imax + 1) * sizeof (int));</div><div class='add'>+ if (data == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < imax; i++)</div><div class='add'>+ {</div><div class='add'>+ data [i] = xmin;</div><div class='add'>+ xmin += dx;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLfree ((char *) range);</div><div class='add'>+ at->data = (VOID_STAR) data;</div><div class='add'>+ at->flags &= ~SLARR_DATA_VALUE_IS_RANGE;</div><div class='add'>+ at->index_fun = linear_get_data_addr;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+free_index_objects (SLang_Object_Type *index_objs, unsigned int num_indices)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+ SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < num_indices; i++)</div><div class='add'>+ {</div><div class='add'>+ obj = index_objs + i;</div><div class='add'>+ if (obj->data_type != 0)</div><div class='add'>+ SLang_free_object (obj);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+pop_indices (SLang_Object_Type *index_objs, unsigned int num_indices,</div><div class='add'>+ int *is_index_array)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ SLMEMSET((char *) index_objs, 0, num_indices * sizeof (SLang_Object_Type));</div><div class='add'>+</div><div class='add'>+ *is_index_array = 0;</div><div class='add'>+</div><div class='add'>+ if (num_indices >= SLARRAY_MAX_DIMS)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "too many indices for array");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ i = num_indices;</div><div class='add'>+ while (i != 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+ i--;</div><div class='add'>+ obj = index_objs + i;</div><div class='add'>+ if (-1 == _SLang_pop_object_of_type (SLANG_INT_TYPE, obj, 1))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (obj->data_type == SLANG_ARRAY_TYPE)</div><div class='add'>+ {</div><div class='add'>+ SLang_Array_Type *at = obj->v.array_val;</div><div class='add'>+</div><div class='add'>+ if (at->num_dims == 1)</div><div class='add'>+ {</div><div class='add'>+ if ((num_indices == 1)</div><div class='add'>+ && (0 == (at->flags & SLARR_DATA_VALUE_IS_RANGE)))</div><div class='add'>+ *is_index_array = 1;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "expecting a 1-d index array");</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ free_index_objects (index_objs, num_indices);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Here ind_at is a linear 1-d array of indices */</div><div class='add'>+static int</div><div class='add'>+check_index_array_ranges (SLang_Array_Type *at, SLang_Array_Type *ind_at)</div><div class='add'>+{</div><div class='add'>+ int *indices, *indices_max;</div><div class='add'>+ unsigned int num_elements;</div><div class='add'>+</div><div class='add'>+ num_elements = at->num_elements;</div><div class='add'>+ indices = (int *) ind_at->data;</div><div class='add'>+ indices_max = indices + ind_at->num_elements;</div><div class='add'>+</div><div class='add'>+ while (indices < indices_max)</div><div class='add'>+ {</div><div class='add'>+ unsigned int d;</div><div class='add'>+</div><div class='add'>+ d = (unsigned int) *indices++;</div><div class='add'>+ if (d >= num_elements)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM,</div><div class='add'>+ "index-array is out of range");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+transfer_n_elements (SLang_Array_Type *at, VOID_STAR dest_data, VOID_STAR src_data,</div><div class='add'>+ unsigned int sizeof_type, unsigned int n, int is_ptr)</div><div class='add'>+{</div><div class='add'>+ unsigned char data_type;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (is_ptr == 0)</div><div class='add'>+ {</div><div class='add'>+ SLMEMCPY ((char *) dest_data, (char *)src_data, n * sizeof_type);</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ data_type = at->data_type;</div><div class='add'>+ cl = at->cl;</div><div class='add'>+</div><div class='add'>+ while (n != 0)</div><div class='add'>+ {</div><div class='add'>+ if (*(VOID_STAR *)dest_data != NULL)</div><div class='add'>+ {</div><div class='add'>+ (*cl->cl_destroy) (data_type, dest_data);</div><div class='add'>+ *(VOID_STAR *) dest_data = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (*(VOID_STAR *) src_data == NULL)</div><div class='add'>+ *(VOID_STAR *) dest_data = NULL;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cl->cl_acopy) (data_type, src_data, dest_data))</div><div class='add'>+ /* No need to destroy anything */</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ src_data = (VOID_STAR) ((char *)src_data + sizeof_type);</div><div class='add'>+ dest_data = (VOID_STAR) ((char *)dest_data + sizeof_type);</div><div class='add'>+</div><div class='add'>+ n--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_SLarray_aget_transfer_elem (SLang_Array_Type *at, int *indices,</div><div class='add'>+ VOID_STAR new_data, unsigned int sizeof_type, int is_ptr)</div><div class='add'>+{</div><div class='add'>+ VOID_STAR at_data;</div><div class='add'>+</div><div class='add'>+ /* Since 1 element is being transferred, there is not need to coerse</div><div class='add'>+ * the array to linear.</div><div class='add'>+ */</div><div class='add'>+ if (NULL == (at_data = get_data_addr (at, indices)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return transfer_n_elements (at, new_data, at_data, sizeof_type, 1, is_ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Here the ind_at index-array is a 1-d array of indices. This function</div><div class='add'>+ * creates a 1-d array of made up of values of 'at' at the locations</div><div class='add'>+ * specified by the indices. The result is pushed.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+aget_from_index_array (SLang_Array_Type *at,</div><div class='add'>+ SLang_Array_Type *ind_at)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *new_at;</div><div class='add'>+ int *indices, *indices_max;</div><div class='add'>+ unsigned char *new_data, *src_data;</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+ int is_ptr;</div><div class='add'>+ </div><div class='add'>+ if (-1 == coerse_array_to_linear (at))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == coerse_array_to_linear (ind_at))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == check_index_array_ranges (at, ind_at))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (NULL == (new_at = SLang_create_array (at->data_type, 0, NULL, ind_at->dims, 1)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* Since the index array is linear, I can address it directly */</div><div class='add'>+ indices = (int *) ind_at->data;</div><div class='add'>+ indices_max = indices + ind_at->num_elements;</div><div class='add'>+</div><div class='add'>+ src_data = (unsigned char *) at->data;</div><div class='add'>+ new_data = (unsigned char *) new_at->data;</div><div class='add'>+ sizeof_type = new_at->sizeof_type;</div><div class='add'>+ is_ptr = (new_at->flags & SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+</div><div class='add'>+ while (indices < indices_max)</div><div class='add'>+ {</div><div class='add'>+ unsigned int offset;</div><div class='add'>+</div><div class='add'>+ offset = sizeof_type * (unsigned int)*indices;</div><div class='add'>+ if (-1 == transfer_n_elements (at, (VOID_STAR) new_data,</div><div class='add'>+ (VOID_STAR) (src_data + offset),</div><div class='add'>+ sizeof_type, 1, is_ptr))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (new_at);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ new_data += sizeof_type;</div><div class='add'>+ indices++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return SLang_push_array (new_at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is extremely ugly. It is due to the fact that the index_objects</div><div class='add'>+ * may contain ranges. This is a utility function for the aget/aput</div><div class='add'>+ * routines</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+convert_nasty_index_objs (SLang_Array_Type *at,</div><div class='add'>+ SLang_Object_Type *index_objs,</div><div class='add'>+ unsigned int num_indices,</div><div class='add'>+ int **index_data,</div><div class='add'>+ int *range_buf, int *range_delta_buf,</div><div class='add'>+ int *max_dims,</div><div class='add'>+ unsigned int *num_elements,</div><div class='add'>+ int *is_array, int is_dim_array[SLARRAY_MAX_DIMS])</div><div class='add'>+{</div><div class='add'>+ unsigned int i, total_num_elements;</div><div class='add'>+ SLang_Array_Type *ind_at;</div><div class='add'>+</div><div class='add'>+ if (num_indices != at->num_dims)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Array requires %u indices", at->num_dims);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *is_array = 0;</div><div class='add'>+ total_num_elements = 1;</div><div class='add'>+ for (i = 0; i < num_indices; i++)</div><div class='add'>+ {</div><div class='add'>+ int max_index, min_index;</div><div class='add'>+ SLang_Object_Type *obj;</div><div class='add'>+ int at_dims_i;</div><div class='add'>+</div><div class='add'>+ at_dims_i = at->dims[i];</div><div class='add'>+ obj = index_objs + i;</div><div class='add'>+ range_delta_buf [i] = 0;</div><div class='add'>+</div><div class='add'>+ if (obj->data_type == SLANG_INT_TYPE)</div><div class='add'>+ {</div><div class='add'>+ range_buf [i] = min_index = max_index = obj->v.int_val;</div><div class='add'>+ max_dims [i] = 1;</div><div class='add'>+ index_data[i] = range_buf + i;</div><div class='add'>+ is_dim_array[i] = 0;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ *is_array = 1;</div><div class='add'>+ is_dim_array[i] = 1;</div><div class='add'>+ ind_at = obj->v.array_val;</div><div class='add'>+</div><div class='add'>+ if (ind_at->flags & SLARR_DATA_VALUE_IS_RANGE)</div><div class='add'>+ {</div><div class='add'>+ SLarray_Range_Array_Type *r;</div><div class='add'>+ int delta;</div><div class='add'>+ int first_index, last_index;</div><div class='add'>+</div><div class='add'>+ r = (SLarray_Range_Array_Type *) ind_at->data;</div><div class='add'>+</div><div class='add'>+ /* In an array indexing context, range arrays have different</div><div class='add'>+ * semantics. Consider a[[0:10]]. Clearly this means elements</div><div class='add'>+ * 0-10 of a. But what does a[[0:-1]] mean? By itself,</div><div class='add'>+ * [0:-1] is a null matrix []. But, it is useful in an</div><div class='add'>+ * indexing context to allow -1 to refer to the last element</div><div class='add'>+ * of the array. Similarly, [-3:-1] refers to the last 3</div><div class='add'>+ * elements.</div><div class='add'>+ * </div><div class='add'>+ * However, [-1:-3] does not refer to any of the elements.</div><div class='add'>+ */</div><div class='add'>+ if ((first_index = r->first_index) < 0)</div><div class='add'>+ {</div><div class='add'>+ if (at_dims_i != 0)</div><div class='add'>+ first_index = (at_dims_i + first_index) % at_dims_i;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((last_index = r->last_index) < 0)</div><div class='add'>+ {</div><div class='add'>+ if (at_dims_i != 0)</div><div class='add'>+ last_index = (at_dims_i + last_index) % at_dims_i;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ delta = r->delta;</div><div class='add'>+</div><div class='add'>+ range_delta_buf [i] = delta;</div><div class='add'>+ range_buf[i] = first_index;</div><div class='add'>+</div><div class='add'>+ if (delta > 0)</div><div class='add'>+ {</div><div class='add'>+ if (first_index > last_index)</div><div class='add'>+ max_dims[i] = min_index = max_index = 0;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ max_index = min_index = first_index;</div><div class='add'>+ while (max_index + delta <= last_index)</div><div class='add'>+ max_index += delta;</div><div class='add'>+ max_dims [i] = 1 + (max_index - min_index) / delta;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if (first_index < last_index)</div><div class='add'>+ max_dims[i] = min_index = max_index = 0;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ min_index = max_index = first_index;</div><div class='add'>+ while (min_index + delta >= last_index)</div><div class='add'>+ min_index += delta;</div><div class='add'>+ max_dims [i] = 1 + (max_index - min_index) / (-delta);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ int *tmp, *tmp_max;</div><div class='add'>+</div><div class='add'>+ if (0 == (max_dims[i] = ind_at->num_elements))</div><div class='add'>+ {</div><div class='add'>+ total_num_elements = 0;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ tmp = (int *) ind_at->data;</div><div class='add'>+ tmp_max = tmp + ind_at->num_elements;</div><div class='add'>+ index_data [i] = tmp;</div><div class='add'>+</div><div class='add'>+ min_index = max_index = *tmp;</div><div class='add'>+ while (tmp < tmp_max)</div><div class='add'>+ {</div><div class='add'>+ if (max_index > *tmp)</div><div class='add'>+ max_index = *tmp;</div><div class='add'>+ if (min_index < *tmp)</div><div class='add'>+ min_index = *tmp;</div><div class='add'>+</div><div class='add'>+ tmp++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((at_dims_i == 0) && (max_dims[i] == 0))</div><div class='add'>+ {</div><div class='add'>+ total_num_elements = 0;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (max_index < 0)</div><div class='add'>+ max_index += at_dims_i;</div><div class='add'>+ if (min_index < 0)</div><div class='add'>+ min_index += at_dims_i;</div><div class='add'>+</div><div class='add'>+ if ((min_index < 0) || (min_index >= at_dims_i)</div><div class='add'>+ || (max_index < 0) || (max_index >= at_dims_i))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Array index %u ([%d:%d]) out of allowed range [0->%d]",</div><div class='add'>+ i, min_index, max_index, at_dims_i);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ total_num_elements = total_num_elements * max_dims[i];</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *num_elements = total_num_elements;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This routine pushes a 1-d vector of values from 'at' indexed by</div><div class='add'>+ * the objects 'index_objs'. These objects can either be integers or</div><div class='add'>+ * 1-d integer arrays. The fact that the 1-d arrays can be ranges</div><div class='add'>+ * makes this look ugly.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+aget_from_indices (SLang_Array_Type *at,</div><div class='add'>+ SLang_Object_Type *index_objs, unsigned int num_indices)</div><div class='add'>+{</div><div class='add'>+ int *index_data [SLARRAY_MAX_DIMS];</div><div class='add'>+ int range_buf [SLARRAY_MAX_DIMS];</div><div class='add'>+ int range_delta_buf [SLARRAY_MAX_DIMS];</div><div class='add'>+ int max_dims [SLARRAY_MAX_DIMS];</div><div class='add'>+ unsigned int i, num_elements;</div><div class='add'>+ SLang_Array_Type *new_at;</div><div class='add'>+ int map_indices[SLARRAY_MAX_DIMS];</div><div class='add'>+ int indices [SLARRAY_MAX_DIMS];</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+ int is_ptr, ret, is_array;</div><div class='add'>+ char *new_data;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ int is_dim_array[SLARRAY_MAX_DIMS];</div><div class='add'>+</div><div class='add'>+ if (-1 == convert_nasty_index_objs (at, index_objs, num_indices,</div><div class='add'>+ index_data, range_buf, range_delta_buf,</div><div class='add'>+ max_dims, &num_elements, &is_array,</div><div class='add'>+ is_dim_array))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+ sizeof_type = at->sizeof_type;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (at->data_type);</div><div class='add'>+</div><div class='add'>+ if ((is_array == 0) && (num_elements == 1))</div><div class='add'>+ {</div><div class='add'>+ new_data = (char *)cl->cl_transfer_buf;</div><div class='add'>+ memset (new_data, 0, sizeof_type);</div><div class='add'>+ new_at = NULL;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ int i_num_elements = (int)num_elements;</div><div class='add'>+</div><div class='add'>+ new_at = SLang_create_array (at->data_type, 0, NULL, &i_num_elements, 1);</div><div class='add'>+ if (NULL == new_at)</div><div class='add'>+ return -1;</div><div class='add'>+ if (num_elements == 0)</div><div class='add'>+ return SLang_push_array (new_at, 1);</div><div class='add'>+</div><div class='add'>+ new_data = (char *)new_at->data;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLMEMSET((char *) map_indices, 0, sizeof(map_indices));</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ for (i = 0; i < num_indices; i++)</div><div class='add'>+ {</div><div class='add'>+ int j;</div><div class='add'>+</div><div class='add'>+ j = map_indices[i];</div><div class='add'>+</div><div class='add'>+ if (0 != range_delta_buf[i])</div><div class='add'>+ indices[i] = range_buf[i] + j * range_delta_buf[i];</div><div class='add'>+ else</div><div class='add'>+ indices[i] = index_data [i][j];</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLarray_aget_transfer_elem (at, indices, (VOID_STAR)new_data, sizeof_type, is_ptr))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (new_at);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ new_data += sizeof_type;</div><div class='add'>+ }</div><div class='add'>+ while (0 == next_index (map_indices, max_dims, num_indices));</div><div class='add'>+</div><div class='add'>+ if (new_at != NULL)</div><div class='add'>+ {</div><div class='add'>+ int num_dims = 0;</div><div class='add'>+ /* Fixup dimensions on array */</div><div class='add'>+ for (i = 0; i < num_indices; i++)</div><div class='add'>+ {</div><div class='add'>+ if (is_dim_array[i]) /* was: (max_dims[i] > 1) */</div><div class='add'>+ {</div><div class='add'>+ new_at->dims[num_dims] = max_dims[i];</div><div class='add'>+ num_dims++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (num_dims != 0) new_at->num_dims = num_dims;</div><div class='add'>+ return SLang_push_array (new_at, 1);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Here new_data is a whole new copy, so free it after the push */</div><div class='add'>+ new_data -= sizeof_type;</div><div class='add'>+ if (is_ptr && (*(VOID_STAR *)new_data == NULL))</div><div class='add'>+ ret = SLang_push_null ();</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ ret = (*cl->cl_apush) (at->data_type, (VOID_STAR)new_data);</div><div class='add'>+ (*cl->cl_adestroy) (at->data_type, (VOID_STAR)new_data);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_string_as_array (unsigned char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ int ilen;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ ilen = (int) len;</div><div class='add'>+</div><div class='add'>+ at = SLang_create_array (SLANG_UCHAR_TYPE, 0, NULL, &ilen, 1);</div><div class='add'>+ if (at == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ memcpy ((char *)at->data, (char *)s, len);</div><div class='add'>+ return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_array_as_string (char **sp)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ *sp = NULL;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_array_of_type (&at, SLANG_UCHAR_TYPE))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ ret = 0;</div><div class='add'>+</div><div class='add'>+ if (NULL == (*sp = SLang_create_nslstring ((char *) at->data, at->num_elements)))</div><div class='add'>+ ret = -1;</div><div class='add'>+</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_array_as_bstring (SLang_BString_Type **bs)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ *bs = NULL;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_array_of_type (&at, SLANG_UCHAR_TYPE))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ ret = 0;</div><div class='add'>+</div><div class='add'>+ if (NULL == (*bs = SLbstring_create ((unsigned char *) at->data, at->num_elements)))</div><div class='add'>+ ret = -1;</div><div class='add'>+</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int aget_from_array (unsigned int num_indices)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ SLang_Object_Type index_objs [SLARRAY_MAX_DIMS];</div><div class='add'>+ int ret;</div><div class='add'>+ int is_index_array;</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ if (num_indices > SLARRAY_MAX_DIMS)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Number of dims must be less than %d", SLARRAY_MAX_DIMS);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_array (&at, 1))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_indices (index_objs, num_indices, &is_index_array))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (is_index_array == 0)</div><div class='add'>+ ret = aget_from_indices (at, index_objs, num_indices);</div><div class='add'>+ else</div><div class='add'>+ ret = aget_from_index_array (at, index_objs[0].v.array_val);</div><div class='add'>+</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ for (i = 0; i < num_indices; i++)</div><div class='add'>+ SLang_free_object (index_objs + i);</div><div class='add'>+</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_string_element (unsigned char type, unsigned char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if (SLang_peek_at_stack () == SLANG_ARRAY_TYPE)</div><div class='add'>+ {</div><div class='add'>+ char *str;</div><div class='add'>+</div><div class='add'>+ /* The indices are array values. So, do this: */</div><div class='add'>+ if (-1 == push_string_as_array (s, len))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == aget_from_array (1))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (type == SLANG_BSTRING_TYPE)</div><div class='add'>+ {</div><div class='add'>+ SLang_BString_Type *bs;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_array_as_bstring (&bs))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ ret = SLang_push_bstring (bs);</div><div class='add'>+ SLbstring_free (bs);</div><div class='add'>+ return ret;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_array_as_string (&str))</div><div class='add'>+ return -1;</div><div class='add'>+ return _SLang_push_slstring (str); /* frees s upon error */</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_integer (&i))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (i < 0) i = i + (int)len;</div><div class='add'>+ if ((unsigned int) i > len)</div><div class='add'>+ i = len; /* get \0 character --- bstrings include it as well */</div><div class='add'>+</div><div class='add'>+ i = s[(unsigned int) i];</div><div class='add'>+</div><div class='add'>+ return SLang_push_integer (i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* ARRAY[i, j, k] generates code: __args i j ...k ARRAY __aput/__aget</div><div class='add'>+ * Here i, j, ... k may be a mixture of integers and 1-d arrays, or</div><div class='add'>+ * a single 2-d array of indices. The 2-d index array is generated by the</div><div class='add'>+ * 'where' function.</div><div class='add'>+ *</div><div class='add'>+ * If ARRAY is of type DataType, then this function will create an array of</div><div class='add'>+ * the appropriate type. In that case, the indices i, j, ..., k must be</div><div class='add'>+ * integers.</div><div class='add'>+ */</div><div class='add'>+int _SLarray_aget (void)</div><div class='add'>+{</div><div class='add'>+ unsigned int num_indices;</div><div class='add'>+ int type;</div><div class='add'>+ int (*aget_fun) (unsigned char, unsigned int);</div><div class='add'>+</div><div class='add'>+ num_indices = (SLang_Num_Function_Args - 1);</div><div class='add'>+</div><div class='add'>+ type = SLang_peek_at_stack ();</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case -1:</div><div class='add'>+ return -1; /* stack underflow */</div><div class='add'>+</div><div class='add'>+ case SLANG_DATATYPE_TYPE:</div><div class='add'>+ return push_create_new_array ();</div><div class='add'>+</div><div class='add'>+ case SLANG_BSTRING_TYPE:</div><div class='add'>+ if (1 == num_indices)</div><div class='add'>+ {</div><div class='add'>+ SLang_BString_Type *bs;</div><div class='add'>+ int ret;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ unsigned char *s;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_bstring (&bs))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (NULL == (s = SLbstring_get_pointer (bs, &len)))</div><div class='add'>+ ret = -1;</div><div class='add'>+ else</div><div class='add'>+ ret = push_string_element (type, s, len);</div><div class='add'>+</div><div class='add'>+ SLbstring_free (bs);</div><div class='add'>+ return ret;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_STRING_TYPE:</div><div class='add'>+ if (1 == num_indices)</div><div class='add'>+ {</div><div class='add'>+ char *s;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_slstring (&s))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ ret = push_string_element (type, (unsigned char *)s, strlen (s));</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+ return ret;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_ARRAY_TYPE:</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ aget_fun = _SLclass_get_class (type)->cl_aget;</div><div class='add'>+ if (NULL != aget_fun)</div><div class='add'>+ return (*aget_fun) (type, num_indices);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return aget_from_array (num_indices);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_SLarray_aput_transfer_elem (SLang_Array_Type *at, int *indices,</div><div class='add'>+ VOID_STAR data_to_put, unsigned int sizeof_type, int is_ptr)</div><div class='add'>+{</div><div class='add'>+ VOID_STAR at_data;</div><div class='add'>+</div><div class='add'>+ /* Since 1 element is being transferred, there is no need to coerse</div><div class='add'>+ * the array to linear.</div><div class='add'>+ */</div><div class='add'>+ if (NULL == (at_data = get_data_addr (at, indices)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return transfer_n_elements (at, at_data, data_to_put, sizeof_type, 1, is_ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+aput_get_array_to_put (SLang_Class_Type *cl, unsigned int num_elements, int allow_array,</div><div class='add'>+ SLang_Array_Type **at_ptr, char **data_to_put, unsigned int *data_increment)</div><div class='add'>+{</div><div class='add'>+ unsigned char data_type;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ *at_ptr = NULL;</div><div class='add'>+</div><div class='add'>+ data_type = cl->cl_data_type;</div><div class='add'>+ if (-1 == SLclass_typecast (data_type, 1, allow_array))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((data_type != SLANG_ARRAY_TYPE)</div><div class='add'>+ && (data_type != SLANG_ANY_TYPE)</div><div class='add'>+ && (SLANG_ARRAY_TYPE == SLang_peek_at_stack ()))</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLang_pop_array (&at, 0))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((at->num_elements != num_elements)</div><div class='add'>+#if 0</div><div class='add'>+ || (at->num_dims != 1)</div><div class='add'>+#endif</div><div class='add'>+ )</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "Array size is inappropriate for use with index-array");</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *data_to_put = (char *) at->data;</div><div class='add'>+ *data_increment = at->sizeof_type;</div><div class='add'>+ *at_ptr = at;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *data_increment = 0;</div><div class='add'>+ *data_to_put = (char *) cl->cl_transfer_buf;</div><div class='add'>+</div><div class='add'>+ if (-1 == (*cl->cl_apop)(data_type, (VOID_STAR) *data_to_put))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+aput_from_indices (SLang_Array_Type *at,</div><div class='add'>+ SLang_Object_Type *index_objs, unsigned int num_indices)</div><div class='add'>+{</div><div class='add'>+ int *index_data [SLARRAY_MAX_DIMS];</div><div class='add'>+ int range_buf [SLARRAY_MAX_DIMS];</div><div class='add'>+ int range_delta_buf [SLARRAY_MAX_DIMS];</div><div class='add'>+ int max_dims [SLARRAY_MAX_DIMS];</div><div class='add'>+ unsigned int i, num_elements;</div><div class='add'>+ SLang_Array_Type *bt;</div><div class='add'>+ int map_indices[SLARRAY_MAX_DIMS];</div><div class='add'>+ int indices [SLARRAY_MAX_DIMS];</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+ int is_ptr, is_array, ret;</div><div class='add'>+ char *data_to_put;</div><div class='add'>+ unsigned int data_increment;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ int is_dim_array [SLARRAY_MAX_DIMS];</div><div class='add'>+</div><div class='add'>+ if (-1 == convert_nasty_index_objs (at, index_objs, num_indices,</div><div class='add'>+ index_data, range_buf, range_delta_buf,</div><div class='add'>+ max_dims, &num_elements, &is_array,</div><div class='add'>+ is_dim_array))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ cl = at->cl;</div><div class='add'>+</div><div class='add'>+ if (-1 == aput_get_array_to_put (cl, num_elements, is_array,</div><div class='add'>+ &bt, &data_to_put, &data_increment))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ sizeof_type = at->sizeof_type;</div><div class='add'>+ is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+</div><div class='add'>+ ret = -1;</div><div class='add'>+</div><div class='add'>+ SLMEMSET((char *) map_indices, 0, sizeof(map_indices));</div><div class='add'>+ if (num_elements) do</div><div class='add'>+ {</div><div class='add'>+ for (i = 0; i < num_indices; i++)</div><div class='add'>+ {</div><div class='add'>+ int j;</div><div class='add'>+</div><div class='add'>+ j = map_indices[i];</div><div class='add'>+</div><div class='add'>+ if (0 != range_delta_buf[i])</div><div class='add'>+ indices[i] = range_buf[i] + j * range_delta_buf[i];</div><div class='add'>+ else</div><div class='add'>+ indices[i] = index_data [i][j];</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLarray_aput_transfer_elem (at, indices, (VOID_STAR)data_to_put, sizeof_type, is_ptr))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ data_to_put += data_increment;</div><div class='add'>+ }</div><div class='add'>+ while (0 == next_index (map_indices, max_dims, num_indices));</div><div class='add'>+</div><div class='add'>+ ret = 0;</div><div class='add'>+</div><div class='add'>+ /* drop */</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ if (bt == NULL)</div><div class='add'>+ {</div><div class='add'>+ if (is_ptr)</div><div class='add'>+ (*cl->cl_destroy) (cl->cl_data_type, (VOID_STAR) data_to_put);</div><div class='add'>+ }</div><div class='add'>+ else SLang_free_array (bt);</div><div class='add'>+</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+aput_from_index_array (SLang_Array_Type *at, SLang_Array_Type *ind_at)</div><div class='add'>+{</div><div class='add'>+ int *indices, *indices_max;</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+ char *data_to_put, *dest_data;</div><div class='add'>+ unsigned int data_increment;</div><div class='add'>+ int is_ptr;</div><div class='add'>+ SLang_Array_Type *bt;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (-1 == coerse_array_to_linear (at))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == coerse_array_to_linear (ind_at))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == check_index_array_ranges (at, ind_at))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ sizeof_type = at->sizeof_type;</div><div class='add'>+</div><div class='add'>+ cl = at->cl;</div><div class='add'>+</div><div class='add'>+ /* Note that if bt is returned as non NULL, then the array is a linear</div><div class='add'>+ * one.</div><div class='add'>+ */</div><div class='add'>+ if (-1 == aput_get_array_to_put (cl, ind_at->num_elements, 1,</div><div class='add'>+ &bt, &data_to_put, &data_increment))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* Since the index array is linear, I can address it directly */</div><div class='add'>+ indices = (int *) ind_at->data;</div><div class='add'>+ indices_max = indices + ind_at->num_elements;</div><div class='add'>+</div><div class='add'>+ is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+ dest_data = (char *) at->data;</div><div class='add'>+</div><div class='add'>+ ret = -1;</div><div class='add'>+ while (indices < indices_max)</div><div class='add'>+ {</div><div class='add'>+ unsigned int offset;</div><div class='add'>+</div><div class='add'>+ offset = sizeof_type * (unsigned int)*indices;</div><div class='add'>+</div><div class='add'>+ if (-1 == transfer_n_elements (at, (VOID_STAR) (dest_data + offset),</div><div class='add'>+ (VOID_STAR) data_to_put, sizeof_type, 1,</div><div class='add'>+ is_ptr))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ indices++;</div><div class='add'>+ data_to_put += data_increment;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ret = 0;</div><div class='add'>+ /* Drop */</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+</div><div class='add'>+ if (bt == NULL)</div><div class='add'>+ {</div><div class='add'>+ if (is_ptr)</div><div class='add'>+ (*cl->cl_destroy) (cl->cl_data_type, (VOID_STAR)data_to_put);</div><div class='add'>+ }</div><div class='add'>+ else SLang_free_array (bt);</div><div class='add'>+</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* ARRAY[i, j, k] = generates code: __args i j k ARRAY __aput</div><div class='add'>+ */</div><div class='add'>+int _SLarray_aput (void)</div><div class='add'>+{</div><div class='add'>+ unsigned int num_indices;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ SLang_Object_Type index_objs [SLARRAY_MAX_DIMS];</div><div class='add'>+ int ret;</div><div class='add'>+ int is_index_array;</div><div class='add'>+ int (*aput_fun) (unsigned char, unsigned int);</div><div class='add'>+ int type;</div><div class='add'>+</div><div class='add'>+ ret = -1;</div><div class='add'>+ num_indices = (SLang_Num_Function_Args - 1);</div><div class='add'>+</div><div class='add'>+ type = SLang_peek_at_stack ();</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case -1:</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ case SLANG_ARRAY_TYPE:</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ if (NULL != (aput_fun = _SLclass_get_class (type)->cl_aput))</div><div class='add'>+ return (*aput_fun) (type, num_indices);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_array (&at, 0))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (at->flags & SLARR_DATA_VALUE_IS_READ_ONLY)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_READONLY_ERROR, "%s Array is read-only",</div><div class='add'>+ SLclass_get_datatype_name (at->data_type));</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_indices (index_objs, num_indices, &is_index_array))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (is_index_array == 0)</div><div class='add'>+ ret = aput_from_indices (at, index_objs, num_indices);</div><div class='add'>+ else</div><div class='add'>+ ret = aput_from_index_array (at, index_objs[0].v.array_val);</div><div class='add'>+</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ free_index_objects (index_objs, num_indices);</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is for 1-d matrices only. It is used by the sort function */</div><div class='add'>+static int push_element_at_index (SLang_Array_Type *at, int indx)</div><div class='add'>+{</div><div class='add'>+ VOID_STAR data;</div><div class='add'>+</div><div class='add'>+ if (NULL == (data = get_data_addr (at, &indx)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return push_element_at_addr (at, (VOID_STAR) data, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type *Sort_Function;</div><div class='add'>+static SLang_Array_Type *Sort_Array;</div><div class='add'>+</div><div class='add'>+static int sort_cmp_fun (int *a, int *b)</div><div class='add'>+{</div><div class='add'>+ int cmp;</div><div class='add'>+</div><div class='add'>+ if (SLang_Error</div><div class='add'>+ || (-1 == push_element_at_index (Sort_Array, *a))</div><div class='add'>+ || (-1 == push_element_at_index (Sort_Array, *b))</div><div class='add'>+ || (-1 == SLexecute_function (Sort_Function))</div><div class='add'>+ || (-1 == SLang_pop_integer (&cmp)))</div><div class='add'>+ {</div><div class='add'>+ /* DO not allow qsort to loop forever. Return something meaningful */</div><div class='add'>+ if (*a > *b) return 1;</div><div class='add'>+ if (*a < *b) return -1;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return cmp;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int builtin_sort_cmp_fun (int *a, int *b)</div><div class='add'>+{</div><div class='add'>+ VOID_STAR a_data;</div><div class='add'>+ VOID_STAR b_data;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ </div><div class='add'>+ cl = Sort_Array->cl;</div><div class='add'>+</div><div class='add'>+ if ((SLang_Error == 0)</div><div class='add'>+ && (NULL != (a_data = get_data_addr (Sort_Array, a)))</div><div class='add'>+ && (NULL != (b_data = get_data_addr (Sort_Array, b))))</div><div class='add'>+ {</div><div class='add'>+ int cmp;</div><div class='add'>+</div><div class='add'>+ if ((Sort_Array->flags & SLARR_DATA_VALUE_IS_POINTER)</div><div class='add'>+ && ((*(VOID_STAR *) a_data == NULL) || (*(VOID_STAR *) a_data == NULL)))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_VARIABLE_UNINITIALIZED,</div><div class='add'>+ "%s array has unitialized element", cl->cl_name);</div><div class='add'>+ }</div><div class='add'>+ else if (0 == (*cl->cl_cmp)(Sort_Array->data_type, a_data, b_data, &cmp))</div><div class='add'>+ return cmp;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ </div><div class='add'>+ if (*a > *b) return 1;</div><div class='add'>+ if (*a == *b) return 0;</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sort_array_internal (SLang_Array_Type *at_str, </div><div class='add'>+ SLang_Name_Type *entry,</div><div class='add'>+ int (*sort_fun)(int *, int *))</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *ind_at;</div><div class='add'>+ /* This is a silly hack to make up for braindead compilers and the lack of</div><div class='add'>+ * uniformity in prototypes for qsort.</div><div class='add'>+ */</div><div class='add'>+ void (*qsort_fun) (char *, unsigned int, int, int (*)(int *, int *));</div><div class='add'>+ int *indx;</div><div class='add'>+ int i, n;</div><div class='add'>+ int dims[1];</div><div class='add'>+</div><div class='add'>+ if (Sort_Array != NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "array_sort is not recursive");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ n = at_str->num_elements;</div><div class='add'>+</div><div class='add'>+ if (at_str->num_dims != 1)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "sort is restricted to 1 dim arrays");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ dims [0] = n;</div><div class='add'>+</div><div class='add'>+ if (NULL == (ind_at = SLang_create_array (SLANG_INT_TYPE, 0, NULL, dims, 1)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ indx = (int *) ind_at->data;</div><div class='add'>+ for (i = 0; i < n; i++) indx[i] = i;</div><div class='add'>+</div><div class='add'>+ if (n > 1)</div><div class='add'>+ {</div><div class='add'>+ qsort_fun = (void (*)(char *, unsigned int, int, int (*)(int *,</div><div class='add'>+ int *)))</div><div class='add'>+ qsort;</div><div class='add'>+</div><div class='add'>+ Sort_Array = at_str;</div><div class='add'>+ Sort_Function = entry;</div><div class='add'>+ (*qsort_fun) ((char *) indx, n, sizeof (int), sort_fun);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Sort_Array = NULL;</div><div class='add'>+ (void) SLang_push_array (ind_at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sort_array (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Name_Type *entry;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int (*sort_fun) (int *, int *);</div><div class='add'>+</div><div class='add'>+ if (SLang_Num_Function_Args != 1)</div><div class='add'>+ {</div><div class='add'>+ sort_fun = sort_cmp_fun;</div><div class='add'>+</div><div class='add'>+ if (NULL == (entry = SLang_pop_function ()))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_array (&at, 1))</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ sort_fun = builtin_sort_cmp_fun;</div><div class='add'>+ if (-1 == SLang_pop_array (&at, 1))</div><div class='add'>+ return;</div><div class='add'>+ if (at->cl->cl_cmp == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, </div><div class='add'>+ "%s does not have a predefined sorting method",</div><div class='add'>+ at->cl->cl_name);</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ entry = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ sort_array_internal (at, entry, sort_fun);</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ SLang_free_function (entry);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void bstring_to_array (SLang_BString_Type *bs)</div><div class='add'>+{</div><div class='add'>+ unsigned char *s;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ </div><div class='add'>+ if (NULL == (s = SLbstring_get_pointer (bs, &len)))</div><div class='add'>+ (void) SLang_push_null ();</div><div class='add'>+ else</div><div class='add'>+ (void) push_string_as_array (s, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_to_bstring (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+ unsigned int nbytes;</div><div class='add'>+ SLang_BString_Type *bs;</div><div class='add'>+</div><div class='add'>+ nbytes = at->num_elements * at->sizeof_type;</div><div class='add'>+ bs = SLbstring_create ((unsigned char *)at->data, nbytes);</div><div class='add'>+ (void) SLang_push_bstring (bs);</div><div class='add'>+ SLbstring_free (bs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void init_char_array (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ char *s;</div><div class='add'>+ unsigned int n, ndim;</div><div class='add'>+</div><div class='add'>+ if (SLang_pop_slstring (&s)) return;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_array (&at, 0))</div><div class='add'>+ goto free_and_return;</div><div class='add'>+</div><div class='add'>+ if (at->data_type != SLANG_CHAR_TYPE)</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror("Operation requires character array");</div><div class='add'>+ goto free_and_return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ n = strlen (s);</div><div class='add'>+ ndim = at->num_elements;</div><div class='add'>+ if (n > ndim)</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror("String too big to init array");</div><div class='add'>+ goto free_and_return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ strncpy((char *) at->data, s, ndim);</div><div class='add'>+ /* drop */</div><div class='add'>+</div><div class='add'>+ free_and_return:</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_info (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at, *bt;</div><div class='add'>+ int num_dims;</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_array (&at, 1))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ num_dims = (int)at->num_dims;</div><div class='add'>+</div><div class='add'>+ if (NULL != (bt = SLang_create_array (SLANG_INT_TYPE, 0, NULL, &num_dims, 1)))</div><div class='add'>+ {</div><div class='add'>+ int *bdata;</div><div class='add'>+ int i;</div><div class='add'>+ int *a_dims;</div><div class='add'>+</div><div class='add'>+ a_dims = at->dims;</div><div class='add'>+ bdata = (int *) bt->data;</div><div class='add'>+ for (i = 0; i < num_dims; i++) bdata [i] = a_dims [i];</div><div class='add'>+</div><div class='add'>+ if (0 == SLang_push_array (bt, 1))</div><div class='add'>+ {</div><div class='add'>+ (void) SLang_push_integer ((int) at->num_dims);</div><div class='add'>+ (void) _SLang_push_datatype (at->data_type);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static VOID_STAR range_get_data_addr (SLang_Array_Type *at, int *dims)</div><div class='add'>+{</div><div class='add'>+ static int value;</div><div class='add'>+ SLarray_Range_Array_Type *r;</div><div class='add'>+ int d;</div><div class='add'>+</div><div class='add'>+ d = *dims;</div><div class='add'>+ r = (SLarray_Range_Array_Type *)at->data;</div><div class='add'>+</div><div class='add'>+ if (d < 0)</div><div class='add'>+ d += at->dims[0];</div><div class='add'>+</div><div class='add'>+ value = r->first_index + d * r->delta;</div><div class='add'>+ return (VOID_STAR) &value;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Array_Type *inline_implicit_int_array (int *xminptr, int *xmaxptr, int *dxptr)</div><div class='add'>+{</div><div class='add'>+ int delta;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int dims, idims;</div><div class='add'>+ SLarray_Range_Array_Type *data;</div><div class='add'>+</div><div class='add'>+ if (dxptr == NULL) delta = 1;</div><div class='add'>+ else delta = *dxptr;</div><div class='add'>+</div><div class='add'>+ if (delta == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "range-array increment must be non-zero");</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ data = (SLarray_Range_Array_Type *) SLmalloc (sizeof (SLarray_Range_Array_Type));</div><div class='add'>+ if (data == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ SLMEMSET((char *) data, 0, sizeof (SLarray_Range_Array_Type));</div><div class='add'>+ data->delta = delta;</div><div class='add'>+ dims = 0;</div><div class='add'>+</div><div class='add'>+ if (xminptr != NULL)</div><div class='add'>+ data->first_index = *xminptr;</div><div class='add'>+ else</div><div class='add'>+ data->first_index = 0;</div><div class='add'>+</div><div class='add'>+ if (xmaxptr != NULL)</div><div class='add'>+ data->last_index = *xmaxptr;</div><div class='add'>+ else</div><div class='add'>+ data->last_index = -1;</div><div class='add'>+</div><div class='add'>+/* if ((xminptr != NULL) && (xmaxptr != NULL))</div><div class='add'>+ { */</div><div class='add'>+ idims = 1 + (data->last_index - data->first_index) / delta;</div><div class='add'>+ if (idims > 0)</div><div class='add'>+ dims = idims;</div><div class='add'>+ /* } */</div><div class='add'>+</div><div class='add'>+ if (NULL == (at = SLang_create_array (SLANG_INT_TYPE, 0, (VOID_STAR) data, &dims, 1)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ at->index_fun = range_get_data_addr;</div><div class='add'>+ at->flags |= SLARR_DATA_VALUE_IS_RANGE;</div><div class='add'>+</div><div class='add'>+ return at;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+static SLang_Array_Type *inline_implicit_floating_array (unsigned char type,</div><div class='add'>+ double *xminptr, double *xmaxptr, double *dxptr)</div><div class='add'>+{</div><div class='add'>+ int n, i;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int dims;</div><div class='add'>+ double xmin, xmax, dx;</div><div class='add'>+</div><div class='add'>+ if ((xminptr == NULL) || (xmaxptr == NULL))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "range-array has unknown size");</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ xmin = *xminptr;</div><div class='add'>+ xmax = *xmaxptr;</div><div class='add'>+ if (dxptr == NULL) dx = 1.0;</div><div class='add'>+ else dx = *dxptr;</div><div class='add'>+</div><div class='add'>+ if (dx == 0.0)</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror ("range-array increment must be non-zero");</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* I have convinced myself that it is better to use semi-open intervals</div><div class='add'>+ * because of less ambiguities. So, [a:b:c] will represent the set of</div><div class='add'>+ * values a, a + c, a + 2c ... a + nc</div><div class='add'>+ * such that a + nc < b. That is, b lies outside the interval.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ /* Allow for roundoff by adding 0.5 before truncation */</div><div class='add'>+ n = (int)(1.5 + ((xmax - xmin) / dx));</div><div class='add'>+ if (n <= 0)</div><div class='add'>+ n = 0;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ double last = xmin + (n-1) * dx;</div><div class='add'>+</div><div class='add'>+ if (dx > 0.0)</div><div class='add'>+ {</div><div class='add'>+ if (last >= xmax)</div><div class='add'>+ n -= 1;</div><div class='add'>+ }</div><div class='add'>+ else if (last <= xmax)</div><div class='add'>+ n -= 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ dims = n;</div><div class='add'>+ if (NULL == (at = SLang_create_array1 (type, 0, NULL, &dims, 1, 1)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ if (type == SLANG_DOUBLE_TYPE)</div><div class='add'>+ {</div><div class='add'>+ double *ptr;</div><div class='add'>+</div><div class='add'>+ ptr = (double *) at->data;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < n; i++)</div><div class='add'>+ ptr[i] = xmin + i * dx;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ float *ptr;</div><div class='add'>+</div><div class='add'>+ ptr = (float *) at->data;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < n; i++)</div><div class='add'>+ ptr[i] = (float) (xmin + i * dx);</div><div class='add'>+ }</div><div class='add'>+ return at;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* FIXME: Priority=medium</div><div class='add'>+ * This needs to be updated to work with all integer types.</div><div class='add'>+ */</div><div class='add'>+int _SLarray_inline_implicit_array (void)</div><div class='add'>+{</div><div class='add'>+ int int_vals[3];</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ double double_vals[3];</div><div class='add'>+#endif</div><div class='add'>+ int has_vals[3];</div><div class='add'>+ unsigned int i, count;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int precedence;</div><div class='add'>+ unsigned char type;</div><div class='add'>+ int is_int;</div><div class='add'>+</div><div class='add'>+ count = SLang_Num_Function_Args;</div><div class='add'>+</div><div class='add'>+ if (count == 2)</div><div class='add'>+ has_vals [2] = 0;</div><div class='add'>+ else if (count != 3)</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror ("wrong number of arguments to __implicit_inline_array");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ is_int = 1;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ type = 0;</div><div class='add'>+ precedence = 0;</div><div class='add'>+</div><div class='add'>+ i = count;</div><div class='add'>+ while (i--)</div><div class='add'>+ {</div><div class='add'>+ int this_type, this_precedence;</div><div class='add'>+</div><div class='add'>+ if (-1 == (this_type = SLang_peek_at_stack ()))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ this_precedence = _SLarith_get_precedence ((unsigned char) this_type);</div><div class='add'>+ if (precedence < this_precedence)</div><div class='add'>+ {</div><div class='add'>+ type = (unsigned char) this_type;</div><div class='add'>+ precedence = this_precedence;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ has_vals [i] = 1;</div><div class='add'>+</div><div class='add'>+ switch (this_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_NULL_TYPE:</div><div class='add'>+ has_vals[i] = 0;</div><div class='add'>+ (void) SLdo_pop ();</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ if (-1 == SLang_pop_double (double_vals + i, NULL, NULL))</div><div class='add'>+ return -1;</div><div class='add'>+ is_int = 0;</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ default:</div><div class='add'>+ if (-1 == SLang_pop_integer (int_vals + i))</div><div class='add'>+ return -1;</div><div class='add'>+ double_vals[i] = (double) int_vals[i];</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ if (is_int == 0)</div><div class='add'>+ at = inline_implicit_floating_array (type,</div><div class='add'>+ (has_vals[0] ? &double_vals[0] : NULL),</div><div class='add'>+ (has_vals[1] ? &double_vals[1] : NULL),</div><div class='add'>+ (has_vals[2] ? &double_vals[2] : NULL));</div><div class='add'>+ else</div><div class='add'>+#endif</div><div class='add'>+ at = inline_implicit_int_array ((has_vals[0] ? &int_vals[0] : NULL),</div><div class='add'>+ (has_vals[1] ? &int_vals[1] : NULL),</div><div class='add'>+ (has_vals[2] ? &int_vals[2] : NULL));</div><div class='add'>+</div><div class='add'>+ if (at == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLarray_wildcard_array (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ </div><div class='add'>+ if (NULL == (at = inline_implicit_int_array (NULL, NULL, NULL)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Array_Type *concat_arrays (unsigned int count)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type **arrays;</div><div class='add'>+ SLang_Array_Type *at, *bt;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ int num_elements;</div><div class='add'>+ unsigned char type;</div><div class='add'>+ char *src_data, *dest_data;</div><div class='add'>+ int is_ptr;</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+ int max_dims, min_dims, max_rows, min_rows;</div><div class='add'>+</div><div class='add'>+ arrays = (SLang_Array_Type **)SLmalloc (count * sizeof (SLang_Array_Type *));</div><div class='add'>+ if (arrays == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop_n (count);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ SLMEMSET((char *) arrays, 0, count * sizeof(SLang_Array_Type *));</div><div class='add'>+</div><div class='add'>+ at = NULL;</div><div class='add'>+</div><div class='add'>+ num_elements = 0;</div><div class='add'>+ i = count;</div><div class='add'>+</div><div class='add'>+ while (i != 0)</div><div class='add'>+ {</div><div class='add'>+ i--;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_array (&bt, 1))</div><div class='add'>+ goto free_and_return;</div><div class='add'>+</div><div class='add'>+ arrays[i] = bt;</div><div class='add'>+ num_elements += (int)bt->num_elements;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ type = arrays[0]->data_type;</div><div class='add'>+ max_dims = min_dims = arrays[0]->num_dims;</div><div class='add'>+ min_rows = max_rows = arrays[0]->dims[0];</div><div class='add'>+</div><div class='add'>+ for (i = 1; i < count; i++)</div><div class='add'>+ {</div><div class='add'>+ SLang_Array_Type *ct;</div><div class='add'>+ int num;</div><div class='add'>+</div><div class='add'>+ bt = arrays[i];</div><div class='add'>+</div><div class='add'>+ num = bt->num_dims;</div><div class='add'>+ if (num > max_dims) max_dims = num;</div><div class='add'>+ if (num < min_dims) min_dims = num;</div><div class='add'>+</div><div class='add'>+ num = bt->dims[0];</div><div class='add'>+ if (num > max_rows) max_rows = num;</div><div class='add'>+ if (num < min_rows) min_rows = num;</div><div class='add'>+</div><div class='add'>+ if (type == bt->data_type)</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ if (1 != _SLarray_typecast (bt->data_type, (VOID_STAR) &bt, 1,</div><div class='add'>+ type, (VOID_STAR) &ct, 1))</div><div class='add'>+ goto free_and_return;</div><div class='add'>+</div><div class='add'>+ SLang_free_array (bt);</div><div class='add'>+ arrays [i] = ct;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (at = SLang_create_array (type, 0, NULL, &num_elements, 1)))</div><div class='add'>+ goto free_and_return;</div><div class='add'>+</div><div class='add'>+ is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+ sizeof_type = at->sizeof_type;</div><div class='add'>+ dest_data = (char *) at->data;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < count; i++)</div><div class='add'>+ {</div><div class='add'>+ bt = arrays[i];</div><div class='add'>+</div><div class='add'>+ src_data = (char *) bt->data;</div><div class='add'>+ num_elements = bt->num_elements;</div><div class='add'>+</div><div class='add'>+ if (-1 == transfer_n_elements (bt, (VOID_STAR)dest_data, (VOID_STAR)src_data, sizeof_type,</div><div class='add'>+ num_elements, is_ptr))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ at = NULL;</div><div class='add'>+ goto free_and_return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ dest_data += num_elements * sizeof_type;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* If the arrays are all 1-d, and all the same size, then reshape to a</div><div class='add'>+ * 2-d array. This will allow us to do, e.g.</div><div class='add'>+ * a = [[1,2], [3,4]]</div><div class='add'>+ * to specifiy a 2-d.</div><div class='add'>+ * Someday I will generalize this.</div><div class='add'>+ */</div><div class='add'>+ if ((max_dims == min_dims) && (max_dims == 1) && (min_rows == max_rows))</div><div class='add'>+ {</div><div class='add'>+ at->num_dims = 2;</div><div class='add'>+ at->dims[0] = count;</div><div class='add'>+ at->dims[1] = min_rows;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ free_and_return:</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < count; i++)</div><div class='add'>+ SLang_free_array (arrays[i]);</div><div class='add'>+ SLfree ((char *) arrays);</div><div class='add'>+</div><div class='add'>+ return at;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLarray_inline_array (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type *obj;</div><div class='add'>+ unsigned char type, this_type;</div><div class='add'>+ unsigned int count;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ obj = _SLStack_Pointer;</div><div class='add'>+</div><div class='add'>+ count = SLang_Num_Function_Args;</div><div class='add'>+ type = 0;</div><div class='add'>+</div><div class='add'>+ while ((count > 0) && (--obj >= _SLRun_Stack))</div><div class='add'>+ {</div><div class='add'>+ this_type = obj->data_type;</div><div class='add'>+</div><div class='add'>+ if (type == 0)</div><div class='add'>+ type = this_type;</div><div class='add'>+</div><div class='add'>+ if ((type == this_type) || (type == SLANG_ARRAY_TYPE))</div><div class='add'>+ {</div><div class='add'>+ count--;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ switch (this_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_ARRAY_TYPE:</div><div class='add'>+ type = SLANG_ARRAY_TYPE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_INT_TYPE:</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ case SLANG_COMPLEX_TYPE:</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ default:</div><div class='add'>+ goto type_mismatch;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_INT_TYPE:</div><div class='add'>+ type = SLANG_DOUBLE_TYPE;</div><div class='add'>+ break;</div><div class='add'>+# if SLANG_HAS_COMPLEX</div><div class='add'>+ case SLANG_COMPLEX_TYPE:</div><div class='add'>+ break;</div><div class='add'>+# endif</div><div class='add'>+ default:</div><div class='add'>+ goto type_mismatch;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ case SLANG_COMPLEX_TYPE:</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_INT_TYPE:</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ type = SLANG_COMPLEX_TYPE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ goto type_mismatch;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ default:</div><div class='add'>+ type_mismatch:</div><div class='add'>+ _SLclass_type_mismatch_error (type, this_type);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ count--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (count != 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ count = SLang_Num_Function_Args;</div><div class='add'>+</div><div class='add'>+ if (count == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "Empty inline-arrays not supported");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (type == SLANG_ARRAY_TYPE)</div><div class='add'>+ {</div><div class='add'>+ if (NULL == (at = concat_arrays (count)))</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ SLang_Object_Type index_obj;</div><div class='add'>+ int icount = (int) count;</div><div class='add'>+</div><div class='add'>+ if (NULL == (at = SLang_create_array (type, 0, NULL, &icount, 1)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ index_obj.data_type = SLANG_INT_TYPE;</div><div class='add'>+ while (count != 0)</div><div class='add'>+ {</div><div class='add'>+ count--;</div><div class='add'>+ index_obj.v.int_val = (int) count;</div><div class='add'>+ if (-1 == aput_from_indices (at, &index_obj, 1))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ SLdo_pop_n (count);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int array_binary_op_result (int op, unsigned char a, unsigned char b,</div><div class='add'>+ unsigned char *c)</div><div class='add'>+{</div><div class='add'>+ (void) op;</div><div class='add'>+ (void) a;</div><div class='add'>+ (void) b;</div><div class='add'>+ *c = SLANG_ARRAY_TYPE;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int array_binary_op (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at, *bt, *ct;</div><div class='add'>+ unsigned int i, num_dims;</div><div class='add'>+ int (*binary_fun) (int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR);</div><div class='add'>+ SLang_Class_Type *a_cl, *b_cl, *c_cl;</div><div class='add'>+ int no_init;</div><div class='add'>+</div><div class='add'>+ if (a_type == SLANG_ARRAY_TYPE)</div><div class='add'>+ {</div><div class='add'>+ if (na != 1)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "Binary operation on multiple arrays not implemented");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ at = *(SLang_Array_Type **) ap;</div><div class='add'>+ if (-1 == coerse_array_to_linear (at))</div><div class='add'>+ return -1;</div><div class='add'>+ ap = at->data;</div><div class='add'>+ a_type = at->data_type;</div><div class='add'>+ na = at->num_elements;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ at = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (b_type == SLANG_ARRAY_TYPE)</div><div class='add'>+ {</div><div class='add'>+ if (nb != 1)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "Binary operation on multiple arrays not implemented");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ bt = *(SLang_Array_Type **) bp;</div><div class='add'>+ if (-1 == coerse_array_to_linear (bt))</div><div class='add'>+ return -1;</div><div class='add'>+ bp = bt->data;</div><div class='add'>+ b_type = bt->data_type;</div><div class='add'>+ nb = bt->num_elements;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ bt = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((at != NULL) && (bt != NULL))</div><div class='add'>+ {</div><div class='add'>+ num_dims = at->num_dims;</div><div class='add'>+</div><div class='add'>+ if (num_dims != bt->num_dims)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "Arrays must have same dim for binary operation");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < num_dims; i++)</div><div class='add'>+ {</div><div class='add'>+ if (at->dims[i] != bt->dims[i])</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "Arrays must be the same for binary operation");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ a_cl = _SLclass_get_class (a_type);</div><div class='add'>+ b_cl = _SLclass_get_class (b_type);</div><div class='add'>+</div><div class='add'>+ if (NULL == (binary_fun = _SLclass_get_binary_fun (op, a_cl, b_cl, &c_cl, 1)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ no_init = ((c_cl->cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+ || (c_cl->cl_class_type == SLANG_CLASS_TYPE_VECTOR));</div><div class='add'>+</div><div class='add'>+ ct = NULL;</div><div class='add'>+#if _SLANG_USE_TMP_OPTIMIZATION</div><div class='add'>+ /* If we are dealing with scalar (or vector) objects, and if the object</div><div class='add'>+ * appears to be owned by the stack, then use it instead of creating a </div><div class='add'>+ * new version. This can happen with code such as:</div><div class='add'>+ * @ x = [1,2,3,4];</div><div class='add'>+ * @ x = __tmp(x) + 1;</div><div class='add'>+ */</div><div class='add'>+ if (no_init)</div><div class='add'>+ {</div><div class='add'>+ if ((at != NULL) </div><div class='add'>+ && (at->num_refs == 1)</div><div class='add'>+ && (at->data_type == c_cl->cl_data_type))</div><div class='add'>+ {</div><div class='add'>+ ct = at;</div><div class='add'>+ ct->num_refs = 2;</div><div class='add'>+ }</div><div class='add'>+ else if ((bt != NULL) </div><div class='add'>+ && (bt->num_refs == 1)</div><div class='add'>+ && (bt->data_type == c_cl->cl_data_type))</div><div class='add'>+ {</div><div class='add'>+ ct = bt;</div><div class='add'>+ ct->num_refs = 2;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+#endif /* _SLANG_USE_TMP_OPTIMIZATION */</div><div class='add'>+ </div><div class='add'>+ if (ct == NULL)</div><div class='add'>+ {</div><div class='add'>+ if (at != NULL) ct = at; else ct = bt;</div><div class='add'>+ ct = SLang_create_array1 (c_cl->cl_data_type, 0, NULL, ct->dims, ct->num_dims, no_init);</div><div class='add'>+ if (ct == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ if ((na == 0) || (nb == 0) /* allow empty arrays */</div><div class='add'>+ || (1 == (*binary_fun) (op, a_type, ap, na, b_type, bp, nb, ct->data)))</div><div class='add'>+ {</div><div class='add'>+ *(SLang_Array_Type **) cp = ct;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_free_array (ct);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_where (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at, *bt;</div><div class='add'>+ char *a_data;</div><div class='add'>+ int *b_data;</div><div class='add'>+ unsigned int i, num_elements;</div><div class='add'>+ int b_num;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_array (&at, 1))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ bt = NULL;</div><div class='add'>+</div><div class='add'>+ if (at->data_type != SLANG_CHAR_TYPE)</div><div class='add'>+ {</div><div class='add'>+ int zero;</div><div class='add'>+ SLang_Array_Type *tmp_at;</div><div class='add'>+</div><div class='add'>+ tmp_at = at;</div><div class='add'>+ zero = 0;</div><div class='add'>+ if (1 != array_binary_op (SLANG_NE,</div><div class='add'>+ SLANG_ARRAY_TYPE, (VOID_STAR) &at, 1,</div><div class='add'>+ SLANG_CHAR_TYPE, (VOID_STAR) &zero, 1,</div><div class='add'>+ (VOID_STAR) &tmp_at))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ at = tmp_at;</div><div class='add'>+ if (at->data_type != SLANG_CHAR_TYPE)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_TYPE_MISMATCH;</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ a_data = (char *) at->data;</div><div class='add'>+ num_elements = at->num_elements;</div><div class='add'>+</div><div class='add'>+ b_num = 0;</div><div class='add'>+ for (i = 0; i < num_elements; i++)</div><div class='add'>+ if (a_data[i] != 0) b_num++;</div><div class='add'>+</div><div class='add'>+ if (NULL == (bt = SLang_create_array1 (SLANG_INT_TYPE, 0, NULL, &b_num, 1, 1)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ b_data = (int *) bt->data;</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ while (b_num)</div><div class='add'>+ {</div><div class='add'>+ if (a_data[i] != 0)</div><div class='add'>+ {</div><div class='add'>+ *b_data++ = i;</div><div class='add'>+ b_num--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ (void) SLang_push_array (bt, 0);</div><div class='add'>+ /* drop */</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ SLang_free_array (bt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int do_array_reshape (SLang_Array_Type *at, SLang_Array_Type *ind_at)</div><div class='add'>+{</div><div class='add'>+ int *dims;</div><div class='add'>+ unsigned int i, num_dims;</div><div class='add'>+ unsigned int num_elements;</div><div class='add'>+</div><div class='add'>+ if ((ind_at->data_type != SLANG_INT_TYPE)</div><div class='add'>+ || (ind_at->num_dims != 1))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "Expecting 1-d integer array");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ num_dims = ind_at->num_elements;</div><div class='add'>+ dims = (int *) ind_at->data;</div><div class='add'>+</div><div class='add'>+ num_elements = 1;</div><div class='add'>+ for (i = 0; i < num_dims; i++)</div><div class='add'>+ {</div><div class='add'>+ int d = dims[i];</div><div class='add'>+ if (d < 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "reshape: dimension is less then 0");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ num_elements = (unsigned int) d * num_elements;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((num_elements != at->num_elements)</div><div class='add'>+ || (num_dims > SLARRAY_MAX_DIMS))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Unable to reshape array to specified size");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < num_dims; i++)</div><div class='add'>+ at->dims [i] = dims[i];</div><div class='add'>+</div><div class='add'>+ while (i < SLARRAY_MAX_DIMS)</div><div class='add'>+ {</div><div class='add'>+ at->dims [i] = 1;</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ at->num_dims = num_dims;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_reshape (SLang_Array_Type *at, SLang_Array_Type *ind_at)</div><div class='add'>+{</div><div class='add'>+ (void) do_array_reshape (at, ind_at);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void _array_reshape (SLang_Array_Type *ind_at)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ SLang_Array_Type *new_at;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_array (&at, 1))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ /* FIXME: Priority=low: duplicate_array could me modified to look at num_refs */</div><div class='add'>+</div><div class='add'>+ /* Now try to avoid the overhead of creating a new array if possible */</div><div class='add'>+ if (at->num_refs == 1)</div><div class='add'>+ {</div><div class='add'>+ /* Great, we are the sole owner of this array. */</div><div class='add'>+ if ((-1 == do_array_reshape (at, ind_at))</div><div class='add'>+ || (-1 == SLclass_push_ptr_obj (SLANG_ARRAY_TYPE, (VOID_STAR)at)))</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ new_at = SLang_duplicate_array (at);</div><div class='add'>+ if (new_at != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (0 == do_array_reshape (new_at, ind_at))</div><div class='add'>+ (void) SLang_push_array (new_at, 0);</div><div class='add'>+ </div><div class='add'>+ SLang_free_array (new_at);</div><div class='add'>+ }</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ unsigned int increment;</div><div class='add'>+ char *addr;</div><div class='add'>+}</div><div class='add'>+Map_Arg_Type;</div><div class='add'>+/* Usage: array_map (Return-Type, func, args,....); */</div><div class='add'>+static void array_map (void)</div><div class='add'>+{</div><div class='add'>+ Map_Arg_Type *args;</div><div class='add'>+ unsigned int num_args;</div><div class='add'>+ unsigned int i, i_control;</div><div class='add'>+ SLang_Name_Type *nt;</div><div class='add'>+ unsigned int num_elements;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ char *addr;</div><div class='add'>+ unsigned char type;</div><div class='add'>+</div><div class='add'>+ at = NULL;</div><div class='add'>+ args = NULL;</div><div class='add'>+ nt = NULL;</div><div class='add'>+</div><div class='add'>+ if (SLang_Num_Function_Args < 3)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM,</div><div class='add'>+ "Usage: array_map (Return-Type, &func, args...)");</div><div class='add'>+ SLdo_pop_n (SLang_Num_Function_Args);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ num_args = (unsigned int)SLang_Num_Function_Args - 2;</div><div class='add'>+ args = (Map_Arg_Type *) SLmalloc (num_args * sizeof (Map_Arg_Type));</div><div class='add'>+ if (args == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop_n (SLang_Num_Function_Args);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ memset ((char *) args, 0, num_args * sizeof (Map_Arg_Type));</div><div class='add'>+ i = num_args;</div><div class='add'>+ i_control = 0;</div><div class='add'>+ while (i > 0)</div><div class='add'>+ {</div><div class='add'>+ i--;</div><div class='add'>+ if (-1 == SLang_pop_array (&args[i].at, 1))</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop_n (i + 2);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+ if (args[i].at->num_elements > 1)</div><div class='add'>+ i_control = i;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (nt = SLang_pop_function ()))</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop_n (1);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ num_elements = args[i_control].at->num_elements;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_datatype (&type))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (type == SLANG_UNDEFINED_TYPE) /* Void_Type */</div><div class='add'>+ at = NULL;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ at = args[i_control].at;</div><div class='add'>+</div><div class='add'>+ if (NULL == (at = SLang_create_array (type, 0, NULL, at->dims, at->num_dims)))</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+</div><div class='add'>+ for (i = 0; i < num_args; i++)</div><div class='add'>+ {</div><div class='add'>+ SLang_Array_Type *ati = args[i].at;</div><div class='add'>+ /* FIXME: Priority = low: The actual dimensions should be compared. */</div><div class='add'>+ if (ati->num_elements == num_elements)</div><div class='add'>+ args[i].increment = ati->sizeof_type;</div><div class='add'>+ /* memset already guarantees increment to be zero */</div><div class='add'>+</div><div class='add'>+ if (ati->num_elements == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (0, "array_map: function argument %d of %d is an empty array", </div><div class='add'>+ i+1, num_args);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ args[i].addr = (char *) ati->data;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (at == NULL)</div><div class='add'>+ addr = NULL;</div><div class='add'>+ else</div><div class='add'>+ addr = (char *)at->data;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < num_elements; i++)</div><div class='add'>+ {</div><div class='add'>+ unsigned int j;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_start_arg_list ())</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ for (j = 0; j < num_args; j++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == push_element_at_addr (args[j].at, </div><div class='add'>+ (VOID_STAR) args[j].addr,</div><div class='add'>+ 1))</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop_n (j);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ args[j].addr += args[j].increment;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_end_arg_list ())</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop_n (num_args);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLexecute_function (nt))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (at == NULL)</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ if (-1 == at->cl->cl_apop (type, (VOID_STAR) addr))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ addr += at->sizeof_type;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (at != NULL)</div><div class='add'>+ (void) SLang_push_array (at, 0);</div><div class='add'>+</div><div class='add'>+ /* drop */</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ SLang_free_function (nt);</div><div class='add'>+ if (args != NULL)</div><div class='add'>+ {</div><div class='add'>+ for (i = 0; i < num_args; i++)</div><div class='add'>+ SLang_free_array (args[i].at);</div><div class='add'>+</div><div class='add'>+ SLfree ((char *) args);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Array_Table [] =</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_0("array_map", array_map, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("array_sort", sort_array, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_1("array_to_bstring", array_to_bstring, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_1("bstring_to_array", bstring_to_array, SLANG_VOID_TYPE, SLANG_BSTRING_TYPE),</div><div class='add'>+ MAKE_INTRINSIC("init_char_array", init_char_array, SLANG_VOID_TYPE, 0),</div><div class='add'>+ MAKE_INTRINSIC("array_info", array_info, SLANG_VOID_TYPE, 0),</div><div class='add'>+ MAKE_INTRINSIC("where", array_where, SLANG_VOID_TYPE, 0),</div><div class='add'>+ MAKE_INTRINSIC_2("reshape", array_reshape, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE, SLANG_ARRAY_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_1("_reshape", _array_reshape, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE),</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static char *array_string (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ char buf[512];</div><div class='add'>+ unsigned int i, num_dims;</div><div class='add'>+ int *dims;</div><div class='add'>+</div><div class='add'>+ at = *(SLang_Array_Type **) v;</div><div class='add'>+ type = at->data_type;</div><div class='add'>+ num_dims = at->num_dims;</div><div class='add'>+ dims = at->dims;</div><div class='add'>+</div><div class='add'>+ sprintf (buf, "%s[%d", SLclass_get_datatype_name (type), at->dims[0]);</div><div class='add'>+</div><div class='add'>+ for (i = 1; i < num_dims; i++)</div><div class='add'>+ sprintf (buf + strlen(buf), ",%d", dims[i]);</div><div class='add'>+ strcat (buf, "]");</div><div class='add'>+</div><div class='add'>+ return SLmake_string (buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_destroy (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ SLang_free_array (*(SLang_Array_Type **) v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int array_push (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ at = *(SLang_Array_Type **) v;</div><div class='add'>+ return SLang_push_array (at, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Intrinsic arrays are not stored in a variable. So, the address that</div><div class='add'>+ * would contain the variable holds the array address.</div><div class='add'>+ */</div><div class='add'>+static int array_push_intrinsic (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ return SLang_push_array ((SLang_Array_Type *) v, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLarray_add_bin_op (unsigned char type)</div><div class='add'>+{</div><div class='add'>+ SL_OOBinary_Type *ab;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ ab = cl->cl_binary_ops;</div><div class='add'>+</div><div class='add'>+ while (ab != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (ab->data_type == SLANG_ARRAY_TYPE)</div><div class='add'>+ return 0;</div><div class='add'>+ ab = ab->next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLclass_add_binary_op (SLANG_ARRAY_TYPE, type, array_binary_op, array_binary_op_result))</div><div class='add'>+ || (-1 == SLclass_add_binary_op (type, SLANG_ARRAY_TYPE, array_binary_op, array_binary_op_result)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Array_Type *</div><div class='add'>+do_array_math_op (int op, int unary_type,</div><div class='add'>+ SLang_Array_Type *at, unsigned int na)</div><div class='add'>+{</div><div class='add'>+ unsigned char a_type, b_type;</div><div class='add'>+ int (*f) (int, unsigned char, VOID_STAR, unsigned int, VOID_STAR);</div><div class='add'>+ SLang_Array_Type *bt;</div><div class='add'>+ SLang_Class_Type *b_cl;</div><div class='add'>+ int no_init;</div><div class='add'>+</div><div class='add'>+ if (na != 1)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "Operation restricted to 1 array");</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ a_type = at->data_type;</div><div class='add'>+ if (NULL == (f = _SLclass_get_unary_fun (op, at->cl, &b_cl, unary_type)))</div><div class='add'>+ return NULL;</div><div class='add'>+ b_type = b_cl->cl_data_type;</div><div class='add'>+</div><div class='add'>+ if (-1 == coerse_array_to_linear (at))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ no_init = ((b_cl->cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+ || (b_cl->cl_class_type == SLANG_CLASS_TYPE_VECTOR));</div><div class='add'>+</div><div class='add'>+#if _SLANG_USE_TMP_OPTIMIZATION</div><div class='add'>+ /* If we are dealing with scalar (or vector) objects, and if the object</div><div class='add'>+ * appears to be owned by the stack, then use it instead of creating a </div><div class='add'>+ * new version. This can happen with code such as:</div><div class='add'>+ * @ x = [1,2,3,4];</div><div class='add'>+ * @ x = UNARY_OP(__tmp(x));</div><div class='add'>+ */</div><div class='add'>+ if (no_init</div><div class='add'>+ && (at->num_refs == 1)</div><div class='add'>+ && (at->data_type == b_cl->cl_data_type))</div><div class='add'>+ {</div><div class='add'>+ bt = at;</div><div class='add'>+ bt->num_refs = 2;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+#endif /* _SLANG_USE_TMP_OPTIMIZATION */</div><div class='add'>+ if (NULL == (bt = SLang_create_array1 (b_type, 0, NULL, at->dims, at->num_dims, no_init)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ if (1 != (*f)(op, a_type, at->data, at->num_elements, bt->data))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (bt);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ return bt;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+array_unary_op_result (int op, unsigned char a, unsigned char *b)</div><div class='add'>+{</div><div class='add'>+ (void) op;</div><div class='add'>+ (void) a;</div><div class='add'>+ *b = SLANG_ARRAY_TYPE;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+array_unary_op (int op,</div><div class='add'>+ unsigned char a, VOID_STAR ap, unsigned int na,</div><div class='add'>+ VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ (void) a;</div><div class='add'>+ at = *(SLang_Array_Type **) ap;</div><div class='add'>+ if (NULL == (at = do_array_math_op (op, _SLANG_BC_UNARY, at, na)))</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error) return -1;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ *(SLang_Array_Type **) bp = at;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+array_math_op (int op,</div><div class='add'>+ unsigned char a, VOID_STAR ap, unsigned int na,</div><div class='add'>+ VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ (void) a;</div><div class='add'>+ at = *(SLang_Array_Type **) ap;</div><div class='add'>+ if (NULL == (at = do_array_math_op (op, _SLANG_BC_MATH_UNARY, at, na)))</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error) return -1;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ *(SLang_Array_Type **) bp = at;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+array_app_op (int op,</div><div class='add'>+ unsigned char a, VOID_STAR ap, unsigned int na,</div><div class='add'>+ VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ (void) a;</div><div class='add'>+ at = *(SLang_Array_Type **) ap;</div><div class='add'>+ if (NULL == (at = do_array_math_op (op, _SLANG_BC_APP_UNARY, at, na)))</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error) return -1;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ *(SLang_Array_Type **) bp = at;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_SLarray_typecast (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp,</div><div class='add'>+ int is_implicit)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at, *bt;</div><div class='add'>+ SLang_Class_Type *b_cl;</div><div class='add'>+ int no_init;</div><div class='add'>+ int (*t) (unsigned char, VOID_STAR, unsigned int, unsigned char, VOID_STAR);</div><div class='add'>+</div><div class='add'>+ if (na != 1)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "typecast of multiple arrays not implemented");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ at = *(SLang_Array_Type **) ap;</div><div class='add'>+ a_type = at->data_type;</div><div class='add'>+</div><div class='add'>+ if (a_type == b_type)</div><div class='add'>+ {</div><div class='add'>+ at->num_refs += 1;</div><div class='add'>+ *(SLang_Array_Type **) bp = at;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (t = _SLclass_get_typecast (a_type, b_type, is_implicit)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == coerse_array_to_linear (at))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ b_cl = _SLclass_get_class (b_type);</div><div class='add'>+</div><div class='add'>+ no_init = ((b_cl->cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+ || (b_cl->cl_class_type == SLANG_CLASS_TYPE_VECTOR));</div><div class='add'>+</div><div class='add'>+ if (NULL == (bt = SLang_create_array1 (b_type, 0, NULL, at->dims, at->num_dims, no_init)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (1 == (*t) (a_type, at->data, at->num_elements, b_type, bt->data))</div><div class='add'>+ {</div><div class='add'>+ *(SLang_Array_Type **) bp = bt;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_free_array (bt);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Array_Type *SLang_duplicate_array (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *bt;</div><div class='add'>+ char *data, *a_data;</div><div class='add'>+ unsigned int i, num_elements, sizeof_type;</div><div class='add'>+ unsigned int size;</div><div class='add'>+ int (*cl_acopy) (unsigned char, VOID_STAR, VOID_STAR);</div><div class='add'>+ unsigned char type;</div><div class='add'>+</div><div class='add'>+ if (-1 == coerse_array_to_linear (at))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ type = at->data_type;</div><div class='add'>+ num_elements = at->num_elements;</div><div class='add'>+ sizeof_type = at->sizeof_type;</div><div class='add'>+ size = num_elements * sizeof_type;</div><div class='add'>+</div><div class='add'>+ if (NULL == (data = SLmalloc (size)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ if (NULL == (bt = SLang_create_array (type, 0, (VOID_STAR)data, at->dims, at->num_dims)))</div><div class='add'>+ {</div><div class='add'>+ SLfree (data);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ a_data = (char *) at->data;</div><div class='add'>+ if (0 == (at->flags & SLARR_DATA_VALUE_IS_POINTER))</div><div class='add'>+ {</div><div class='add'>+ SLMEMCPY (data, a_data, size);</div><div class='add'>+ return bt;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLMEMSET (data, 0, size);</div><div class='add'>+</div><div class='add'>+ cl_acopy = at->cl->cl_acopy;</div><div class='add'>+ for (i = 0; i < num_elements; i++)</div><div class='add'>+ {</div><div class='add'>+ if (NULL != *(VOID_STAR *) a_data)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cl_acopy) (type, (VOID_STAR) a_data, (VOID_STAR) data))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (bt);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ data += sizeof_type;</div><div class='add'>+ a_data += sizeof_type;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return bt;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int array_dereference (unsigned char type, VOID_STAR addr)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ at = SLang_duplicate_array (*(SLang_Array_Type **) addr);</div><div class='add'>+ if (at == NULL) return -1;</div><div class='add'>+ return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function gets called via, e.g., @Array_Type (Double_Type, [10,20]);</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+array_datatype_deref (unsigned char type)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *ind_at;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+ /* The parser generated code for this as if a function call were to be</div><div class='add'>+ * made. However, the interpreter simply called the deref object routine</div><div class='add'>+ * instead of the function call. So, I must simulate the function call.</div><div class='add'>+ * This needs to be formalized to hide this detail from applications</div><div class='add'>+ * who wish to do the same. So...</div><div class='add'>+ * FIXME: Priority=medium</div><div class='add'>+ */</div><div class='add'>+ if (0 == _SL_increment_frame_pointer ())</div><div class='add'>+ (void) _SL_decrement_frame_pointer ();</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_array (&ind_at, 1))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((ind_at->data_type != SLANG_INT_TYPE)</div><div class='add'>+ || (ind_at->num_dims != 1))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "Expecting 1-d integer array");</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_datatype (&type))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (NULL == (at = SLang_create_array (type, 0, NULL,</div><div class='add'>+ (int *) ind_at->data,</div><div class='add'>+ ind_at->num_elements)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ SLang_free_array (ind_at);</div><div class='add'>+ return SLang_push_array (at, 1);</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ SLang_free_array (ind_at);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int array_length (unsigned char type, VOID_STAR v, unsigned int *len)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ at = *(SLang_Array_Type **) v;</div><div class='add'>+ *len = at->num_elements;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_SLarray_init_slarray (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLadd_intrin_fun_table (Array_Table, NULL))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("Array_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ (void) SLclass_set_string_function (cl, array_string);</div><div class='add'>+ (void) SLclass_set_destroy_function (cl, array_destroy);</div><div class='add'>+ (void) SLclass_set_push_function (cl, array_push);</div><div class='add'>+ cl->cl_push_intrinsic = array_push_intrinsic;</div><div class='add'>+ cl->cl_dereference = array_dereference;</div><div class='add'>+ cl->cl_datatype_deref = array_datatype_deref;</div><div class='add'>+ cl->cl_length = array_length;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_ARRAY_TYPE, sizeof (VOID_STAR),</div><div class='add'>+ SLANG_CLASS_TYPE_PTR))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLclass_add_binary_op (SLANG_ARRAY_TYPE, SLANG_ARRAY_TYPE, array_binary_op, array_binary_op_result))</div><div class='add'>+ || (-1 == SLclass_add_unary_op (SLANG_ARRAY_TYPE, array_unary_op, array_unary_op_result))</div><div class='add'>+ || (-1 == SLclass_add_app_unary_op (SLANG_ARRAY_TYPE, array_app_op, array_unary_op_result))</div><div class='add'>+ || (-1 == SLclass_add_math_op (SLANG_ARRAY_TYPE, array_math_op, array_unary_op_result))</div><div class='add'>+ || (-1 == SLclass_add_math_op (SLANG_ARRAY_TYPE, array_math_op, array_unary_op_result)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_array (SLang_Array_Type **at_ptr, int convert_scalar)</div><div class='add'>+{</div><div class='add'>+ if (-1 == pop_array (at_ptr, convert_scalar))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == coerse_array_to_linear (*at_ptr))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (*at_ptr);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_array_of_type (SLang_Array_Type **at, unsigned char type)</div><div class='add'>+{</div><div class='add'>+ if (-1 == SLclass_typecast (type, 1, 1))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return SLang_pop_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void (*_SLang_Matrix_Multiply)(void);</div><div class='add'>+</div><div class='add'>+int _SLarray_matrix_multiply (void)</div><div class='add'>+{</div><div class='add'>+ if (_SLang_Matrix_Multiply != NULL)</div><div class='add'>+ {</div><div class='add'>+ (*_SLang_Matrix_Multiply)();</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "Matrix multiplication not available");</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct _SLang_Foreach_Context_Type</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ unsigned int next_element_index;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+SLang_Foreach_Context_Type *</div><div class='add'>+_SLarray_cl_foreach_open (unsigned char type, unsigned int num)</div><div class='add'>+{</div><div class='add'>+ SLang_Foreach_Context_Type *c;</div><div class='add'>+</div><div class='add'>+ if (num != 0)</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop_n (num + 1);</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "%s does not support 'foreach using' form",</div><div class='add'>+ SLclass_get_datatype_name (type));</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (c = (SLang_Foreach_Context_Type *) SLmalloc (sizeof (SLang_Foreach_Context_Type))))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_array (&c->at, 1))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) c);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLarray_cl_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ if (c == NULL) return;</div><div class='add'>+ SLang_free_array (c->at);</div><div class='add'>+ SLfree ((char *) c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLarray_cl_foreach (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ VOID_STAR data;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+</div><div class='add'>+ if (c == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ at = c->at;</div><div class='add'>+ if (at->num_elements == c->next_element_index)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ /* FIXME: Priority = low. The following assumes linear arrays</div><div class='add'>+ * or Integer range arrays. Fixing it right requires a method to get the</div><div class='add'>+ * nth element of a multidimensional array.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ if (at->flags & SLARR_DATA_VALUE_IS_RANGE)</div><div class='add'>+ {</div><div class='add'>+ int d = (int) c->next_element_index;</div><div class='add'>+ data = range_get_data_addr (at, &d);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ data = (VOID_STAR) ((char *)at->data + (c->next_element_index * at->sizeof_type));</div><div class='add'>+</div><div class='add'>+ c->next_element_index += 1;</div><div class='add'>+</div><div class='add'>+ if ((at->flags & SLARR_DATA_VALUE_IS_POINTER)</div><div class='add'>+ && (*(VOID_STAR *) data == NULL))</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLang_push_null ())</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ else if (-1 == (*at->cl->cl_apush)(at->data_type, data))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* keep going */</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slarrfun.c b/mdk-stage1/slang/slarrfun.c<br/>new file mode 100644<br/>index 000000000..bfa6ec5e5<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slarrfun.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarrfun.c</a></div><div class='hunk'>@@ -0,0 +1,464 @@</div><div class='add'>+/* Advanced array manipulation routines for S-Lang */</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static int next_transposed_index (int *dims, int *max_dims, unsigned int num_dims)</div><div class='add'>+{</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < (int) num_dims; i++)</div><div class='add'>+ {</div><div class='add'>+ int dims_i;</div><div class='add'>+</div><div class='add'>+ dims_i = dims [i] + 1;</div><div class='add'>+ if (dims_i != (int) max_dims [i])</div><div class='add'>+ {</div><div class='add'>+ dims [i] = dims_i;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ dims [i] = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Array_Type *allocate_transposed_array (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+ unsigned int num_elements;</div><div class='add'>+ SLang_Array_Type *bt;</div><div class='add'>+ VOID_STAR b_data;</div><div class='add'>+</div><div class='add'>+ num_elements = at->num_elements;</div><div class='add'>+ b_data = (VOID_STAR) SLmalloc (at->sizeof_type * num_elements);</div><div class='add'>+ if (b_data == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ bt = SLang_create_array (at->data_type, 0, b_data, at->dims, 2);</div><div class='add'>+ if (bt == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *)b_data);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ bt->dims[1] = at->dims[0];</div><div class='add'>+ bt->dims[0] = at->dims[1];</div><div class='add'>+</div><div class='add'>+ return bt;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define GENERIC_TYPE float</div><div class='add'>+#define TRANSPOSE_2D_ARRAY transpose_floats</div><div class='add'>+#define GENERIC_TYPE_A float</div><div class='add'>+#define GENERIC_TYPE_B float</div><div class='add'>+#define GENERIC_TYPE_C float</div><div class='add'>+#define INNERPROD_FUNCTION innerprod_float_float</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+# define INNERPROD_COMPLEX_A innerprod_complex_float</div><div class='add'>+# define INNERPROD_A_COMPLEX innerprod_float_complex</div><div class='add'>+#endif</div><div class='add'>+#include "slarrfun.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_TYPE double</div><div class='add'>+#define TRANSPOSE_2D_ARRAY transpose_doubles</div><div class='add'>+#define GENERIC_TYPE_A double</div><div class='add'>+#define GENERIC_TYPE_B double</div><div class='add'>+#define GENERIC_TYPE_C double</div><div class='add'>+#define INNERPROD_FUNCTION innerprod_double_double</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+# define INNERPROD_COMPLEX_A innerprod_complex_double</div><div class='add'>+# define INNERPROD_A_COMPLEX innerprod_double_complex</div><div class='add'>+#endif</div><div class='add'>+#include "slarrfun.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_TYPE_A double</div><div class='add'>+#define GENERIC_TYPE_B float</div><div class='add'>+#define GENERIC_TYPE_C double</div><div class='add'>+#define INNERPROD_FUNCTION innerprod_double_float</div><div class='add'>+#include "slarrfun.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_TYPE_A float</div><div class='add'>+#define GENERIC_TYPE_B double</div><div class='add'>+#define GENERIC_TYPE_C double</div><div class='add'>+#define INNERPROD_FUNCTION innerprod_float_double</div><div class='add'>+#include "slarrfun.inc"</div><div class='add'>+</div><div class='add'>+/* Finally pick up the complex_complex multiplication</div><div class='add'>+ * and do the integers</div><div class='add'>+ */</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+# define INNERPROD_COMPLEX_COMPLEX innerprod_complex_complex</div><div class='add'>+#endif</div><div class='add'>+#define GENERIC_TYPE int</div><div class='add'>+#define TRANSPOSE_2D_ARRAY transpose_ints</div><div class='add'>+#include "slarrfun.inc"</div><div class='add'>+</div><div class='add'>+#if SIZEOF_LONG != SIZEOF_INT</div><div class='add'>+# define GENERIC_TYPE long</div><div class='add'>+# define TRANSPOSE_2D_ARRAY transpose_longs</div><div class='add'>+# include "slarrfun.inc"</div><div class='add'>+#else</div><div class='add'>+# define transpose_longs transpose_ints</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SIZEOF_SHORT != SIZEOF_INT</div><div class='add'>+# define GENERIC_TYPE short</div><div class='add'>+# define TRANSPOSE_2D_ARRAY transpose_shorts</div><div class='add'>+# include "slarrfun.inc"</div><div class='add'>+#else</div><div class='add'>+# define transpose_shorts transpose_ints</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define GENERIC_TYPE char</div><div class='add'>+#define TRANSPOSE_2D_ARRAY transpose_chars</div><div class='add'>+#include "slarrfun.inc"</div><div class='add'>+</div><div class='add'>+/* This routine works only with linear arrays */</div><div class='add'>+static SLang_Array_Type *transpose (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+ int dims [SLARRAY_MAX_DIMS];</div><div class='add'>+ int *max_dims;</div><div class='add'>+ unsigned int num_dims;</div><div class='add'>+ SLang_Array_Type *bt;</div><div class='add'>+ int i;</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+ int is_ptr;</div><div class='add'>+ char *b_data;</div><div class='add'>+</div><div class='add'>+ max_dims = at->dims;</div><div class='add'>+ num_dims = at->num_dims;</div><div class='add'>+</div><div class='add'>+ if ((at->num_elements == 0)</div><div class='add'>+ || (num_dims == 1))</div><div class='add'>+ {</div><div class='add'>+ bt = SLang_duplicate_array (at);</div><div class='add'>+ if (num_dims == 1) bt->num_dims = 2;</div><div class='add'>+ goto transpose_dims;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* For numeric arrays skip the overhead below */</div><div class='add'>+ if (num_dims == 2)</div><div class='add'>+ {</div><div class='add'>+ bt = allocate_transposed_array (at);</div><div class='add'>+ if (bt == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+ switch (at->data_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_INT_TYPE:</div><div class='add'>+ case SLANG_UINT_TYPE:</div><div class='add'>+ return transpose_ints (at, bt);</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ return transpose_doubles (at, bt);</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ return transpose_floats (at, bt);</div><div class='add'>+ case SLANG_CHAR_TYPE:</div><div class='add'>+ case SLANG_UCHAR_TYPE:</div><div class='add'>+ return transpose_chars (at, bt);</div><div class='add'>+ case SLANG_LONG_TYPE:</div><div class='add'>+ case SLANG_ULONG_TYPE:</div><div class='add'>+ return transpose_longs (at, bt);</div><div class='add'>+ case SLANG_SHORT_TYPE:</div><div class='add'>+ case SLANG_USHORT_TYPE:</div><div class='add'>+ return transpose_shorts (at, bt);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ bt = SLang_create_array (at->data_type, 0, NULL, max_dims, num_dims);</div><div class='add'>+ if (bt == NULL) return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ sizeof_type = at->sizeof_type;</div><div class='add'>+ is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+</div><div class='add'>+ memset ((char *)dims, 0, sizeof(dims));</div><div class='add'>+</div><div class='add'>+ b_data = (char *) bt->data;</div><div class='add'>+</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ if (-1 == _SLarray_aget_transfer_elem (at, dims, (VOID_STAR) b_data,</div><div class='add'>+ sizeof_type, is_ptr))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (bt);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ b_data += sizeof_type;</div><div class='add'>+ }</div><div class='add'>+ while (0 == next_transposed_index (dims, max_dims, num_dims));</div><div class='add'>+</div><div class='add'>+ transpose_dims:</div><div class='add'>+</div><div class='add'>+ num_dims = bt->num_dims;</div><div class='add'>+ for (i = 0; i < (int) num_dims; i++)</div><div class='add'>+ bt->dims[i] = max_dims [num_dims - i - 1];</div><div class='add'>+</div><div class='add'>+ return bt;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_transpose (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+ if (NULL != (at = transpose (at)))</div><div class='add'>+ (void) SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_inner_product_parms (SLang_Array_Type *a, int *dp,</div><div class='add'>+ unsigned int *loops, unsigned int *other)</div><div class='add'>+{</div><div class='add'>+ int num_dims;</div><div class='add'>+ int d;</div><div class='add'>+ </div><div class='add'>+ d = *dp;</div><div class='add'>+ </div><div class='add'>+ num_dims = (int)a->num_dims;</div><div class='add'>+ if (num_dims == 0) </div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Inner-product operation requires an array of at least 1 dimension.");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* An index of -1 refers to last dimension */</div><div class='add'>+ if (d == -1)</div><div class='add'>+ d += num_dims;</div><div class='add'>+ *dp = d;</div><div class='add'>+</div><div class='add'>+ if (a->num_elements == 0)</div><div class='add'>+ { /* [] # [] ==> [] */</div><div class='add'>+ *loops = *other = 0;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *loops = a->num_elements / a->dims[d];</div><div class='add'>+</div><div class='add'>+ if (d == 0)</div><div class='add'>+ {</div><div class='add'>+ *other = *loops; /* a->num_elements / a->dims[0]; */</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ *other = a->dims[d];</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This routines takes two arrays A_i..j and B_j..k and produces a third</div><div class='add'>+ * via C_i..k = A_i..j B_j..k.</div><div class='add'>+ * </div><div class='add'>+ * If A is a vector, and B is a 2-d matrix, then regard A as a 2-d matrix</div><div class='add'>+ * with 1-column.</div><div class='add'>+ */</div><div class='add'>+static void do_inner_product (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *a, *b, *c;</div><div class='add'>+ void (*fun)(SLang_Array_Type *, SLang_Array_Type *, SLang_Array_Type *,</div><div class='add'>+ unsigned int, unsigned int, unsigned int, unsigned int, </div><div class='add'>+ unsigned int);</div><div class='add'>+ unsigned char c_type;</div><div class='add'>+ int dims[SLARRAY_MAX_DIMS];</div><div class='add'>+ int status;</div><div class='add'>+ unsigned int a_loops, b_loops, b_inc, a_stride;</div><div class='add'>+ int ai_dims, i, j;</div><div class='add'>+ unsigned int num_dims, a_num_dims, b_num_dims;</div><div class='add'>+ int ai, bi;</div><div class='add'>+</div><div class='add'>+ /* The result of a inner_product will be either a float, double, or</div><div class='add'>+ * a complex number.</div><div class='add'>+ * </div><div class='add'>+ * If an integer array is used, it will be promoted to a float.</div><div class='add'>+ */</div><div class='add'>+ </div><div class='add'>+ switch (SLang_peek_at_stack1 ())</div><div class='add'>+ {</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ if (-1 == SLang_pop_array_of_type (&b, SLANG_DOUBLE_TYPE))</div><div class='add'>+ return;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ case SLANG_COMPLEX_TYPE:</div><div class='add'>+ if (-1 == SLang_pop_array_of_type (&b, SLANG_COMPLEX_TYPE))</div><div class='add'>+ return;</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ default:</div><div class='add'>+ if (-1 == SLang_pop_array_of_type (&b, SLANG_FLOAT_TYPE))</div><div class='add'>+ return;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ switch (SLang_peek_at_stack1 ())</div><div class='add'>+ {</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ status = SLang_pop_array_of_type (&a, SLANG_DOUBLE_TYPE);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ case SLANG_COMPLEX_TYPE:</div><div class='add'>+ status = SLang_pop_array_of_type (&a, SLANG_COMPLEX_TYPE);</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ default:</div><div class='add'>+ status = SLang_pop_array_of_type (&a, SLANG_FLOAT_TYPE);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (status == -1)</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (b);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ ai = -1; /* last index of a */</div><div class='add'>+ bi = 0; /* first index of b */</div><div class='add'>+ if ((-1 == get_inner_product_parms (a, &ai, &a_loops, &a_stride))</div><div class='add'>+ || (-1 == get_inner_product_parms (b, &bi, &b_loops, &b_inc)))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "Array dimensions are not compatible for inner-product");</div><div class='add'>+ goto free_and_return;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ a_num_dims = a->num_dims;</div><div class='add'>+ b_num_dims = b->num_dims;</div><div class='add'>+</div><div class='add'>+ /* Coerse a 1-d vector to 2-d */</div><div class='add'>+ if ((a_num_dims == 1) </div><div class='add'>+ && (b_num_dims == 2)</div><div class='add'>+ && (a->num_elements))</div><div class='add'>+ {</div><div class='add'>+ a_num_dims = 2;</div><div class='add'>+ ai = 1;</div><div class='add'>+ a_loops = a->num_elements;</div><div class='add'>+ a_stride = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((ai_dims = a->dims[ai]) != b->dims[bi])</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "Array dimensions are not compatible for inner-product");</div><div class='add'>+ goto free_and_return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ num_dims = a_num_dims + b_num_dims - 2;</div><div class='add'>+ if (num_dims > SLARRAY_MAX_DIMS)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "Inner-product result exceed max allowed dimensions");</div><div class='add'>+ goto free_and_return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (num_dims)</div><div class='add'>+ {</div><div class='add'>+ j = 0;</div><div class='add'>+ for (i = 0; i < (int)a_num_dims; i++)</div><div class='add'>+ if (i != ai) dims [j++] = a->dims[i];</div><div class='add'>+ for (i = 0; i < (int)b_num_dims; i++)</div><div class='add'>+ if (i != bi) dims [j++] = b->dims[i];</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ /* a scalar */</div><div class='add'>+ num_dims = 1;</div><div class='add'>+ dims[0] = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ c_type = 0; fun = NULL;</div><div class='add'>+ switch (a->data_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ switch (b->data_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ c_type = SLANG_FLOAT_TYPE;</div><div class='add'>+ fun = innerprod_float_float;</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ c_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+ fun = innerprod_float_double;</div><div class='add'>+ break;</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ case SLANG_COMPLEX_TYPE:</div><div class='add'>+ c_type = SLANG_COMPLEX_TYPE;</div><div class='add'>+ fun = innerprod_float_complex;</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ switch (b->data_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ c_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+ fun = innerprod_double_float;</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ c_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+ fun = innerprod_double_double;</div><div class='add'>+ break;</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ case SLANG_COMPLEX_TYPE:</div><div class='add'>+ c_type = SLANG_COMPLEX_TYPE;</div><div class='add'>+ fun = innerprod_double_complex;</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ case SLANG_COMPLEX_TYPE:</div><div class='add'>+ c_type = SLANG_COMPLEX_TYPE;</div><div class='add'>+ switch (b->data_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ fun = innerprod_complex_float;</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ fun = innerprod_complex_double;</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_COMPLEX_TYPE:</div><div class='add'>+ fun = innerprod_complex_complex;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ default:</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (c = SLang_create_array (c_type, 0, NULL, dims, num_dims)))</div><div class='add'>+ goto free_and_return;</div><div class='add'>+</div><div class='add'>+ (*fun)(a, b, c, a_loops, a_stride, b_loops, b_inc, ai_dims);</div><div class='add'>+</div><div class='add'>+ (void) SLang_push_array (c, 1);</div><div class='add'>+ /* drop */</div><div class='add'>+</div><div class='add'>+ free_and_return:</div><div class='add'>+ SLang_free_array (a);</div><div class='add'>+ SLang_free_array (b);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Array_Fun_Table [] =</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_1("transpose", array_transpose, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE),</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLang_init_array (void)</div><div class='add'>+{</div><div class='add'>+ if (-1 == SLadd_intrin_fun_table (Array_Fun_Table, "__SLARRAY__"))</div><div class='add'>+ return -1;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ _SLang_Matrix_Multiply = do_inner_product;</div><div class='add'>+#endif</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slarrfun.inc b/mdk-stage1/slang/slarrfun.inc<br/>new file mode 100644<br/>index 000000000..348473a6f<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slarrfun.inc?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarrfun.inc</a></div><div class='hunk'>@@ -0,0 +1,257 @@</div><div class='add'>+/* -*- mode: C -*- */</div><div class='add'>+</div><div class='add'>+/* Some "inline" functions for generic scalar types */</div><div class='add'>+</div><div class='add'>+#ifdef TRANSPOSE_2D_ARRAY</div><div class='add'>+static SLang_Array_Type *TRANSPOSE_2D_ARRAY (SLang_Array_Type *at, SLang_Array_Type *bt)</div><div class='add'>+{</div><div class='add'>+ GENERIC_TYPE *a_data, *b_data;</div><div class='add'>+ int nr, nc, i;</div><div class='add'>+</div><div class='add'>+ nr = at->dims[0];</div><div class='add'>+ nc = at->dims[1];</div><div class='add'>+</div><div class='add'>+ a_data = (GENERIC_TYPE *) at->data;</div><div class='add'>+ b_data = (GENERIC_TYPE *) bt->data;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < nr; i++)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE *offset = b_data + i;</div><div class='add'>+ int j;</div><div class='add'>+ for (j = 0; j < nc; j++)</div><div class='add'>+ {</div><div class='add'>+ *offset = *a_data++;</div><div class='add'>+ offset += nr;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ return bt;</div><div class='add'>+}</div><div class='add'>+#undef TRANSPOSE_2D_ARRAY</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#ifdef INNERPROD_FUNCTION</div><div class='add'>+</div><div class='add'>+static void INNERPROD_FUNCTION</div><div class='add'>+ (SLang_Array_Type *at, SLang_Array_Type *bt, SLang_Array_Type *ct,</div><div class='add'>+ unsigned int a_loops, unsigned int a_stride,</div><div class='add'>+ unsigned int b_loops, unsigned int b_inc,</div><div class='add'>+ unsigned int inner_loops)</div><div class='add'>+{</div><div class='add'>+ GENERIC_TYPE_A *a;</div><div class='add'>+ GENERIC_TYPE_B *b;</div><div class='add'>+ GENERIC_TYPE_C *c;</div><div class='add'>+</div><div class='add'>+ c = (GENERIC_TYPE_C *) ct->data;</div><div class='add'>+ b = (GENERIC_TYPE_B *) bt->data;</div><div class='add'>+ a = (GENERIC_TYPE_A *) at->data;</div><div class='add'>+ </div><div class='add'>+ while (a_loops--)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE_B *bb;</div><div class='add'>+ unsigned int j;</div><div class='add'>+</div><div class='add'>+ bb = b;</div><div class='add'>+</div><div class='add'>+ for (j = 0; j < inner_loops; j++)</div><div class='add'>+ {</div><div class='add'>+ double x = (double) a[j];</div><div class='add'>+</div><div class='add'>+ if (x != 0.0)</div><div class='add'>+ {</div><div class='add'>+ unsigned int k;</div><div class='add'>+</div><div class='add'>+ for (k = 0; k < b_loops; k++)</div><div class='add'>+ c[k] += x * bb[k];</div><div class='add'>+ }</div><div class='add'>+ bb += b_inc;</div><div class='add'>+ }</div><div class='add'>+ c += b_loops;</div><div class='add'>+ a += a_stride;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+#undef INNERPROD_FUNCTION</div><div class='add'>+</div><div class='add'>+#undef GENERIC_TYPE_A</div><div class='add'>+#undef GENERIC_TYPE_B</div><div class='add'>+#undef GENERIC_TYPE_C</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef INNERPROD_COMPLEX_A</div><div class='add'>+static void INNERPROD_COMPLEX_A</div><div class='add'>+ (SLang_Array_Type *at, SLang_Array_Type *bt, SLang_Array_Type *ct,</div><div class='add'>+ unsigned int a_loops, unsigned int a_stride,</div><div class='add'>+ unsigned int b_loops, unsigned int b_inc,</div><div class='add'>+ unsigned int inner_loops)</div><div class='add'>+{</div><div class='add'>+ double *a;</div><div class='add'>+ GENERIC_TYPE *b;</div><div class='add'>+ double *c;</div><div class='add'>+</div><div class='add'>+ c = (double *) ct->data;</div><div class='add'>+ b = (GENERIC_TYPE *) bt->data;</div><div class='add'>+ a = (double *) at->data;</div><div class='add'>+ </div><div class='add'>+ a_stride *= 2;</div><div class='add'>+</div><div class='add'>+ while (a_loops--)</div><div class='add'>+ {</div><div class='add'>+ GENERIC_TYPE *bb;</div><div class='add'>+ unsigned int bb_loops;</div><div class='add'>+</div><div class='add'>+ bb = b;</div><div class='add'>+ bb_loops = b_loops;</div><div class='add'>+ </div><div class='add'>+ while (bb_loops--)</div><div class='add'>+ {</div><div class='add'>+ double real_sum;</div><div class='add'>+ double imag_sum;</div><div class='add'>+ unsigned int iloops;</div><div class='add'>+ double *aa;</div><div class='add'>+ GENERIC_TYPE *bbb;</div><div class='add'>+ </div><div class='add'>+ aa = a;</div><div class='add'>+ bbb = bb;</div><div class='add'>+ iloops = inner_loops;</div><div class='add'>+</div><div class='add'>+ real_sum = 0.0;</div><div class='add'>+ imag_sum = 0.0;</div><div class='add'>+ while (iloops--)</div><div class='add'>+ {</div><div class='add'>+ real_sum += aa[0] * (double)bbb[0];</div><div class='add'>+ imag_sum += aa[1] * (double)bbb[0];</div><div class='add'>+ aa += 2;</div><div class='add'>+ bbb += b_inc;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *c++ = real_sum;</div><div class='add'>+ *c++ = imag_sum;</div><div class='add'>+ bb++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ a += a_stride;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void INNERPROD_A_COMPLEX</div><div class='add'>+ (SLang_Array_Type *at, SLang_Array_Type *bt, SLang_Array_Type *ct,</div><div class='add'>+ unsigned int a_loops, unsigned int a_stride,</div><div class='add'>+ unsigned int b_loops, unsigned int b_inc,</div><div class='add'>+ unsigned int inner_loops)</div><div class='add'>+{</div><div class='add'>+ GENERIC_TYPE *a;</div><div class='add'>+ double *b;</div><div class='add'>+ double *c;</div><div class='add'>+</div><div class='add'>+ c = (double *) ct->data;</div><div class='add'>+ b = (double *) bt->data;</div><div class='add'>+ a = (GENERIC_TYPE *) at->data;</div><div class='add'>+ </div><div class='add'>+ b_inc *= 2;</div><div class='add'>+</div><div class='add'>+ while (a_loops--)</div><div class='add'>+ {</div><div class='add'>+ double *bb;</div><div class='add'>+ unsigned int bb_loops;</div><div class='add'>+</div><div class='add'>+ bb = b;</div><div class='add'>+ bb_loops = b_loops;</div><div class='add'>+ </div><div class='add'>+ while (bb_loops--)</div><div class='add'>+ {</div><div class='add'>+ double real_sum;</div><div class='add'>+ double imag_sum;</div><div class='add'>+ unsigned int iloops;</div><div class='add'>+ GENERIC_TYPE *aa;</div><div class='add'>+ double *bbb;</div><div class='add'>+</div><div class='add'>+ aa = a;</div><div class='add'>+ bbb = bb;</div><div class='add'>+ iloops = inner_loops;</div><div class='add'>+</div><div class='add'>+ real_sum = 0.0;</div><div class='add'>+ imag_sum = 0.0;</div><div class='add'>+ while (iloops--)</div><div class='add'>+ {</div><div class='add'>+ real_sum += (double)aa[0] * bbb[0];</div><div class='add'>+ imag_sum += (double)aa[0] * bbb[1];</div><div class='add'>+ aa += 1;</div><div class='add'>+ bbb += b_inc;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *c++ = real_sum;</div><div class='add'>+ *c++ = imag_sum;</div><div class='add'>+ bb += 2;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ a += a_stride;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#undef INNERPROD_A_COMPLEX</div><div class='add'>+#undef INNERPROD_COMPLEX_A</div><div class='add'>+#endif /* INNERPROD_COMPLEX_A */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#ifdef INNERPROD_COMPLEX_COMPLEX</div><div class='add'>+static void INNERPROD_COMPLEX_COMPLEX</div><div class='add'>+ (SLang_Array_Type *at, SLang_Array_Type *bt, SLang_Array_Type *ct,</div><div class='add'>+ unsigned int a_loops, unsigned int a_stride,</div><div class='add'>+ unsigned int b_loops, unsigned int b_inc,</div><div class='add'>+ unsigned int inner_loops)</div><div class='add'>+{</div><div class='add'>+ double *a;</div><div class='add'>+ double *b;</div><div class='add'>+ double *c;</div><div class='add'>+</div><div class='add'>+ c = (double *) ct->data;</div><div class='add'>+ b = (double *) bt->data;</div><div class='add'>+ a = (double *) at->data;</div><div class='add'>+ </div><div class='add'>+ a_stride *= 2;</div><div class='add'>+ b_inc *= 2;</div><div class='add'>+</div><div class='add'>+ while (a_loops--)</div><div class='add'>+ {</div><div class='add'>+ double *bb;</div><div class='add'>+ unsigned int bb_loops;</div><div class='add'>+</div><div class='add'>+ bb = b;</div><div class='add'>+ bb_loops = b_loops;</div><div class='add'>+ </div><div class='add'>+ while (bb_loops--)</div><div class='add'>+ {</div><div class='add'>+ double real_sum;</div><div class='add'>+ double imag_sum;</div><div class='add'>+ unsigned int iloops;</div><div class='add'>+ double *aa;</div><div class='add'>+ double *bbb;</div><div class='add'>+</div><div class='add'>+ aa = a;</div><div class='add'>+ bbb = bb;</div><div class='add'>+ iloops = inner_loops;</div><div class='add'>+</div><div class='add'>+ real_sum = 0.0;</div><div class='add'>+ imag_sum = 0.0;</div><div class='add'>+ while (iloops--)</div><div class='add'>+ {</div><div class='add'>+ real_sum += aa[0]*bbb[0] - aa[1]*bbb[1];</div><div class='add'>+ imag_sum += aa[0]*bbb[1] + aa[1]*bbb[0];</div><div class='add'>+ aa += 2;</div><div class='add'>+ bbb += b_inc;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *c++ = real_sum;</div><div class='add'>+ *c++ = imag_sum;</div><div class='add'>+ bb += 2;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ a += a_stride;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+#undef INNERPROD_COMPLEX_COMPLEX</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef GENERIC_TYPE</div><div class='add'>+# undef GENERIC_TYPE</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slarrmis.c b/mdk-stage1/slang/slarrmis.c<br/>new file mode 100644<br/>index 000000000..330dcb53f<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slarrmis.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarrmis.c</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+/* Misc Array Functions */</div><div class='add'>+/* Copyright (c) 1997, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+int SLang_get_array_element (SLang_Array_Type *at, int *indices, VOID_STAR data)</div><div class='add'>+{</div><div class='add'>+ int is_ptr;</div><div class='add'>+</div><div class='add'>+ if ((at == NULL)</div><div class='add'>+ || (indices == NULL)</div><div class='add'>+ || (data == NULL))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+ if (is_ptr) *(VOID_STAR *) data = NULL;</div><div class='add'>+ return _SLarray_aget_transfer_elem (at, indices, data, at->sizeof_type, is_ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_set_array_element (SLang_Array_Type *at, int *indices, VOID_STAR data)</div><div class='add'>+{</div><div class='add'>+ if ((at == NULL)</div><div class='add'>+ || (indices == NULL)</div><div class='add'>+ || (data == NULL))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ return _SLarray_aput_transfer_elem (at, indices, data, at->sizeof_type,</div><div class='add'>+ at->flags & SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slassoc.c b/mdk-stage1/slang/slassoc.c<br/>new file mode 100644<br/>index 000000000..5997458d2<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slassoc.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slassoc.c</a></div><div class='hunk'>@@ -0,0 +1,713 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#define SL_APP_WANTS_FOREACH</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#define USE_NEW_ANYTYPE_CODE 1</div><div class='add'>+</div><div class='add'>+typedef struct _SLAssoc_Array_Element_Type</div><div class='add'>+{</div><div class='add'>+ char *key; /* slstring */</div><div class='add'>+ struct _SLAssoc_Array_Element_Type *next;</div><div class='add'>+ SLang_Object_Type value;</div><div class='add'>+}</div><div class='add'>+_SLAssoc_Array_Element_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ _SLAssoc_Array_Element_Type *elements[SLASSOC_HASH_TABLE_SIZE];</div><div class='add'>+ SLang_Object_Type default_value;</div><div class='add'>+ unsigned int num_elements;</div><div class='add'>+#define HAS_DEFAULT_VALUE 1</div><div class='add'>+ unsigned int flags;</div><div class='add'>+ unsigned char type;</div><div class='add'>+}</div><div class='add'>+SLang_Assoc_Array_Type;</div><div class='add'>+</div><div class='add'>+#define USE_CACHED_STRING 1</div><div class='add'>+</div><div class='add'>+#if USE_CACHED_STRING </div><div class='add'>+static char *Cached_String;</div><div class='add'>+static SLang_Object_Type *Cached_Obj;</div><div class='add'>+static SLang_Assoc_Array_Type *Cached_Array;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_Assoc_Array_Type *alloc_assoc_array (unsigned char type, int has_default_value)</div><div class='add'>+{</div><div class='add'>+ SLang_Assoc_Array_Type *a;</div><div class='add'>+</div><div class='add'>+ a = (SLang_Assoc_Array_Type *)SLmalloc (sizeof (SLang_Assoc_Array_Type));</div><div class='add'>+ if (a == NULL)</div><div class='add'>+ {</div><div class='add'>+ if (has_default_value)</div><div class='add'>+ SLdo_pop_n (1);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ memset ((char *) a, 0, sizeof (SLang_Assoc_Array_Type));</div><div class='add'>+ a->type = type;</div><div class='add'>+</div><div class='add'>+ if (has_default_value)</div><div class='add'>+ {</div><div class='add'>+ if (</div><div class='add'>+#if USE_NEW_ANYTYPE_CODE</div><div class='add'>+ ((type != SLANG_ANY_TYPE) && (-1 == SLclass_typecast (type, 1, 1)))</div><div class='add'>+#else</div><div class='add'>+ (-1 == SLclass_typecast (type, 1, 1))</div><div class='add'>+#endif</div><div class='add'>+ || (-1 == SLang_pop (&a->default_value)))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) a);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ a->flags |= HAS_DEFAULT_VALUE;</div><div class='add'>+ }</div><div class='add'>+ return a;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void free_element (_SLAssoc_Array_Element_Type *e)</div><div class='add'>+{</div><div class='add'>+ if (e == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ SLang_free_object (&e->value);</div><div class='add'>+ SLang_free_slstring (e->key);</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+ if (e->key == Cached_String)</div><div class='add'>+ Cached_String = NULL;</div><div class='add'>+#endif</div><div class='add'>+ SLfree ((char *)e);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void delete_assoc_array (SLang_Assoc_Array_Type *a)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ if (a == NULL) return;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < SLASSOC_HASH_TABLE_SIZE; i++)</div><div class='add'>+ {</div><div class='add'>+ _SLAssoc_Array_Element_Type *e;</div><div class='add'>+</div><div class='add'>+ e = a->elements[i];</div><div class='add'>+ while (e != NULL)</div><div class='add'>+ {</div><div class='add'>+ _SLAssoc_Array_Element_Type *next_e;</div><div class='add'>+</div><div class='add'>+ next_e = e->next;</div><div class='add'>+ free_element (e);</div><div class='add'>+ e = next_e;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ if (a->flags & HAS_DEFAULT_VALUE)</div><div class='add'>+ SLang_free_object (&a->default_value);</div><div class='add'>+</div><div class='add'>+ SLfree ((char *) a);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static SLang_Object_Type *</div><div class='add'>+find_element (SLang_Assoc_Array_Type *a, char *str, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ unsigned int h;</div><div class='add'>+ _SLAssoc_Array_Element_Type *e;</div><div class='add'>+</div><div class='add'>+ h = (unsigned int) (hash % SLASSOC_HASH_TABLE_SIZE);</div><div class='add'>+ e = a->elements[h];</div><div class='add'>+</div><div class='add'>+ while (e != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (str == e->key) /* slstrings can be compared this way */</div><div class='add'>+ {</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+ Cached_String = str;</div><div class='add'>+ Cached_Obj = &e->value;</div><div class='add'>+ Cached_Array = a;</div><div class='add'>+#endif</div><div class='add'>+ return &e->value;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ e = e->next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static _SLAssoc_Array_Element_Type *</div><div class='add'>+create_element (SLang_Assoc_Array_Type *a, char *str, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ unsigned int h;</div><div class='add'>+ _SLAssoc_Array_Element_Type *e;</div><div class='add'>+</div><div class='add'>+ e = (_SLAssoc_Array_Element_Type *) SLmalloc (sizeof (_SLAssoc_Array_Element_Type));</div><div class='add'>+ if (e == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ memset ((char *) e, 0, sizeof (_SLAssoc_Array_Element_Type));</div><div class='add'>+ h = (unsigned int) (hash % SLASSOC_HASH_TABLE_SIZE);</div><div class='add'>+</div><div class='add'>+ if (NULL == (str = _SLstring_dup_hashed_string (str, hash)))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) e);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ e->key = str;</div><div class='add'>+ e->next = a->elements[h];</div><div class='add'>+ a->elements[h] = e;</div><div class='add'>+</div><div class='add'>+ a->num_elements += 1;</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+ Cached_String = str;</div><div class='add'>+ Cached_Obj = &e->value;</div><div class='add'>+ Cached_Array = a;</div><div class='add'>+#endif</div><div class='add'>+ return e;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int store_object (SLang_Assoc_Array_Type *a, char *s, SLang_Object_Type *obj)</div><div class='add'>+{</div><div class='add'>+ unsigned long hash;</div><div class='add'>+ SLang_Object_Type *v;</div><div class='add'>+</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+ if ((s == Cached_String) && (a == Cached_Array))</div><div class='add'>+ {</div><div class='add'>+ v = Cached_Obj;</div><div class='add'>+ SLang_free_object (v);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+#endif</div><div class='add'>+ hash = _SLcompute_string_hash (s);</div><div class='add'>+ if (NULL != (v = find_element (a, s, hash)))</div><div class='add'>+ SLang_free_object (v);</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ _SLAssoc_Array_Element_Type *e;</div><div class='add'>+ </div><div class='add'>+ e = create_element (a, s, hash);</div><div class='add'>+ if (e == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ v = &e->value;</div><div class='add'>+ }</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ *v = *obj;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void assoc_destroy (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ delete_assoc_array ((SLang_Assoc_Array_Type *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_index (unsigned int num_indices,</div><div class='add'>+ SLang_MMT_Type **mmt,</div><div class='add'>+ SLang_Assoc_Array_Type **a,</div><div class='add'>+ char **str)</div><div class='add'>+{</div><div class='add'>+ if (NULL == (*mmt = SLang_pop_mmt (SLANG_ASSOC_TYPE)))</div><div class='add'>+ {</div><div class='add'>+ *a = NULL;</div><div class='add'>+ *str = NULL;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((num_indices != 1)</div><div class='add'>+ || (-1 == SLang_pop_slstring (str)))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "Assoc_Type arrays require a single string index");</div><div class='add'>+ SLang_free_mmt (*mmt);</div><div class='add'>+ *mmt = NULL;</div><div class='add'>+ *a = NULL;</div><div class='add'>+ *str = NULL;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *a = (SLang_Assoc_Array_Type *) SLang_object_from_mmt (*mmt);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int assoc_aget (unsigned char type, unsigned int num_indices)</div><div class='add'>+{</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+ char *str;</div><div class='add'>+ SLang_Assoc_Array_Type *a;</div><div class='add'>+ SLang_Object_Type *obj;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_index (num_indices, &mmt, &a, &str))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+ if ((str == Cached_String) && (a == Cached_Array))</div><div class='add'>+ obj = Cached_Obj;</div><div class='add'>+ else</div><div class='add'>+#endif</div><div class='add'>+ obj = find_element (a, str, _SLcompute_string_hash (str));</div><div class='add'>+</div><div class='add'>+ if ((obj == NULL)</div><div class='add'>+ && (a->flags & HAS_DEFAULT_VALUE))</div><div class='add'>+ obj = &a->default_value;</div><div class='add'>+</div><div class='add'>+ if (obj == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INTRINSIC_ERROR,</div><div class='add'>+ "No such element in Assoc Array: %s", str);</div><div class='add'>+ ret = -1;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type[obj->data_type])</div><div class='add'>+ ret = SLang_push (obj);</div><div class='add'>+#endif</div><div class='add'>+ else</div><div class='add'>+ ret = _SLpush_slang_obj (obj);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_free_slstring (str);</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int assoc_aput (unsigned char type, unsigned int num_indices)</div><div class='add'>+{</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+ char *str;</div><div class='add'>+ SLang_Assoc_Array_Type *a;</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_index (num_indices, &mmt, &a, &str))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ ret = -1;</div><div class='add'>+</div><div class='add'>+ if (0 == SLang_pop (&obj))</div><div class='add'>+ {</div><div class='add'>+ if ((obj.data_type != a->type)</div><div class='add'>+#if USE_NEW_ANYTYPE_CODE</div><div class='add'>+ && (a->type != SLANG_ANY_TYPE)</div><div class='add'>+#endif</div><div class='add'>+ )</div><div class='add'>+ {</div><div class='add'>+ (void) SLang_push (&obj);</div><div class='add'>+ if ((-1 == SLclass_typecast (a->type, 1, 1))</div><div class='add'>+ || (-1 == SLang_pop (&obj)))</div><div class='add'>+ goto the_return;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (-1 == store_object (a, str, &obj))</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ else</div><div class='add'>+ ret = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ the_return:</div><div class='add'>+ SLang_free_slstring (str);</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int assoc_anew (unsigned char type, unsigned int num_dims)</div><div class='add'>+{</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+ SLang_Assoc_Array_Type *a;</div><div class='add'>+ int has_default_value;</div><div class='add'>+</div><div class='add'>+ has_default_value = 0;</div><div class='add'>+ switch (num_dims)</div><div class='add'>+ {</div><div class='add'>+ case 0:</div><div class='add'>+ type = SLANG_ANY_TYPE;</div><div class='add'>+ break;</div><div class='add'>+ case 2:</div><div class='add'>+ (void) SLreverse_stack (2);</div><div class='add'>+ has_default_value = 1;</div><div class='add'>+ /* drop */</div><div class='add'>+ case 1:</div><div class='add'>+ if (0 == _SLang_pop_datatype (&type))</div><div class='add'>+ break;</div><div class='add'>+ num_dims--;</div><div class='add'>+ /* drop */</div><div class='add'>+ default:</div><div class='add'>+ SLdo_pop_n (num_dims);</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "Usage: Assoc_Type [DataType_Type]");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ a = alloc_assoc_array (type, has_default_value);</div><div class='add'>+ if (a == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (NULL == (mmt = SLang_create_mmt (SLANG_ASSOC_TYPE, (VOID_STAR) a)))</div><div class='add'>+ {</div><div class='add'>+ delete_assoc_array (a);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_push_mmt (mmt))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void assoc_get_keys (SLang_Assoc_Array_Type *a)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int num;</div><div class='add'>+ unsigned int i, j;</div><div class='add'>+ char **data;</div><div class='add'>+</div><div class='add'>+ /* Note: If support for threads is added, then we need to modify this</div><div class='add'>+ * algorithm to prevent another thread from modifying the array.</div><div class='add'>+ * However, that should be handled in inner_interp.</div><div class='add'>+ */</div><div class='add'>+ num = a->num_elements;</div><div class='add'>+</div><div class='add'>+ if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, NULL, &num, 1)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ data = (char **)at->data;</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ for (j = 0; j < SLASSOC_HASH_TABLE_SIZE; j++)</div><div class='add'>+ {</div><div class='add'>+ _SLAssoc_Array_Element_Type *e;</div><div class='add'>+</div><div class='add'>+ e = a->elements[j];</div><div class='add'>+ while (e != NULL)</div><div class='add'>+ {</div><div class='add'>+ /* Next cannot fail because it is an slstring */</div><div class='add'>+ data [i] = SLang_create_slstring (e->key);</div><div class='add'>+ e = e->next;</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ (void) SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+transfer_element (SLang_Class_Type *cl, VOID_STAR dest_data,</div><div class='add'>+ SLang_Object_Type *obj)</div><div class='add'>+{</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+ VOID_STAR src_data;</div><div class='add'>+</div><div class='add'>+#if USE_NEW_ANYTYPE_CODE</div><div class='add'>+ if (cl->cl_data_type == SLANG_ANY_TYPE)</div><div class='add'>+ {</div><div class='add'>+ SLang_Any_Type *any;</div><div class='add'>+</div><div class='add'>+ if ((-1 == _SLpush_slang_obj (obj))</div><div class='add'>+ || (-1 == SLang_pop_anytype (&any)))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ *(SLang_Any_Type **)dest_data = any;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ /* Optimize for scalar */</div><div class='add'>+ if (cl->cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+ {</div><div class='add'>+ sizeof_type = cl->cl_sizeof_type;</div><div class='add'>+ memcpy ((char *) dest_data, (char *)&obj->v, sizeof_type);</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ src_data = _SLclass_get_ptr_to_value (cl, obj);</div><div class='add'>+</div><div class='add'>+ if (-1 == (*cl->cl_acopy) (cl->cl_data_type, src_data, dest_data))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void assoc_get_values (SLang_Assoc_Array_Type *a)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int num;</div><div class='add'>+ unsigned int i, j;</div><div class='add'>+ char *dest_data;</div><div class='add'>+ unsigned char type;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+</div><div class='add'>+ /* Note: If support for threads is added, then we need to modify this</div><div class='add'>+ * algorithm to prevent another thread from modifying the array.</div><div class='add'>+ * However, that should be handled in inner_interp.</div><div class='add'>+ */</div><div class='add'>+ num = a->num_elements;</div><div class='add'>+ type = a->type;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ sizeof_type = cl->cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+ if (NULL == (at = SLang_create_array (type, 0, NULL, &num, 1)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ dest_data = (char *)at->data;</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ for (j = 0; j < SLASSOC_HASH_TABLE_SIZE; j++)</div><div class='add'>+ {</div><div class='add'>+ _SLAssoc_Array_Element_Type *e;</div><div class='add'>+</div><div class='add'>+ e = a->elements[j];</div><div class='add'>+ while (e != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == transfer_element (cl, (VOID_STAR) dest_data, &e->value))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ dest_data += sizeof_type;</div><div class='add'>+ e = e->next;</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ (void) SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int assoc_key_exists (SLang_Assoc_Array_Type *a, char *key)</div><div class='add'>+{</div><div class='add'>+ return (NULL != find_element (a, key, _SLcompute_string_hash (key)));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void assoc_delete_key (SLang_Assoc_Array_Type *a, char *key)</div><div class='add'>+{</div><div class='add'>+ unsigned int h;</div><div class='add'>+ _SLAssoc_Array_Element_Type *v, *v0;</div><div class='add'>+</div><div class='add'>+ h = (unsigned int) (_SLcompute_string_hash (key) % SLASSOC_HASH_TABLE_SIZE);</div><div class='add'>+</div><div class='add'>+ v0 = NULL;</div><div class='add'>+ v = a->elements[h];</div><div class='add'>+ while (v != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (v->key == key)</div><div class='add'>+ {</div><div class='add'>+ if (v0 != NULL)</div><div class='add'>+ v0->next = v->next;</div><div class='add'>+ else</div><div class='add'>+ a->elements[h] = v->next;</div><div class='add'>+</div><div class='add'>+ free_element (v);</div><div class='add'>+ a->num_elements -= 1;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ v0 = v;</div><div class='add'>+ v = v->next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* No such element. Let it pass with no error. */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define A SLANG_ASSOC_TYPE</div><div class='add'>+#define S SLANG_STRING_TYPE</div><div class='add'>+static SLang_Intrin_Fun_Type Assoc_Table [] =</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_1("assoc_get_keys", assoc_get_keys, SLANG_VOID_TYPE, A),</div><div class='add'>+ MAKE_INTRINSIC_1("assoc_get_values", assoc_get_values, SLANG_VOID_TYPE, A),</div><div class='add'>+ MAKE_INTRINSIC_2("assoc_key_exists", assoc_key_exists, SLANG_INT_TYPE, A, S),</div><div class='add'>+ MAKE_INTRINSIC_2("assoc_delete_key", assoc_delete_key, SLANG_VOID_TYPE, A, S),</div><div class='add'>+</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+#undef A</div><div class='add'>+#undef S</div><div class='add'>+</div><div class='add'>+static int assoc_length (unsigned char type, VOID_STAR v, unsigned int *len)</div><div class='add'>+{</div><div class='add'>+ SLang_Assoc_Array_Type *a;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ a = (SLang_Assoc_Array_Type *) SLang_object_from_mmt (*(SLang_MMT_Type **)v);</div><div class='add'>+ *len = a->num_elements;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct _SLang_Foreach_Context_Type</div><div class='add'>+{</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+ SLang_Assoc_Array_Type *a;</div><div class='add'>+ unsigned int this_hash_index;</div><div class='add'>+ unsigned int next_same_hash_index;</div><div class='add'>+#define CTX_WRITE_KEYS 1</div><div class='add'>+#define CTX_WRITE_VALUES 2</div><div class='add'>+ unsigned char flags;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static SLang_Foreach_Context_Type *</div><div class='add'>+cl_foreach_open (unsigned char type, unsigned int num)</div><div class='add'>+{</div><div class='add'>+ SLang_Foreach_Context_Type *c;</div><div class='add'>+ unsigned char flags;</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+</div><div class='add'>+ if (NULL == (mmt = SLang_pop_mmt (SLANG_ASSOC_TYPE)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ flags = 0;</div><div class='add'>+</div><div class='add'>+ while (num--)</div><div class='add'>+ {</div><div class='add'>+ char *s;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_slstring (&s))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (0 == strcmp (s, "keys"))</div><div class='add'>+ flags |= CTX_WRITE_KEYS;</div><div class='add'>+ else if (0 == strcmp (s, "values"))</div><div class='add'>+ flags |= CTX_WRITE_VALUES;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "using '%s' not supported by SLassoc_Type",</div><div class='add'>+ s);</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (c = (SLang_Foreach_Context_Type *) SLmalloc (sizeof (SLang_Foreach_Context_Type))))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+</div><div class='add'>+ if (flags == 0) flags = CTX_WRITE_VALUES|CTX_WRITE_KEYS;</div><div class='add'>+</div><div class='add'>+ c->flags = flags;</div><div class='add'>+ c->mmt = mmt;</div><div class='add'>+ c->a = (SLang_Assoc_Array_Type *) SLang_object_from_mmt (mmt);</div><div class='add'>+</div><div class='add'>+ return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void cl_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ if (c == NULL) return;</div><div class='add'>+ SLang_free_mmt (c->mmt);</div><div class='add'>+ SLfree ((char *) c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int cl_foreach (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+ SLang_Assoc_Array_Type *a;</div><div class='add'>+ _SLAssoc_Array_Element_Type *e;</div><div class='add'>+ unsigned int i, j;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+</div><div class='add'>+ if (c == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ a = c->a;</div><div class='add'>+</div><div class='add'>+ i = c->this_hash_index;</div><div class='add'>+ if (i >= SLASSOC_HASH_TABLE_SIZE)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ e = a->elements[i];</div><div class='add'>+</div><div class='add'>+ j = c->next_same_hash_index;</div><div class='add'>+ c->next_same_hash_index = j + 1;</div><div class='add'>+</div><div class='add'>+ while ((j > 0) && (e != NULL))</div><div class='add'>+ {</div><div class='add'>+ j--;</div><div class='add'>+ e = e->next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (e == NULL)</div><div class='add'>+ {</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ i++;</div><div class='add'>+ if (i >= SLASSOC_HASH_TABLE_SIZE)</div><div class='add'>+ return 0; /* no more */</div><div class='add'>+ }</div><div class='add'>+ while (a->elements [i] == NULL);</div><div class='add'>+</div><div class='add'>+ e = a->elements[i];</div><div class='add'>+ c->this_hash_index = i;</div><div class='add'>+ c->next_same_hash_index = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((c->flags & CTX_WRITE_KEYS)</div><div class='add'>+ && (-1 == SLang_push_string (e->key)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((c->flags & CTX_WRITE_VALUES)</div><div class='add'>+ && (-1 == _SLpush_slang_obj (&e->value)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* keep going */</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_init_slassoc (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (SLclass_is_class_defined (SLANG_ASSOC_TYPE))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("Assoc_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ (void) SLclass_set_destroy_function (cl, assoc_destroy);</div><div class='add'>+ (void) SLclass_set_aput_function (cl, assoc_aput);</div><div class='add'>+ (void) SLclass_set_aget_function (cl, assoc_aget);</div><div class='add'>+ (void) SLclass_set_anew_function (cl, assoc_anew);</div><div class='add'>+ cl->cl_length = assoc_length;</div><div class='add'>+ cl->cl_foreach_open = cl_foreach_open;</div><div class='add'>+ cl->cl_foreach_close = cl_foreach_close;</div><div class='add'>+ cl->cl_foreach = cl_foreach;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_ASSOC_TYPE, sizeof (SLang_Assoc_Array_Type), SLANG_CLASS_TYPE_MMT))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLadd_intrin_fun_table (Assoc_Table, "__SLASSOC__"))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slbstr.c b/mdk-stage1/slang/slbstr.c<br/>new file mode 100644<br/>index 000000000..b4b8c4c51<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slbstr.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slbstr.c</a></div><div class='hunk'>@@ -0,0 +1,615 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+struct _SLang_BString_Type</div><div class='add'>+{</div><div class='add'>+ unsigned int num_refs;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ int ptr_type;</div><div class='add'>+#define IS_SLSTRING 1</div><div class='add'>+#define IS_MALLOCED 2</div><div class='add'>+#define IS_NOT_TO_BE_FREED 3</div><div class='add'>+ union</div><div class='add'>+ {</div><div class='add'>+ unsigned char bytes[1];</div><div class='add'>+ unsigned char *ptr;</div><div class='add'>+ }</div><div class='add'>+ v;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define BS_GET_POINTER(b) ((b)->ptr_type ? (b)->v.ptr : (b)->v.bytes)</div><div class='add'>+</div><div class='add'>+static SLang_BString_Type *create_bstring_of_type (char *bytes, unsigned int len, int type)</div><div class='add'>+{</div><div class='add'>+ SLang_BString_Type *b;</div><div class='add'>+ unsigned int size;</div><div class='add'>+</div><div class='add'>+ size = sizeof(SLang_BString_Type);</div><div class='add'>+ if (type == 0)</div><div class='add'>+ size += len;</div><div class='add'>+</div><div class='add'>+ if (NULL == (b = (SLang_BString_Type *)SLmalloc (size)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ b->len = len;</div><div class='add'>+ b->num_refs = 1;</div><div class='add'>+ b->ptr_type = type;</div><div class='add'>+</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case 0:</div><div class='add'>+ if (bytes != NULL) memcpy ((char *) b->v.bytes, bytes, len);</div><div class='add'>+ /* Now \0 terminate it because we want to also use it as a C string</div><div class='add'>+ * whenever possible. Note that sizeof(SLang_BString_Type) includes</div><div class='add'>+ * space for 1 character and we allocated len extra bytes. Thus, it is</div><div class='add'>+ * ok to add a \0 to the end.</div><div class='add'>+ */</div><div class='add'>+ b->v.bytes[len] = 0;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case IS_SLSTRING:</div><div class='add'>+ if (NULL == (b->v.ptr = (unsigned char *)SLang_create_nslstring (bytes, len)))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) b);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case IS_MALLOCED:</div><div class='add'>+ case IS_NOT_TO_BE_FREED:</div><div class='add'>+ b->v.ptr = (unsigned char *)bytes;</div><div class='add'>+ bytes [len] = 0; /* NULL terminate */</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_BString_Type *</div><div class='add'>+SLbstring_create (unsigned char *bytes, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ return create_bstring_of_type ((char *)bytes, len, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note that ptr must be len + 1 bytes long for \0 termination */</div><div class='add'>+SLang_BString_Type *</div><div class='add'>+SLbstring_create_malloced (unsigned char *ptr, unsigned int len, int free_on_error)</div><div class='add'>+{</div><div class='add'>+ SLang_BString_Type *b;</div><div class='add'>+</div><div class='add'>+ if (ptr == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ if (NULL == (b = create_bstring_of_type ((char *)ptr, len, IS_MALLOCED)))</div><div class='add'>+ {</div><div class='add'>+ if (free_on_error)</div><div class='add'>+ SLfree ((char *) ptr);</div><div class='add'>+ }</div><div class='add'>+ return b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_BString_Type *SLbstring_create_slstring (char *s)</div><div class='add'>+{</div><div class='add'>+ if (s == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ return create_bstring_of_type (s, strlen (s), IS_SLSTRING);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_BString_Type *SLbstring_dup (SLang_BString_Type *b)</div><div class='add'>+{</div><div class='add'>+ if (b != NULL)</div><div class='add'>+ b->num_refs += 1;</div><div class='add'>+</div><div class='add'>+ return b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned char *SLbstring_get_pointer (SLang_BString_Type *b, unsigned int *len)</div><div class='add'>+{</div><div class='add'>+ if (b == NULL)</div><div class='add'>+ {</div><div class='add'>+ *len = 0;</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ *len = b->len;</div><div class='add'>+ return BS_GET_POINTER(b);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLbstring_free (SLang_BString_Type *b)</div><div class='add'>+{</div><div class='add'>+ if (b == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (b->num_refs > 1)</div><div class='add'>+ {</div><div class='add'>+ b->num_refs -= 1;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ switch (b->ptr_type)</div><div class='add'>+ {</div><div class='add'>+ case 0:</div><div class='add'>+ case IS_NOT_TO_BE_FREED:</div><div class='add'>+ default:</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case IS_SLSTRING:</div><div class='add'>+ SLang_free_slstring ((char *)b->v.ptr);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case IS_MALLOCED:</div><div class='add'>+ SLfree ((char *)b->v.ptr);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLfree ((char *) b);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_bstring (SLang_BString_Type **b)</div><div class='add'>+{</div><div class='add'>+ return SLclass_pop_ptr_obj (SLANG_BSTRING_TYPE, (VOID_STAR *)b);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_bstring (SLang_BString_Type *b)</div><div class='add'>+{</div><div class='add'>+ if (b == NULL)</div><div class='add'>+ return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+ b->num_refs += 1;</div><div class='add'>+</div><div class='add'>+ if (0 == SLclass_push_ptr_obj (SLANG_BSTRING_TYPE, (VOID_STAR)b))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ b->num_refs -= 1;</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+bstring_bstring_bin_op_result (int op, unsigned char a, unsigned char b,</div><div class='add'>+ unsigned char *c)</div><div class='add'>+{</div><div class='add'>+ (void) a;</div><div class='add'>+ (void) b;</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLANG_PLUS:</div><div class='add'>+ *c = SLANG_BSTRING_TYPE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_GT:</div><div class='add'>+ case SLANG_GE:</div><div class='add'>+ case SLANG_LT:</div><div class='add'>+ case SLANG_LE:</div><div class='add'>+ case SLANG_EQ:</div><div class='add'>+ case SLANG_NE:</div><div class='add'>+ *c = SLANG_CHAR_TYPE;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int compare_bstrings (SLang_BString_Type *a, SLang_BString_Type *b)</div><div class='add'>+{</div><div class='add'>+ unsigned int len;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ len = a->len;</div><div class='add'>+ if (b->len < len) len = b->len;</div><div class='add'>+</div><div class='add'>+ ret = memcmp ((char *)BS_GET_POINTER(b), (char *)BS_GET_POINTER(a), len);</div><div class='add'>+ if (ret != 0)</div><div class='add'>+ return ret;</div><div class='add'>+</div><div class='add'>+ if (a->len > b->len)</div><div class='add'>+ return 1;</div><div class='add'>+ if (a->len == b->len)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_BString_Type *</div><div class='add'>+concat_bstrings (SLang_BString_Type *a, SLang_BString_Type *b)</div><div class='add'>+{</div><div class='add'>+ unsigned int len;</div><div class='add'>+ SLang_BString_Type *c;</div><div class='add'>+ char *bytes;</div><div class='add'>+</div><div class='add'>+ len = a->len + b->len;</div><div class='add'>+</div><div class='add'>+ if (NULL == (c = SLbstring_create (NULL, len)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ bytes = (char *)BS_GET_POINTER(c);</div><div class='add'>+</div><div class='add'>+ memcpy (bytes, (char *)BS_GET_POINTER(a), a->len);</div><div class='add'>+ memcpy (bytes + a->len, (char *)BS_GET_POINTER(b), b->len);</div><div class='add'>+</div><div class='add'>+ return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void free_n_bstrings (SLang_BString_Type **a, unsigned int n)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ if (a == NULL) return;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < n; i++)</div><div class='add'>+ {</div><div class='add'>+ SLbstring_free (a[i]);</div><div class='add'>+ a[i] = NULL;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+bstring_bstring_bin_op (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ char *ic;</div><div class='add'>+ SLang_BString_Type **a, **b, **c;</div><div class='add'>+ unsigned int n, n_max;</div><div class='add'>+ unsigned int da, db;</div><div class='add'>+</div><div class='add'>+ (void) a_type;</div><div class='add'>+ (void) b_type;</div><div class='add'>+</div><div class='add'>+ if (na == 1) da = 0; else da = 1;</div><div class='add'>+ if (nb == 1) db = 0; else db = 1;</div><div class='add'>+</div><div class='add'>+ if (na > nb) n_max = na; else n_max = nb;</div><div class='add'>+</div><div class='add'>+ a = (SLang_BString_Type **) ap;</div><div class='add'>+ b = (SLang_BString_Type **) bp;</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if ((*a == NULL) || (*b == NULL))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_VARIABLE_UNINITIALIZED,</div><div class='add'>+ "Binary string element[%u] not initialized for binary operation", n);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ a = (SLang_BString_Type **) ap;</div><div class='add'>+ b = (SLang_BString_Type **) bp;</div><div class='add'>+ ic = (char *) cp;</div><div class='add'>+ c = NULL;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_PLUS:</div><div class='add'>+ /* Concat */</div><div class='add'>+ c = (SLang_BString_Type **) cp;</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (NULL == (c[n] = concat_bstrings (*a, *b)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_NE:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ ic [n] = (0 != compare_bstrings (*a, *b));</div><div class='add'>+ a += da;</div><div class='add'>+ b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_GT:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ ic [n] = (compare_bstrings (*a, *b) > 0);</div><div class='add'>+ a += da;</div><div class='add'>+ b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_GE:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ ic [n] = (compare_bstrings (*a, *b) >= 0);</div><div class='add'>+ a += da;</div><div class='add'>+ b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_LT:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ ic [n] = (compare_bstrings (*a, *b) < 0);</div><div class='add'>+ a += da;</div><div class='add'>+ b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_LE:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ ic [n] = (compare_bstrings (*a, *b) <= 0);</div><div class='add'>+ a += da;</div><div class='add'>+ b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_EQ:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ ic [n] = (compare_bstrings (*a, *b) == 0);</div><div class='add'>+ a += da;</div><div class='add'>+ b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ if (c != NULL)</div><div class='add'>+ {</div><div class='add'>+ free_n_bstrings (c, n);</div><div class='add'>+ while (n < n_max)</div><div class='add'>+ {</div><div class='add'>+ c[n] = NULL;</div><div class='add'>+ n++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* If preserve_ptr, then use a[i] as the bstring data. See how this function</div><div class='add'>+ * is called by the binary op routines for why.</div><div class='add'>+ */</div><div class='add'>+static SLang_BString_Type **</div><div class='add'>+make_n_bstrings (SLang_BString_Type **b, char **a, unsigned int n, int ptr_type)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+ int malloc_flag;</div><div class='add'>+</div><div class='add'>+ malloc_flag = 0;</div><div class='add'>+ if (b == NULL)</div><div class='add'>+ {</div><div class='add'>+ b = (SLang_BString_Type **) SLmalloc ((n + 1) * sizeof (SLang_BString_Type *));</div><div class='add'>+ if (b == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+ malloc_flag = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < n; i++)</div><div class='add'>+ {</div><div class='add'>+ char *s = a[i];</div><div class='add'>+</div><div class='add'>+ if (s == NULL)</div><div class='add'>+ {</div><div class='add'>+ b[i] = NULL;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (b[i] = create_bstring_of_type (s, strlen(s), ptr_type)))</div><div class='add'>+ {</div><div class='add'>+ free_n_bstrings (b, i);</div><div class='add'>+ if (malloc_flag) SLfree ((char *) b);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+bstring_string_bin_op (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ SLang_BString_Type **b;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (NULL == (b = make_n_bstrings (NULL, (char **)bp, nb, IS_NOT_TO_BE_FREED)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ b_type = SLANG_BSTRING_TYPE;</div><div class='add'>+ ret = bstring_bstring_bin_op (op,</div><div class='add'>+ a_type, ap, na,</div><div class='add'>+ b_type, (VOID_STAR) b, nb,</div><div class='add'>+ cp);</div><div class='add'>+ free_n_bstrings (b, nb);</div><div class='add'>+ SLfree ((char *) b);</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+string_bstring_bin_op (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ SLang_BString_Type **a;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (NULL == (a = make_n_bstrings (NULL, (char **)ap, na, IS_NOT_TO_BE_FREED)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ a_type = SLANG_BSTRING_TYPE;</div><div class='add'>+ ret = bstring_bstring_bin_op (op,</div><div class='add'>+ a_type, (VOID_STAR) a, na,</div><div class='add'>+ b_type, bp, nb,</div><div class='add'>+ cp);</div><div class='add'>+ free_n_bstrings (a, na);</div><div class='add'>+ SLfree ((char *) a);</div><div class='add'>+</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void bstring_destroy (unsigned char unused, VOID_STAR s)</div><div class='add'>+{</div><div class='add'>+ (void) unused;</div><div class='add'>+ SLbstring_free (*(SLang_BString_Type **) s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int bstring_push (unsigned char unused, VOID_STAR sptr)</div><div class='add'>+{</div><div class='add'>+ (void) unused;</div><div class='add'>+</div><div class='add'>+ return SLang_push_bstring (*(SLang_BString_Type **) sptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int string_to_bstring (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ char **s;</div><div class='add'>+ SLang_BString_Type **b;</div><div class='add'>+</div><div class='add'>+ (void) a_type;</div><div class='add'>+ (void) b_type;</div><div class='add'>+</div><div class='add'>+ s = (char **) ap;</div><div class='add'>+ b = (SLang_BString_Type **) bp;</div><div class='add'>+</div><div class='add'>+ if (NULL == make_n_bstrings (b, s, na, IS_SLSTRING))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int bstring_to_string (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ char **s;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ SLang_BString_Type **a;</div><div class='add'>+</div><div class='add'>+ (void) a_type;</div><div class='add'>+ (void) b_type;</div><div class='add'>+</div><div class='add'>+ s = (char **) bp;</div><div class='add'>+ a = (SLang_BString_Type **) ap;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ {</div><div class='add'>+ SLang_BString_Type *ai = a[i];</div><div class='add'>+</div><div class='add'>+ if (ai == NULL)</div><div class='add'>+ {</div><div class='add'>+ s[i] = NULL;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (s[i] = SLang_create_slstring ((char *)BS_GET_POINTER(ai))))</div><div class='add'>+ {</div><div class='add'>+ while (i != 0)</div><div class='add'>+ {</div><div class='add'>+ i--;</div><div class='add'>+ SLang_free_slstring (s[i]);</div><div class='add'>+ s[i] = NULL;</div><div class='add'>+ }</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *bstring_string (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+ SLang_BString_Type *s;</div><div class='add'>+ unsigned char buf[128];</div><div class='add'>+ unsigned char *bytes, *bytes_max;</div><div class='add'>+ unsigned char *b, *bmax;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+</div><div class='add'>+ s = *(SLang_BString_Type **) v;</div><div class='add'>+ bytes = BS_GET_POINTER(s);</div><div class='add'>+ bytes_max = bytes + s->len;</div><div class='add'>+</div><div class='add'>+ b = buf;</div><div class='add'>+ bmax = buf + (sizeof (buf) - 4);</div><div class='add'>+</div><div class='add'>+ while (bytes < bytes_max)</div><div class='add'>+ {</div><div class='add'>+ unsigned char ch = *bytes;</div><div class='add'>+</div><div class='add'>+ if ((ch < 32) || (ch >= 127) || (ch == '\\'))</div><div class='add'>+ {</div><div class='add'>+ if (b + 4 > bmax)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ sprintf ((char *) b, "\\%03o", ch);</div><div class='add'>+ b += 4;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if (b == bmax)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ *b++ = ch;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ bytes++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (bytes < bytes_max)</div><div class='add'>+ {</div><div class='add'>+ *b++ = '.';</div><div class='add'>+ *b++ = '.';</div><div class='add'>+ *b++ = '.';</div><div class='add'>+ }</div><div class='add'>+ *b = 0;</div><div class='add'>+</div><div class='add'>+ return SLmake_string ((char *)buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned int bstrlen_cmd (SLang_BString_Type *b)</div><div class='add'>+{</div><div class='add'>+ return b->len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type BString_Table [] = /*{{{*/</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_1("bstrlen", bstrlen_cmd, SLANG_UINT_TYPE, SLANG_BSTRING_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("pack", _SLpack, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_2("unpack", _SLunpack, SLANG_VOID_TYPE, SLANG_STRING_TYPE, SLANG_BSTRING_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_1("pad_pack_format", _SLpack_pad_format, SLANG_VOID_TYPE, SLANG_STRING_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_1("sizeof_pack", _SLpack_compute_size, SLANG_UINT_TYPE, SLANG_STRING_TYPE),</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLang_init_bstring (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("BString_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+ (void) SLclass_set_destroy_function (cl, bstring_destroy);</div><div class='add'>+ (void) SLclass_set_push_function (cl, bstring_push);</div><div class='add'>+ (void) SLclass_set_string_function (cl, bstring_string);</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_BSTRING_TYPE, sizeof (char *),</div><div class='add'>+ SLANG_CLASS_TYPE_PTR))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLclass_add_typecast (SLANG_BSTRING_TYPE, SLANG_STRING_TYPE, bstring_to_string, 1))</div><div class='add'>+ || (-1 == SLclass_add_typecast (SLANG_STRING_TYPE, SLANG_BSTRING_TYPE, string_to_bstring, 1))</div><div class='add'>+ || (-1 == SLclass_add_binary_op (SLANG_BSTRING_TYPE, SLANG_BSTRING_TYPE, bstring_bstring_bin_op, bstring_bstring_bin_op_result))</div><div class='add'>+ || (-1 == SLclass_add_binary_op (SLANG_STRING_TYPE, SLANG_BSTRING_TYPE, string_bstring_bin_op, bstring_bstring_bin_op_result))</div><div class='add'>+ || (-1 == SLclass_add_binary_op (SLANG_BSTRING_TYPE, SLANG_STRING_TYPE, bstring_string_bin_op, bstring_bstring_bin_op_result)))</div><div class='add'>+</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLadd_intrin_fun_table (BString_Table, NULL))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slclass.c b/mdk-stage1/slang/slclass.c<br/>new file mode 100644<br/>index 000000000..733888cb8<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slclass.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slclass.c</a></div><div class='hunk'>@@ -0,0 +1,1391 @@</div><div class='add'>+/* User defined objects */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+unsigned char _SLclass_Class_Type [256];</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_Class_Type *Registered_Types[256];</div><div class='add'>+SLang_Class_Type *_SLclass_get_class (unsigned char type)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = Registered_Types [type];</div><div class='add'>+ if (cl == NULL)</div><div class='add'>+ SLang_exit_error ("Application error: Type %d not registered", (int) type);</div><div class='add'>+</div><div class='add'>+ return cl;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_is_class_defined (unsigned char type)</div><div class='add'>+{</div><div class='add'>+ return (NULL != Registered_Types[type]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+VOID_STAR _SLclass_get_ptr_to_value (SLang_Class_Type *cl,</div><div class='add'>+ SLang_Object_Type *obj)</div><div class='add'>+{</div><div class='add'>+ VOID_STAR p;</div><div class='add'>+</div><div class='add'>+ switch (cl->cl_class_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_CLASS_TYPE_MMT:</div><div class='add'>+ case SLANG_CLASS_TYPE_PTR:</div><div class='add'>+ case SLANG_CLASS_TYPE_SCALAR:</div><div class='add'>+ p = (VOID_STAR) &obj->v;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_CLASS_TYPE_VECTOR:</div><div class='add'>+ p = obj->v.ptr_val;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ p = NULL;</div><div class='add'>+ }</div><div class='add'>+ return p;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLclass_get_datatype_name (unsigned char stype)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (stype);</div><div class='add'>+ return cl->cl_name;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int method_undefined_error (unsigned char type, char *method, char *name)</div><div class='add'>+{</div><div class='add'>+ if (name == NULL) name = SLclass_get_datatype_name (type);</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "%s method not defined for %s",</div><div class='add'>+ method, name);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+scalar_vector_bin_op_result (int op, unsigned char a, unsigned char b,</div><div class='add'>+ unsigned char *c)</div><div class='add'>+{</div><div class='add'>+ (void) a; (void) b;</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_NE:</div><div class='add'>+ case SLANG_EQ:</div><div class='add'>+ *c = SLANG_INT_TYPE;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+scalar_vector_bin_op (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ int *c;</div><div class='add'>+ char *a, *b;</div><div class='add'>+ unsigned int da, db;</div><div class='add'>+ unsigned int n, n_max;</div><div class='add'>+ unsigned int data_type_len;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ (void) b_type;</div><div class='add'>+ cl = _SLclass_get_class (a_type);</div><div class='add'>+</div><div class='add'>+ data_type_len = cl->cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+ a = (char *) ap;</div><div class='add'>+ b = (char *) bp;</div><div class='add'>+ c = (int *) cp;</div><div class='add'>+</div><div class='add'>+ if (na == 1) da = 0; else da = data_type_len;</div><div class='add'>+ if (nb == 1) db = 0; else db = data_type_len;</div><div class='add'>+ if (na > nb) n_max = na; else n_max = nb;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLANG_NE:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ c[n] = (0 != SLMEMCMP(a, b, data_type_len));</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_EQ:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ c[n] = (0 == SLMEMCMP(a, b, data_type_len));</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int scalar_fread (unsigned char type, FILE *fp, VOID_STAR ptr,</div><div class='add'>+ unsigned int desired, unsigned int *actual)</div><div class='add'>+{</div><div class='add'>+ unsigned int n;</div><div class='add'>+</div><div class='add'>+ n = fread ((char *) ptr, _SLclass_get_class (type)->cl_sizeof_type,</div><div class='add'>+ desired, fp);</div><div class='add'>+ *actual = n;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int scalar_fwrite (unsigned char type, FILE *fp, VOID_STAR ptr,</div><div class='add'>+ unsigned int desired, unsigned int *actual)</div><div class='add'>+{</div><div class='add'>+ unsigned int n;</div><div class='add'>+</div><div class='add'>+ n = fwrite ((char *) ptr, _SLclass_get_class (type)->cl_sizeof_type,</div><div class='add'>+ desired, fp);</div><div class='add'>+ *actual = n;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int vector_apush (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ return (*cl->cl_push)(type, (VOID_STAR) &ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int vector_apop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ return (*cl->cl_pop)(type, (VOID_STAR) &ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int default_push_mmt (unsigned char type_unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ SLang_MMT_Type *ref;</div><div class='add'>+</div><div class='add'>+ (void) type_unused;</div><div class='add'>+ ref = *(SLang_MMT_Type **) ptr;</div><div class='add'>+ return SLang_push_mmt (ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void default_destroy_simple (unsigned char type_unused, VOID_STAR ptr_unused)</div><div class='add'>+{</div><div class='add'>+ (void) type_unused;</div><div class='add'>+ (void) ptr_unused;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void default_destroy_user (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ SLang_free_mmt (*(SLang_MMT_Type **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int default_pop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ return SLclass_pop_ptr_obj (type, (VOID_STAR *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int default_datatype_deref (unsigned char type)</div><div class='add'>+{</div><div class='add'>+ return method_undefined_error (type, "datatype_deref", NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int default_acopy (unsigned char type, VOID_STAR from, VOID_STAR to)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ if (-1 == (*cl->cl_apush) (type, from))</div><div class='add'>+ return -1;</div><div class='add'>+ return (*cl->cl_apop) (type, to);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int default_dereference_object (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) ptr;</div><div class='add'>+ return method_undefined_error (type, "dereference", NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *default_string (unsigned char stype, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+ char buf [256];</div><div class='add'>+ char *s;</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ double *cplx;</div><div class='add'>+#endif</div><div class='add'>+ s = buf;</div><div class='add'>+</div><div class='add'>+ switch (stype)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_STRING_TYPE:</div><div class='add'>+ s = *(char **) v;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_NULL_TYPE:</div><div class='add'>+ s = "NULL";</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_DATATYPE_TYPE:</div><div class='add'>+ s = SLclass_get_datatype_name ((unsigned char) *(int *)v);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ case SLANG_COMPLEX_TYPE:</div><div class='add'>+ cplx = *(double **) v;</div><div class='add'>+ if (cplx[1] < 0)</div><div class='add'>+ sprintf (s, "(%g - %gi)", cplx [0], -cplx [1]);</div><div class='add'>+ else</div><div class='add'>+ sprintf (s, "(%g + %gi)", cplx [0], cplx [1]);</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ default:</div><div class='add'>+ s = SLclass_get_datatype_name (stype);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return SLmake_string (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+use_cmp_bin_op_result (int op, unsigned char a, unsigned char b,</div><div class='add'>+ unsigned char *c)</div><div class='add'>+{</div><div class='add'>+ if (a != b)</div><div class='add'>+ return 0;</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_NE:</div><div class='add'>+ case SLANG_EQ:</div><div class='add'>+ case SLANG_LT:</div><div class='add'>+ case SLANG_LE:</div><div class='add'>+ case SLANG_GT:</div><div class='add'>+ case SLANG_GE:</div><div class='add'>+ *c = SLANG_INT_TYPE;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+use_cmp_bin_op (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ int *c;</div><div class='add'>+ char *a, *b;</div><div class='add'>+ unsigned int da, db;</div><div class='add'>+ unsigned int n, n_max;</div><div class='add'>+ unsigned int data_type_len;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ int (*cmp)(unsigned char, VOID_STAR, VOID_STAR, int *);</div><div class='add'>+</div><div class='add'>+ (void) b_type;</div><div class='add'>+ cl = _SLclass_get_class (a_type);</div><div class='add'>+ cmp = cl->cl_cmp;</div><div class='add'>+ data_type_len = cl->cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+ a = (char *) ap;</div><div class='add'>+ b = (char *) bp;</div><div class='add'>+ c = (int *) cp;</div><div class='add'>+</div><div class='add'>+ if (na == 1) da = 0; else da = data_type_len;</div><div class='add'>+ if (nb == 1) db = 0; else db = data_type_len;</div><div class='add'>+ if (na > nb) n_max = na; else n_max = nb;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ int result;</div><div class='add'>+ </div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLANG_NE:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &result))</div><div class='add'>+ return -1;</div><div class='add'>+ c[n] = (result != 0);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_EQ:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &result))</div><div class='add'>+ return -1;</div><div class='add'>+ c[n] = (result == 0);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_GT:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &result))</div><div class='add'>+ return -1;</div><div class='add'>+ c[n] = (result > 0);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_GE:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &result))</div><div class='add'>+ return -1;</div><div class='add'>+ c[n] = (result >= 0);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_LT:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &result))</div><div class='add'>+ return -1;</div><div class='add'>+ c[n] = (result < 0);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_LE:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &result))</div><div class='add'>+ return -1;</div><div class='add'>+ c[n] = (result <= 0);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+int SLclass_get_class_id (SLang_Class_Type *cl)</div><div class='add'>+{</div><div class='add'>+ if (cl == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+ return (int) cl->cl_data_type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Class_Type *SLclass_allocate_class (char *name)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 256; i++)</div><div class='add'>+ {</div><div class='add'>+ cl = Registered_Types [i];</div><div class='add'>+ if ((cl != NULL)</div><div class='add'>+ && (0 == strcmp (cl->cl_name, name)))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_DUPLICATE_DEFINITION, "Type name %s already exists", name);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ cl = (SLang_Class_Type *) SLmalloc (sizeof (SLang_Class_Type));</div><div class='add'>+ if (cl == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+ SLMEMSET ((char *) cl, 0, sizeof (SLang_Class_Type));</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl->cl_name = SLang_create_slstring (name)))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) cl);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return cl;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int DataType_Ids [256];</div><div class='add'>+</div><div class='add'>+int _SLang_push_datatype (unsigned char data_type)</div><div class='add'>+{</div><div class='add'>+ /* This data type could be a copy of another type, e.g., short and</div><div class='add'>+ * int if they are the same size (Int16 == Short). So, make sure</div><div class='add'>+ * we push the original and not the copy. </div><div class='add'>+ */</div><div class='add'>+ data_type = _SLclass_get_class (data_type)->cl_data_type;</div><div class='add'>+ return SLclass_push_int_obj (SLANG_DATATYPE_TYPE, (int) data_type);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int datatype_deref (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ /* The parser generated code for this as if a function call were to be</div><div class='add'>+ * made. However, we are calling the deref object routine</div><div class='add'>+ * instead of the function call. So, I must simulate the function call.</div><div class='add'>+ */</div><div class='add'>+ if (-1 == _SL_increment_frame_pointer ())</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ type = (unsigned char) *(int *) ptr;</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ status = (*cl->cl_datatype_deref) (type);</div><div class='add'>+</div><div class='add'>+ (void) _SL_decrement_frame_pointer ();</div><div class='add'>+ return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int datatype_push (unsigned char type_unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) type_unused;</div><div class='add'>+ return _SLang_push_datatype (*(int *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_pop_datatype (unsigned char *type)</div><div class='add'>+{</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_pop_int_obj (SLANG_DATATYPE_TYPE, &i))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ *type = (unsigned char) i;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int datatype_pop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ if (-1 == _SLang_pop_datatype (&type))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ *(int *) ptr = type;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLclass_init (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ /* First initialize the container classes. This is so binary operations</div><div class='add'>+ * added later will work with them.</div><div class='add'>+ */</div><div class='add'>+ if (-1 == _SLarray_init_slarray ())</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* DataType_Type */</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("DataType_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+ cl->cl_pop = datatype_pop;</div><div class='add'>+ cl->cl_push = datatype_push;</div><div class='add'>+ cl->cl_dereference = datatype_deref;</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_DATATYPE_TYPE, sizeof(int),</div><div class='add'>+ SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int register_new_datatype (char *name, unsigned char type)</div><div class='add'>+{</div><div class='add'>+ DataType_Ids [type] = type;</div><div class='add'>+ return SLadd_intrinsic_variable (name, (VOID_STAR) (DataType_Ids + type),</div><div class='add'>+ SLANG_DATATYPE_TYPE, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_create_synonym (char *name, unsigned char type)</div><div class='add'>+{</div><div class='add'>+ if (NULL == _SLclass_get_class (type))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return register_new_datatype (name, type);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLclass_copy_class (unsigned char to, unsigned char from)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl = _SLclass_get_class (from);</div><div class='add'>+</div><div class='add'>+ if (Registered_Types[to] != NULL)</div><div class='add'>+ SLang_exit_error ("Application error: Class already exists");</div><div class='add'>+</div><div class='add'>+ Registered_Types[to] = cl;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (to != SLANG_UNDEFINED_TYPE)</div><div class='add'>+ _SLclass_Class_Type [to] = cl->cl_class_type;</div><div class='add'>+#endif</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_register_class (SLang_Class_Type *cl, unsigned char type, unsigned int type_size, unsigned char class_type)</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ int can_binop = 1; /* scalar_vector_bin_op should work</div><div class='add'>+ * for all data types.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ if (type == SLANG_VOID_TYPE) for (i = 0; i < 256; i++)</div><div class='add'>+ {</div><div class='add'>+ if ((Registered_Types[i] == NULL)</div><div class='add'>+ && (i != SLANG_VOID_TYPE))</div><div class='add'>+ {</div><div class='add'>+ type = (unsigned char) i;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((NULL != Registered_Types [type])</div><div class='add'>+ || (type == SLANG_VOID_TYPE))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_APPLICATION_ERROR, "Class type %d already in use", (int) type);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ cl->cl_data_type = type;</div><div class='add'>+ cl->cl_class_type = class_type;</div><div class='add'>+ name = cl->cl_name;</div><div class='add'>+</div><div class='add'>+ switch (class_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_CLASS_TYPE_MMT:</div><div class='add'>+ if (cl->cl_push == NULL) cl->cl_push = default_push_mmt;</div><div class='add'>+ if (cl->cl_destroy == NULL)</div><div class='add'>+ return method_undefined_error (type, "destroy", name);</div><div class='add'>+ cl->cl_user_destroy_fun = cl->cl_destroy;</div><div class='add'>+ cl->cl_destroy = default_destroy_user;</div><div class='add'>+ type_size = sizeof (VOID_STAR);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_CLASS_TYPE_SCALAR:</div><div class='add'>+ if (cl->cl_destroy == NULL) cl->cl_destroy = default_destroy_simple;</div><div class='add'>+ if ((type_size == 0)</div><div class='add'>+ || (type_size > sizeof (_SL_Object_Union_Type)))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM,</div><div class='add'>+ "Type size for %s not appropriate for SCALAR type",</div><div class='add'>+ name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ if (cl->cl_pop == NULL)</div><div class='add'>+ return method_undefined_error (type, "pop", name);</div><div class='add'>+ if (cl->cl_fread == NULL) cl->cl_fread = scalar_fread;</div><div class='add'>+ if (cl->cl_fwrite == NULL) cl->cl_fwrite = scalar_fwrite;</div><div class='add'>+</div><div class='add'>+ can_binop = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_CLASS_TYPE_PTR:</div><div class='add'>+ if (cl->cl_destroy == NULL)</div><div class='add'>+ return method_undefined_error (type, "destroy", name);</div><div class='add'>+ type_size = sizeof (VOID_STAR);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_CLASS_TYPE_VECTOR:</div><div class='add'>+ if (cl->cl_destroy == NULL)</div><div class='add'>+ return method_undefined_error (type, "destroy", name);</div><div class='add'>+ if (cl->cl_pop == NULL)</div><div class='add'>+ return method_undefined_error (type, "pop", name);</div><div class='add'>+ cl->cl_apop = vector_apop;</div><div class='add'>+ cl->cl_apush = vector_apush;</div><div class='add'>+ cl->cl_adestroy = default_destroy_simple;</div><div class='add'>+ if (cl->cl_fread == NULL) cl->cl_fread = scalar_fread;</div><div class='add'>+ if (cl->cl_fwrite == NULL) cl->cl_fwrite = scalar_fwrite;</div><div class='add'>+ can_binop = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "%s: unknown class type (%d)", name, class_type);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (type != SLANG_UNDEFINED_TYPE)</div><div class='add'>+ _SLclass_Class_Type [type] = class_type;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (type_size == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "type size must be non-zero for %s", name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (cl->cl_string == NULL) cl->cl_string = default_string;</div><div class='add'>+ if (cl->cl_acopy == NULL) cl->cl_acopy = default_acopy;</div><div class='add'>+ if (cl->cl_datatype_deref == NULL) cl->cl_datatype_deref = default_datatype_deref;</div><div class='add'>+</div><div class='add'>+ if (cl->cl_pop == NULL) cl->cl_pop = default_pop;</div><div class='add'>+</div><div class='add'>+ if (cl->cl_push == NULL)</div><div class='add'>+ return method_undefined_error (type, "push", name);</div><div class='add'>+</div><div class='add'>+ if (cl->cl_byte_code_destroy == NULL)</div><div class='add'>+ cl->cl_byte_code_destroy = cl->cl_destroy;</div><div class='add'>+ if (cl->cl_push_literal == NULL)</div><div class='add'>+ cl->cl_push_literal = cl->cl_push;</div><div class='add'>+</div><div class='add'>+ if (cl->cl_dereference == NULL)</div><div class='add'>+ cl->cl_dereference = default_dereference_object;</div><div class='add'>+</div><div class='add'>+ if (cl->cl_apop == NULL) cl->cl_apop = cl->cl_pop;</div><div class='add'>+ if (cl->cl_apush == NULL) cl->cl_apush = cl->cl_push;</div><div class='add'>+ if (cl->cl_adestroy == NULL) cl->cl_adestroy = cl->cl_destroy;</div><div class='add'>+ if (cl->cl_push_intrinsic == NULL) cl->cl_push_intrinsic = cl->cl_push;</div><div class='add'>+</div><div class='add'>+ if ((cl->cl_foreach == NULL)</div><div class='add'>+ || (cl->cl_foreach_open == NULL)</div><div class='add'>+ || (cl->cl_foreach_close == NULL))</div><div class='add'>+ {</div><div class='add'>+ cl->cl_foreach = _SLarray_cl_foreach;</div><div class='add'>+ cl->cl_foreach_open = _SLarray_cl_foreach_open;</div><div class='add'>+ cl->cl_foreach_close = _SLarray_cl_foreach_close;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ cl->cl_sizeof_type = type_size;</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl->cl_transfer_buf = (VOID_STAR) SLmalloc (type_size)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ Registered_Types[type] = cl;</div><div class='add'>+</div><div class='add'>+ if (-1 == register_new_datatype (name, type))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (cl->cl_cmp != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLclass_add_binary_op (type, type, use_cmp_bin_op, use_cmp_bin_op_result))</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ else if (can_binop</div><div class='add'>+ && (-1 == SLclass_add_binary_op (type, type, scalar_vector_bin_op, scalar_vector_bin_op_result)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ cl->cl_anytype_typecast = _SLanytype_typecast;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_add_math_op (unsigned char type,</div><div class='add'>+ int (*handler)(int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR),</div><div class='add'>+ int (*result) (int, unsigned char, unsigned char *))</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+ cl->cl_math_op = handler;</div><div class='add'>+ cl->cl_math_op_result_type = result;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_add_binary_op (unsigned char a, unsigned char b,</div><div class='add'>+ int (*f) (int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR),</div><div class='add'>+ int (*r) (int, unsigned char, unsigned char, unsigned char *))</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ SL_OOBinary_Type *ab;</div><div class='add'>+</div><div class='add'>+ if ((f == NULL) || (r == NULL))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "SLclass_add_binary_op");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (a);</div><div class='add'>+ (void) _SLclass_get_class (b);</div><div class='add'>+</div><div class='add'>+ if (NULL == (ab = (SL_OOBinary_Type *) SLmalloc (sizeof(SL_OOBinary_Type))))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ ab->data_type = b;</div><div class='add'>+ ab->binary_function = f;</div><div class='add'>+ ab->binary_result = r;</div><div class='add'>+ ab->next = cl->cl_binary_ops;</div><div class='add'>+ cl->cl_binary_ops = ab;</div><div class='add'>+</div><div class='add'>+ if ((a != SLANG_ARRAY_TYPE)</div><div class='add'>+ && (b != SLANG_ARRAY_TYPE))</div><div class='add'>+ {</div><div class='add'>+ if ((-1 == _SLarray_add_bin_op (a))</div><div class='add'>+ || (-1 == _SLarray_add_bin_op (b)))</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_add_unary_op (unsigned char type,</div><div class='add'>+ int (*f)(int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR),</div><div class='add'>+ int (*r)(int, unsigned char, unsigned char *))</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ if ((f == NULL) || (r == NULL))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "SLclass_add_unary_op");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ cl->cl_unary_op = f;</div><div class='add'>+ cl->cl_unary_op_result_type = r;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_add_app_unary_op (unsigned char type,</div><div class='add'>+ int (*f)(int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR),</div><div class='add'>+ int (*r)(int, unsigned char, unsigned char *))</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ if ((f == NULL) || (r == NULL))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "SLclass_add_app_unary_op");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ cl->cl_app_unary_op = f;</div><div class='add'>+ cl->cl_app_unary_op_result_type = r;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_pop_function (SLang_Class_Type *cl, int (*f)(unsigned char, VOID_STAR))</div><div class='add'>+{</div><div class='add'>+ if (cl == NULL) return -1;</div><div class='add'>+ cl->cl_pop = f;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_push_function (SLang_Class_Type *cl, int (*f)(unsigned char, VOID_STAR))</div><div class='add'>+{</div><div class='add'>+ if (cl == NULL) return -1;</div><div class='add'>+ cl->cl_push = f;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_string_function (SLang_Class_Type *cl, char *(*f)(unsigned char, VOID_STAR))</div><div class='add'>+{</div><div class='add'>+ if (cl == NULL) return -1;</div><div class='add'>+</div><div class='add'>+ cl->cl_string = f;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_destroy_function (SLang_Class_Type *cl, void (*f)(unsigned char, VOID_STAR))</div><div class='add'>+{</div><div class='add'>+ if (cl == NULL) return -1;</div><div class='add'>+</div><div class='add'>+ cl->cl_destroy = f;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_sget_function (SLang_Class_Type *cl, int (*f)(unsigned char, char *))</div><div class='add'>+{</div><div class='add'>+ if (cl == NULL) return -1;</div><div class='add'>+ cl->cl_sget = f;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_sput_function (SLang_Class_Type *cl, int (*f)(unsigned char, char *))</div><div class='add'>+{</div><div class='add'>+ if (cl == NULL) return -1;</div><div class='add'>+ cl->cl_sput = f;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_aget_function (SLang_Class_Type *cl, int (*f)(unsigned char, unsigned int))</div><div class='add'>+{</div><div class='add'>+ if (cl == NULL) return -1;</div><div class='add'>+ cl->cl_aget = f;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_aput_function (SLang_Class_Type *cl, int (*f)(unsigned char, unsigned int))</div><div class='add'>+{</div><div class='add'>+ if (cl == NULL) return -1;</div><div class='add'>+ cl->cl_aput = f;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_anew_function (SLang_Class_Type *cl, int (*f)(unsigned char, unsigned int))</div><div class='add'>+{</div><div class='add'>+ if (cl == NULL) return -1;</div><div class='add'>+ cl->cl_anew = f;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Misc */</div><div class='add'>+void _SLclass_type_mismatch_error (unsigned char a, unsigned char b)</div><div class='add'>+{</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "Expecting %s, found %s",</div><div class='add'>+ SLclass_get_datatype_name (a),</div><div class='add'>+ SLclass_get_datatype_name (b));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* */</div><div class='add'>+</div><div class='add'>+static int null_binary_fun (int op,</div><div class='add'>+ unsigned char a, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ int *ic;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ int c;</div><div class='add'>+</div><div class='add'>+ (void) ap; (void) bp;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_EQ:</div><div class='add'>+ c = (a == b);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_NE:</div><div class='add'>+ c = (a != b);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (na > nb) nb = na;</div><div class='add'>+ ic = (int *) cp;</div><div class='add'>+ for (i = 0; i < nb; i++)</div><div class='add'>+ ic[i] = c;</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *get_binary_op_string (int op)</div><div class='add'>+{</div><div class='add'>+ static char *ops[SLANG_MOD] =</div><div class='add'>+ {</div><div class='add'>+ "+", "=", "*", "/", "==", "!=", ">", ">=", "<", "<=", "^",</div><div class='add'>+ "or", "and", "&", "|", "xor", "shl", "shr", "mod"</div><div class='add'>+ };</div><div class='add'>+</div><div class='add'>+ if ((op > SLANG_MOD) || (op <= 0))</div><div class='add'>+ return "??";</div><div class='add'>+ return ops[op - 1];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int (*_SLclass_get_binary_fun (int op,</div><div class='add'>+ SLang_Class_Type *a_cl, SLang_Class_Type *b_cl,</div><div class='add'>+ SLang_Class_Type **c_cl, int do_error))</div><div class='add'>+(int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR)</div><div class='add'>+{</div><div class='add'>+ SL_OOBinary_Type *bt;</div><div class='add'>+ unsigned char a, b, c;</div><div class='add'>+</div><div class='add'>+ a = a_cl->cl_data_type;</div><div class='add'>+ b = b_cl->cl_data_type;</div><div class='add'>+</div><div class='add'>+ if ((a == SLANG_NULL_TYPE) || (b == SLANG_NULL_TYPE))</div><div class='add'>+ {</div><div class='add'>+ *c_cl = _SLclass_get_class (SLANG_INT_TYPE);</div><div class='add'>+ return null_binary_fun;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ bt = a_cl->cl_binary_ops;</div><div class='add'>+</div><div class='add'>+ while (bt != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (bt->data_type == b)</div><div class='add'>+ {</div><div class='add'>+ if (1 != (*bt->binary_result)(op, a, b, &c))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ if (c == a) *c_cl = a_cl;</div><div class='add'>+ else if (c == b) *c_cl = b_cl;</div><div class='add'>+ else *c_cl = _SLclass_get_class (c);</div><div class='add'>+</div><div class='add'>+ return bt->binary_function;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ bt = bt->next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (do_error)</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "%s %s %s is not possible",</div><div class='add'>+ a_cl->cl_name, get_binary_op_string (op), b_cl->cl_name);</div><div class='add'>+</div><div class='add'>+ *c_cl = NULL;</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int (*_SLclass_get_unary_fun (int op,</div><div class='add'>+ SLang_Class_Type *a_cl,</div><div class='add'>+ SLang_Class_Type **b_cl,</div><div class='add'>+ int utype))</div><div class='add'>+(int, unsigned char, VOID_STAR, unsigned int, VOID_STAR)</div><div class='add'>+{</div><div class='add'>+ int (*f)(int, unsigned char, VOID_STAR, unsigned int, VOID_STAR);</div><div class='add'>+ int (*r)(int, unsigned char, unsigned char *);</div><div class='add'>+ unsigned char a;</div><div class='add'>+ unsigned char b;</div><div class='add'>+</div><div class='add'>+ switch (utype)</div><div class='add'>+ {</div><div class='add'>+ case _SLANG_BC_UNARY:</div><div class='add'>+ f = a_cl->cl_unary_op;</div><div class='add'>+ r = a_cl->cl_unary_op_result_type;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_MATH_UNARY:</div><div class='add'>+ f = a_cl->cl_math_op;</div><div class='add'>+ r = a_cl->cl_math_op_result_type;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _SLANG_BC_APP_UNARY:</div><div class='add'>+ f = a_cl->cl_app_unary_op;</div><div class='add'>+ r = a_cl->cl_app_unary_op_result_type;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ f = NULL;</div><div class='add'>+ r = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ a = a_cl->cl_data_type;</div><div class='add'>+ if ((f != NULL) && (r != NULL) && (1 == (*r) (op, a, &b)))</div><div class='add'>+ {</div><div class='add'>+ if (a == b)</div><div class='add'>+ *b_cl = a_cl;</div><div class='add'>+ else</div><div class='add'>+ *b_cl = _SLclass_get_class (b);</div><div class='add'>+ return f;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "undefined unary operation/function on %s",</div><div class='add'>+ a_cl->cl_name);</div><div class='add'>+</div><div class='add'>+ *b_cl = NULL;</div><div class='add'>+</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+SLclass_typecast (unsigned char to_type, int is_implicit, int allow_array)</div><div class='add'>+{</div><div class='add'>+ unsigned char from_type;</div><div class='add'>+ SLang_Class_Type *cl_to, *cl_from;</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ VOID_STAR ap;</div><div class='add'>+ VOID_STAR bp;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&obj))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ from_type = obj.data_type;</div><div class='add'>+ if (from_type == to_type)</div><div class='add'>+ {</div><div class='add'>+ SLang_push (&obj);</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ cl_from = _SLclass_get_class (from_type);</div><div class='add'>+ </div><div class='add'>+ /* Since the typecast functions are designed to work on arrays, </div><div class='add'>+ * get the pointer to the value instead of just &obj.v.</div><div class='add'>+ */</div><div class='add'>+ ap = _SLclass_get_ptr_to_value (cl_from, &obj);</div><div class='add'>+</div><div class='add'>+ if ((from_type == SLANG_ARRAY_TYPE)</div><div class='add'>+ && (allow_array || (to_type != SLANG_ANY_TYPE)))</div><div class='add'>+ {</div><div class='add'>+ if (allow_array == 0)</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ cl_to = _SLclass_get_class (SLANG_ARRAY_TYPE);</div><div class='add'>+ bp = cl_to->cl_transfer_buf;</div><div class='add'>+ status = _SLarray_typecast (from_type, ap, 1, to_type, bp, is_implicit);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ int (*t) (unsigned char, VOID_STAR, unsigned int, unsigned char, VOID_STAR);</div><div class='add'>+</div><div class='add'>+ if (NULL == (t = _SLclass_get_typecast (from_type, to_type, is_implicit)))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ cl_to = _SLclass_get_class (to_type);</div><div class='add'>+ bp = cl_to->cl_transfer_buf;</div><div class='add'>+ status = (*t) (from_type, ap, 1, to_type, bp);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (1 == status)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cl_to->cl_apush)(to_type, bp))</div><div class='add'>+ {</div><div class='add'>+ (*cl_to->cl_adestroy) (to_type, bp);</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* cl_apush will push a copy, so destry this one */</div><div class='add'>+ (*cl_to->cl_adestroy) (to_type, bp);</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "Unable to typecast %s to %s",</div><div class='add'>+ cl_from->cl_name,</div><div class='add'>+ SLclass_get_datatype_name (to_type));</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int (*_SLclass_get_typecast (unsigned char from, unsigned char to, int is_implicit))</div><div class='add'>+(unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR)</div><div class='add'>+{</div><div class='add'>+ SL_Typecast_Type *t;</div><div class='add'>+ SLang_Class_Type *cl_from;</div><div class='add'>+</div><div class='add'>+ cl_from = _SLclass_get_class (from);</div><div class='add'>+</div><div class='add'>+ t = cl_from->cl_typecast_funs;</div><div class='add'>+ while (t != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (t->data_type != to)</div><div class='add'>+ {</div><div class='add'>+ t = t->next;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (is_implicit && (t->allow_implicit == 0))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ return t->typecast;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (to == SLANG_ANY_TYPE)</div><div class='add'>+ return _SLanytype_typecast;</div><div class='add'>+</div><div class='add'>+ if ((is_implicit == 0)</div><div class='add'>+ && (cl_from->cl_void_typecast != NULL))</div><div class='add'>+ return cl_from->cl_void_typecast;</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "Unable to typecast %s to %s",</div><div class='add'>+ cl_from->cl_name,</div><div class='add'>+ SLclass_get_datatype_name (to));</div><div class='add'>+</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+SLclass_add_typecast (unsigned char from, unsigned char to,</div><div class='add'>+ int (*f)_PROTO((unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR)),</div><div class='add'>+ int allow_implicit)</div><div class='add'>+{</div><div class='add'>+ SL_Typecast_Type *t;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (from);</div><div class='add'>+ if (to == SLANG_VOID_TYPE)</div><div class='add'>+ {</div><div class='add'>+ cl->cl_void_typecast = f;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ (void) _SLclass_get_class (to);</div><div class='add'>+</div><div class='add'>+ if (NULL == (t = (SL_Typecast_Type *) SLmalloc (sizeof (SL_Typecast_Type))))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ SLMEMSET((char *) t, 0, sizeof(SL_Typecast_Type));</div><div class='add'>+ t->data_type = to;</div><div class='add'>+ t->next = cl->cl_typecast_funs;</div><div class='add'>+ t->typecast = f;</div><div class='add'>+ t->allow_implicit = allow_implicit;</div><div class='add'>+</div><div class='add'>+ cl->cl_typecast_funs = t;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_MMT_Type *SLang_pop_mmt (unsigned char type) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_pop_ptr_obj (type, (VOID_STAR *) &mmt))</div><div class='add'>+ mmt = NULL;</div><div class='add'>+ return mmt;</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (_SLang_pop_object_of_type (type, &obj))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ if ((cl->cl_class_type == SLANG_CLASS_TYPE_MMT)</div><div class='add'>+ && (obj.data_type == type))</div><div class='add'>+ {</div><div class='add'>+ return obj.v.ref;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ _SLclass_type_mismatch_error (type, obj.data_type);</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return NULL;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int SLang_push_mmt (SLang_MMT_Type *ref) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ if (ref == NULL)</div><div class='add'>+ return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+ ref->count += 1;</div><div class='add'>+</div><div class='add'>+ if (0 == SLclass_push_ptr_obj (ref->data_type, (VOID_STAR) ref))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ ref->count -= 1;</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+void SLang_inc_mmt (SLang_MMT_Type *ref)</div><div class='add'>+{</div><div class='add'>+ if (ref != NULL)</div><div class='add'>+ ref->count += 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+VOID_STAR SLang_object_from_mmt (SLang_MMT_Type *ref)</div><div class='add'>+{</div><div class='add'>+ if (ref == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ return ref->user_data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_MMT_Type *SLang_create_mmt (unsigned char t, VOID_STAR p)</div><div class='add'>+{</div><div class='add'>+ SLang_MMT_Type *ref;</div><div class='add'>+</div><div class='add'>+ (void) _SLclass_get_class (t); /* check to see if it is registered */</div><div class='add'>+</div><div class='add'>+ if (NULL == (ref = (SLang_MMT_Type *) SLmalloc (sizeof (SLang_MMT_Type))))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ SLMEMSET ((char *) ref, 0, sizeof (SLang_MMT_Type));</div><div class='add'>+</div><div class='add'>+ ref->data_type = t;</div><div class='add'>+ ref->user_data = p;</div><div class='add'>+ /* FIXME!! To be consistent with other types, the reference count should </div><div class='add'>+ * be set to 1 here. However, doing so will require other code changes</div><div class='add'>+ * involving the use of MMTs. For instance, SLang_free_mmt would have</div><div class='add'>+ * to be called after every push of the MMT.</div><div class='add'>+ */</div><div class='add'>+ return ref;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_free_mmt (SLang_MMT_Type *ref)</div><div class='add'>+{</div><div class='add'>+ unsigned char type;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (ref == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ /* This can be zero if SLang_create_mmt is called followed</div><div class='add'>+ * by this routine before anything gets a chance to attach itself</div><div class='add'>+ * to it.</div><div class='add'>+ */</div><div class='add'>+ if (ref->count > 1)</div><div class='add'>+ {</div><div class='add'>+ ref->count -= 1;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ type = ref->data_type;</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ (*cl->cl_user_destroy_fun) (type, ref->user_data);</div><div class='add'>+ SLfree ((char *)ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_value (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ return (*cl->cl_apush)(type, v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_value (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ return (*cl->cl_apop)(type, v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_free_value (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ (*cl->cl_adestroy) (type, v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* These routines are very low-level and are designed for application data</div><div class='add'>+ * types to access the stack from their push/pop methods. The int and</div><div class='add'>+ * pointer versions are in slang.c</div><div class='add'>+ */</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+int SLclass_push_double_obj (unsigned char type, double x)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ obj.data_type = type;</div><div class='add'>+ obj.v.double_val = x;</div><div class='add'>+ return SLang_push (&obj);</div><div class='add'>+}</div><div class='add'>+int SLclass_push_float_obj (unsigned char type, float x)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ obj.data_type = type;</div><div class='add'>+ obj.v.float_val = x;</div><div class='add'>+ return SLang_push (&obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLclass_push_long_obj (unsigned char type, long x)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ obj.data_type = type;</div><div class='add'>+ obj.v.long_val = x;</div><div class='add'>+ return SLang_push (&obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_push_short_obj (unsigned char type, short x)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ obj.data_type = type;</div><div class='add'>+ obj.v.short_val = x;</div><div class='add'>+ return SLang_push (&obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_push_char_obj (unsigned char type, char x)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ obj.data_type = type;</div><div class='add'>+ obj.v.char_val = x;</div><div class='add'>+ return SLang_push (&obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+int SLclass_pop_double_obj (unsigned char type, double *x)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_object_of_type (type, &obj, 0))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ *x = obj.v.double_val;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_pop_float_obj (unsigned char type, float *x)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_object_of_type (type, &obj, 0))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ *x = obj.v.float_val;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLclass_pop_long_obj (unsigned char type, long *x)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_object_of_type (type, &obj, 0))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ *x = obj.v.long_val;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_pop_int_obj (unsigned char type, int *x)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_object_of_type (type, &obj, 0))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ *x = obj.v.int_val;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_pop_short_obj (unsigned char type, short *x)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_object_of_type (type, &obj, 0))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ *x = obj.v.short_val;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_pop_char_obj (unsigned char type, char *x)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_object_of_type (type, &obj, 0))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ *x = obj.v.char_val;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_pop_ptr_obj (unsigned char type, VOID_STAR *s)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_object_of_type (type, &obj, 0))</div><div class='add'>+ {</div><div class='add'>+ *s = (VOID_STAR) NULL;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ *s = obj.v.ptr_val;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slcmd.c b/mdk-stage1/slang/slcmd.c<br/>new file mode 100644<br/>index 000000000..4a00a90fc<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slcmd.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcmd.c</a></div><div class='hunk'>@@ -0,0 +1,351 @@</div><div class='add'>+/* cmd line facility for slang */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+# include <math.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_STDLIB_H</div><div class='add'>+/* Oh dear. Where is the prototype for atof? If not in stdlib, then</div><div class='add'>+ * I do not know where. Not in math.h onsome systems either.</div><div class='add'>+ */</div><div class='add'>+extern double atof ();</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLcmd_Cmd_Type *SLcmd_find_command (char *s, SLcmd_Cmd_Type *cmd)</div><div class='add'>+{</div><div class='add'>+ char *cmdstr;</div><div class='add'>+ char chs = *s++, ch;</div><div class='add'>+</div><div class='add'>+ while ((cmd->cmdfun != NULL)</div><div class='add'>+ && (NULL != (cmdstr = cmd->cmd))</div><div class='add'>+ && (0 != (ch = *cmdstr++)))</div><div class='add'>+ {</div><div class='add'>+ if ((ch == chs) && !strcmp (s, cmdstr)) return cmd;</div><div class='add'>+ cmd++;</div><div class='add'>+ }</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int extract_token (char **strptr, char *buf)</div><div class='add'>+{</div><div class='add'>+ char *s, *b;</div><div class='add'>+ char ch, quote;</div><div class='add'>+</div><div class='add'>+ *buf = 0;</div><div class='add'>+</div><div class='add'>+ s = *strptr;</div><div class='add'>+ while (((ch = *s) != 0)</div><div class='add'>+ && ((ch == ' ') || (ch == '\t') || (ch == '\n')))</div><div class='add'>+ s++;</div><div class='add'>+</div><div class='add'>+ *strptr = s;</div><div class='add'>+</div><div class='add'>+ if (ch == 0) return 0;</div><div class='add'>+ if (ch == '%') return 0;</div><div class='add'>+</div><div class='add'>+ b = buf;</div><div class='add'>+</div><div class='add'>+ *b++ = ch;</div><div class='add'>+ s++;</div><div class='add'>+</div><div class='add'>+ if ((ch == '\'') || (ch == '"'))</div><div class='add'>+ {</div><div class='add'>+ quote = ch;</div><div class='add'>+ while ((ch = *s) != 0)</div><div class='add'>+ {</div><div class='add'>+ s++;</div><div class='add'>+ *b++ = ch;</div><div class='add'>+ if (ch == quote)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ if (ch == '\\')</div><div class='add'>+ {</div><div class='add'>+ if (0 == (ch = *s))</div><div class='add'>+ break;</div><div class='add'>+ *b++ = ch;</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ *strptr = s;</div><div class='add'>+ *b = 0;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (((ch = *s) != 0)</div><div class='add'>+ && (ch != ' ')</div><div class='add'>+ && (ch != '\t')</div><div class='add'>+ && (ch != '\n')</div><div class='add'>+ && (ch != '%'))</div><div class='add'>+ *b++ = *s++;</div><div class='add'>+</div><div class='add'>+ *strptr = s;</div><div class='add'>+ *b = 0;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int allocate_arg_space (SLcmd_Cmd_Table_Type *table, int argc, unsigned int *space_ptr)</div><div class='add'>+{</div><div class='add'>+ unsigned int space = *space_ptr;</div><div class='add'>+ char *p;</div><div class='add'>+</div><div class='add'>+ if (argc + 1 < (int) space)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ if (space > 128)</div><div class='add'>+ {</div><div class='add'>+ if (space > 1024) space += 1024;</div><div class='add'>+ else space += 128;</div><div class='add'>+ }</div><div class='add'>+ else space += 32;</div><div class='add'>+</div><div class='add'>+ if (NULL == (p = SLrealloc ((char *)table->string_args, space * sizeof (char *))))</div><div class='add'>+ return -1;</div><div class='add'>+ table->string_args = (char **)p;</div><div class='add'>+ table->string_args [argc] = NULL;</div><div class='add'>+</div><div class='add'>+ if (NULL == (p = SLrealloc ((char *)table->int_args, space * sizeof (int))))</div><div class='add'>+ return -1;</div><div class='add'>+ table->int_args = (int *)p;</div><div class='add'>+</div><div class='add'>+ if (NULL == (p = SLrealloc ((char *)table->double_args, space * sizeof (double))))</div><div class='add'>+ return -1;</div><div class='add'>+ table->double_args = (double *)p;</div><div class='add'>+</div><div class='add'>+ if (NULL == (p = SLrealloc ((char *)table->arg_type, space * sizeof (unsigned char))))</div><div class='add'>+ return -1;</div><div class='add'>+ table->arg_type = (unsigned char *)p;</div><div class='add'>+</div><div class='add'>+ *space_ptr = space;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcmd_execute_string (char *str, SLcmd_Cmd_Table_Type *table)</div><div class='add'>+{</div><div class='add'>+ char *s, *b = NULL, *arg_type, *last_str, *cmd_name;</div><div class='add'>+ SLcmd_Cmd_Type *cmd;</div><div class='add'>+ char *buf;</div><div class='add'>+ int token_present;</div><div class='add'>+ int i;</div><div class='add'>+ int status;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ int argc;</div><div class='add'>+ unsigned int space;</div><div class='add'>+</div><div class='add'>+ table->argc = 0;</div><div class='add'>+ table->string_args = NULL;</div><div class='add'>+ table->int_args = NULL;</div><div class='add'>+ table->double_args = NULL;</div><div class='add'>+ table->arg_type = NULL;</div><div class='add'>+</div><div class='add'>+ buf = SLmake_string (str);</div><div class='add'>+ if (buf == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ status = extract_token (&str, buf);</div><div class='add'>+ if (status <= 0)</div><div class='add'>+ {</div><div class='add'>+ SLfree (buf);</div><div class='add'>+ return status;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (((len = strlen (buf)) >= 32)</div><div class='add'>+ || (NULL == (cmd = SLcmd_find_command (buf, table->table))))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_UNDEFINED_NAME,"%s: invalid command", buf);</div><div class='add'>+ SLfree (buf);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (cmd_name = SLmake_string (buf)))</div><div class='add'>+ {</div><div class='add'>+ SLfree (buf);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ space = 0;</div><div class='add'>+ argc = 0;</div><div class='add'>+ if (-1 == allocate_arg_space (table, argc, &space))</div><div class='add'>+ {</div><div class='add'>+ SLfree (buf);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ table->arg_type[argc] = SLANG_STRING_TYPE;</div><div class='add'>+ table->string_args[argc++] = cmd_name;</div><div class='add'>+</div><div class='add'>+ arg_type = cmd->arg_type;</div><div class='add'>+ status = -1;</div><div class='add'>+ while (*arg_type)</div><div class='add'>+ {</div><div class='add'>+ int guess_type = 0;</div><div class='add'>+</div><div class='add'>+ last_str = str;</div><div class='add'>+</div><div class='add'>+ if (-1 == allocate_arg_space (table, argc, &space))</div><div class='add'>+ goto error;</div><div class='add'>+</div><div class='add'>+ if (-1 == (token_present = extract_token (&str, buf)))</div><div class='add'>+ goto error;</div><div class='add'>+</div><div class='add'>+ table->string_args[argc] = NULL;</div><div class='add'>+</div><div class='add'>+ if (token_present)</div><div class='add'>+ {</div><div class='add'>+ b = buf;</div><div class='add'>+ len = strlen (b);</div><div class='add'>+</div><div class='add'>+ if ((*b == '"') && (len > 1))</div><div class='add'>+ {</div><div class='add'>+ b++;</div><div class='add'>+ len -= 2;</div><div class='add'>+ b[len] = 0;</div><div class='add'>+ guess_type = SLANG_STRING_TYPE;</div><div class='add'>+ SLexpand_escaped_string (buf, b, b + len);</div><div class='add'>+ len = strlen (buf);</div><div class='add'>+ }</div><div class='add'>+ else if ((*b == '\'') && (len > 1))</div><div class='add'>+ {</div><div class='add'>+ char ch;</div><div class='add'>+ b++;</div><div class='add'>+ len -= 2;</div><div class='add'>+ b[len] = 0;</div><div class='add'>+ guess_type = SLANG_INT_TYPE;</div><div class='add'>+ ch = *b;</div><div class='add'>+ if (ch == '\\')</div><div class='add'>+ (void) _SLexpand_escaped_char (b, &ch);</div><div class='add'>+ sprintf (buf, "%d", (unsigned char) ch);</div><div class='add'>+ len = strlen (buf);</div><div class='add'>+ }</div><div class='add'>+ else guess_type = SLang_guess_type (buf);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ switch (*arg_type++)</div><div class='add'>+ {</div><div class='add'>+ /* variable argument number */</div><div class='add'>+ case 'v':</div><div class='add'>+ if (token_present == 0) break;</div><div class='add'>+ case 'V':</div><div class='add'>+ if (token_present == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "%s: Expecting argument", cmd_name);</div><div class='add'>+ goto error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (*last_str == ' ') last_str++;</div><div class='add'>+ len = strlen (last_str);</div><div class='add'>+ str = last_str + len;</div><div class='add'>+</div><div class='add'>+ s = SLmake_nstring (last_str, len);</div><div class='add'>+ if (s == NULL) goto error;</div><div class='add'>+</div><div class='add'>+ table->arg_type[argc] = SLANG_STRING_TYPE;</div><div class='add'>+ table->string_args[argc++] = s;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 's':</div><div class='add'>+ if (token_present == 0) break;</div><div class='add'>+ case 'S':</div><div class='add'>+ if (token_present == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting string argument", cmd_name);</div><div class='add'>+ goto error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ s = SLmake_nstring (buf, len);</div><div class='add'>+ if (s == NULL) goto error;</div><div class='add'>+ table->arg_type[argc] = SLANG_STRING_TYPE;</div><div class='add'>+ table->string_args[argc++] = s;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* integer argument */</div><div class='add'>+ case 'i':</div><div class='add'>+ if (token_present == 0) break;</div><div class='add'>+ case 'I':</div><div class='add'>+ if ((token_present == 0) || (SLANG_INT_TYPE != guess_type))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting integer argument", cmd_name);</div><div class='add'>+ goto error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ table->arg_type[argc] = SLANG_INT_TYPE;</div><div class='add'>+ table->int_args[argc++] = SLatoi((unsigned char *) buf);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* floating point arg */</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ case 'f':</div><div class='add'>+ if (token_present == 0) break;</div><div class='add'>+ case 'F':</div><div class='add'>+ if ((token_present == 0) || (SLANG_STRING_TYPE == guess_type))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting double argument", cmd_name);</div><div class='add'>+ goto error;</div><div class='add'>+ }</div><div class='add'>+ table->arg_type[argc] = SLANG_DOUBLE_TYPE;</div><div class='add'>+ table->double_args[argc++] = atof(buf);</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ /* Generic type */</div><div class='add'>+ case 'g':</div><div class='add'>+ if (token_present == 0) break;</div><div class='add'>+ case 'G':</div><div class='add'>+ if (token_present == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting argument", cmd_name);</div><div class='add'>+ goto error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ switch (guess_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_INT_TYPE:</div><div class='add'>+ table->arg_type[argc] = SLANG_INT_TYPE;</div><div class='add'>+ table->int_args[argc++] = SLatoi((unsigned char *) buf);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_STRING_TYPE:</div><div class='add'>+ s = SLmake_nstring (buf, len);</div><div class='add'>+ if (s == NULL) goto error;</div><div class='add'>+</div><div class='add'>+ table->arg_type[argc] = SLANG_STRING_TYPE;</div><div class='add'>+ table->string_args[argc++] = s;</div><div class='add'>+ break;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ table->arg_type[argc] = SLANG_DOUBLE_TYPE;</div><div class='add'>+ table->double_args[argc++] = atof(buf);</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* call function */</div><div class='add'>+ status = (*cmd->cmdfun)(argc, table);</div><div class='add'>+</div><div class='add'>+ error:</div><div class='add'>+ if (table->string_args != NULL) for (i = 0; i < argc; i++)</div><div class='add'>+ {</div><div class='add'>+ if (NULL != table->string_args[i])</div><div class='add'>+ {</div><div class='add'>+ SLfree (table->string_args[i]);</div><div class='add'>+ table->string_args[i] = NULL;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ SLfree ((char *)table->string_args); table->string_args = NULL;</div><div class='add'>+ SLfree ((char *)table->double_args); table->double_args = NULL;</div><div class='add'>+ SLfree ((char *)table->int_args); table->int_args = NULL;</div><div class='add'>+ SLfree ((char *)table->arg_type); table->arg_type = NULL;</div><div class='add'>+</div><div class='add'>+ SLfree (buf);</div><div class='add'>+ return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slcmplex.c b/mdk-stage1/slang/slcmplex.c<br/>new file mode 100644<br/>index 000000000..b210dfc04<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slcmplex.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcmplex.c</a></div><div class='hunk'>@@ -0,0 +1,1142 @@</div><div class='add'>+/* Complex Data Type definition for S-Lang */</div><div class='add'>+/* Copyright (c) 1997, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* The rest of the file is enclosed in this #if */</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+# include <math.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef PI</div><div class='add'>+# undef PI</div><div class='add'>+#endif</div><div class='add'>+#define PI 3.14159265358979323846</div><div class='add'>+</div><div class='add'>+int SLang_pop_complex (double *r, double *i)</div><div class='add'>+{</div><div class='add'>+ double *c;</div><div class='add'>+</div><div class='add'>+ switch (SLang_peek_at_stack ())</div><div class='add'>+ {</div><div class='add'>+ case SLANG_COMPLEX_TYPE:</div><div class='add'>+ if (-1 == SLclass_pop_ptr_obj (SLANG_COMPLEX_TYPE, (VOID_STAR *)&c))</div><div class='add'>+ return -1;</div><div class='add'>+ *r = c[0];</div><div class='add'>+ *i = c[1];</div><div class='add'>+ SLfree ((char *) c);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ *i = 0.0;</div><div class='add'>+ if (-1 == SLang_pop_double (r, NULL, NULL))</div><div class='add'>+ return -1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case -1:</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_complex (double r, double i)</div><div class='add'>+{</div><div class='add'>+ double *c;</div><div class='add'>+</div><div class='add'>+ c = (double *) SLmalloc (2 * sizeof (double));</div><div class='add'>+ if (c == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ c[0] = r;</div><div class='add'>+ c[1] = i;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_push_ptr_obj (SLANG_COMPLEX_TYPE, (VOID_STAR) c))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) c);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_times (double *c, double *a, double *b)</div><div class='add'>+{</div><div class='add'>+ double a_real, b_real, a_imag, b_imag;</div><div class='add'>+</div><div class='add'>+ a_real = a[0];</div><div class='add'>+ b_real = b[0];</div><div class='add'>+ a_imag = a[1];</div><div class='add'>+ b_imag = b[1];</div><div class='add'>+</div><div class='add'>+ c[0] = a_real * b_real - a_imag * b_imag;</div><div class='add'>+ c[1] = a_imag * b_real + a_real * b_imag;</div><div class='add'>+</div><div class='add'>+ return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_divide (double *c, double *a, double *b)</div><div class='add'>+{</div><div class='add'>+ double a_real, b_real, a_imag, b_imag;</div><div class='add'>+ double ratio, invden;</div><div class='add'>+</div><div class='add'>+ a_real = a[0];</div><div class='add'>+ b_real = b[0];</div><div class='add'>+ a_imag = a[1];</div><div class='add'>+ b_imag = b[1];</div><div class='add'>+</div><div class='add'>+ /* Do it this way to avoid overflow in the denom */</div><div class='add'>+ if (fabs(b_real) > fabs(b_imag))</div><div class='add'>+ {</div><div class='add'>+ ratio = b_imag / b_real;</div><div class='add'>+ invden = 1.0 / (b_real + b_imag * ratio);</div><div class='add'>+ c[0] = (a_real + ratio * a_imag) * invden;</div><div class='add'>+ c[1] = (a_imag - a_real * ratio) * invden;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ ratio = b_real / b_imag;</div><div class='add'>+ invden = 1.0 / (b_real * ratio + b_imag);</div><div class='add'>+ c[0] = (a_real * ratio + a_imag) * invden;</div><div class='add'>+ c[1] = (a_imag * ratio - a_real) * invden;</div><div class='add'>+ }</div><div class='add'>+ return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* a^b = exp (b log a); */</div><div class='add'>+double *SLcomplex_pow (double *c, double *a, double *b)</div><div class='add'>+{</div><div class='add'>+ return SLcomplex_exp (c, SLcomplex_times (c, b, SLcomplex_log (c, a)));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static double *complex_dpow (double *c, double *a, double b)</div><div class='add'>+{</div><div class='add'>+ SLcomplex_log (c, a);</div><div class='add'>+ c[0] *= b;</div><div class='add'>+ c[1] *= b;</div><div class='add'>+ return SLcomplex_exp (c, c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static double *dcomplex_pow (double *c, double a, double *b)</div><div class='add'>+{</div><div class='add'>+ a = log (a);</div><div class='add'>+ c[0] = a * b[0];</div><div class='add'>+ c[1] = a * b[1];</div><div class='add'>+ return SLcomplex_exp (c, c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double SLcomplex_abs (double *z)</div><div class='add'>+{</div><div class='add'>+ return SLmath_hypot (z[0], z[1]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* It appears that FORTRAN assumes that the branch cut for the log function</div><div class='add'>+ * is along the -x axis. So, use this for atan2:</div><div class='add'>+ */</div><div class='add'>+static double my_atan2 (double y, double x)</div><div class='add'>+{</div><div class='add'>+ double val;</div><div class='add'>+</div><div class='add'>+ val = atan (y/x);</div><div class='add'>+</div><div class='add'>+ if (x >= 0)</div><div class='add'>+ return val; /* I, IV */</div><div class='add'>+</div><div class='add'>+ if (y <= 0) /* III */</div><div class='add'>+ return val - PI;</div><div class='add'>+</div><div class='add'>+ return PI + val; /* II */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void polar_form (double *r, double *theta, double *z)</div><div class='add'>+{</div><div class='add'>+ double x, y;</div><div class='add'>+</div><div class='add'>+ *r = SLcomplex_abs (z);</div><div class='add'>+</div><div class='add'>+ x = z[0];</div><div class='add'>+ y = z[1];</div><div class='add'>+</div><div class='add'>+ if (x == 0.0)</div><div class='add'>+ {</div><div class='add'>+ if (y >= 0)</div><div class='add'>+ *theta = 0.5 * PI;</div><div class='add'>+ else</div><div class='add'>+ *theta = 1.5 * PI;</div><div class='add'>+ }</div><div class='add'>+ else *theta = my_atan2 (y, x);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_sin (double *sinz, double *z)</div><div class='add'>+{</div><div class='add'>+ double x, y;</div><div class='add'>+</div><div class='add'>+ x = z[0]; y = z[1];</div><div class='add'>+ sinz[0] = sin (x) * cosh (y);</div><div class='add'>+ sinz[1] = cos (x) * sinh (y);</div><div class='add'>+ return sinz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_cos (double *cosz, double *z)</div><div class='add'>+{</div><div class='add'>+ double x, y;</div><div class='add'>+</div><div class='add'>+ x = z[0]; y = z[1];</div><div class='add'>+ cosz[0] = cos (x) * cosh (y);</div><div class='add'>+ cosz[1] = -sin (x) * sinh (y);</div><div class='add'>+ return cosz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_exp (double *expz, double *z)</div><div class='add'>+{</div><div class='add'>+ double r, i;</div><div class='add'>+</div><div class='add'>+ r = exp (z[0]);</div><div class='add'>+ i = z[1];</div><div class='add'>+ expz[0] = r * cos (i);</div><div class='add'>+ expz[1] = r * sin (i);</div><div class='add'>+ return expz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_log (double *logz, double *z)</div><div class='add'>+{</div><div class='add'>+ double r, theta;</div><div class='add'>+</div><div class='add'>+ polar_form (&r, &theta, z); /* log R.e^(ix) = log R + ix */</div><div class='add'>+ logz[0] = log(r);</div><div class='add'>+ logz[1] = theta;</div><div class='add'>+ return logz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_log10 (double *log10z, double *z)</div><div class='add'>+{</div><div class='add'>+ double l10 = log (10.0);</div><div class='add'>+ (void) SLcomplex_log (log10z, z);</div><div class='add'>+ log10z[0] = log10z[0] / l10;</div><div class='add'>+ log10z[1] = log10z[1] / l10;</div><div class='add'>+ return log10z;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_sqrt (double *sqrtz, double *z)</div><div class='add'>+{</div><div class='add'>+ double r, x, y;</div><div class='add'>+</div><div class='add'>+ x = z[0];</div><div class='add'>+ y = z[1];</div><div class='add'>+</div><div class='add'>+ r = SLmath_hypot (x, y);</div><div class='add'>+</div><div class='add'>+ if (r == 0.0)</div><div class='add'>+ {</div><div class='add'>+ sqrtz [0] = sqrtz [1] = 0.0;</div><div class='add'>+ return sqrtz;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (x >= 0.0)</div><div class='add'>+ {</div><div class='add'>+ x = sqrt (0.5 * (r + x));</div><div class='add'>+ y = 0.5 * y / x;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ r = sqrt (0.5 * (r - x));</div><div class='add'>+ x = 0.5 * y / r;</div><div class='add'>+ y = r;</div><div class='add'>+</div><div class='add'>+ if (x < 0.0)</div><div class='add'>+ {</div><div class='add'>+ x = -x;</div><div class='add'>+ y = -y;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ sqrtz[0] = x;</div><div class='add'>+ sqrtz[1] = y;</div><div class='add'>+</div><div class='add'>+ return sqrtz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_tan (double *tanz, double *z)</div><div class='add'>+{</div><div class='add'>+ double x, y, invden;</div><div class='add'>+</div><div class='add'>+ x = 2 * z[0];</div><div class='add'>+ y = 2 * z[1];</div><div class='add'>+ invden = 1.0 / (cos (x) + cosh (y));</div><div class='add'>+ tanz[0] = invden * sin (x);</div><div class='add'>+ tanz[1] = invden * sinh (y);</div><div class='add'>+ return tanz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Utility Function */</div><div class='add'>+static void compute_alpha_beta (double *z, double *alpha, double *beta)</div><div class='add'>+{</div><div class='add'>+ double x, y, a, b;</div><div class='add'>+</div><div class='add'>+ x = z[0];</div><div class='add'>+ y = z[1];</div><div class='add'>+ a = 0.5 * SLmath_hypot (x + 1, y);</div><div class='add'>+ b = 0.5 * SLmath_hypot (x - 1, y);</div><div class='add'>+</div><div class='add'>+ *alpha = a + b;</div><div class='add'>+ *beta = a - b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_asin (double *asinz, double *z)</div><div class='add'>+{</div><div class='add'>+ double alpha, beta;</div><div class='add'>+</div><div class='add'>+ compute_alpha_beta (z, &alpha, &beta);</div><div class='add'>+ asinz[0] = asin (beta);</div><div class='add'>+ asinz[1] = log (alpha + sqrt (alpha * alpha - 1));</div><div class='add'>+ return asinz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_acos (double *acosz, double *z)</div><div class='add'>+{</div><div class='add'>+ double alpha, beta;</div><div class='add'>+</div><div class='add'>+ compute_alpha_beta (z, &alpha, &beta);</div><div class='add'>+ acosz[0] = acos (beta);</div><div class='add'>+ acosz[1] = -log (alpha + sqrt (alpha * alpha - 1));</div><div class='add'>+ return acosz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_atan (double *atanz, double *z)</div><div class='add'>+{</div><div class='add'>+ double x, y;</div><div class='add'>+ double z1[2], z2[2];</div><div class='add'>+</div><div class='add'>+ x = z[0]; y = z[1];</div><div class='add'>+ z1[0] = x;</div><div class='add'>+ z1[1] = 1 + y;</div><div class='add'>+ z2[0] = -x;</div><div class='add'>+ z2[1] = 1 - y;</div><div class='add'>+</div><div class='add'>+ SLcomplex_log (z1, SLcomplex_divide (z2, z1, z2));</div><div class='add'>+ atanz[0] = -0.5 * z1[1];</div><div class='add'>+ atanz[1] = 0.5 * z1[0];</div><div class='add'>+</div><div class='add'>+ return atanz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_sinh (double *sinhz, double *z)</div><div class='add'>+{</div><div class='add'>+ double x, y;</div><div class='add'>+ x = z[0]; y = z[1];</div><div class='add'>+ sinhz[0] = sinh (x) * cos (y);</div><div class='add'>+ sinhz[1] = cosh (x) * sin (y);</div><div class='add'>+ return sinhz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_cosh (double *coshz, double *z)</div><div class='add'>+{</div><div class='add'>+ double x, y;</div><div class='add'>+ x = z[0]; y = z[1];</div><div class='add'>+ coshz[0] = cosh (x) * cos (y);</div><div class='add'>+ coshz[1] = sinh (x) * sin (y);</div><div class='add'>+ return coshz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_tanh (double *tanhz, double *z)</div><div class='add'>+{</div><div class='add'>+ double x, y, invden;</div><div class='add'>+ x = 2 * z[0];</div><div class='add'>+ y = 2 * z[1];</div><div class='add'>+ invden = 1.0 / (cosh (x) + cos (y));</div><div class='add'>+ tanhz[0] = invden * sinh (x);</div><div class='add'>+ tanhz[1] = invden * sin (y);</div><div class='add'>+ return tanhz;</div><div class='add'>+}</div><div class='add'>+#if 0</div><div class='add'>+static double *not_implemented (char *fun, double *p)</div><div class='add'>+{</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "%s for complex numbers has not been implemented",</div><div class='add'>+ fun);</div><div class='add'>+ *p = -1.0;</div><div class='add'>+ return p;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+/* Use: asinh(z) = -i asin(iz) */</div><div class='add'>+double *SLcomplex_asinh (double *asinhz, double *z)</div><div class='add'>+{</div><div class='add'>+ double iz[2];</div><div class='add'>+ </div><div class='add'>+ iz[0] = -z[1];</div><div class='add'>+ iz[1] = z[0];</div><div class='add'>+ </div><div class='add'>+ (void) SLcomplex_asin (iz, iz);</div><div class='add'>+ asinhz[0] = iz[1];</div><div class='add'>+ asinhz[1] = -iz[0];</div><div class='add'>+ </div><div class='add'>+ return asinhz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Use: acosh (z) = i acos(z) */</div><div class='add'>+double *SLcomplex_acosh (double *acoshz, double *z)</div><div class='add'>+{</div><div class='add'>+ double iz[2];</div><div class='add'>+ </div><div class='add'>+ (void) SLcomplex_acos (iz, z);</div><div class='add'>+ acoshz[0] = -iz[1];</div><div class='add'>+ acoshz[1] = iz[0];</div><div class='add'>+</div><div class='add'>+ return acoshz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Use: atanh(z) = -i atan(iz) */</div><div class='add'>+double *SLcomplex_atanh (double *atanhz, double *z)</div><div class='add'>+{</div><div class='add'>+ double iz[2];</div><div class='add'>+ </div><div class='add'>+ iz[0] = -z[1];</div><div class='add'>+ iz[1] = z[0];</div><div class='add'>+ </div><div class='add'>+ (void) SLcomplex_atan (iz, iz);</div><div class='add'>+ atanhz[0] = iz[1];</div><div class='add'>+ atanhz[1] = -iz[0];</div><div class='add'>+ </div><div class='add'>+ return atanhz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_binary_result (int op, unsigned char a, unsigned char b,</div><div class='add'>+ unsigned char *c)</div><div class='add'>+{</div><div class='add'>+ (void) a; (void) b;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ case SLANG_POW:</div><div class='add'>+ case SLANG_PLUS:</div><div class='add'>+ case SLANG_MINUS:</div><div class='add'>+ case SLANG_TIMES:</div><div class='add'>+ case SLANG_DIVIDE:</div><div class='add'>+ *c = SLANG_COMPLEX_TYPE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_EQ:</div><div class='add'>+ case SLANG_NE:</div><div class='add'>+ *c = SLANG_CHAR_TYPE;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_complex_binary (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ char *ic;</div><div class='add'>+ double *a, *b, *c;</div><div class='add'>+ unsigned int n, n_max;</div><div class='add'>+ unsigned int da, db;</div><div class='add'>+</div><div class='add'>+ (void) a_type;</div><div class='add'>+ (void) b_type;</div><div class='add'>+</div><div class='add'>+ a = (double *) ap;</div><div class='add'>+ b = (double *) bp;</div><div class='add'>+ c = (double *) cp;</div><div class='add'>+ ic = (char *) cp;</div><div class='add'>+</div><div class='add'>+ if (na == 1) da = 0; else da = 2;</div><div class='add'>+ if (nb == 1) db = 0; else db = 2;</div><div class='add'>+</div><div class='add'>+ if (na > nb) n_max = na; else n_max = nb;</div><div class='add'>+ n_max = 2 * n_max;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLANG_PLUS:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ c[n] = a[0] + b[0];</div><div class='add'>+ c[n + 1] = a[1] + b[1];</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_MINUS:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ c[n] = a[0] - b[0];</div><div class='add'>+ c[n + 1] = a[1] - b[1];</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_TIMES:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ SLcomplex_times (c + n, a, b);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_DIVIDE: /* / */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ if ((b[0] == 0.0) && (b[1] == 0.0))</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ SLcomplex_divide (c + n, a, b);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_EQ: /* == */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ ic[n/2] = ((a[0] == b[0]) && (a[1] == b[1]));</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_NE: /* != */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ ic[n/2] = ((a[0] != b[0]) || (a[1] != b[1]));</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_POW:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ SLcomplex_pow (c + n, a, b);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_double_binary (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ char *ic;</div><div class='add'>+ double *a, *b, *c;</div><div class='add'>+ unsigned int n, n_max;</div><div class='add'>+ unsigned int da, db;</div><div class='add'>+</div><div class='add'>+ (void) a_type;</div><div class='add'>+ (void) b_type;</div><div class='add'>+</div><div class='add'>+ a = (double *) ap;</div><div class='add'>+ b = (double *) bp;</div><div class='add'>+ c = (double *) cp;</div><div class='add'>+ ic = (char *) cp;</div><div class='add'>+</div><div class='add'>+ if (na == 1) da = 0; else da = 2;</div><div class='add'>+ if (nb == 1) db = 0; else db = 1;</div><div class='add'>+</div><div class='add'>+ if (na > nb) n_max = na; else n_max = nb;</div><div class='add'>+ n_max = 2 * n_max;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLANG_PLUS:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ c[n] = a[0] + b[0];</div><div class='add'>+ c[n + 1] = a[1];</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_MINUS:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ c[n] = a[0] - b[0];</div><div class='add'>+ c[n + 1] = a[1];</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_TIMES:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ double b0 = b[0];</div><div class='add'>+ c[n] = a[0] * b0;</div><div class='add'>+ c[n + 1] = a[1] * b0;</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_DIVIDE: /* / */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ double b0 = b[0];</div><div class='add'>+ if (b0 == 0.0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ c[n] = a[0] / b0;</div><div class='add'>+ c[n + 1] = a[1] / b0;</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_EQ: /* == */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ ic[n/2] = ((a[0] == b[0]) && (a[1] == 0.0));</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_NE: /* != */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ ic[n/2] = ((a[0] != b[0]) || (a[1] != 0.0));</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_POW:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ complex_dpow (c + n, a, b[0]);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int double_complex_binary (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ char *ic;</div><div class='add'>+ double *a, *b, *c;</div><div class='add'>+ unsigned int n, n_max;</div><div class='add'>+ unsigned int da, db;</div><div class='add'>+</div><div class='add'>+ (void) a_type;</div><div class='add'>+ (void) b_type;</div><div class='add'>+</div><div class='add'>+ a = (double *) ap;</div><div class='add'>+ b = (double *) bp;</div><div class='add'>+ c = (double *) cp;</div><div class='add'>+ ic = (char *) cp;</div><div class='add'>+</div><div class='add'>+ if (na == 1) da = 0; else da = 1;</div><div class='add'>+ if (nb == 1) db = 0; else db = 2;</div><div class='add'>+</div><div class='add'>+ if (na > nb) n_max = na; else n_max = nb;</div><div class='add'>+ n_max = 2 * n_max;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLANG_PLUS:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ c[n] = a[0] + b[0];</div><div class='add'>+ c[n + 1] = b[1];</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_MINUS:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ c[n] = a[0] - b[0];</div><div class='add'>+ c[n + 1] = -b[1];</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_TIMES:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ double a0 = a[0];</div><div class='add'>+ c[n] = a0 * b[0];</div><div class='add'>+ c[n + 1] = a0 * b[1];</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_DIVIDE: /* / */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ double z[2];</div><div class='add'>+ if ((b[0] == 0.0) && (b[1] == 0.0))</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ z[0] = a[0];</div><div class='add'>+ z[1] = 0.0;</div><div class='add'>+ SLcomplex_divide (c + n, z, b);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_EQ: /* == */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ ic[n/2] = ((a[0] == b[0]) && (0.0 == b[1]));</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_NE: /* != */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ ic[n/2] = ((a[0] != b[0]) || (0.0 != b[1]));</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_POW:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ dcomplex_pow (c + n, a[0], b);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_generic_binary (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ char *ic;</div><div class='add'>+ char *b;</div><div class='add'>+ double *a, *c;</div><div class='add'>+ unsigned int n, n_max;</div><div class='add'>+ unsigned int da, db;</div><div class='add'>+ unsigned int sizeof_b;</div><div class='add'>+ SLang_To_Double_Fun_Type to_double;</div><div class='add'>+</div><div class='add'>+ if (NULL == (to_double = SLarith_get_to_double_fun (b_type, &sizeof_b)))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ (void) a_type;</div><div class='add'>+</div><div class='add'>+ a = (double *) ap;</div><div class='add'>+ b = (char *) bp;</div><div class='add'>+ c = (double *) cp;</div><div class='add'>+ ic = (char *) cp;</div><div class='add'>+</div><div class='add'>+ if (na == 1) da = 0; else da = 2;</div><div class='add'>+ if (nb == 1) db = 0; else db = sizeof_b;</div><div class='add'>+</div><div class='add'>+ if (na > nb) n_max = na; else n_max = nb;</div><div class='add'>+ n_max = 2 * n_max;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLANG_POW:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ complex_dpow (c + n, a, to_double((VOID_STAR)b));</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_PLUS:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ c[n] = a[0] + to_double((VOID_STAR)b);</div><div class='add'>+ c[n + 1] = a[1];</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_MINUS:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ c[n] = a[0] - to_double((VOID_STAR)b);</div><div class='add'>+ c[n + 1] = a[1];</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_TIMES:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ double b0 = to_double((VOID_STAR)b);</div><div class='add'>+ c[n] = a[0] * b0;</div><div class='add'>+ c[n + 1] = a[1] * b0;</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_DIVIDE: /* / */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ double b0 = to_double((VOID_STAR)b);</div><div class='add'>+ if (b0 == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ c[n] = a[0] / b0;</div><div class='add'>+ c[n + 1] = a[1] / b0;</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_EQ: /* == */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ ic[n/2] = ((a[0] == to_double((VOID_STAR)b)) && (a[1] == 0.0));</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_NE: /* != */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ ic[n/2] = ((a[0] != to_double((VOID_STAR)b)) || (a[1] != 0.0));</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int generic_complex_binary (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ double *b, *c;</div><div class='add'>+ char *a, *ic;</div><div class='add'>+ unsigned int n, n_max;</div><div class='add'>+ unsigned int da, db;</div><div class='add'>+ unsigned int sizeof_a;</div><div class='add'>+ SLang_To_Double_Fun_Type to_double;</div><div class='add'>+</div><div class='add'>+ if (NULL == (to_double = SLarith_get_to_double_fun (a_type, &sizeof_a)))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ (void) b_type;</div><div class='add'>+</div><div class='add'>+ a = (char *) ap;</div><div class='add'>+ b = (double *) bp;</div><div class='add'>+ c = (double *) cp;</div><div class='add'>+ ic = (char *) cp;</div><div class='add'>+</div><div class='add'>+ if (na == 1) da = 0; else da = sizeof_a;</div><div class='add'>+ if (nb == 1) db = 0; else db = 2;</div><div class='add'>+</div><div class='add'>+ if (na > nb) n_max = na; else n_max = nb;</div><div class='add'>+ n_max = 2 * n_max;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+ case SLANG_POW:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ dcomplex_pow (c + n, to_double((VOID_STAR)a), b);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_PLUS:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ c[n] = to_double((VOID_STAR)a) + b[0];</div><div class='add'>+ c[n + 1] = b[1];</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_MINUS:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ c[n] = to_double((VOID_STAR)a) - b[0];</div><div class='add'>+ c[n + 1] = -b[1];</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_TIMES:</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ double a0 = to_double((VOID_STAR)a);</div><div class='add'>+ c[n] = a0 * b[0];</div><div class='add'>+ c[n + 1] = a0 * b[1];</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_DIVIDE: /* / */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ double z[2];</div><div class='add'>+ if ((b[0] == 0.0) && (b[1] == 0.0))</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ z[0] = to_double((VOID_STAR)a);</div><div class='add'>+ z[1] = 0.0;</div><div class='add'>+ SLcomplex_divide (c + n, z, b);</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_EQ: /* == */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ ic[n/2] = ((to_double((VOID_STAR)a) == b[0]) && (0.0 == b[1]));</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_NE: /* != */</div><div class='add'>+ for (n = 0; n < n_max; n += 2)</div><div class='add'>+ {</div><div class='add'>+ ic[n/2] = ((to_double((VOID_STAR)a) != b[0]) || (0.0 != b[1]));</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_unary_result (int op, unsigned char a, unsigned char *b)</div><div class='add'>+{</div><div class='add'>+ (void) a;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLANG_PLUSPLUS:</div><div class='add'>+ case SLANG_MINUSMINUS:</div><div class='add'>+ case SLANG_CHS:</div><div class='add'>+ case SLANG_MUL2:</div><div class='add'>+ *b = SLANG_COMPLEX_TYPE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_SQR: /* |Real|^2 + |Imag|^2 ==> double */</div><div class='add'>+ case SLANG_ABS: /* |z| ==> double */</div><div class='add'>+ *b = SLANG_DOUBLE_TYPE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_SIGN:</div><div class='add'>+ *b = SLANG_INT_TYPE;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_unary (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ unsigned int n;</div><div class='add'>+ double *a, *b;</div><div class='add'>+ int *ic;</div><div class='add'>+</div><div class='add'>+ (void) a_type;</div><div class='add'>+</div><div class='add'>+ a = (double *) ap;</div><div class='add'>+ b = (double *) bp;</div><div class='add'>+ ic = (int *) bp;</div><div class='add'>+</div><div class='add'>+ na = 2 * na;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLANG_PLUSPLUS:</div><div class='add'>+ for (n = 0; n < na; n += 2) b[n] = (a[n] + 1);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_MINUSMINUS:</div><div class='add'>+ for (n = 0; n < na; n += 2) b[n] = (a[n] - 1);</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_CHS:</div><div class='add'>+ for (n = 0; n < na; n += 2)</div><div class='add'>+ {</div><div class='add'>+ b[n] = -(a[n]);</div><div class='add'>+ b[n + 1] = -(a[n + 1]);</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_SQR: /* |Real|^2 + |Imag|^2 ==> double */</div><div class='add'>+ for (n = 0; n < na; n += 2)</div><div class='add'>+ b[n/2] = (a[n] * a[n] + a[n + 1] * a[n + 1]);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_MUL2:</div><div class='add'>+ for (n = 0; n < na; n += 2)</div><div class='add'>+ {</div><div class='add'>+ b[n] = (2 * a[n]);</div><div class='add'>+ b[n + 1] = (2 * a[n + 1]);</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_ABS: /* |z| ==> double */</div><div class='add'>+ for (n = 0; n < na; n += 2)</div><div class='add'>+ b[n/2] = SLcomplex_abs (a + n);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_SIGN:</div><div class='add'>+ /* Another creative extension. Lets return an integer which indicates</div><div class='add'>+ * whether the complex number is in the upperhalf plane or not.</div><div class='add'>+ */</div><div class='add'>+ for (n = 0; n < na; n += 2)</div><div class='add'>+ {</div><div class='add'>+ if (a[n + 1] < 0.0) ic[n/2] = -1;</div><div class='add'>+ else if (a[n + 1] > 0.0) ic[n/2] = 1;</div><div class='add'>+ else ic[n/2] = 0;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+complex_typecast (unsigned char from_type, VOID_STAR from, unsigned int num,</div><div class='add'>+ unsigned char to_type, VOID_STAR to)</div><div class='add'>+{</div><div class='add'>+ double *z;</div><div class='add'>+ double *d;</div><div class='add'>+ char *i;</div><div class='add'>+ unsigned int n;</div><div class='add'>+ unsigned int sizeof_i;</div><div class='add'>+ SLang_To_Double_Fun_Type to_double;</div><div class='add'>+</div><div class='add'>+ (void) to_type;</div><div class='add'>+</div><div class='add'>+ z = (double *) to;</div><div class='add'>+</div><div class='add'>+ switch (from_type)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ if (NULL == (to_double = SLarith_get_to_double_fun (from_type, &sizeof_i)))</div><div class='add'>+ return 0;</div><div class='add'>+ i = (char *) from;</div><div class='add'>+ for (n = 0; n < num; n++)</div><div class='add'>+ {</div><div class='add'>+ *z++ = to_double ((VOID_STAR) i);</div><div class='add'>+ *z++ = 0.0;</div><div class='add'>+</div><div class='add'>+ i += sizeof_i;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ d = (double *) from;</div><div class='add'>+ for (n = 0; n < num; n++)</div><div class='add'>+ {</div><div class='add'>+ *z++ = d[n];</div><div class='add'>+ *z++ = 0.0;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void complex_destroy (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ SLfree ((char *)*(double **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_push (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ double *z;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ z = *(double **) ptr;</div><div class='add'>+ return SLang_push_complex (z[0], z[1]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_pop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ double *z;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ z = *(double **) ptr;</div><div class='add'>+ return SLang_pop_complex (&z[0], &z[1]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLinit_slcomplex (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ unsigned char *types;</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("Complex_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ (void) SLclass_set_destroy_function (cl, complex_destroy);</div><div class='add'>+ (void) SLclass_set_push_function (cl, complex_push);</div><div class='add'>+ (void) SLclass_set_pop_function (cl, complex_pop);</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_COMPLEX_TYPE, 2 * sizeof (double),</div><div class='add'>+ SLANG_CLASS_TYPE_VECTOR))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ types = _SLarith_Arith_Types;</div><div class='add'>+ while (*types != SLANG_DOUBLE_TYPE)</div><div class='add'>+ {</div><div class='add'>+ unsigned char t = *types++;</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLclass_add_binary_op (t, SLANG_COMPLEX_TYPE, generic_complex_binary, complex_binary_result))</div><div class='add'>+ || (-1 == SLclass_add_binary_op (SLANG_COMPLEX_TYPE, t, complex_generic_binary, complex_binary_result))</div><div class='add'>+ || (-1 == (SLclass_add_typecast (t, SLANG_COMPLEX_TYPE, complex_typecast, 1))))</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((-1 == (SLclass_add_binary_op (SLANG_COMPLEX_TYPE, SLANG_COMPLEX_TYPE, complex_complex_binary, complex_binary_result)))</div><div class='add'>+ || (-1 == (SLclass_add_binary_op (SLANG_COMPLEX_TYPE, SLANG_DOUBLE_TYPE, complex_double_binary, complex_binary_result)))</div><div class='add'>+ || (-1 == (SLclass_add_binary_op (SLANG_DOUBLE_TYPE, SLANG_COMPLEX_TYPE, double_complex_binary, complex_binary_result)))</div><div class='add'>+ || (-1 == (SLclass_add_unary_op (SLANG_COMPLEX_TYPE, complex_unary, complex_unary_result)))</div><div class='add'>+ || (-1 == (SLclass_add_typecast (SLANG_DOUBLE_TYPE, SLANG_COMPLEX_TYPE, complex_typecast, 1))))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* if SLANG_HAS_COMPLEX */</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slcompat.c b/mdk-stage1/slang/slcompat.c<br/>new file mode 100644<br/>index 000000000..5aa122483<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slcompat.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcompat.c</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+/* These functions are provided for backward compatibility and are obsolete.</div><div class='add'>+ * Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* Compatibility */</div><div class='add'>+int SLang_init_slunix (void)</div><div class='add'>+{</div><div class='add'>+ if ((-1 == SLang_init_posix_dir ())</div><div class='add'>+ || (-1 == SLang_init_posix_process ())</div><div class='add'>+ || (-1 == SLdefine_for_ifdef ("__SLUNIX__")))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_init_slfile (void)</div><div class='add'>+{</div><div class='add'>+ if ((-1 == SLang_init_stdio ())</div><div class='add'>+ || (-1 == SLang_init_posix_dir ())</div><div class='add'>+ || (-1 == SLdefine_for_ifdef("__SLFILE__")))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slcurses.c b/mdk-stage1/slang/slcurses.c<br/>new file mode 100644<br/>index 000000000..f1212afc8<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slcurses.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcurses.c</a></div><div class='hunk'>@@ -0,0 +1,972 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include <signal.h></div><div class='add'>+#include <errno.h></div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+#include "slcurses.h"</div><div class='add'>+</div><div class='add'>+/* This file is meant to implement a primitive curses implementation in</div><div class='add'>+ * terms of SLsmg calls. The fact is that the interfaces are sufficiently</div><div class='add'>+ * different that a 100% emulation is not possible.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+SLcurses_Window_Type *SLcurses_Stdscr;</div><div class='add'>+int SLcurses_Esc_Delay = 150; /* 0.15 seconds */</div><div class='add'>+SLtt_Char_Type SLcurses_Acs_Map [128];</div><div class='add'>+int SLcurses_Is_Endwin = 1;</div><div class='add'>+int SLcurses_Num_Colors = 8;</div><div class='add'>+</div><div class='add'>+static void blank_line (SLsmg_Char_Type *b, unsigned int len, SLsmg_Char_Type color)</div><div class='add'>+{</div><div class='add'>+ SLsmg_Char_Type *bmax;</div><div class='add'>+</div><div class='add'>+ bmax = b + len;</div><div class='add'>+ color = SLSMG_BUILD_CHAR(' ', color);</div><div class='add'>+</div><div class='add'>+ while (b < bmax) *b++ = color;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int va_mvprintw (SLcurses_Window_Type *w, int r, int c, int do_move,</div><div class='add'>+ char *fmt, va_list ap)</div><div class='add'>+{</div><div class='add'>+ char buf[1024];</div><div class='add'>+</div><div class='add'>+ if (do_move) SLcurses_wmove (w, r, c);</div><div class='add'>+</div><div class='add'>+ (void) _SLvsnprintf (buf, sizeof(buf), fmt, ap);</div><div class='add'>+</div><div class='add'>+ SLcurses_waddnstr (w, buf, -1);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_mvprintw (int r, int c, char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+ va_list ap;</div><div class='add'>+</div><div class='add'>+ va_start(ap, fmt);</div><div class='add'>+ va_mvprintw (SLcurses_Stdscr, r, c, 1, fmt, ap);</div><div class='add'>+ va_end(ap);</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_mvwprintw (SLcurses_Window_Type *w, int r, int c, char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+ va_list ap;</div><div class='add'>+</div><div class='add'>+ va_start(ap, fmt);</div><div class='add'>+ va_mvprintw (w, r, c, 1, fmt, ap);</div><div class='add'>+ va_end(ap);</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wprintw (SLcurses_Window_Type *w, char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+ va_list ap;</div><div class='add'>+</div><div class='add'>+ va_start(ap, fmt);</div><div class='add'>+ va_mvprintw (w, 0, 0, 0, fmt, ap);</div><div class='add'>+ va_end(ap);</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_printw (char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+ va_list ap;</div><div class='add'>+</div><div class='add'>+ va_start(ap, fmt);</div><div class='add'>+ va_mvprintw (SLcurses_Stdscr, 0, 0, 0, fmt, ap);</div><div class='add'>+ va_end(ap);</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_nil (void)</div><div class='add'>+{</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_has_colors(void)</div><div class='add'>+{</div><div class='add'>+ return SLtt_Use_Ansi_Colors;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_nodelay (SLcurses_Window_Type *w, int onoff)</div><div class='add'>+{</div><div class='add'>+ w->delay_off = (onoff ? 0 : -1);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wgetch (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+ if (w == NULL)</div><div class='add'>+ return ERR;</div><div class='add'>+</div><div class='add'>+ SLcurses_wrefresh (w);</div><div class='add'>+</div><div class='add'>+ if ((w->delay_off == -1) ||</div><div class='add'>+ SLang_input_pending (w->delay_off))</div><div class='add'>+ {</div><div class='add'>+ if (w->use_keypad)</div><div class='add'>+ {</div><div class='add'>+ int ch = SLang_getkey ();</div><div class='add'>+ if (ch == '\033')</div><div class='add'>+ {</div><div class='add'>+ if (0 == SLang_input_pending (ESCDELAY / 100))</div><div class='add'>+ return ch;</div><div class='add'>+ }</div><div class='add'>+ else if (ch == 0xFFFF) return ERR;</div><div class='add'>+ SLang_ungetkey (ch);</div><div class='add'>+ return SLkp_getkey ();</div><div class='add'>+ }</div><div class='add'>+ return SLang_getkey ();</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return ERR;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_getch (void)</div><div class='add'>+{</div><div class='add'>+ return SLcurses_wgetch (SLcurses_Stdscr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is a super hack. That fact is that SLsmg and curses</div><div class='add'>+ * are incompatible.</div><div class='add'>+ */</div><div class='add'>+static unsigned char Color_Objects[256];</div><div class='add'>+</div><div class='add'>+static unsigned int map_attr_to_object (SLtt_Char_Type attr)</div><div class='add'>+{</div><div class='add'>+ unsigned int obj;</div><div class='add'>+ SLtt_Char_Type at;</div><div class='add'>+</div><div class='add'>+ obj = (attr >> 8) & 0xFF;</div><div class='add'>+</div><div class='add'>+ if (SLtt_Use_Ansi_Colors)</div><div class='add'>+ {</div><div class='add'>+ if (Color_Objects[obj] != 0) return obj;</div><div class='add'>+</div><div class='add'>+ at = SLtt_get_color_object (obj & 0xF);</div><div class='add'>+</div><div class='add'>+ if (attr & A_BOLD) at |= SLTT_BOLD_MASK;</div><div class='add'>+ if (attr & A_UNDERLINE) at |= SLTT_ULINE_MASK;</div><div class='add'>+ if (attr & A_REVERSE) at |= SLTT_REV_MASK;</div><div class='add'>+</div><div class='add'>+ SLtt_set_color_object (obj, at);</div><div class='add'>+</div><div class='add'>+ Color_Objects[obj] = 1;</div><div class='add'>+ }</div><div class='add'>+ else obj = obj & 0xF0;</div><div class='add'>+</div><div class='add'>+ return obj;</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_start_color (void)</div><div class='add'>+{</div><div class='add'>+ int f, b;</div><div class='add'>+ int obj;</div><div class='add'>+</div><div class='add'>+ if (SLtt_Use_Ansi_Colors == 0) return -1;</div><div class='add'>+</div><div class='add'>+ obj = 0;</div><div class='add'>+ for (f = 0; f < 16; f++)</div><div class='add'>+ {</div><div class='add'>+ for (b = 0; b < 16; b++)</div><div class='add'>+ {</div><div class='add'>+ obj++;</div><div class='add'>+ SLtt_set_color_fgbg (obj, f, b);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef SIGINT</div><div class='add'>+static void sigint_handler (int sig)</div><div class='add'>+{</div><div class='add'>+ SLang_reset_tty ();</div><div class='add'>+ SLsmg_reset_smg ();</div><div class='add'>+ exit (sig);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Values are assumed to be 0, 1, 2. This fact is exploited */</div><div class='add'>+static int TTY_State;</div><div class='add'>+</div><div class='add'>+static int init_tty (int suspend_ok)</div><div class='add'>+{</div><div class='add'>+ if (-1 == SLang_init_tty (-1, 1, 0))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+ if (suspend_ok) SLtty_set_suspend_state (1);</div><div class='add'>+#endif</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_raw (void)</div><div class='add'>+{</div><div class='add'>+ TTY_State = 1;</div><div class='add'>+ return init_tty (0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_cbreak (void)</div><div class='add'>+{</div><div class='add'>+ TTY_State = 2;</div><div class='add'>+ return init_tty (1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if defined(SIGTSTP) && defined(SIGSTOP)</div><div class='add'>+static void sigtstp_handler (int sig)</div><div class='add'>+{</div><div class='add'>+ sig = errno;</div><div class='add'>+</div><div class='add'>+ SLsmg_suspend_smg ();</div><div class='add'>+</div><div class='add'>+ if (TTY_State)</div><div class='add'>+ SLang_reset_tty ();</div><div class='add'>+</div><div class='add'>+ kill(getpid(),SIGSTOP);</div><div class='add'>+</div><div class='add'>+ SLsmg_resume_smg ();</div><div class='add'>+</div><div class='add'>+ if (TTY_State) init_tty (TTY_State - 1);</div><div class='add'>+</div><div class='add'>+ signal (SIGTSTP, sigtstp_handler);</div><div class='add'>+ errno = sig;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+SLcurses_Window_Type *SLcurses_initscr (void)</div><div class='add'>+{</div><div class='add'>+ SLcurses_Is_Endwin = 0;</div><div class='add'>+ SLsmg_Newline_Behavior = SLSMG_NEWLINE_MOVES;</div><div class='add'>+ SLtt_get_terminfo ();</div><div class='add'>+</div><div class='add'>+#if !defined(IBMPC_SYSTEM) && !defined(VMS)</div><div class='add'>+ if (-1 == (SLcurses_Num_Colors = SLtt_tgetnum ("Co")))</div><div class='add'>+#endif</div><div class='add'>+ SLcurses_Num_Colors = 8;</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLkp_init ())</div><div class='add'>+ || (-1 == SLcurses_cbreak ())</div><div class='add'>+ || (NULL == (SLcurses_Stdscr = SLcurses_newwin (0, 0, 0, 0)))</div><div class='add'>+ || (-1 == SLsmg_init_smg ()))</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror (NULL);</div><div class='add'>+ SLang_exit_error ("SLcurses_initscr: init failed\n");</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#ifdef SIGINT</div><div class='add'>+ signal (SIGINT, sigint_handler);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(SIGTSTP) && defined(SIGSTOP)</div><div class='add'>+ signal (SIGTSTP, sigtstp_handler);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ SLtt_set_mono (A_BOLD >> 8, NULL, SLTT_BOLD_MASK);</div><div class='add'>+ SLtt_set_mono (A_UNDERLINE >> 8, NULL, SLTT_ULINE_MASK);</div><div class='add'>+ SLtt_set_mono (A_REVERSE >> 8, NULL, SLTT_REV_MASK);</div><div class='add'>+ /* SLtt_set_mono (A_BLINK >> 8, NULL, SLTT_BLINK_MASK); */</div><div class='add'>+ SLtt_set_mono ((A_BOLD|A_UNDERLINE) >> 8, NULL, SLTT_ULINE_MASK|SLTT_BOLD_MASK);</div><div class='add'>+ SLtt_set_mono ((A_REVERSE|A_UNDERLINE) >> 8, NULL, SLTT_ULINE_MASK|SLTT_REV_MASK);</div><div class='add'>+</div><div class='add'>+ if (SLtt_Has_Alt_Charset)</div><div class='add'>+ {</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_ULCORN_CHAR] = SLSMG_ULCORN_CHAR | A_ALTCHARSET;</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_URCORN_CHAR] = SLSMG_URCORN_CHAR | A_ALTCHARSET;</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_LLCORN_CHAR] = SLSMG_LLCORN_CHAR | A_ALTCHARSET;</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_LRCORN_CHAR] = SLSMG_LRCORN_CHAR | A_ALTCHARSET;</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_UTEE_CHAR] = SLSMG_UTEE_CHAR | A_ALTCHARSET;</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_DTEE_CHAR] = SLSMG_DTEE_CHAR | A_ALTCHARSET;</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_LTEE_CHAR] = SLSMG_LTEE_CHAR | A_ALTCHARSET;</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_RTEE_CHAR] = SLSMG_RTEE_CHAR | A_ALTCHARSET;</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_VLINE_CHAR] = SLSMG_VLINE_CHAR | A_ALTCHARSET;</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_HLINE_CHAR] = SLSMG_HLINE_CHAR | A_ALTCHARSET;</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_PLUS_CHAR] = SLSMG_PLUS_CHAR | A_ALTCHARSET;</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_CKBRD_CHAR] = SLSMG_CKBRD_CHAR | A_ALTCHARSET;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ /* ugly defaults to use on terminals which don't support graphics */</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_ULCORN_CHAR] = '+';</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_URCORN_CHAR] = '+';</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_LLCORN_CHAR] = '+';</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_LRCORN_CHAR] = '+';</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_UTEE_CHAR] = '+';</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_DTEE_CHAR] = '+';</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_LTEE_CHAR] = '+';</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_RTEE_CHAR] = '+';</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_VLINE_CHAR] = '|';</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_HLINE_CHAR] = '-';</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_PLUS_CHAR] = '+';</div><div class='add'>+ SLcurses_Acs_Map[SLSMG_CKBRD_CHAR] = '#';</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return SLcurses_Stdscr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wattrset (SLcurses_Window_Type *w, SLtt_Char_Type ch)</div><div class='add'>+{</div><div class='add'>+ unsigned int obj;</div><div class='add'>+</div><div class='add'>+ obj = map_attr_to_object (ch);</div><div class='add'>+ w->color = obj;</div><div class='add'>+ w->attr = ch;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wattroff (SLcurses_Window_Type *w, SLtt_Char_Type ch)</div><div class='add'>+{</div><div class='add'>+ if (SLtt_Use_Ansi_Colors)</div><div class='add'>+ return SLcurses_wattrset (w, 0);</div><div class='add'>+</div><div class='add'>+ w->attr &= ~ch;</div><div class='add'>+ return SLcurses_wattrset (w, w->attr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wattron (SLcurses_Window_Type *w, SLtt_Char_Type ch)</div><div class='add'>+{</div><div class='add'>+ if (SLtt_Use_Ansi_Colors)</div><div class='add'>+ return SLcurses_wattrset (w, ch);</div><div class='add'>+</div><div class='add'>+ w->attr |= ch;</div><div class='add'>+ return SLcurses_wattrset (w, w->attr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_delwin (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+ if (w == NULL) return 0;</div><div class='add'>+ if (w->lines != NULL)</div><div class='add'>+ {</div><div class='add'>+ SLsmg_Char_Type **lines = w->lines;</div><div class='add'>+ if (w->is_subwin == 0)</div><div class='add'>+ {</div><div class='add'>+ unsigned int r, rmax;</div><div class='add'>+</div><div class='add'>+ rmax = w->nrows;</div><div class='add'>+ for (r = 0; r < rmax; r++)</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *)lines[r]);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLfree ((char *)lines);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLfree ((char *)w);</div><div class='add'>+ if (w == SLcurses_Stdscr)</div><div class='add'>+ SLcurses_Stdscr = NULL;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLcurses_Window_Type *SLcurses_newwin (unsigned int nrows, unsigned int ncols,</div><div class='add'>+ unsigned int r, unsigned int c)</div><div class='add'>+{</div><div class='add'>+ SLcurses_Window_Type *win;</div><div class='add'>+ SLsmg_Char_Type **lines;</div><div class='add'>+</div><div class='add'>+ if (r >= (unsigned int) SLtt_Screen_Rows)</div><div class='add'>+ return NULL;</div><div class='add'>+ if (c >= (unsigned int) SLtt_Screen_Cols)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ if (NULL == (win = (SLcurses_Window_Type *) SLmalloc (sizeof (SLcurses_Window_Type))))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ SLMEMSET ((char *) win, 0, sizeof (SLcurses_Window_Type));</div><div class='add'>+</div><div class='add'>+ if (nrows == 0)</div><div class='add'>+ nrows = (unsigned int) SLtt_Screen_Rows - r;</div><div class='add'>+ if (ncols == 0)</div><div class='add'>+ ncols = (unsigned int) SLtt_Screen_Cols - c;</div><div class='add'>+</div><div class='add'>+ lines = (SLsmg_Char_Type **) SLmalloc (nrows * sizeof (SLsmg_Char_Type *));</div><div class='add'>+ if (lines == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLcurses_delwin (win);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLMEMSET ((char *) lines, 0, nrows * sizeof (SLsmg_Char_Type *));</div><div class='add'>+</div><div class='add'>+ win->lines = lines;</div><div class='add'>+ win->scroll_max = win->nrows = nrows;</div><div class='add'>+ win->ncols = ncols;</div><div class='add'>+ win->_begy = r;</div><div class='add'>+ win->_begx = c;</div><div class='add'>+ win->_maxx = (c + ncols) - 1;</div><div class='add'>+ win->_maxy = (r + nrows) - 1;</div><div class='add'>+ win->modified = 1;</div><div class='add'>+ win->delay_off = -1;</div><div class='add'>+</div><div class='add'>+ for (r = 0; r < nrows; r++)</div><div class='add'>+ {</div><div class='add'>+ SLsmg_Char_Type *b;</div><div class='add'>+</div><div class='add'>+ b = (SLsmg_Char_Type *) SLmalloc (ncols * sizeof (SLsmg_Char_Type));</div><div class='add'>+ if (b == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLcurses_delwin (win);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ lines [r] = b;</div><div class='add'>+ blank_line (b, ncols, 0);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return win;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wmove (SLcurses_Window_Type *win, unsigned int r, unsigned int c)</div><div class='add'>+{</div><div class='add'>+ if (win == NULL) return -1;</div><div class='add'>+ win->_cury = r;</div><div class='add'>+ win->_curx = c;</div><div class='add'>+ win->modified = 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int do_newline (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+ w->_curx = 0;</div><div class='add'>+ w->_cury += 1;</div><div class='add'>+ if (w->_cury >= w->scroll_max)</div><div class='add'>+ {</div><div class='add'>+ w->_cury = w->scroll_max - 1;</div><div class='add'>+ if (w->scroll_ok)</div><div class='add'>+ SLcurses_wscrl (w, 1);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_waddch (SLcurses_Window_Type *win, SLtt_Char_Type attr)</div><div class='add'>+{</div><div class='add'>+ SLsmg_Char_Type *b, ch;</div><div class='add'>+ SLsmg_Char_Type color;</div><div class='add'>+</div><div class='add'>+ if (win == NULL) return -1;</div><div class='add'>+</div><div class='add'>+ if (win->_cury >= win->nrows)</div><div class='add'>+ {</div><div class='add'>+ /* Curses seems to move current postion to top of window. */</div><div class='add'>+ win->_cury = win->_curx = 0;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ win->modified = 1;</div><div class='add'>+</div><div class='add'>+ ch = SLSMG_EXTRACT_CHAR(attr);</div><div class='add'>+</div><div class='add'>+ if (attr == ch)</div><div class='add'>+ color = win->color;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ /* hack to pick up the default color for graphics chars */</div><div class='add'>+ if (((attr & A_COLOR) == 0) && ((attr & A_ALTCHARSET) != 0))</div><div class='add'>+ {</div><div class='add'>+ /* FIXME: priority=medium: Use SLSMG_?? instead of << */</div><div class='add'>+ attr |= win->color << 8;</div><div class='add'>+ }</div><div class='add'>+ color = map_attr_to_object (attr);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ch < ' ')</div><div class='add'>+ {</div><div class='add'>+ if (ch == '\n')</div><div class='add'>+ {</div><div class='add'>+ SLcurses_wclrtoeol (win);</div><div class='add'>+ return do_newline (win);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ch == '\r')</div><div class='add'>+ {</div><div class='add'>+ win->_curx = 0;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ch == '\b')</div><div class='add'>+ {</div><div class='add'>+ if (win->_curx > 0)</div><div class='add'>+ win->_curx--;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* HACK HACK!!!! */</div><div class='add'>+ if (ch == '\t') ch = ' ';</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (win->_curx >= win->ncols)</div><div class='add'>+ do_newline (win);</div><div class='add'>+</div><div class='add'>+ b = win->lines[win->_cury] + win->_curx;</div><div class='add'>+ *b = SLSMG_BUILD_CHAR(ch,color);</div><div class='add'>+ win->_curx++;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wnoutrefresh (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+ unsigned int len;</div><div class='add'>+ unsigned int r, c;</div><div class='add'>+ unsigned int i, imax;</div><div class='add'>+</div><div class='add'>+ if (SLcurses_Is_Endwin)</div><div class='add'>+ {</div><div class='add'>+ if (TTY_State) init_tty (TTY_State - 1);</div><div class='add'>+ SLsmg_resume_smg ();</div><div class='add'>+ SLcurses_Is_Endwin = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (w == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLsmg_refresh ();</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (w->modified == 0)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ r = w->_begy;</div><div class='add'>+ c = w->_begx;</div><div class='add'>+</div><div class='add'>+ len = w->ncols;</div><div class='add'>+ imax = w->nrows;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < imax; i++)</div><div class='add'>+ {</div><div class='add'>+ SLsmg_gotorc (r, c);</div><div class='add'>+ SLsmg_write_color_chars (w->lines[i], len);</div><div class='add'>+ r++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (w->has_box)</div><div class='add'>+ SLsmg_draw_box(w->_begy, w->_begx, w->nrows, w->ncols);</div><div class='add'>+</div><div class='add'>+ SLsmg_gotorc (w->_begy + w->_cury, w->_begx + w->_curx);</div><div class='add'>+ w->modified = 0;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wrefresh (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+ if (w == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (w->modified == 0)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ SLcurses_wnoutrefresh (w);</div><div class='add'>+ SLsmg_refresh ();</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wclrtoeol (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+ SLsmg_Char_Type *b, *bmax;</div><div class='add'>+ SLsmg_Char_Type blank;</div><div class='add'>+</div><div class='add'>+ if (w == NULL) return -1;</div><div class='add'>+ if (w->_cury >= w->nrows)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ w->modified = 1;</div><div class='add'>+</div><div class='add'>+ blank = SLSMG_BUILD_CHAR(' ',w->color);</div><div class='add'>+</div><div class='add'>+ b = w->lines[w->_cury];</div><div class='add'>+ bmax = b + w->ncols;</div><div class='add'>+ b += w->_curx;</div><div class='add'>+</div><div class='add'>+ while (b < bmax) *b++ = blank;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wclrtobot (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+ SLsmg_Char_Type *b, *bmax;</div><div class='add'>+ SLsmg_Char_Type blank;</div><div class='add'>+ unsigned int r;</div><div class='add'>+</div><div class='add'>+ if (w == NULL) return -1;</div><div class='add'>+</div><div class='add'>+ w->modified = 1;</div><div class='add'>+ blank = SLSMG_BUILD_CHAR(' ',w->color);</div><div class='add'>+ SLcurses_wclrtoeol (w);</div><div class='add'>+ for (r = w->_cury + 1; r < w->nrows; r++)</div><div class='add'>+ {</div><div class='add'>+ b = w->lines [r];</div><div class='add'>+ bmax = b + w->ncols;</div><div class='add'>+</div><div class='add'>+ while (b < bmax) *b++ = blank;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wscrl (SLcurses_Window_Type *w, int n)</div><div class='add'>+{</div><div class='add'>+ SLsmg_Char_Type **lines;</div><div class='add'>+ unsigned int r, rmax, rmin, ncols;</div><div class='add'>+ SLsmg_Char_Type color;</div><div class='add'>+</div><div class='add'>+ if ((w == NULL) || (w->scroll_ok == 0))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ w->modified = 1;</div><div class='add'>+#if 0</div><div class='add'>+ if (w->is_subwin)</div><div class='add'>+ {</div><div class='add'>+ SLang_reset_tty ();</div><div class='add'>+ SLsmg_reset_smg ();</div><div class='add'>+ fprintf (stderr, "\rAttempt to scroll a subwindow\n");</div><div class='add'>+ exit (1);</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ color = w->color;</div><div class='add'>+ ncols = w->ncols;</div><div class='add'>+ lines = w->lines;</div><div class='add'>+ rmax = w->scroll_max;</div><div class='add'>+ rmin = w->scroll_min;</div><div class='add'>+ if (rmax > w->nrows)</div><div class='add'>+ rmax = w->nrows;</div><div class='add'>+ if (rmin >= rmax)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ while (n > 0)</div><div class='add'>+ {</div><div class='add'>+ for (r = rmin + 1; r < rmax; r++)</div><div class='add'>+ {</div><div class='add'>+ /* lines[r - 1] = lines[r]; */</div><div class='add'>+ memcpy ((char *)lines[r - 1], (char *)lines[r],</div><div class='add'>+ sizeof (SLsmg_Char_Type) * ncols);</div><div class='add'>+ }</div><div class='add'>+ blank_line (lines[rmax - 1], ncols, color);</div><div class='add'>+ n--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ rmax--;</div><div class='add'>+ while (n < 0)</div><div class='add'>+ {</div><div class='add'>+ for (r = rmax; r > rmin; r--)</div><div class='add'>+ {</div><div class='add'>+ memcpy ((char *)lines[r], (char *)lines[r - 1],</div><div class='add'>+ sizeof (SLsmg_Char_Type) * ncols);</div><div class='add'>+ }</div><div class='add'>+ blank_line (lines[rmin], ncols, color);</div><div class='add'>+ n++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* wmove (w, w->nrows - 1, 0); */</div><div class='add'>+ /* wclrtobot (w); */</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note: if len is < 0, entire string will be used.</div><div class='add'>+ */</div><div class='add'>+int SLcurses_waddnstr (SLcurses_Window_Type *w, char *str, int len)</div><div class='add'>+{</div><div class='add'>+ SLsmg_Char_Type *b;</div><div class='add'>+ SLsmg_Char_Type color;</div><div class='add'>+ unsigned char ch;</div><div class='add'>+ unsigned int nrows, ncols, crow, ccol;</div><div class='add'>+</div><div class='add'>+ if ((w == NULL)</div><div class='add'>+ || (str == NULL))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ w->modified = 1;</div><div class='add'>+ nrows = w->nrows;</div><div class='add'>+ ncols = w->ncols;</div><div class='add'>+ crow = w->_cury;</div><div class='add'>+ ccol = w->_curx;</div><div class='add'>+ color = w->color;</div><div class='add'>+</div><div class='add'>+ if (w->scroll_max <= nrows)</div><div class='add'>+ nrows = w->scroll_max;</div><div class='add'>+</div><div class='add'>+ if (crow >= nrows)</div><div class='add'>+ crow = 0; /* wrap back to top */</div><div class='add'>+</div><div class='add'>+ b = w->lines [crow] + ccol;</div><div class='add'>+</div><div class='add'>+ while (len && ((ch = (unsigned char) *str++) != 0))</div><div class='add'>+ {</div><div class='add'>+ len--;</div><div class='add'>+</div><div class='add'>+ if (ch == '\n')</div><div class='add'>+ {</div><div class='add'>+ w->_cury = crow;</div><div class='add'>+ w->_curx = ccol;</div><div class='add'>+ SLcurses_wclrtoeol (w);</div><div class='add'>+ do_newline (w);</div><div class='add'>+ crow = w->_cury;</div><div class='add'>+ ccol = w->_curx;</div><div class='add'>+ b = w->lines[crow];</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ccol >= ncols)</div><div class='add'>+ {</div><div class='add'>+ ccol = 0;</div><div class='add'>+ crow++;</div><div class='add'>+ if (crow >= nrows)</div><div class='add'>+ {</div><div class='add'>+ w->_curx = 0;</div><div class='add'>+ w->_cury = crow;</div><div class='add'>+ do_newline (w);</div><div class='add'>+ crow = w->_cury;</div><div class='add'>+ ccol = w->_curx;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ b = w->lines [crow];</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ch == '\t')</div><div class='add'>+ {</div><div class='add'>+ unsigned int n = ccol;</div><div class='add'>+ n += SLsmg_Tab_Width;</div><div class='add'>+ n = SLsmg_Tab_Width - (n % SLsmg_Tab_Width);</div><div class='add'>+ if (ccol + n > ncols) n = ncols - len;</div><div class='add'>+ ccol += n;</div><div class='add'>+ while (n--)</div><div class='add'>+ *b++ = SLSMG_BUILD_CHAR(' ',color);</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *b++ = SLSMG_BUILD_CHAR(ch, color);</div><div class='add'>+ ccol++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ w->_curx = ccol;</div><div class='add'>+ w->_cury = crow;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This routine IS NOT CORRECT. It needs to compute the proper overlap</div><div class='add'>+ * and copy accordingly. Here, I just assume windows are same size.</div><div class='add'>+ */</div><div class='add'>+#if 0</div><div class='add'>+int SLcurses_overlay (SLcurses_Window_Type *swin, SLcurses_Window_Type *dwin)</div><div class='add'>+{</div><div class='add'>+ SLsmg_Char_Type *s, *smax, *d, *dmax;</div><div class='add'>+</div><div class='add'>+ if ((swin == NULL) || (dwin == NULL))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ s = swin->buf;</div><div class='add'>+ smax = swin->bufmax;</div><div class='add'>+ d = dwin->buf;</div><div class='add'>+ dmax = dwin->bufmax;</div><div class='add'>+</div><div class='add'>+ while ((s < smax) && (d < dmax))</div><div class='add'>+ {</div><div class='add'>+ SLsmg_Char_Type ch = *s++;</div><div class='add'>+ if (SLSMG_EXTRACT_CHAR(ch) != ' ')</div><div class='add'>+ *d = ch;</div><div class='add'>+ d++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return -1; /* not implemented */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+SLcurses_Window_Type *SLcurses_subwin (SLcurses_Window_Type *orig,</div><div class='add'>+ unsigned int nlines, unsigned int ncols,</div><div class='add'>+ unsigned int begin_y, unsigned int begin_x)</div><div class='add'>+{</div><div class='add'>+ SLcurses_Window_Type *sw;</div><div class='add'>+ int r, c;</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ if (orig == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ sw = (SLcurses_Window_Type *) SLmalloc (sizeof (SLcurses_Window_Type));</div><div class='add'>+ if (sw == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ SLMEMSET ((char *)sw, 0, sizeof (SLcurses_Window_Type));</div><div class='add'>+#if 1</div><div class='add'>+ r = begin_y - orig->_begy;</div><div class='add'>+#else</div><div class='add'>+ r = 1 + ((int)orig->nrows - (int)nlines) / 2;</div><div class='add'>+#endif</div><div class='add'>+ if (r < 0) r = 0;</div><div class='add'>+ if (r + nlines > orig->nrows) nlines = orig->nrows - r;</div><div class='add'>+</div><div class='add'>+ c = ((int)orig->ncols - (int)ncols) / 2;</div><div class='add'>+ if (c < 0) c = 0;</div><div class='add'>+ if (c + ncols > orig->ncols) ncols = orig->ncols - c;</div><div class='add'>+</div><div class='add'>+ sw->scroll_min = 0;</div><div class='add'>+ sw->scroll_max = sw->nrows = nlines;</div><div class='add'>+ sw->ncols = ncols;</div><div class='add'>+ sw->_begy = begin_y;</div><div class='add'>+ sw->_begx = begin_x;</div><div class='add'>+ sw->_maxx = (begin_x + ncols) - 1;</div><div class='add'>+ sw->_maxy = (begin_y + nlines) - 1;</div><div class='add'>+</div><div class='add'>+ sw->lines = (SLsmg_Char_Type **) SLmalloc (nlines * sizeof (SLsmg_Char_Type *));</div><div class='add'>+ if (sw->lines == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLcurses_delwin (sw);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < nlines; i++)</div><div class='add'>+ {</div><div class='add'>+ sw->lines [i] = orig->lines [r + i] + c;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ sw->is_subwin = 1;</div><div class='add'>+ return sw;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wclear (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ if (w != NULL) w->modified = 1;</div><div class='add'>+ for (i=0; i < w->nrows; i++)</div><div class='add'>+ blank_line (w->lines[i], w->ncols, w->color);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wdelch (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+ SLsmg_Char_Type *p, *p1, *pmax;</div><div class='add'>+</div><div class='add'>+ p = w->lines[w->_cury];</div><div class='add'>+ pmax = p + w->ncols;</div><div class='add'>+ p += w->_curx;</div><div class='add'>+ p1 = p + 1;</div><div class='add'>+</div><div class='add'>+ while (p1 < pmax)</div><div class='add'>+ {</div><div class='add'>+ *p = *p1;</div><div class='add'>+ p = p1;</div><div class='add'>+ p1++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (p < pmax)</div><div class='add'>+ *p = SLSMG_BUILD_CHAR(' ',w->color);</div><div class='add'>+</div><div class='add'>+ w->modified = 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_winsch (SLcurses_Window_Type *w, int ch)</div><div class='add'>+{</div><div class='add'>+ SLsmg_Char_Type *p, *p1, *pmax;</div><div class='add'>+</div><div class='add'>+ p = w->lines[w->_cury];</div><div class='add'>+ pmax = p + w->ncols;</div><div class='add'>+ p += w->_curx;</div><div class='add'>+ p1 = pmax - 1;</div><div class='add'>+</div><div class='add'>+ while (pmax > p)</div><div class='add'>+ {</div><div class='add'>+ *pmax = *p1;</div><div class='add'>+ pmax = p1;</div><div class='add'>+ p1--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (p < pmax)</div><div class='add'>+ *p = SLSMG_BUILD_CHAR(ch, w->color);</div><div class='add'>+</div><div class='add'>+ w->modified = 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_endwin (void)</div><div class='add'>+{</div><div class='add'>+ SLcurses_Is_Endwin = 1;</div><div class='add'>+ SLsmg_suspend_smg ();</div><div class='add'>+ SLang_reset_tty ();</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+int SLcurses_mvwscanw (SLcurses_Window_Type *w, unsigned int r, unsigned int c,</div><div class='add'>+ char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+#if HAVE_VFSCANF</div><div class='add'>+ int ret;</div><div class='add'>+ va_list ap;</div><div class='add'>+</div><div class='add'>+ SLcurses_wmove (w, r, c);</div><div class='add'>+ SLcurses_wrefresh (w);</div><div class='add'>+</div><div class='add'>+ va_start(ap, fmt);</div><div class='add'>+ ret = vfscanf (stdin, fmt, ap);</div><div class='add'>+ va_end(ap);</div><div class='add'>+ return ret;</div><div class='add'>+#else</div><div class='add'>+ return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wscanw (SLcurses_Window_Type *w, char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+#if HAVE_VFSCANF</div><div class='add'>+ va_list ap;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ SLcurses_wrefresh (w);</div><div class='add'>+</div><div class='add'>+ va_start(ap, fmt);</div><div class='add'>+ ret = vfscanf (stdin, fmt, ap);</div><div class='add'>+ va_end(ap);</div><div class='add'>+</div><div class='add'>+ return ret;</div><div class='add'>+#else</div><div class='add'>+ return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_scanw (char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_VFSCANF</div><div class='add'>+ va_list ap;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ SLcurses_wrefresh (SLcurses_Stdscr);</div><div class='add'>+</div><div class='add'>+ va_start(ap, fmt);</div><div class='add'>+ ret = vfscanf (stdin, fmt, ap);</div><div class='add'>+ va_end(ap);</div><div class='add'>+</div><div class='add'>+ return ret;</div><div class='add'>+#else</div><div class='add'>+ return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLcurses_clearok (SLcurses_Window_Type *w, int bf)</div><div class='add'>+{</div><div class='add'>+ if (bf)</div><div class='add'>+ {</div><div class='add'>+ SLsmg_cls ();</div><div class='add'>+ w->modified = 1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slcurses.h b/mdk-stage1/slang/slcurses.h<br/>new file mode 100644<br/>index 000000000..fa082304f<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slcurses.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcurses.h</a></div><div class='hunk'>@@ -0,0 +1,353 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include <stdio.h></div><div class='add'>+</div><div class='add'>+#ifndef SLANG_VERSION</div><div class='add'>+# include <slang.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* This is a temporary hack until lynx is fixed to not include this file. */</div><div class='add'>+#ifndef LYCURSES_H</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ unsigned int _begy, _begx, _maxy, _maxx;</div><div class='add'>+ unsigned int _curx, _cury;</div><div class='add'>+ unsigned int nrows, ncols;</div><div class='add'>+ unsigned int scroll_min, scroll_max;</div><div class='add'>+ SLsmg_Char_Type **lines;</div><div class='add'>+ SLsmg_Char_Type color;</div><div class='add'>+ int is_subwin;</div><div class='add'>+ SLtt_Char_Type attr;</div><div class='add'>+ int delay_off;</div><div class='add'>+ int scroll_ok;</div><div class='add'>+ int modified;</div><div class='add'>+ int has_box;</div><div class='add'>+ int use_keypad;</div><div class='add'>+}</div><div class='add'>+SLcurses_Window_Type;</div><div class='add'>+</div><div class='add'>+extern int SLcurses_wclrtobot (SLcurses_Window_Type *);</div><div class='add'>+extern int SLcurses_wscrl (SLcurses_Window_Type *, int);</div><div class='add'>+extern int SLcurses_wrefresh (SLcurses_Window_Type *);</div><div class='add'>+extern int SLcurses_delwin (SLcurses_Window_Type *);</div><div class='add'>+extern int SLcurses_wprintw (SLcurses_Window_Type *, char *, ...);</div><div class='add'>+extern SLcurses_Window_Type *SLcurses_newwin (unsigned int, unsigned int,</div><div class='add'>+ unsigned int, unsigned int);</div><div class='add'>+</div><div class='add'>+extern SLcurses_Window_Type *SLcurses_subwin (SLcurses_Window_Type *,</div><div class='add'>+ unsigned int, unsigned int,</div><div class='add'>+ unsigned int, unsigned int);</div><div class='add'>+</div><div class='add'>+extern int SLcurses_wnoutrefresh (SLcurses_Window_Type *);</div><div class='add'>+extern int SLcurses_wclrtoeol (SLcurses_Window_Type *);</div><div class='add'>+</div><div class='add'>+extern int SLcurses_wmove (SLcurses_Window_Type *, unsigned int, unsigned int);</div><div class='add'>+extern int SLcurses_waddch (SLcurses_Window_Type *, SLtt_Char_Type);</div><div class='add'>+extern int SLcurses_waddnstr (SLcurses_Window_Type *, char *, int);</div><div class='add'>+</div><div class='add'>+#define waddnstr SLcurses_waddnstr</div><div class='add'>+#define waddch SLcurses_waddch</div><div class='add'>+#define waddstr(w,s) waddnstr((w),(s),-1)</div><div class='add'>+#define addstr(x) waddstr(stdscr, (x))</div><div class='add'>+#define addnstr(s,n) waddnstr(stdscr,(s),(n))</div><div class='add'>+#define addch(ch) waddch(stdscr,(ch))</div><div class='add'>+</div><div class='add'>+#define mvwaddnstr(w,y,x,s,n) \</div><div class='add'>+ (-1 == wmove((w),(y),(x)) ? -1 : waddnstr((w),(s),(n)))</div><div class='add'>+#define mvwaddstr(w,y,x,s) \</div><div class='add'>+ (-1 == wmove((w),(y),(x)) ? -1 : waddnstr((w),(s), -1))</div><div class='add'>+#define mvaddnstr(y,x,s,n) mvwaddnstr(stdscr,(y),(x),(s),(n))</div><div class='add'>+#define mvaddstr(y,x,s) mvwaddstr(stdscr,(y),(x),(s))</div><div class='add'>+#define mvwaddch(w,y,x,c) \</div><div class='add'>+ ((-1 == wmove((w),(y),(x))) ? -1 : waddch((w),(c)))</div><div class='add'>+#define mvaddch(y,x,c) mvwaddch(stdscr,(y),(x),(c))</div><div class='add'>+</div><div class='add'>+extern int SLcurses_wclear (SLcurses_Window_Type *w);</div><div class='add'>+extern int SLcurses_printw (char *, ...);</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+/* Why are these functions part of curses??? */</div><div class='add'>+extern int SLcurses_mvwscanw (SLcurses_Window_Type *, unsigned int, unsigned int,</div><div class='add'>+ char *, ...);</div><div class='add'>+extern int SLcurses_wscanw (SLcurses_Window_Type *, char *, ...);</div><div class='add'>+extern int SLcurses_scanw (char *, ...);</div><div class='add'>+#define mvwscanw SLcurses_mvwscanw</div><div class='add'>+#define wscanw SLcurses_wscanw</div><div class='add'>+#define scanw SLcurses_scanw</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern SLcurses_Window_Type *SLcurses_Stdscr;</div><div class='add'>+#define WINDOW SLcurses_Window_Type</div><div class='add'>+#define stdscr SLcurses_Stdscr</div><div class='add'>+</div><div class='add'>+#define subwin SLcurses_subwin</div><div class='add'>+#define wclrtobot SLcurses_wclrtobot</div><div class='add'>+#define wscrl SLcurses_wscrl</div><div class='add'>+#define scrl(n) wscrl(stdscr,(n))</div><div class='add'>+#define scroll(w) wscrl((w),1)</div><div class='add'>+#define wrefresh SLcurses_wrefresh</div><div class='add'>+#define delwin SLcurses_delwin</div><div class='add'>+#define wmove SLcurses_wmove</div><div class='add'>+#define newwin SLcurses_newwin</div><div class='add'>+#define wnoutrefresh SLcurses_wnoutrefresh</div><div class='add'>+#define werase(w) SLcurses_wmove((w),0,0); SLcurses_wclrtobot(w)</div><div class='add'>+#define wclear(w) SLcurses_wmove((w),0,0); SLcurses_wclrtobot(w)</div><div class='add'>+#define wprintw SLcurses_wprintw</div><div class='add'>+#define mvwprintw SLcurses_mvwprintw</div><div class='add'>+</div><div class='add'>+#define winch(w) \</div><div class='add'>+ ((((w)->_cury < (w)->nrows) && ((w)->_curx < (w)->ncols)) \</div><div class='add'>+ ? ((w)->lines[(w)->_cury][(w)->_curx]) : 0)</div><div class='add'>+</div><div class='add'>+#define inch() winch(stdscr)</div><div class='add'>+#define mvwinch(w,x,y) \</div><div class='add'>+ ((-1 != wmove((w),(x),(y))) ? winch(w) : (-1))</div><div class='add'>+#define doupdate SLsmg_refresh</div><div class='add'>+</div><div class='add'>+#define mvwin(w,a,b) ((w)->_begy = (a), (w)->_begx = (b))</div><div class='add'>+</div><div class='add'>+extern int SLcurses_mvprintw (int, int, char *, ...);</div><div class='add'>+extern int SLcurses_mvwprintw (SLcurses_Window_Type *, int, int, char *, ...);</div><div class='add'>+extern int SLcurses_has_colors(void);</div><div class='add'>+extern int SLcurses_nil (void);</div><div class='add'>+extern int SLcurses_wgetch (SLcurses_Window_Type *);</div><div class='add'>+extern int SLcurses_getch (void);</div><div class='add'>+</div><div class='add'>+extern int SLcurses_wattrset (SLcurses_Window_Type *, SLtt_Char_Type);</div><div class='add'>+extern int SLcurses_wattron (SLcurses_Window_Type *, SLtt_Char_Type);</div><div class='add'>+extern int SLcurses_wattroff (SLcurses_Window_Type *, SLtt_Char_Type);</div><div class='add'>+#define attrset(x) SLcurses_wattrset(stdscr, (x))</div><div class='add'>+#define attron(x) SLcurses_wattron(stdscr, (x))</div><div class='add'>+#define attroff(x) SLcurses_wattroff(stdscr, (x))</div><div class='add'>+#define wattrset(w, x) SLcurses_wattrset((w), (x))</div><div class='add'>+#define wattron(w, x) SLcurses_wattron((w), (x))</div><div class='add'>+#define wattroff(w, x) SLcurses_wattroff((w), (x))</div><div class='add'>+#define wattr_get(w) ((w)->color << 8)</div><div class='add'>+#define attr_get() wattr_get(stdscr)</div><div class='add'>+</div><div class='add'>+#define COLOR_PAIR(x) ((x) << 8)</div><div class='add'>+</div><div class='add'>+extern int SLcurses_start_color (void);</div><div class='add'>+#define start_color SLcurses_start_color</div><div class='add'>+</div><div class='add'>+#define ERR 0xFFFF</div><div class='add'>+#define wgetch SLcurses_wgetch</div><div class='add'>+#define getch SLcurses_getch</div><div class='add'>+</div><div class='add'>+extern int SLcurses_nodelay (SLcurses_Window_Type *, int);</div><div class='add'>+extern SLcurses_Window_Type *SLcurses_initscr (void);</div><div class='add'>+#define initscr SLcurses_initscr</div><div class='add'>+</div><div class='add'>+extern int SLcurses_cbreak (void);</div><div class='add'>+extern int SLcurses_raw (void);</div><div class='add'>+#define cbreak SLcurses_cbreak</div><div class='add'>+#define crmode SLcurses_cbreak</div><div class='add'>+#define raw SLcurses_raw</div><div class='add'>+#define noraw SLang_reset_tty</div><div class='add'>+#define nocbreak SLang_reset_tty</div><div class='add'>+</div><div class='add'>+#define mvprintw SLcurses_mvprintw</div><div class='add'>+#define has_colors SLcurses_has_colors</div><div class='add'>+#define nodelay SLcurses_nodelay</div><div class='add'>+</div><div class='add'>+#define ungetch SLang_ungetkey</div><div class='add'>+</div><div class='add'>+#define COLS SLtt_Screen_Cols</div><div class='add'>+#define LINES SLtt_Screen_Rows</div><div class='add'>+</div><div class='add'>+#define move(x,y) SLcurses_wmove(stdscr, (x), (y))</div><div class='add'>+#define wclrtoeol SLcurses_wclrtoeol</div><div class='add'>+#define clrtoeol() SLcurses_wclrtoeol(stdscr)</div><div class='add'>+#define clrtobot() SLcurses_wclrtobot(stdscr)</div><div class='add'>+</div><div class='add'>+#define printw SLcurses_printw</div><div class='add'>+#define mvprintw SLcurses_mvprintw</div><div class='add'>+#define wstandout(w) SLcurses_wattrset((w),A_STANDOUT)</div><div class='add'>+#define wstandend(w) SLcurses_wattrset((w),A_NORMAL)</div><div class='add'>+#define standout() SLcurses_wattrset(stdscr,A_STANDOUT)</div><div class='add'>+#define standend() SLcurses_wattrset(stdscr,A_NORMAL)</div><div class='add'>+</div><div class='add'>+#define refresh() SLcurses_wrefresh(stdscr)</div><div class='add'>+#define clear() SLcurses_wclear(stdscr)</div><div class='add'>+#define erase() werase(stdscr)</div><div class='add'>+#define touchline SLsmg_touch_lines</div><div class='add'>+#define resetterm SLang_reset_tty</div><div class='add'>+</div><div class='add'>+extern int SLcurses_endwin (void);</div><div class='add'>+#define endwin SLcurses_endwin</div><div class='add'>+extern int SLcurses_Is_Endwin;</div><div class='add'>+#define isendwin() SLcurses_Is_Endwin</div><div class='add'>+</div><div class='add'>+#define keypad(w,x) ((w)->use_keypad = (x))</div><div class='add'>+</div><div class='add'>+#define KEY_MIN SL_KEY_UP</div><div class='add'>+#define KEY_DOWN SL_KEY_DOWN</div><div class='add'>+#define KEY_UP SL_KEY_UP</div><div class='add'>+#define KEY_LEFT SL_KEY_LEFT</div><div class='add'>+#define KEY_RIGHT SL_KEY_RIGHT</div><div class='add'>+#define KEY_A1 SL_KEY_A1</div><div class='add'>+#define KEY_B1 SL_KEY_B1</div><div class='add'>+#define KEY_C1 SL_KEY_C1</div><div class='add'>+#define KEY_A2 SL_KEY_A2</div><div class='add'>+#define KEY_B2 SL_KEY_B2</div><div class='add'>+#define KEY_C2 SL_KEY_C2</div><div class='add'>+#define KEY_A3 SL_KEY_A3</div><div class='add'>+#define KEY_B3 SL_KEY_B3</div><div class='add'>+#define KEY_C3 SL_KEY_C3</div><div class='add'>+#define KEY_REDO SL_KEY_REDO</div><div class='add'>+#define KEY_UNDO SL_KEY_UNDO</div><div class='add'>+#define KEY_BACKSPACE SL_KEY_BACKSPACE</div><div class='add'>+#define KEY_PPAGE SL_KEY_PPAGE</div><div class='add'>+#define KEY_NPAGE SL_KEY_NPAGE</div><div class='add'>+#define KEY_HOME SL_KEY_HOME</div><div class='add'>+#define KEY_END SL_KEY_END</div><div class='add'>+#define KEY_F0 SL_KEY_F0</div><div class='add'>+#define KEY_F SL_KEY_F</div><div class='add'>+#define KEY_ENTER SL_KEY_ENTER</div><div class='add'>+#define KEY_MAX 0xFFFF</div><div class='add'>+</div><div class='add'>+/* Ugly Hacks that may not work */</div><div class='add'>+#define flushinp SLcurses_nil</div><div class='add'>+#define winsertln(w) \</div><div class='add'>+ ((w)->scroll_min=(w)->_cury, \</div><div class='add'>+ (w)->scroll_max=(w)->nrows, \</div><div class='add'>+ wscrl((w), -1))</div><div class='add'>+</div><div class='add'>+extern SLtt_Char_Type SLcurses_Acs_Map [128];</div><div class='add'>+#define acs_map SLcurses_Acs_Map</div><div class='add'>+</div><div class='add'>+#define ACS_ULCORNER (acs_map[SLSMG_ULCORN_CHAR])</div><div class='add'>+#define ACS_URCORNER (acs_map[SLSMG_URCORN_CHAR])</div><div class='add'>+#define ACS_LRCORNER (acs_map[SLSMG_LRCORN_CHAR])</div><div class='add'>+#define ACS_LLCORNER (acs_map[SLSMG_LLCORN_CHAR])</div><div class='add'>+#define ACS_TTEE (acs_map[SLSMG_UTEE_CHAR])</div><div class='add'>+#define ACS_LTEE (acs_map[SLSMG_LTEE_CHAR])</div><div class='add'>+#define ACS_RTEE (acs_map[SLSMG_RTEE_CHAR])</div><div class='add'>+#define ACS_BTEE (acs_map[SLSMG_DTEE_CHAR])</div><div class='add'>+#define ACS_PLUS (acs_map[SLSMG_PLUS_CHAR])</div><div class='add'>+#define ACS_VLINE (acs_map[SLSMG_VLINE_CHAR])</div><div class='add'>+#define ACS_HLINE (acs_map[SLSMG_HLINE_CHAR])</div><div class='add'>+#define ACS_S1 '-'</div><div class='add'>+#define ACS_S9 '-'</div><div class='add'>+#define ACS_DIAMOND '&'</div><div class='add'>+#define ACS_CKBOARD (acs_map[SLSMG_CKBRD_CHAR])</div><div class='add'>+#define ACS_DEGREE 'o'</div><div class='add'>+#define ACS_PLMINUS '+'</div><div class='add'>+#define ACS_BULLET '*'</div><div class='add'>+#define ACS_LARROW '<'</div><div class='add'>+#define ACS_RARROW '>'</div><div class='add'>+#define ACS_DARROW 'v'</div><div class='add'>+#define ACS_UARROW '^'</div><div class='add'>+#define ACS_BOARD '#'</div><div class='add'>+#define ACS_LANTERN '#'</div><div class='add'>+#define ACS_BLOCK '#'</div><div class='add'>+</div><div class='add'>+#if 1</div><div class='add'>+#define hline(x,y) SLcurses_nil ()</div><div class='add'>+#define vline(x,y) SLcurses_nil ()</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define A_CHARTEXT 0x00FF</div><div class='add'>+#define A_NORMAL 0</div><div class='add'>+#define A_BOLD 0x1000</div><div class='add'>+#define A_REVERSE 0x2000</div><div class='add'>+#define A_STANDOUT A_REVERSE</div><div class='add'>+#define A_UNDERLINE 0x4000</div><div class='add'>+#define A_BLINK 0</div><div class='add'>+#define A_COLOR 0x0700</div><div class='add'>+#define A_ALTCHARSET 0x8000</div><div class='add'>+#define A_DIM 0</div><div class='add'>+#define A_PROTECT 0</div><div class='add'>+#define A_INVIS 0</div><div class='add'>+</div><div class='add'>+#define COLOR_BLACK SLSMG_COLOR_BLACK</div><div class='add'>+#define COLOR_RED SLSMG_COLOR_RED</div><div class='add'>+#define COLOR_GREEN SLSMG_COLOR_GREEN</div><div class='add'>+#define COLOR_YELLOW SLSMG_COLOR_BROWN</div><div class='add'>+#define COLOR_BLUE SLSMG_COLOR_BLUE</div><div class='add'>+#define COLOR_MAGENTA SLSMG_COLOR_MAGENTA</div><div class='add'>+#define COLOR_CYAN SLSMG_COLOR_CYAN</div><div class='add'>+#define COLOR_WHITE SLSMG_COLOR_LGRAY</div><div class='add'>+</div><div class='add'>+extern int SLcurses_Num_Colors;</div><div class='add'>+#define COLORS SLcurses_Num_Colors</div><div class='add'>+#define COLOR_PAIRS (SLcurses_Num_Colors*SLcurses_Num_Colors)</div><div class='add'>+</div><div class='add'>+#define init_pair(_x,_f,_b) \</div><div class='add'>+ SLtt_set_color_object((_x), ((_f) == (_b) ? 0x0700 : ((_f) | ((_b) << 8)) << 8))</div><div class='add'>+</div><div class='add'>+#define scrollok(a,b) ((a)->scroll_ok = (b))</div><div class='add'>+#define getyx(a,y,x) (y=(a)->_cury, x=(a)->_curx)</div><div class='add'>+#define getmaxyx(a,y,x) (y=(a)->nrows, x=(a)->ncols)</div><div class='add'>+#define napms(x) usleep(1000 * (x))</div><div class='add'>+typedef SLtt_Char_Type chtype;</div><div class='add'>+#define beep SLtt_beep</div><div class='add'>+#define curs_set(x) SLtt_set_cursor_visibility(x)</div><div class='add'>+#define touchwin(x) SLsmg_touch_lines((x)->_begy, (x)->nrows)</div><div class='add'>+#define flash SLtt_beep</div><div class='add'>+</div><div class='add'>+#define wsetscrreg(w,a,b) ((w)->scroll_min = (a), (w)->scroll_max = (b))</div><div class='add'>+</div><div class='add'>+#define wtimeout(a,b) (a)->delay_off = ((b >= 0) ? (b) / 100 : -1)</div><div class='add'>+#define timeout(a) wtimeout(stdscr, a)</div><div class='add'>+extern int SLcurses_wdelch (SLcurses_Window_Type *);</div><div class='add'>+#define wdelch SLcurses_wdelch</div><div class='add'>+#define delch() wdelch(stdscr)</div><div class='add'>+</div><div class='add'>+extern int SLcurses_winsch (SLcurses_Window_Type *, int);</div><div class='add'>+#define winsch SLcurses_winsch</div><div class='add'>+</div><div class='add'>+extern int SLcurses_Esc_Delay;/* ESC expire time in milliseconds (ncurses compatible) */</div><div class='add'>+#define ESCDELAY SLcurses_Esc_Delay</div><div class='add'>+</div><div class='add'>+extern int SLcurses_clearok (SLcurses_Window_Type *, int);</div><div class='add'>+#define clearok SLcurses_clearok</div><div class='add'>+</div><div class='add'>+/* Functions that have not been implemented. */</div><div class='add'>+#define copywin(w,v,a,b,c,d,e,f,g) SLcurses_nil()</div><div class='add'>+#define wdeleteln(win) SLcurses_nil()</div><div class='add'>+#define resetty SLcurses_nil</div><div class='add'>+#define savetty SLcurses_nil</div><div class='add'>+#define overlay(u,v) SLcurses_nil()</div><div class='add'>+</div><div class='add'>+/* These functions do nothing */</div><div class='add'>+#define savetty SLcurses_nil</div><div class='add'>+#define nonl SLcurses_nil</div><div class='add'>+#define echo SLcurses_nil</div><div class='add'>+#define noecho SLcurses_nil</div><div class='add'>+#define saveterm SLcurses_nil</div><div class='add'>+#define box(w,y,z) ((w)->has_box = 1, (w)->modified = 1)</div><div class='add'>+#define leaveok(a,b) SLcurses_nil()</div><div class='add'>+#define nl() SLcurses_nil()</div><div class='add'>+#define trace(x) SLcurses_nil()</div><div class='add'>+#define tigetstr(x) NULL</div><div class='add'>+</div><div class='add'>+/* These have no place in C */</div><div class='add'>+#define TRUE 1</div><div class='add'>+#define FALSE 0</div><div class='add'>+#define bool int</div><div class='add'>+</div><div class='add'>+/* Lynx compatability */</div><div class='add'>+#else</div><div class='add'>+</div><div class='add'>+#define stdscr NULL</div><div class='add'>+#define COLS SLtt_Screen_Cols</div><div class='add'>+#define LINES SLtt_Screen_Rows</div><div class='add'>+#define move SLsmg_gotorc</div><div class='add'>+#define addstr SLsmg_write_string</div><div class='add'>+#define clear SLsmg_cls</div><div class='add'>+#define standout SLsmg_reverse_video</div><div class='add'>+#define standend SLsmg_normal_video</div><div class='add'>+#define clrtoeol SLsmg_erase_eol</div><div class='add'>+#define scrollok(a,b) SLsmg_Newline_Moves = ((b) ? 1 : -1)</div><div class='add'>+#define addch SLsmg_write_char</div><div class='add'>+#define echo()</div><div class='add'>+#define printw SLsmg_printf</div><div class='add'>+#define endwin SLsmg_reset_smg(),SLang_reset_tty</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/sldisply.c b/mdk-stage1/slang/sldisply.c<br/>new file mode 100644<br/>index 000000000..1e1161774<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sldisply.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sldisply.c</a></div><div class='hunk'>@@ -0,0 +1,2596 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include <time.h></div><div class='add'>+#include <ctype.h></div><div class='add'>+</div><div class='add'>+#if !defined(VMS) || (__VMS_VER >= 70000000)</div><div class='add'>+# include <sys/time.h></div><div class='add'>+# ifdef __QNX__</div><div class='add'>+# include <sys/select.h></div><div class='add'>+# endif</div><div class='add'>+# include <sys/types.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __BEOS__</div><div class='add'>+/* Prototype for select */</div><div class='add'>+# include <net/socket.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TERMIOS_H</div><div class='add'>+# include <termios.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+# include <unixlib.h></div><div class='add'>+# include <unixio.h></div><div class='add'>+# include <dvidef.h></div><div class='add'>+# include <descrip.h></div><div class='add'>+# include <lib$routines.h></div><div class='add'>+# include <starlet.h></div><div class='add'>+#else</div><div class='add'>+# if !defined(sun)</div><div class='add'>+# include <sys/ioctl.h></div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef SYSV</div><div class='add'>+# include <sys/termio.h></div><div class='add'>+# include <sys/stream.h></div><div class='add'>+# include <sys/ptem.h></div><div class='add'>+# include <sys/tty.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined (_AIX) && !defined (FD_SET)</div><div class='add'>+# include <sys/select.h> /* for FD_ISSET, FD_SET, FD_ZERO */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include <errno.h></div><div class='add'>+</div><div class='add'>+#if defined(__DECC) && defined(VMS)</div><div class='add'>+/* These get prototypes for write an sleep */</div><div class='add'>+# include <unixio.h></div><div class='add'>+#endif</div><div class='add'>+#include <signal.h></div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* Colors: These definitions are used for the display. However, the</div><div class='add'>+ * application only uses object handles which get mapped to this</div><div class='add'>+ * internal representation. The mapping is performed by the Color_Map</div><div class='add'>+ * structure below. */</div><div class='add'>+</div><div class='add'>+#define CHAR_MASK 0x000000FF</div><div class='add'>+#define FG_MASK 0x0000FF00</div><div class='add'>+#define BG_MASK 0x00FF0000</div><div class='add'>+#define ATTR_MASK 0x1F000000</div><div class='add'>+#define BGALL_MASK 0x0FFF0000</div><div class='add'>+</div><div class='add'>+/* The 0x10000000 bit represents the alternate character set. BGALL_MASK does</div><div class='add'>+ * not include this attribute.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define GET_FG(color) ((color & FG_MASK) >> 8)</div><div class='add'>+#define GET_BG(color) ((color & BG_MASK) >> 16)</div><div class='add'>+#define MAKE_COLOR(fg, bg) (((fg) | ((bg) << 8)) << 8)</div><div class='add'>+</div><div class='add'>+int SLtt_Screen_Cols;</div><div class='add'>+int SLtt_Screen_Rows;</div><div class='add'>+int SLtt_Term_Cannot_Insert;</div><div class='add'>+int SLtt_Term_Cannot_Scroll;</div><div class='add'>+int SLtt_Use_Ansi_Colors;</div><div class='add'>+int SLtt_Blink_Mode = 1;</div><div class='add'>+int SLtt_Use_Blink_For_ACS = 0;</div><div class='add'>+int SLtt_Newline_Ok = 0;</div><div class='add'>+int SLtt_Has_Alt_Charset = 0;</div><div class='add'>+int SLtt_Force_Keypad_Init = 0;</div><div class='add'>+</div><div class='add'>+void (*_SLtt_color_changed_hook)(void);</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+static int Bce_Color_Offset = 0;</div><div class='add'>+#endif</div><div class='add'>+static int Can_Background_Color_Erase = 1;</div><div class='add'>+</div><div class='add'>+/* -1 means unknown */</div><div class='add'>+int SLtt_Has_Status_Line = -1; /* hs */</div><div class='add'>+int SLang_TT_Write_FD = -1;</div><div class='add'>+</div><div class='add'>+static int Automatic_Margins;</div><div class='add'>+/* static int No_Move_In_Standout; */</div><div class='add'>+static int Worthless_Highlight;</div><div class='add'>+#define HP_GLITCH_CODE</div><div class='add'>+#ifdef HP_GLITCH_CODE</div><div class='add'>+/* This glitch is exclusive to HP term. Basically it means that to clear</div><div class='add'>+ * attributes, one has to erase to the end of the line.</div><div class='add'>+ */</div><div class='add'>+static int Has_HP_Glitch;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static char *Reset_Color_String;</div><div class='add'>+static int Is_Color_Terminal = 0;</div><div class='add'>+</div><div class='add'>+static int Linux_Console;</div><div class='add'>+</div><div class='add'>+/* It is crucial that JMAX_COLORS must be less than 128 since the high bit</div><div class='add'>+ * is used to indicate a character from the ACS (alt char set). The exception</div><div class='add'>+ * to this rule is if SLtt_Use_Blink_For_ACS is true. This means that of</div><div class='add'>+ * the highbit is set, we interpret that as a blink character. This is</div><div class='add'>+ * exploited by DOSemu.</div><div class='add'>+ */</div><div class='add'>+#define JMAX_COLORS 256</div><div class='add'>+#define JNORMAL_COLOR 0</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ SLtt_Char_Type fgbg;</div><div class='add'>+ SLtt_Char_Type mono;</div><div class='add'>+ char *custom_esc;</div><div class='add'>+}</div><div class='add'>+Ansi_Color_Type;</div><div class='add'>+</div><div class='add'>+#define RGB1(r, g, b) ((r) | ((g) << 1) | ((b) << 2))</div><div class='add'>+#define RGB(r, g, b, br, bg, bb) ((RGB1(r, g, b) << 8) | (RGB1(br, bg, bb) << 16))</div><div class='add'>+</div><div class='add'>+static Ansi_Color_Type Ansi_Color_Map[JMAX_COLORS] =</div><div class='add'>+{</div><div class='add'>+ {RGB(1, 1, 1, 0, 0, 0), 0x00000000, NULL}, /* white/black */</div><div class='add'>+ {RGB(0, 1, 0, 0, 0, 0), SLTT_REV_MASK, NULL}, /* green/black */</div><div class='add'>+ {RGB(1, 0, 1, 0, 0, 0), SLTT_REV_MASK, NULL}, /* magenta/black */</div><div class='add'>+ {RGB(0, 1, 1, 0, 0, 0), SLTT_REV_MASK, NULL}, /* cyan/black */</div><div class='add'>+ {RGB(1, 0, 0, 0, 0, 0), SLTT_REV_MASK, NULL},</div><div class='add'>+ {RGB(0, 1, 0, 0, 0, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+ {RGB(1, 0, 0, 0, 0, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+ {RGB(1, 0, 0, 0, 1, 0), SLTT_REV_MASK, NULL},</div><div class='add'>+ {RGB(0, 0, 1, 1, 0, 0), SLTT_REV_MASK, NULL},</div><div class='add'>+ {RGB(0, 1, 0, 1, 0, 0), SLTT_REV_MASK, NULL},</div><div class='add'>+ {RGB(0, 1, 1, 1, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+ {RGB(1, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+ {RGB(1, 0, 1, 1, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+ {RGB(0, 0, 0, 0, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+ {RGB(0, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+ {RGB(0, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+ {RGB(0, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+ {RGB(0, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static char *Color_Fg_Str = "\033[3%dm";</div><div class='add'>+static char *Color_Bg_Str = "\033[4%dm";</div><div class='add'>+static char *Default_Color_Fg_Str = "\033[39m";</div><div class='add'>+static char *Default_Color_Bg_Str = "\033[49m";</div><div class='add'>+</div><div class='add'>+static int Max_Terminfo_Colors = 8; /* termcap Co */</div><div class='add'>+</div><div class='add'>+char *SLtt_Graphics_Char_Pairs; /* ac termcap string -- def is vt100 */</div><div class='add'>+</div><div class='add'>+/* 1 if terminal lacks the ability to go into insert mode or into delete</div><div class='add'>+ mode. Currently controlled by S-Lang but later perhaps termcap. */</div><div class='add'>+</div><div class='add'>+static char *UnderLine_Vid_Str;</div><div class='add'>+static char *Blink_Vid_Str;</div><div class='add'>+static char *Bold_Vid_Str;</div><div class='add'>+static char *Ins_Mode_Str; /* = "\033[4h"; */ /* ins mode (im) */</div><div class='add'>+static char *Eins_Mode_Str; /* = "\033[4l"; */ /* end ins mode (ei) */</div><div class='add'>+static char *Scroll_R_Str; /* = "\033[%d;%dr"; */ /* scroll region */</div><div class='add'>+static char *Cls_Str; /* = "\033[2J\033[H"; */ /* cl termcap STR for ansi terminals */</div><div class='add'>+static char *Rev_Vid_Str; /* = "\033[7m"; */ /* mr,so termcap string */</div><div class='add'>+static char *Norm_Vid_Str; /* = "\033[m"; */ /* me,se termcap string */</div><div class='add'>+static char *Del_Eol_Str; /* = "\033[K"; */ /* ce */</div><div class='add'>+static char *Del_Bol_Str; /* = "\033[1K"; */ /* cb */</div><div class='add'>+static char *Del_Char_Str; /* = "\033[P"; */ /* dc */</div><div class='add'>+static char *Del_N_Lines_Str; /* = "\033[%dM"; */ /* DL */</div><div class='add'>+static char *Add_N_Lines_Str; /* = "\033[%dL"; */ /* AL */</div><div class='add'>+static char *Rev_Scroll_Str;</div><div class='add'>+static char *Curs_Up_Str;</div><div class='add'>+static char *Curs_F_Str; /* RI termcap string */</div><div class='add'>+static char *Cursor_Visible_Str; /* ve termcap string */</div><div class='add'>+static char *Cursor_Invisible_Str; /* vi termcap string */</div><div class='add'>+#if 0</div><div class='add'>+static char *Start_Mouse_Rpt_Str; /* Start mouse reporting mode */</div><div class='add'>+static char *End_Mouse_Rpt_Str; /* End mouse reporting mode */</div><div class='add'>+#endif</div><div class='add'>+static char *Start_Alt_Chars_Str; /* as */</div><div class='add'>+static char *End_Alt_Chars_Str; /* ae */</div><div class='add'>+static char *Enable_Alt_Char_Set; /* eA */</div><div class='add'>+</div><div class='add'>+static char *Term_Init_Str;</div><div class='add'>+static char *Keypad_Init_Str;</div><div class='add'>+static char *Term_Reset_Str;</div><div class='add'>+static char *Keypad_Reset_Str;</div><div class='add'>+</div><div class='add'>+/* status line functions */</div><div class='add'>+static char *Disable_Status_line_Str; /* ds */</div><div class='add'>+static char *Return_From_Status_Line_Str; /* fs */</div><div class='add'>+static char *Goto_Status_Line_Str; /* ts */</div><div class='add'>+static int Num_Status_Line_Columns; /* ws */</div><div class='add'>+/* static int Status_Line_Esc_Ok; */ /* es */</div><div class='add'>+</div><div class='add'>+/* static int Len_Curs_F_Str = 5; */</div><div class='add'>+</div><div class='add'>+/* cm string has %i%d since termcap numbers columns from 0 */</div><div class='add'>+/* char *CURS_POS_STR = "\033[%d;%df"; ansi-- hor and vert pos */</div><div class='add'>+static char *Curs_Pos_Str; /* = "\033[%i%d;%dH";*/ /* cm termcap string */</div><div class='add'>+</div><div class='add'>+/* scrolling region */</div><div class='add'>+static int Scroll_r1 = 0, Scroll_r2 = 23;</div><div class='add'>+static int Cursor_r, Cursor_c; /* 0 based */</div><div class='add'>+</div><div class='add'>+/* current attributes --- initialized to impossible value */</div><div class='add'>+static SLtt_Char_Type Current_Fgbg = 0xFFFFFFFFU;</div><div class='add'>+</div><div class='add'>+static int Cursor_Set; /* 1 if cursor position known, 0</div><div class='add'>+ * if not. -1 if only row is known</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define MAX_OUTPUT_BUFFER_SIZE 4096</div><div class='add'>+</div><div class='add'>+static unsigned char Output_Buffer[MAX_OUTPUT_BUFFER_SIZE];</div><div class='add'>+static unsigned char *Output_Bufferp = Output_Buffer;</div><div class='add'>+</div><div class='add'>+unsigned long SLtt_Num_Chars_Output;</div><div class='add'>+</div><div class='add'>+int _SLusleep (unsigned long usecs)</div><div class='add'>+{</div><div class='add'>+#if !defined(VMS) || (__VMS_VER >= 70000000)</div><div class='add'>+ struct timeval tv;</div><div class='add'>+ tv.tv_sec = usecs / 1000000;</div><div class='add'>+ tv.tv_usec = usecs % 1000000;</div><div class='add'>+ return select(0, NULL, NULL, NULL, &tv);</div><div class='add'>+#else</div><div class='add'>+ return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_flush_output (void)</div><div class='add'>+{</div><div class='add'>+ int nwrite = 0;</div><div class='add'>+ unsigned int total;</div><div class='add'>+ int n = (int) (Output_Bufferp - Output_Buffer);</div><div class='add'>+</div><div class='add'>+ SLtt_Num_Chars_Output += n;</div><div class='add'>+</div><div class='add'>+ total = 0;</div><div class='add'>+ while (n > 0)</div><div class='add'>+ {</div><div class='add'>+ nwrite = write (SLang_TT_Write_FD, (char *) Output_Buffer + total, n);</div><div class='add'>+ if (nwrite == -1)</div><div class='add'>+ {</div><div class='add'>+ nwrite = 0;</div><div class='add'>+#ifdef EAGAIN</div><div class='add'>+ if (errno == EAGAIN)</div><div class='add'>+ {</div><div class='add'>+ _SLusleep (100000); /* 1/10 sec */</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+#ifdef EWOULDBLOCK</div><div class='add'>+ if (errno == EWOULDBLOCK)</div><div class='add'>+ {</div><div class='add'>+ _SLusleep (100000);</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+#ifdef EINTR</div><div class='add'>+ if (errno == EINTR) continue;</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ n -= nwrite;</div><div class='add'>+ total += nwrite;</div><div class='add'>+ }</div><div class='add'>+ Output_Bufferp = Output_Buffer;</div><div class='add'>+ return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_Baud_Rate;</div><div class='add'>+static void tt_write(char *str, unsigned int n)</div><div class='add'>+{</div><div class='add'>+ static unsigned long last_time;</div><div class='add'>+ static int total;</div><div class='add'>+ unsigned long now;</div><div class='add'>+ unsigned int ndiff;</div><div class='add'>+</div><div class='add'>+ if ((str == NULL) || (n == 0)) return;</div><div class='add'>+ total += n;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ ndiff = MAX_OUTPUT_BUFFER_SIZE - (int) (Output_Bufferp - Output_Buffer);</div><div class='add'>+ if (ndiff < n)</div><div class='add'>+ {</div><div class='add'>+ SLMEMCPY ((char *) Output_Bufferp, (char *) str, ndiff);</div><div class='add'>+ Output_Bufferp += ndiff;</div><div class='add'>+ SLtt_flush_output ();</div><div class='add'>+ n -= ndiff;</div><div class='add'>+ str += ndiff;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ SLMEMCPY ((char *) Output_Bufferp, str, n);</div><div class='add'>+ Output_Bufferp += n;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (((SLtt_Baud_Rate > 150) && (SLtt_Baud_Rate <= 9600))</div><div class='add'>+ && (10 * total > SLtt_Baud_Rate))</div><div class='add'>+ {</div><div class='add'>+ total = 0;</div><div class='add'>+ if ((now = (unsigned long) time(NULL)) - last_time <= 1)</div><div class='add'>+ {</div><div class='add'>+ SLtt_flush_output ();</div><div class='add'>+ sleep((unsigned) 1);</div><div class='add'>+ }</div><div class='add'>+ last_time = now;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void tt_write_string (char *str)</div><div class='add'>+{</div><div class='add'>+ if (str != NULL) tt_write(str, strlen(str));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_write_string (char *str)</div><div class='add'>+{</div><div class='add'>+ tt_write_string (str);</div><div class='add'>+ Cursor_Set = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_putchar (char ch)</div><div class='add'>+{</div><div class='add'>+ SLtt_normal_video ();</div><div class='add'>+ if (Cursor_Set == 1)</div><div class='add'>+ {</div><div class='add'>+ if (ch >= ' ') Cursor_c++;</div><div class='add'>+ else if (ch == '\b') Cursor_c--;</div><div class='add'>+ else if (ch == '\r') Cursor_c = 0;</div><div class='add'>+ else Cursor_Set = 0;</div><div class='add'>+</div><div class='add'>+ if ((Cursor_c + 1 == SLtt_Screen_Cols)</div><div class='add'>+ && Automatic_Margins) Cursor_Set = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (Output_Bufferp < Output_Buffer + MAX_OUTPUT_BUFFER_SIZE)</div><div class='add'>+ {</div><div class='add'>+ *Output_Bufferp++ = (unsigned char) ch;</div><div class='add'>+ }</div><div class='add'>+ else tt_write (&ch, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned int tt_sprintf(char *buf, char *fmt, int x, int y)</div><div class='add'>+{</div><div class='add'>+ char *fmt_max;</div><div class='add'>+ register unsigned char *b, ch;</div><div class='add'>+ int offset;</div><div class='add'>+ int z, z1, parse_level;</div><div class='add'>+ int zero_pad;</div><div class='add'>+ int field_width;</div><div class='add'>+ int variables [26];</div><div class='add'>+ int stack [64];</div><div class='add'>+ unsigned int stack_len;</div><div class='add'>+ int parms [10];</div><div class='add'>+#define STACK_POP (stack_len ? stack[--stack_len] : 0)</div><div class='add'>+</div><div class='add'>+ if (fmt == NULL)</div><div class='add'>+ {</div><div class='add'>+ *buf = 0;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ stack [0] = y; /* pushed for termcap */</div><div class='add'>+ stack [1] = x;</div><div class='add'>+ stack_len = 2;</div><div class='add'>+</div><div class='add'>+ parms [1] = x; /* p1 */</div><div class='add'>+ parms [2] = y; /* p2 */</div><div class='add'>+</div><div class='add'>+ offset = 0;</div><div class='add'>+ zero_pad = 0;</div><div class='add'>+ field_width = 0;</div><div class='add'>+</div><div class='add'>+ b = (unsigned char *) buf;</div><div class='add'>+ fmt_max = fmt + strlen (fmt);</div><div class='add'>+</div><div class='add'>+ while (fmt < fmt_max)</div><div class='add'>+ {</div><div class='add'>+ ch = *fmt++;</div><div class='add'>+</div><div class='add'>+ if (ch != '%')</div><div class='add'>+ {</div><div class='add'>+ *b++ = ch;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (fmt == fmt_max) break;</div><div class='add'>+ ch = *fmt++;</div><div class='add'>+</div><div class='add'>+ switch (ch)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ *b++ = ch;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'p':</div><div class='add'>+</div><div class='add'>+ if (fmt == fmt_max) break;</div><div class='add'>+ ch = *fmt++;</div><div class='add'>+ if ((ch >= '0') && (ch <= '9'))</div><div class='add'>+ stack [stack_len++] = parms [ch - '0'];</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '\'': /* 'x' */</div><div class='add'>+ if (fmt == fmt_max) break;</div><div class='add'>+ stack [stack_len++] = *fmt++;</div><div class='add'>+ if (fmt < fmt_max) fmt++; /* skip ' */</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '{': /* literal constant, e.g. {30} */</div><div class='add'>+ z = 0;</div><div class='add'>+ while ((fmt < fmt_max) && ((ch = *fmt) <= '9') && (ch >= '0'))</div><div class='add'>+ {</div><div class='add'>+ z = z * 10 + (ch - '0');</div><div class='add'>+ fmt++;</div><div class='add'>+ }</div><div class='add'>+ stack [stack_len++] = z;</div><div class='add'>+ if ((ch == '}') && (fmt < fmt_max)) fmt++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '0':</div><div class='add'>+ if (fmt == fmt_max) break;</div><div class='add'>+ ch = *fmt;</div><div class='add'>+ if ((ch != '2') && (ch != '3'))</div><div class='add'>+ break;</div><div class='add'>+ zero_pad = 1;</div><div class='add'>+ fmt++;</div><div class='add'>+ /* drop */</div><div class='add'>+</div><div class='add'>+ case '2':</div><div class='add'>+ case '3':</div><div class='add'>+ if (fmt == fmt_max)</div><div class='add'>+ if (*fmt == 'x')</div><div class='add'>+ {</div><div class='add'>+ char x_fmt_buf [4];</div><div class='add'>+ char *x_fmt_buf_ptr;</div><div class='add'>+</div><div class='add'>+ x_fmt_buf_ptr = x_fmt_buf;</div><div class='add'>+ if (zero_pad) *x_fmt_buf_ptr++ = '0';</div><div class='add'>+ *x_fmt_buf_ptr++ = ch;</div><div class='add'>+ *x_fmt_buf_ptr++ = 'X';</div><div class='add'>+ *x_fmt_buf_ptr = 0;</div><div class='add'>+</div><div class='add'>+ z = STACK_POP;</div><div class='add'>+ z += offset;</div><div class='add'>+</div><div class='add'>+ sprintf ((char *)b, x_fmt_buf, z);</div><div class='add'>+ b += strlen ((char *)b);</div><div class='add'>+ zero_pad = 0;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ field_width = (ch - '0');</div><div class='add'>+ /* drop */</div><div class='add'>+</div><div class='add'>+ case 'd':</div><div class='add'>+ z = STACK_POP;</div><div class='add'>+ z += offset;</div><div class='add'>+ if (z >= 100)</div><div class='add'>+ {</div><div class='add'>+ *b++ = z / 100 + '0';</div><div class='add'>+ z = z % 100;</div><div class='add'>+ zero_pad = 1;</div><div class='add'>+ field_width = 2;</div><div class='add'>+ }</div><div class='add'>+ else if (zero_pad && (field_width == 3))</div><div class='add'>+ *b++ = '0';</div><div class='add'>+</div><div class='add'>+ if (z >= 10)</div><div class='add'>+ {</div><div class='add'>+ *b++ = z / 10 + '0';</div><div class='add'>+ z = z % 10;</div><div class='add'>+ }</div><div class='add'>+ else if (zero_pad && (field_width >= 2))</div><div class='add'>+ *b++ = '0';</div><div class='add'>+</div><div class='add'>+ *b++ = z + '0';</div><div class='add'>+ field_width = zero_pad = 0;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'x':</div><div class='add'>+ z = STACK_POP;</div><div class='add'>+ z += offset;</div><div class='add'>+ sprintf ((char *) b, "%X", z);</div><div class='add'>+ b += strlen ((char *)b);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'i':</div><div class='add'>+ offset = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '+':</div><div class='add'>+ /* Handling this depends upon whether or not we are parsing</div><div class='add'>+ * terminfo. Terminfo requires the stack so use it as an</div><div class='add'>+ * indicator.</div><div class='add'>+ */</div><div class='add'>+ if (stack_len > 2)</div><div class='add'>+ {</div><div class='add'>+ z = STACK_POP;</div><div class='add'>+ stack [stack_len - 1] += z;</div><div class='add'>+ }</div><div class='add'>+ else if (fmt < fmt_max)</div><div class='add'>+ {</div><div class='add'>+ ch = *fmt++;</div><div class='add'>+ if ((unsigned char) ch == 128) ch = 0;</div><div class='add'>+ ch = ch + (unsigned char) STACK_POP;</div><div class='add'>+ if (ch == '\n') ch++;</div><div class='add'>+ *b++ = ch;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* Binary operators */</div><div class='add'>+ case '-':</div><div class='add'>+ case '*':</div><div class='add'>+ case '/':</div><div class='add'>+ case 'm':</div><div class='add'>+ case '&':</div><div class='add'>+ case '|':</div><div class='add'>+ case '^':</div><div class='add'>+ case '=':</div><div class='add'>+ case '>':</div><div class='add'>+ case '<':</div><div class='add'>+ case 'A':</div><div class='add'>+ case 'O':</div><div class='add'>+ z1 = STACK_POP;</div><div class='add'>+ z = STACK_POP;</div><div class='add'>+ switch (ch)</div><div class='add'>+ {</div><div class='add'>+ case '-': z = (z - z1); break;</div><div class='add'>+ case '*': z = (z * z1); break;</div><div class='add'>+ case '/': z = (z / z1); break;</div><div class='add'>+ case 'm': z = (z % z1); break;</div><div class='add'>+ case '&': z = (z & z1); break;</div><div class='add'>+ case '|': z = (z | z1); break;</div><div class='add'>+ case '^': z = (z ^ z1); break;</div><div class='add'>+ case '=': z = (z == z1); break;</div><div class='add'>+ case '>': z = (z > z1); break;</div><div class='add'>+ case '<': z = (z < z1); break;</div><div class='add'>+ case 'A': z = (z && z1); break;</div><div class='add'>+ case 'O': z = (z || z1); break;</div><div class='add'>+ }</div><div class='add'>+ stack [stack_len++] = z;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* unary */</div><div class='add'>+ case '!':</div><div class='add'>+ z = STACK_POP;</div><div class='add'>+ stack [stack_len++] = !z;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '~':</div><div class='add'>+ z = STACK_POP;</div><div class='add'>+ stack [stack_len++] = ~z;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'r': /* termcap -- swap parameters */</div><div class='add'>+ z = stack [0];</div><div class='add'>+ stack [0] = stack [1];</div><div class='add'>+ stack [1] = z;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '.': /* termcap */</div><div class='add'>+ case 'c':</div><div class='add'>+ ch = (unsigned char) STACK_POP;</div><div class='add'>+ if (ch == '\n') ch++;</div><div class='add'>+ *b++ = ch;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'g':</div><div class='add'>+ if (fmt == fmt_max) break;</div><div class='add'>+ ch = *fmt++;</div><div class='add'>+ if ((ch >= 'a') && (ch <= 'z'))</div><div class='add'>+ stack [stack_len++] = variables [ch - 'a'];</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'P':</div><div class='add'>+ if (fmt == fmt_max) break;</div><div class='add'>+ ch = *fmt++;</div><div class='add'>+ if ((ch >= 'a') && (ch <= 'z'))</div><div class='add'>+ variables [ch - 'a'] = STACK_POP;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* If then else parsing. Actually, this is rather easy. The</div><div class='add'>+ * key is to notice that 'then' does all the work. 'if' simply</div><div class='add'>+ * there to indicate the start of a test and endif indicates</div><div class='add'>+ * the end of tests. If 'else' is seen, then skip to</div><div class='add'>+ * endif.</div><div class='add'>+ */</div><div class='add'>+ case '?': /* if */</div><div class='add'>+ case ';': /* endif */</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 't': /* then */</div><div class='add'>+ z = STACK_POP;</div><div class='add'>+ if (z != 0)</div><div class='add'>+ break; /* good. Continue parsing. */</div><div class='add'>+</div><div class='add'>+ /* z == 0 and test has failed. So, skip past this entire if</div><div class='add'>+ * expression to the matching else or matching endif.</div><div class='add'>+ */</div><div class='add'>+ /* drop */</div><div class='add'>+ case 'e': /* else */</div><div class='add'>+</div><div class='add'>+ parse_level = 0;</div><div class='add'>+ while (fmt < fmt_max)</div><div class='add'>+ {</div><div class='add'>+ unsigned char ch1;</div><div class='add'>+</div><div class='add'>+ ch1 = *fmt++;</div><div class='add'>+ if ((ch1 != '%') || (fmt == fmt_max))</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ ch1 = *fmt++;</div><div class='add'>+</div><div class='add'>+ if (ch1 == '?') parse_level++; /* new if */</div><div class='add'>+ else if (ch1 == 'e')</div><div class='add'>+ {</div><div class='add'>+ if ((ch != 'e') && (parse_level == 0))</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ else if (ch1 == ';')</div><div class='add'>+ {</div><div class='add'>+ if (parse_level == 0)</div><div class='add'>+ break;</div><div class='add'>+ parse_level--;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ *b = 0;</div><div class='add'>+ return (unsigned int) (b - (unsigned char *) buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void tt_printf(char *fmt, int x, int y)</div><div class='add'>+{</div><div class='add'>+ char buf[1024];</div><div class='add'>+ unsigned int n;</div><div class='add'>+ if (fmt == NULL) return;</div><div class='add'>+ n = tt_sprintf(buf, fmt, x, y);</div><div class='add'>+ tt_write(buf, n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_set_scroll_region (int r1, int r2)</div><div class='add'>+{</div><div class='add'>+ Scroll_r1 = r1;</div><div class='add'>+ Scroll_r2 = r2;</div><div class='add'>+ tt_printf (Scroll_R_Str, Scroll_r1, Scroll_r2);</div><div class='add'>+ Cursor_Set = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_reset_scroll_region (void)</div><div class='add'>+{</div><div class='add'>+ SLtt_set_scroll_region(0, SLtt_Screen_Rows - 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_set_cursor_visibility (int show)</div><div class='add'>+{</div><div class='add'>+ if ((Cursor_Visible_Str == NULL) || (Cursor_Invisible_Str == NULL))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ tt_write_string (show ? Cursor_Visible_Str : Cursor_Invisible_Str);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* the goto_rc function moves to row relative to scrolling region */</div><div class='add'>+void SLtt_goto_rc(int r, int c)</div><div class='add'>+{</div><div class='add'>+ char *s = NULL;</div><div class='add'>+ int n;</div><div class='add'>+ char buf[6];</div><div class='add'>+</div><div class='add'>+ if ((c < 0) || (r < 0))</div><div class='add'>+ {</div><div class='add'>+ Cursor_Set = 0;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* if (No_Move_In_Standout && Current_Fgbg) SLtt_normal_video (); */</div><div class='add'>+ r += Scroll_r1;</div><div class='add'>+</div><div class='add'>+ if ((Cursor_Set > 0) || ((Cursor_Set < 0) && !Automatic_Margins))</div><div class='add'>+ {</div><div class='add'>+ n = r - Cursor_r;</div><div class='add'>+ if ((n == -1) && (Cursor_Set > 0) && (Cursor_c == c)</div><div class='add'>+ && (Curs_Up_Str != NULL))</div><div class='add'>+ {</div><div class='add'>+ s = Curs_Up_Str;</div><div class='add'>+ }</div><div class='add'>+ else if ((n >= 0) && (n <= 4))</div><div class='add'>+ {</div><div class='add'>+ if ((n == 0) && (Cursor_Set == 1)</div><div class='add'>+ && ((c > 1) || (c == Cursor_c)))</div><div class='add'>+ {</div><div class='add'>+ if (Cursor_c == c) return;</div><div class='add'>+ if (Cursor_c == c + 1)</div><div class='add'>+ {</div><div class='add'>+ s = buf;</div><div class='add'>+ *s++ = '\b'; *s = 0;</div><div class='add'>+ s = buf;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else if (c == 0)</div><div class='add'>+ {</div><div class='add'>+ s = buf;</div><div class='add'>+ if ((Cursor_Set != 1) || (Cursor_c != 0)) *s++ = '\r';</div><div class='add'>+ while (n--) *s++ = '\n';</div><div class='add'>+#ifdef VMS</div><div class='add'>+ /* Need to add this after \n to start a new record. Sheesh. */</div><div class='add'>+ *s++ = '\r';</div><div class='add'>+#endif</div><div class='add'>+ *s = 0;</div><div class='add'>+ s = buf;</div><div class='add'>+ }</div><div class='add'>+ /* Will fail on VMS */</div><div class='add'>+#ifndef VMS</div><div class='add'>+ else if (SLtt_Newline_Ok && (Cursor_Set == 1) &&</div><div class='add'>+ (Cursor_c >= c) && (c + 3 > Cursor_c))</div><div class='add'>+ {</div><div class='add'>+ s = buf;</div><div class='add'>+ while (n--) *s++ = '\n';</div><div class='add'>+ n = Cursor_c - c;</div><div class='add'>+ while (n--) *s++ = '\b';</div><div class='add'>+ *s = 0;</div><div class='add'>+ s = buf;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ if (s != NULL) tt_write_string(s);</div><div class='add'>+ else tt_printf(Curs_Pos_Str, r, c);</div><div class='add'>+ Cursor_c = c; Cursor_r = r;</div><div class='add'>+ Cursor_Set = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_begin_insert (void)</div><div class='add'>+{</div><div class='add'>+ tt_write_string(Ins_Mode_Str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_end_insert (void)</div><div class='add'>+{</div><div class='add'>+ tt_write_string(Eins_Mode_Str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_delete_char (void)</div><div class='add'>+{</div><div class='add'>+ SLtt_normal_video ();</div><div class='add'>+ tt_write_string(Del_Char_Str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_erase_line (void)</div><div class='add'>+{</div><div class='add'>+ tt_write_string("\r");</div><div class='add'>+ Cursor_Set = 1; Cursor_c = 0;</div><div class='add'>+ SLtt_del_eol();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* It appears that the Linux console, and most likely others do not</div><div class='add'>+ * like scrolling regions that consist of one line. So I have to</div><div class='add'>+ * resort to this stupidity to make up for that stupidity.</div><div class='add'>+ */</div><div class='add'>+static void delete_line_in_scroll_region (void)</div><div class='add'>+{</div><div class='add'>+ SLtt_goto_rc (Cursor_r - Scroll_r1, 0);</div><div class='add'>+ SLtt_del_eol ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_delete_nlines (int n)</div><div class='add'>+{</div><div class='add'>+ int r1, curs;</div><div class='add'>+ char buf[132];</div><div class='add'>+</div><div class='add'>+ if (n <= 0) return;</div><div class='add'>+ SLtt_normal_video ();</div><div class='add'>+</div><div class='add'>+ if (Scroll_r1 == Scroll_r2)</div><div class='add'>+ {</div><div class='add'>+ delete_line_in_scroll_region ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (Del_N_Lines_Str != NULL) tt_printf(Del_N_Lines_Str,n, 0);</div><div class='add'>+ else</div><div class='add'>+ /* get a new terminal */</div><div class='add'>+ {</div><div class='add'>+ r1 = Scroll_r1;</div><div class='add'>+ curs = Cursor_r;</div><div class='add'>+ SLtt_set_scroll_region(curs, Scroll_r2);</div><div class='add'>+ SLtt_goto_rc(Scroll_r2 - Scroll_r1, 0);</div><div class='add'>+ SLMEMSET(buf, '\n', (unsigned int) n);</div><div class='add'>+ tt_write(buf, (unsigned int) n);</div><div class='add'>+ /* while (n--) tt_putchar('\n'); */</div><div class='add'>+ SLtt_set_scroll_region(r1, Scroll_r2);</div><div class='add'>+ SLtt_goto_rc(curs, 0);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_cls (void)</div><div class='add'>+{</div><div class='add'>+ /* If the terminal is a color terminal but the user wants black and </div><div class='add'>+ * white, then make sure that the colors are reset. This appears to be</div><div class='add'>+ * necessary.</div><div class='add'>+ */</div><div class='add'>+ if ((SLtt_Use_Ansi_Colors == 0) && Is_Color_Terminal)</div><div class='add'>+ {</div><div class='add'>+ if (Reset_Color_String != NULL)</div><div class='add'>+ tt_write_string (Reset_Color_String);</div><div class='add'>+ else</div><div class='add'>+ tt_write_string ("\033[0m\033[m");</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLtt_normal_video();</div><div class='add'>+ SLtt_reset_scroll_region ();</div><div class='add'>+ tt_write_string(Cls_Str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_reverse_index (int n)</div><div class='add'>+{</div><div class='add'>+ if (!n) return;</div><div class='add'>+</div><div class='add'>+ SLtt_normal_video();</div><div class='add'>+</div><div class='add'>+ if (Scroll_r1 == Scroll_r2)</div><div class='add'>+ {</div><div class='add'>+ delete_line_in_scroll_region ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (Add_N_Lines_Str != NULL) tt_printf(Add_N_Lines_Str,n, 0);</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ while(n--) tt_write_string(Rev_Scroll_Str);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_Ignore_Beep = 1;</div><div class='add'>+static char *Visible_Bell_Str;</div><div class='add'>+</div><div class='add'>+void SLtt_beep (void)</div><div class='add'>+{</div><div class='add'>+ if (SLtt_Ignore_Beep & 0x1) SLtt_putchar('\007');</div><div class='add'>+</div><div class='add'>+ if (SLtt_Ignore_Beep & 0x2)</div><div class='add'>+ {</div><div class='add'>+ if (Visible_Bell_Str != NULL) tt_write_string (Visible_Bell_Str);</div><div class='add'>+#ifdef __linux__</div><div class='add'>+ else if (Linux_Console)</div><div class='add'>+ {</div><div class='add'>+ tt_write_string ("\033[?5h");</div><div class='add'>+ SLtt_flush_output ();</div><div class='add'>+ _SLusleep (50000);</div><div class='add'>+ tt_write_string ("\033[?5l");</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+ SLtt_flush_output ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void del_eol (void)</div><div class='add'>+{</div><div class='add'>+ int c;</div><div class='add'>+</div><div class='add'>+ if (Del_Eol_Str != NULL)</div><div class='add'>+ {</div><div class='add'>+ tt_write_string(Del_Eol_Str);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ c = Cursor_c;</div><div class='add'>+ /* Avoid writing to the lower right corner. If the terminal does not</div><div class='add'>+ * have Del_Eol_Str, then it probably does not have what it takes to play</div><div class='add'>+ * games with insert for for a space into that corner.</div><div class='add'>+ */</div><div class='add'>+ if (Cursor_r + 1 < SLtt_Screen_Rows)</div><div class='add'>+ c++;</div><div class='add'>+</div><div class='add'>+ while (c < SLtt_Screen_Cols)</div><div class='add'>+ {</div><div class='add'>+ tt_write (" ", 1);</div><div class='add'>+ c++;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_del_eol (void)</div><div class='add'>+{</div><div class='add'>+ if (Current_Fgbg != 0xFFFFFFFFU) SLtt_normal_video ();</div><div class='add'>+ del_eol ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ SLtt_Char_Type color;</div><div class='add'>+}</div><div class='add'>+Color_Def_Type;</div><div class='add'>+</div><div class='add'>+#define MAX_COLOR_NAMES 17</div><div class='add'>+static Color_Def_Type Color_Defs [MAX_COLOR_NAMES] =</div><div class='add'>+{</div><div class='add'>+ {"black", SLSMG_COLOR_BLACK},</div><div class='add'>+ {"red", SLSMG_COLOR_RED},</div><div class='add'>+ {"green", SLSMG_COLOR_GREEN},</div><div class='add'>+ {"brown", SLSMG_COLOR_BROWN},</div><div class='add'>+ {"blue", SLSMG_COLOR_BLUE},</div><div class='add'>+ {"magenta", SLSMG_COLOR_MAGENTA},</div><div class='add'>+ {"cyan", SLSMG_COLOR_CYAN},</div><div class='add'>+ {"lightgray", SLSMG_COLOR_LGRAY},</div><div class='add'>+ {"gray", SLSMG_COLOR_GRAY},</div><div class='add'>+ {"brightred", SLSMG_COLOR_BRIGHT_RED},</div><div class='add'>+ {"brightgreen", SLSMG_COLOR_BRIGHT_GREEN},</div><div class='add'>+ {"yellow", SLSMG_COLOR_BRIGHT_BROWN},</div><div class='add'>+ {"brightblue", SLSMG_COLOR_BRIGHT_BLUE},</div><div class='add'>+ {"brightmagenta", SLSMG_COLOR_BRIGHT_CYAN},</div><div class='add'>+ {"brightcyan", SLSMG_COLOR_BRIGHT_MAGENTA},</div><div class='add'>+ {"white", SLSMG_COLOR_BRIGHT_WHITE},</div><div class='add'>+#define SLSMG_COLOR_DEFAULT 0xFF</div><div class='add'>+ {"default", SLSMG_COLOR_DEFAULT}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+void SLtt_set_mono (int obj, char *what, SLtt_Char_Type mask)</div><div class='add'>+{</div><div class='add'>+ (void) what;</div><div class='add'>+ if ((obj < 0) || (obj >= JMAX_COLORS))</div><div class='add'>+ {</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ Ansi_Color_Map[obj].mono = mask & ATTR_MASK;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *check_color_for_digit_form (char *color)</div><div class='add'>+{</div><div class='add'>+ unsigned int i, ich;</div><div class='add'>+ char *s = color;</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ while ((ich = (int) *s) != 0)</div><div class='add'>+ {</div><div class='add'>+ if ((ich < '0') || (ich > '9'))</div><div class='add'>+ return color;</div><div class='add'>+</div><div class='add'>+ i = i * 10 + (ich - '0');</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (i < MAX_COLOR_NAMES)</div><div class='add'>+ color = Color_Defs[i].name;</div><div class='add'>+</div><div class='add'>+ return color;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_default_colors (char **fgp, char **bgp)</div><div class='add'>+{</div><div class='add'>+ static char fg_buf[16], bg_buf[16], *bg, *fg;</div><div class='add'>+ static int already_parsed;</div><div class='add'>+ char *p, *pmax;</div><div class='add'>+</div><div class='add'>+ if (already_parsed == -1)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (already_parsed)</div><div class='add'>+ {</div><div class='add'>+ *fgp = fg;</div><div class='add'>+ *bgp = bg;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ already_parsed = -1;</div><div class='add'>+</div><div class='add'>+ bg = getenv ("COLORFGBG");</div><div class='add'>+</div><div class='add'>+ if (bg == NULL)</div><div class='add'>+ {</div><div class='add'>+ bg = getenv ("DEFAULT_COLORS");</div><div class='add'>+ if (bg == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ p = fg_buf;</div><div class='add'>+ pmax = p + (sizeof (fg_buf) - 1);</div><div class='add'>+</div><div class='add'>+ while ((*bg != 0) && (*bg != ';'))</div><div class='add'>+ {</div><div class='add'>+ if (p < pmax) *p++ = *bg;</div><div class='add'>+ bg++;</div><div class='add'>+ }</div><div class='add'>+ *p = 0;</div><div class='add'>+</div><div class='add'>+ if (*bg) bg++;</div><div class='add'>+</div><div class='add'>+ p = bg_buf;</div><div class='add'>+ pmax = p + (sizeof (bg_buf) - 1);</div><div class='add'>+</div><div class='add'>+ /* Mark suggested allowing for extra spplication specific stuff following</div><div class='add'>+ * the background color. That is what the check for the semi-colon is for.</div><div class='add'>+ */</div><div class='add'>+ while ((*bg != 0) && (*bg != ';'))</div><div class='add'>+ {</div><div class='add'>+ if (p < pmax) *p++ = *bg;</div><div class='add'>+ bg++;</div><div class='add'>+ }</div><div class='add'>+ *p = 0;</div><div class='add'>+</div><div class='add'>+ if (!strcmp (fg_buf, "default") || !strcmp(bg_buf, "default"))</div><div class='add'>+ {</div><div class='add'>+ *fgp = *bgp = fg = bg = "default";</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ *fgp = fg = check_color_for_digit_form (fg_buf);</div><div class='add'>+ *bgp = bg = check_color_for_digit_form (bg_buf);</div><div class='add'>+ }</div><div class='add'>+ already_parsed = 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char FgBg_Stats[JMAX_COLORS];</div><div class='add'>+</div><div class='add'>+static int Color_0_Modified = 0;</div><div class='add'>+</div><div class='add'>+void SLtt_set_color_object (int obj, SLtt_Char_Type attr)</div><div class='add'>+{</div><div class='add'>+ char *cust_esc;</div><div class='add'>+</div><div class='add'>+ if ((obj < 0) || (obj >= JMAX_COLORS)) return;</div><div class='add'>+</div><div class='add'>+ cust_esc = Ansi_Color_Map[obj].custom_esc;</div><div class='add'>+ if (cust_esc != NULL)</div><div class='add'>+ {</div><div class='add'>+ SLfree (cust_esc);</div><div class='add'>+ FgBg_Stats[(Ansi_Color_Map[obj].fgbg >> 8) & 0x7F] -= 1;</div><div class='add'>+ Ansi_Color_Map[obj].custom_esc = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Ansi_Color_Map[obj].fgbg = attr;</div><div class='add'>+ if (obj == 0) Color_0_Modified = 1;</div><div class='add'>+</div><div class='add'>+ if (_SLtt_color_changed_hook != NULL)</div><div class='add'>+ (*_SLtt_color_changed_hook)();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLtt_Char_Type SLtt_get_color_object (int obj)</div><div class='add'>+{</div><div class='add'>+ if ((obj < 0) || (obj >= JMAX_COLORS)) return 0;</div><div class='add'>+ return Ansi_Color_Map[obj].fgbg;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_add_color_attribute (int obj, SLtt_Char_Type attr)</div><div class='add'>+{</div><div class='add'>+ if ((obj < 0) || (obj >= JMAX_COLORS)) return;</div><div class='add'>+</div><div class='add'>+ Ansi_Color_Map[obj].fgbg |= (attr & ATTR_MASK);</div><div class='add'>+ if (obj == 0) Color_0_Modified = 1;</div><div class='add'>+ if (_SLtt_color_changed_hook != NULL)</div><div class='add'>+ (*_SLtt_color_changed_hook)();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLtt_Char_Type fb_to_fgbg (SLtt_Char_Type f, SLtt_Char_Type b)</div><div class='add'>+{</div><div class='add'>+ SLtt_Char_Type attr;</div><div class='add'>+</div><div class='add'>+ if (Max_Terminfo_Colors != 8)</div><div class='add'>+ {</div><div class='add'>+ if (f != SLSMG_COLOR_DEFAULT) f %= Max_Terminfo_Colors;</div><div class='add'>+ if (b != SLSMG_COLOR_DEFAULT) b %= Max_Terminfo_Colors;</div><div class='add'>+ return ((f << 8) | (b << 16));</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Otherwise we have 8 ansi colors. Try to get bright versions</div><div class='add'>+ * by using the BOLD and BLINK attributes.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ attr = 0;</div><div class='add'>+</div><div class='add'>+ /* Note: If f represents default, it will have the value 0xFF */</div><div class='add'>+ if (f != SLSMG_COLOR_DEFAULT)</div><div class='add'>+ {</div><div class='add'>+ if (f & 0x8) attr = SLTT_BOLD_MASK;</div><div class='add'>+ f &= 0x7;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (b != SLSMG_COLOR_DEFAULT)</div><div class='add'>+ {</div><div class='add'>+ if (b & 0x8) attr |= SLTT_BLINK_MASK;</div><div class='add'>+ b &= 0x7;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return ((f << 8) | (b << 16) | attr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This looks for colors with name form 'colorN'. If color is of this</div><div class='add'>+ * form, N is passed back via paramter list.</div><div class='add'>+ */</div><div class='add'>+static int parse_color_digit_name (char *color, SLtt_Char_Type *f)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+ unsigned char ch;</div><div class='add'>+</div><div class='add'>+ if (strncmp (color, "color", 5))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ color += 5;</div><div class='add'>+ if (*color == 0)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ ch = (unsigned char) *color++;</div><div class='add'>+ if (ch == 0)</div><div class='add'>+ break;</div><div class='add'>+ if ((ch > '9') || (ch < '0'))</div><div class='add'>+ return -1;</div><div class='add'>+ i = 10 * i + (ch - '0');</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *f = (SLtt_Char_Type) i;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int make_color_fgbg (char *fg, char *bg, SLtt_Char_Type *fgbg)</div><div class='add'>+{</div><div class='add'>+ SLtt_Char_Type f = 0xFFFFFFFFU, b = 0xFFFFFFFFU;</div><div class='add'>+ char *dfg, *dbg;</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ if ((fg != NULL) && (*fg == 0)) fg = NULL;</div><div class='add'>+ if ((bg != NULL) && (*bg == 0)) bg = NULL;</div><div class='add'>+</div><div class='add'>+ if ((fg == NULL) || (bg == NULL))</div><div class='add'>+ {</div><div class='add'>+ if (-1 == get_default_colors (&dfg, &dbg))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (fg == NULL) fg = dfg;</div><div class='add'>+ if (bg == NULL) bg = dbg;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == parse_color_digit_name (fg, &f))</div><div class='add'>+ {</div><div class='add'>+ for (i = 0; i < MAX_COLOR_NAMES; i++)</div><div class='add'>+ {</div><div class='add'>+ if (strcmp(fg, Color_Defs[i].name)) continue;</div><div class='add'>+ f = Color_Defs[i].color;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == parse_color_digit_name (bg, &b))</div><div class='add'>+ {</div><div class='add'>+ for (i = 0; i < MAX_COLOR_NAMES; i++)</div><div class='add'>+ {</div><div class='add'>+ if (strcmp(bg, Color_Defs[i].name)) continue;</div><div class='add'>+ b = Color_Defs[i].color;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((f == 0xFFFFFFFFU) || (b == 0xFFFFFFFFU))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ *fgbg = fb_to_fgbg (f, b);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_set_color (int obj, char *what, char *fg, char *bg)</div><div class='add'>+{</div><div class='add'>+ SLtt_Char_Type fgbg;</div><div class='add'>+</div><div class='add'>+ (void) what;</div><div class='add'>+ if ((obj < 0) || (obj >= JMAX_COLORS))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (-1 != make_color_fgbg (fg, bg, &fgbg))</div><div class='add'>+ SLtt_set_color_object (obj, fgbg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_set_color_fgbg (int obj, SLtt_Char_Type f, SLtt_Char_Type b)</div><div class='add'>+{</div><div class='add'>+ SLtt_set_color_object (obj, fb_to_fgbg (f, b));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_set_color_esc (int obj, char *esc)</div><div class='add'>+{</div><div class='add'>+ char *cust_esc;</div><div class='add'>+ SLtt_Char_Type fgbg = 0;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if ((obj < 0) || (obj >= JMAX_COLORS))</div><div class='add'>+ {</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ cust_esc = Ansi_Color_Map[obj].custom_esc;</div><div class='add'>+ if (cust_esc != NULL)</div><div class='add'>+ {</div><div class='add'>+ SLfree (cust_esc);</div><div class='add'>+ FgBg_Stats[(Ansi_Color_Map[obj].fgbg >> 8) & 0x7F] -= 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ cust_esc = (char *) SLmalloc (strlen(esc) + 1);</div><div class='add'>+ if (cust_esc != NULL) strcpy (cust_esc, esc);</div><div class='add'>+</div><div class='add'>+ Ansi_Color_Map[obj].custom_esc = cust_esc;</div><div class='add'>+ if (cust_esc == NULL) fgbg = 0;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ /* The whole point of this is to generate a unique fgbg */</div><div class='add'>+ for (i = 0; i < JMAX_COLORS; i++)</div><div class='add'>+ {</div><div class='add'>+ if (FgBg_Stats[i] == 0) fgbg = i;</div><div class='add'>+</div><div class='add'>+ if (obj == i) continue;</div><div class='add'>+ if ((Ansi_Color_Map[i].custom_esc) == NULL) continue;</div><div class='add'>+ if (!strcmp (Ansi_Color_Map[i].custom_esc, cust_esc))</div><div class='add'>+ {</div><div class='add'>+ fgbg = (Ansi_Color_Map[i].fgbg >> 8) & 0x7F;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ FgBg_Stats[fgbg] += 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ fgbg |= 0x80;</div><div class='add'>+ Ansi_Color_Map[obj].fgbg = (fgbg | (fgbg << 8)) << 8;</div><div class='add'>+ if (obj == 0) Color_0_Modified = 1;</div><div class='add'>+ if (_SLtt_color_changed_hook != NULL)</div><div class='add'>+ (*_SLtt_color_changed_hook)();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_set_alt_char_set (int i)</div><div class='add'>+{</div><div class='add'>+ static int last_i;</div><div class='add'>+ if (SLtt_Has_Alt_Charset == 0) return;</div><div class='add'>+ if (i == last_i) return;</div><div class='add'>+ tt_write_string (i ? Start_Alt_Chars_Str : End_Alt_Chars_Str );</div><div class='add'>+ last_i = i;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void write_attributes (SLtt_Char_Type fgbg)</div><div class='add'>+{</div><div class='add'>+ int bg0, fg0;</div><div class='add'>+ int unknown_attributes;</div><div class='add'>+</div><div class='add'>+ if (Worthless_Highlight) return;</div><div class='add'>+ if (fgbg == Current_Fgbg) return;</div><div class='add'>+</div><div class='add'>+ unknown_attributes = 0;</div><div class='add'>+</div><div class='add'>+ /* Before spitting out colors, fix attributes */</div><div class='add'>+ if ((fgbg & ATTR_MASK) != (Current_Fgbg & ATTR_MASK))</div><div class='add'>+ {</div><div class='add'>+ if (Current_Fgbg & ATTR_MASK)</div><div class='add'>+ {</div><div class='add'>+ tt_write_string(Norm_Vid_Str);</div><div class='add'>+ /* In case normal video turns off ALL attributes: */</div><div class='add'>+ if (fgbg & SLTT_ALTC_MASK)</div><div class='add'>+ Current_Fgbg &= ~SLTT_ALTC_MASK;</div><div class='add'>+ SLtt_set_alt_char_set (0);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((fgbg & SLTT_ALTC_MASK)</div><div class='add'>+ != (Current_Fgbg & SLTT_ALTC_MASK))</div><div class='add'>+ {</div><div class='add'>+ SLtt_set_alt_char_set ((int) (fgbg & SLTT_ALTC_MASK));</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (fgbg & SLTT_ULINE_MASK) tt_write_string (UnderLine_Vid_Str);</div><div class='add'>+ if (fgbg & SLTT_BOLD_MASK) SLtt_bold_video ();</div><div class='add'>+ if (fgbg & SLTT_REV_MASK) tt_write_string (Rev_Vid_Str);</div><div class='add'>+ if (fgbg & SLTT_BLINK_MASK)</div><div class='add'>+ {</div><div class='add'>+ /* Someday Linux will have a blink mode that set high intensity</div><div class='add'>+ * background. Lets be prepared.</div><div class='add'>+ */</div><div class='add'>+ if (SLtt_Blink_Mode) tt_write_string (Blink_Vid_Str);</div><div class='add'>+ }</div><div class='add'>+ unknown_attributes = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (SLtt_Use_Ansi_Colors)</div><div class='add'>+ {</div><div class='add'>+ fg0 = (int) GET_FG(fgbg);</div><div class='add'>+ bg0 = (int) GET_BG(fgbg);</div><div class='add'>+</div><div class='add'>+ if (unknown_attributes </div><div class='add'>+ || (fg0 != (int)GET_FG(Current_Fgbg)))</div><div class='add'>+ {</div><div class='add'>+ if (fg0 == SLSMG_COLOR_DEFAULT)</div><div class='add'>+ tt_write_string (Default_Color_Fg_Str);</div><div class='add'>+ else</div><div class='add'>+ tt_printf (Color_Fg_Str, fg0, 0);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (unknown_attributes</div><div class='add'>+ || (bg0 != (int)GET_BG(Current_Fgbg)))</div><div class='add'>+ {</div><div class='add'>+ if (bg0 == SLSMG_COLOR_DEFAULT)</div><div class='add'>+ tt_write_string (Default_Color_Bg_Str);</div><div class='add'>+ else</div><div class='add'>+ tt_printf (Color_Bg_Str, bg0, 0);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Current_Fgbg = fgbg;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int Video_Initialized;</div><div class='add'>+</div><div class='add'>+void SLtt_reverse_video (int color)</div><div class='add'>+{</div><div class='add'>+ SLtt_Char_Type fgbg;</div><div class='add'>+ char *esc;</div><div class='add'>+</div><div class='add'>+ if (Worthless_Highlight) return;</div><div class='add'>+ if ((color < 0) || (color >= JMAX_COLORS)) return;</div><div class='add'>+</div><div class='add'>+ if (Video_Initialized == 0)</div><div class='add'>+ {</div><div class='add'>+ if (color == JNORMAL_COLOR)</div><div class='add'>+ {</div><div class='add'>+ tt_write_string (Norm_Vid_Str);</div><div class='add'>+ }</div><div class='add'>+ else tt_write_string (Rev_Vid_Str);</div><div class='add'>+ Current_Fgbg = 0xFFFFFFFFU;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (SLtt_Use_Ansi_Colors)</div><div class='add'>+ {</div><div class='add'>+ fgbg = Ansi_Color_Map[color].fgbg;</div><div class='add'>+ if ((esc = Ansi_Color_Map[color].custom_esc) != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (fgbg != Current_Fgbg)</div><div class='add'>+ {</div><div class='add'>+ Current_Fgbg = fgbg;</div><div class='add'>+ tt_write_string (esc);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else fgbg = Ansi_Color_Map[color].mono;</div><div class='add'>+</div><div class='add'>+ if (fgbg == Current_Fgbg) return;</div><div class='add'>+ write_attributes (fgbg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_normal_video (void)</div><div class='add'>+{</div><div class='add'>+ SLtt_reverse_video(JNORMAL_COLOR);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_narrow_width (void)</div><div class='add'>+{</div><div class='add'>+ tt_write_string("\033[?3l");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_wide_width (void)</div><div class='add'>+{</div><div class='add'>+ tt_write_string("\033[?3h");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Highest bit represents the character set. */</div><div class='add'>+#define COLOR_MASK 0x7F00</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+static int bce_color_eqs (unsigned int a, unsigned int b)</div><div class='add'>+{</div><div class='add'>+ a = (a & COLOR_MASK) >> 8;</div><div class='add'>+ b = (b & COLOR_MASK) >> 8;</div><div class='add'>+ </div><div class='add'>+ if (a == b)</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+ if (SLtt_Use_Ansi_Colors == 0)</div><div class='add'>+ return Ansi_Color_Map[a].mono == Ansi_Color_Map[b].mono;</div><div class='add'>+ </div><div class='add'>+ if (Bce_Color_Offset == 0)</div><div class='add'>+ return Ansi_Color_Map[a].fgbg == Ansi_Color_Map[b].fgbg;</div><div class='add'>+ </div><div class='add'>+ /* If either are color 0, then we do not know what that means since the</div><div class='add'>+ * terminal does not support BCE */</div><div class='add'>+ if ((a == 0) || (b == 0))</div><div class='add'>+ return 0;</div><div class='add'>+ </div><div class='add'>+ return Ansi_Color_Map[a-1].fgbg == Ansi_Color_Map[b-1].fgbg;</div><div class='add'>+}</div><div class='add'>+#define COLOR_EQS(a,b) bce_color_eqs (a,b)</div><div class='add'>+#else</div><div class='add'>+# define COLOR_OF(x) (((unsigned int)(x) & COLOR_MASK) >> 8)</div><div class='add'>+# define COLOR_EQS(a, b) \</div><div class='add'>+ (SLtt_Use_Ansi_Colors \</div><div class='add'>+ ? (Ansi_Color_Map[COLOR_OF(a)].fgbg == Ansi_Color_Map[COLOR_OF(b)].fgbg)\</div><div class='add'>+ : (Ansi_Color_Map[COLOR_OF(a)].mono == Ansi_Color_Map[COLOR_OF(b)].mono))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define CHAR_EQS(a, b) (((a) == (b))\</div><div class='add'>+ || ((((a) & ~COLOR_MASK) == ((b) & ~COLOR_MASK))\</div><div class='add'>+ && COLOR_EQS((a), (b))))</div><div class='add'>+</div><div class='add'>+/* The whole point of this routine is to prevent writing to the last column</div><div class='add'>+ * and last row on terminals with automatic margins.</div><div class='add'>+ */</div><div class='add'>+static void write_string_with_care (char *str)</div><div class='add'>+{</div><div class='add'>+ unsigned int len;</div><div class='add'>+</div><div class='add'>+ if (str == NULL) return;</div><div class='add'>+</div><div class='add'>+ len = strlen (str);</div><div class='add'>+ if (Automatic_Margins && (Cursor_r + 1 == SLtt_Screen_Rows))</div><div class='add'>+ {</div><div class='add'>+ if (len + (unsigned int) Cursor_c >= (unsigned int) SLtt_Screen_Cols)</div><div class='add'>+ {</div><div class='add'>+ /* For now, just do not write there. Later, something more</div><div class='add'>+ * sophisticated will be implemented.</div><div class='add'>+ */</div><div class='add'>+ if (SLtt_Screen_Cols > Cursor_c)</div><div class='add'>+ len = SLtt_Screen_Cols - Cursor_c - 1;</div><div class='add'>+ else </div><div class='add'>+ len = 0;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ tt_write (str, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void send_attr_str (SLsmg_Char_Type *s)</div><div class='add'>+{</div><div class='add'>+ unsigned char out[256], ch, *p;</div><div class='add'>+ register SLtt_Char_Type attr;</div><div class='add'>+ register SLsmg_Char_Type sh;</div><div class='add'>+ int color, last_color = -1;</div><div class='add'>+</div><div class='add'>+ p = out;</div><div class='add'>+ while (0 != (sh = *s++))</div><div class='add'>+ {</div><div class='add'>+ ch = sh & 0xFF;</div><div class='add'>+ color = ((int) sh & 0xFF00) >> 8;</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+ if (Bce_Color_Offset</div><div class='add'>+ && (color >= Bce_Color_Offset))</div><div class='add'>+ color -= Bce_Color_Offset;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (color != last_color)</div><div class='add'>+ {</div><div class='add'>+ if (SLtt_Use_Ansi_Colors) attr = Ansi_Color_Map[color & 0x7F].fgbg;</div><div class='add'>+ else attr = Ansi_Color_Map[color & 0x7F].mono;</div><div class='add'>+</div><div class='add'>+ if (sh & 0x8000) /* alternate char set */</div><div class='add'>+ {</div><div class='add'>+ if (SLtt_Use_Blink_For_ACS)</div><div class='add'>+ {</div><div class='add'>+ if (SLtt_Blink_Mode) attr |= SLTT_BLINK_MASK;</div><div class='add'>+ }</div><div class='add'>+ else attr |= SLTT_ALTC_MASK;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (attr != Current_Fgbg)</div><div class='add'>+ {</div><div class='add'>+ if ((ch != ' ') ||</div><div class='add'>+ /* it is a space so only consider it different if it</div><div class='add'>+ * has different attributes.</div><div class='add'>+ */</div><div class='add'>+ (attr & BGALL_MASK) != (Current_Fgbg & BGALL_MASK))</div><div class='add'>+ {</div><div class='add'>+ if (p != out)</div><div class='add'>+ {</div><div class='add'>+ *p = 0;</div><div class='add'>+ write_string_with_care ((char *) out);</div><div class='add'>+ Cursor_c += (int) (p - out);</div><div class='add'>+ p = out;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (SLtt_Use_Ansi_Colors && (NULL != Ansi_Color_Map[color & 0x7F].custom_esc))</div><div class='add'>+ {</div><div class='add'>+ tt_write_string (Ansi_Color_Map[color & 0x7F].custom_esc);</div><div class='add'>+ /* Just in case the custom escape sequence screwed up</div><div class='add'>+ * the alt character set state...</div><div class='add'>+ */</div><div class='add'>+ if ((attr & SLTT_ALTC_MASK) != (Current_Fgbg & SLTT_ALTC_MASK))</div><div class='add'>+ SLtt_set_alt_char_set ((int) (attr & SLTT_ALTC_MASK));</div><div class='add'>+ Current_Fgbg = attr;</div><div class='add'>+ }</div><div class='add'>+ else write_attributes (attr);</div><div class='add'>+</div><div class='add'>+ last_color = color;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ *p++ = ch;</div><div class='add'>+ }</div><div class='add'>+ *p = 0;</div><div class='add'>+ if (p != out) write_string_with_care ((char *) out);</div><div class='add'>+ Cursor_c += (int) (p - out);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void forward_cursor (unsigned int n, int row)</div><div class='add'>+{</div><div class='add'>+ char buf [1024];</div><div class='add'>+</div><div class='add'>+ if (n <= 4)</div><div class='add'>+ {</div><div class='add'>+ SLtt_normal_video ();</div><div class='add'>+ SLMEMSET (buf, ' ', n);</div><div class='add'>+ buf[n] = 0;</div><div class='add'>+ write_string_with_care (buf);</div><div class='add'>+ Cursor_c += n;</div><div class='add'>+ }</div><div class='add'>+ else if (Curs_F_Str != NULL)</div><div class='add'>+ {</div><div class='add'>+ Cursor_c += n;</div><div class='add'>+ n = tt_sprintf(buf, Curs_F_Str, (int) n, 0);</div><div class='add'>+ tt_write(buf, n);</div><div class='add'>+ }</div><div class='add'>+ else SLtt_goto_rc (row, (int) (Cursor_c + n));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+void SLtt_smart_puts(SLsmg_Char_Type *neww, SLsmg_Char_Type *oldd, int len, int row)</div><div class='add'>+{</div><div class='add'>+ register SLsmg_Char_Type *p, *q, *qmax, *pmax, *buf;</div><div class='add'>+ SLsmg_Char_Type buffer[256];</div><div class='add'>+ unsigned int n_spaces;</div><div class='add'>+ SLsmg_Char_Type *space_match, *last_buffered_match;</div><div class='add'>+#ifdef HP_GLITCH_CODE</div><div class='add'>+ int handle_hp_glitch = 0;</div><div class='add'>+#endif</div><div class='add'>+ SLsmg_Char_Type space_char;</div><div class='add'>+#define SLTT_USE_INSERT_HACK 1</div><div class='add'>+#if SLTT_USE_INSERT_HACK</div><div class='add'>+ SLsmg_Char_Type insert_hack_prev = 0;</div><div class='add'>+ SLsmg_Char_Type insert_hack_char = 0;</div><div class='add'>+</div><div class='add'>+ if ((row + 1 == SLtt_Screen_Rows)</div><div class='add'>+ && (len == SLtt_Screen_Cols)</div><div class='add'>+ && (len > 1)</div><div class='add'>+ && (SLtt_Term_Cannot_Insert == 0)</div><div class='add'>+ && Automatic_Margins)</div><div class='add'>+ {</div><div class='add'>+ insert_hack_char = neww[len-1];</div><div class='add'>+ if (oldd[len-1] == insert_hack_char)</div><div class='add'>+ insert_hack_char = 0;</div><div class='add'>+ else </div><div class='add'>+ insert_hack_prev = neww[len-2];</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ </div><div class='add'>+ q = oldd; p = neww;</div><div class='add'>+ qmax = oldd + len;</div><div class='add'>+ pmax = p + len;</div><div class='add'>+</div><div class='add'>+ /* Find out where to begin --- while they match, we are ok */</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ if (q == qmax) return;</div><div class='add'>+#if SLANG_HAS_KANJI_SUPPORT</div><div class='add'>+ if (*p & 0x80)</div><div class='add'>+ { /* new is kanji */</div><div class='add'>+ if ((*q & 0x80) && ((q + 1) < qmax))</div><div class='add'>+ { /* old is also kanji */</div><div class='add'>+ if (((0xFF & *q) != (0xFF & *p))</div><div class='add'>+ || ((0xFF & q[1]) != (0xFF & p[1])))</div><div class='add'>+ break; /* both kanji, but not match */</div><div class='add'>+</div><div class='add'>+ else</div><div class='add'>+ { /* kanji match ! */</div><div class='add'>+ if (!COLOR_EQS(*q, *p)) break;</div><div class='add'>+ q++; p++;</div><div class='add'>+ if (!COLOR_EQS(*q, *p)) break;</div><div class='add'>+ /* really match! */</div><div class='add'>+ q++; p++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else break; /* old is not kanji */</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ { /* new is not kanji */</div><div class='add'>+ if (*q & 0x80) break; /* old is kanji */</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ if (!CHAR_EQS(*q, *p)) break;</div><div class='add'>+ q++; p++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#ifdef HP_GLITCH_CODE</div><div class='add'>+ if (Has_HP_Glitch)</div><div class='add'>+ {</div><div class='add'>+ SLsmg_Char_Type *qq = q;</div><div class='add'>+</div><div class='add'>+ SLtt_goto_rc (row, (int) (p - neww));</div><div class='add'>+</div><div class='add'>+ while (qq < qmax)</div><div class='add'>+ {</div><div class='add'>+ if (*qq & 0xFF00)</div><div class='add'>+ {</div><div class='add'>+ SLtt_normal_video ();</div><div class='add'>+ SLtt_del_eol ();</div><div class='add'>+ qmax = q;</div><div class='add'>+ handle_hp_glitch = 1;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ qq++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ /* Find where the last non-blank character on old/new screen is */</div><div class='add'>+</div><div class='add'>+ space_char = ' ';</div><div class='add'>+ if ((*(pmax-1) & 0xFF) == ' ')</div><div class='add'>+ {</div><div class='add'>+ /* If we get here, then we can erase to the end of the line to create</div><div class='add'>+ * the final space. However, this will only work _if_ erasing will </div><div class='add'>+ * get us the correct color. If the terminal supports BCE, then this</div><div class='add'>+ * is easy. If it does not, then we can only perform this operation</div><div class='add'>+ * if the color is known via something like COLORFGBG. For now, </div><div class='add'>+ * I just will not perform the optimization for such terminals.</div><div class='add'>+ */</div><div class='add'>+ if ((Can_Background_Color_Erase)</div><div class='add'>+ && SLtt_Use_Ansi_Colors)</div><div class='add'>+ space_char = *(pmax - 1);</div><div class='add'>+</div><div class='add'>+ while (pmax > p)</div><div class='add'>+ {</div><div class='add'>+ pmax--;</div><div class='add'>+ if (!CHAR_EQS(*pmax, space_char))</div><div class='add'>+ {</div><div class='add'>+ pmax++;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (qmax > q)</div><div class='add'>+ {</div><div class='add'>+ qmax--;</div><div class='add'>+ if (!CHAR_EQS(*qmax, space_char))</div><div class='add'>+ {</div><div class='add'>+ qmax++;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ last_buffered_match = buf = buffer; /* buffer is empty */</div><div class='add'>+</div><div class='add'>+#ifdef HP_GLITCH_CODE</div><div class='add'>+ if (handle_hp_glitch)</div><div class='add'>+ {</div><div class='add'>+ while (p < pmax)</div><div class='add'>+ {</div><div class='add'>+ *buf++ = *p++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HP_GLITCH_CODE</div><div class='add'>+ if (Has_HP_Glitch == 0)</div><div class='add'>+ {</div><div class='add'>+#endif</div><div class='add'>+ /* Try use use erase to bol if possible */</div><div class='add'>+ if ((Del_Bol_Str != NULL) && ((*neww & 0xFF) == 32))</div><div class='add'>+ {</div><div class='add'>+ SLsmg_Char_Type *p1;</div><div class='add'>+ SLsmg_Char_Type blank;</div><div class='add'>+</div><div class='add'>+ p1 = neww;</div><div class='add'>+ if ((Can_Background_Color_Erase)</div><div class='add'>+ && SLtt_Use_Ansi_Colors)</div><div class='add'>+ blank = *p1;</div><div class='add'>+ /* black+white attributes do not support bce */</div><div class='add'>+ else</div><div class='add'>+ blank = 32;</div><div class='add'>+</div><div class='add'>+ while ((p1 < pmax) && (CHAR_EQS (*p1, blank)))</div><div class='add'>+ p1++;</div><div class='add'>+</div><div class='add'>+ /* Is this optimization worth it? Assume Del_Bol_Str is ESC [ 1 K</div><div class='add'>+ * It costs 4 chars + the space needed to properly position the </div><div class='add'>+ * cursor, e.g., ESC [ 10;10H. So, it costs at least 13 characters.</div><div class='add'>+ */</div><div class='add'>+ if ((p1 > neww + 13) </div><div class='add'>+ && (p1 >= p)</div><div class='add'>+ /* Avoid erasing from the end of the line */</div><div class='add'>+ && ((p1 != pmax) || (pmax < neww + len)))</div><div class='add'>+ {</div><div class='add'>+ int ofs = (int) (p1 - neww);</div><div class='add'>+ q = oldd + ofs;</div><div class='add'>+ p = p1;</div><div class='add'>+ SLtt_goto_rc (row, ofs - 1);</div><div class='add'>+ SLtt_reverse_video (blank >> 8);</div><div class='add'>+ tt_write_string (Del_Bol_Str);</div><div class='add'>+ tt_write (" ", 1);</div><div class='add'>+ Cursor_c += 1;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ SLtt_goto_rc (row, (int) (p - neww));</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ SLtt_goto_rc (row, (int) (p - neww));</div><div class='add'>+#ifdef HP_GLITCH_CODE</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ </div><div class='add'>+ </div><div class='add'>+ /* loop using overwrite then skip algorithm until done */</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ /* while they do not match and we do not hit a space, buffer them up */</div><div class='add'>+ n_spaces = 0;</div><div class='add'>+ while (p < pmax)</div><div class='add'>+ {</div><div class='add'>+ if (CHAR_EQS(*q, 32) && CHAR_EQS(*p, 32))</div><div class='add'>+ {</div><div class='add'>+ /* If *q is not a space, we would have to overwrite it.</div><div class='add'>+ * However, if *q is a space, then while *p is also one,</div><div class='add'>+ * we only need to skip over the blank field.</div><div class='add'>+ */</div><div class='add'>+ space_match = p;</div><div class='add'>+ p++; q++;</div><div class='add'>+ while ((p < pmax)</div><div class='add'>+ && CHAR_EQS(*q, 32)</div><div class='add'>+ && CHAR_EQS(*p, 32))</div><div class='add'>+ {</div><div class='add'>+ p++;</div><div class='add'>+ q++;</div><div class='add'>+ }</div><div class='add'>+ n_spaces = (unsigned int) (p - space_match);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+#if SLANG_HAS_KANJI_SUPPORT</div><div class='add'>+ if ((*p & 0x80) && ((p + 1) < pmax))</div><div class='add'>+ { /* new is kanji */</div><div class='add'>+ if (*q & 0x80)</div><div class='add'>+ { /* old is also kanji */</div><div class='add'>+ if (((0xFF & *q) != (0xFF & *p))</div><div class='add'>+ || ((0xFF & q[1]) != (0xFF & p[1])))</div><div class='add'>+ {</div><div class='add'>+ /* both kanji, but not match */</div><div class='add'>+ *buf++ = *p++;</div><div class='add'>+ *buf++ = *p++;</div><div class='add'>+ q += 2;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ { /* kanji match ? */</div><div class='add'>+ if (!COLOR_EQS(*q, *p) || !COLOR_EQS(*(q+1), *(p+1)))</div><div class='add'>+ {</div><div class='add'>+ /* code is match, but color is diff */</div><div class='add'>+ *buf++ = *p++;</div><div class='add'>+ *buf++ = *p++;</div><div class='add'>+ q += 2;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ /* really match ! */</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ { /* old is not kanji */</div><div class='add'>+ *buf++ = *p++;</div><div class='add'>+ *buf++ = *p++;</div><div class='add'>+ q += 2;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ { /* new is not kanji */</div><div class='add'>+ if (*q & 0x80)</div><div class='add'>+ { /* old is kanji */</div><div class='add'>+ *buf++ = *p++;</div><div class='add'>+ q++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (CHAR_EQS(*q, *p)) break;</div><div class='add'>+ *buf++ = *p++;</div><div class='add'>+ q++;</div><div class='add'>+ }</div><div class='add'>+ *buf = 0;</div><div class='add'>+</div><div class='add'>+ if (buf != buffer) send_attr_str (buffer);</div><div class='add'>+ buf = buffer;</div><div class='add'>+</div><div class='add'>+ if (n_spaces </div><div class='add'>+ && ((p < pmax) /* erase to eol will achieve this effect*/</div><div class='add'>+ || (space_char != 32)))/* unless space_char is not a simple space */</div><div class='add'>+ {</div><div class='add'>+ forward_cursor (n_spaces, row);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Now we overwrote what we could and cursor is placed at position</div><div class='add'>+ * of a possible match of new and old. If this is the case, skip</div><div class='add'>+ * some more.</div><div class='add'>+ */</div><div class='add'>+#if !SLANG_HAS_KANJI_SUPPORT</div><div class='add'>+ while ((p < pmax) && CHAR_EQS(*p, *q))</div><div class='add'>+ {</div><div class='add'>+ *buf++ = *p++;</div><div class='add'>+ q++;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ /* Kanji */</div><div class='add'>+ while (p < pmax)</div><div class='add'>+ {</div><div class='add'>+ if ((*p & 0x80) && ((p + 1) < pmax))</div><div class='add'>+ { /* new is kanji */</div><div class='add'>+ if (*q & 0x80)</div><div class='add'>+ { /* old is also kanji */</div><div class='add'>+ if (((0xFF & *q) == (0xFF & *p))</div><div class='add'>+ && ((0xFF & q[1]) == (0xFF & p[1])))</div><div class='add'>+ {</div><div class='add'>+ /* kanji match ? */</div><div class='add'>+ if (!COLOR_EQS(*q, *p)</div><div class='add'>+ || !COLOR_EQS(q[1], p[1]))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ *buf++ = *p++;</div><div class='add'>+ q++;</div><div class='add'>+ if (p >= pmax)</div><div class='add'>+ {</div><div class='add'>+ *buf++ = 32;</div><div class='add'>+ p++;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ *buf++ = *p++;</div><div class='add'>+ q++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else break; /* both kanji, but not match */</div><div class='add'>+ }</div><div class='add'>+ else break; /* old is not kanji */</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ { /* new is not kanji */</div><div class='add'>+ if (*q & 0x80) break; /* old is kanji */</div><div class='add'>+ if (!CHAR_EQS(*q, *p)) break;</div><div class='add'>+ *buf++ = *p++;</div><div class='add'>+ q++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ last_buffered_match = buf;</div><div class='add'>+ if (p >= pmax) break;</div><div class='add'>+</div><div class='add'>+ /* jump to new position is it is greater than 5 otherwise</div><div class='add'>+ * let it sit in the buffer and output it later.</div><div class='add'>+ */</div><div class='add'>+ if ((int) (buf - buffer) >= 5)</div><div class='add'>+ {</div><div class='add'>+ forward_cursor ((unsigned int) (buf - buffer), row);</div><div class='add'>+ last_buffered_match = buf = buffer;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (buf != buffer)</div><div class='add'>+ {</div><div class='add'>+ if (q < qmax)</div><div class='add'>+ {</div><div class='add'>+ if ((buf == last_buffered_match)</div><div class='add'>+ && ((int) (buf - buffer) >= 5))</div><div class='add'>+ {</div><div class='add'>+ forward_cursor ((unsigned int) (buf - buffer), row);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ *buf = 0;</div><div class='add'>+ send_attr_str (buffer);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (q < qmax) </div><div class='add'>+ {</div><div class='add'>+ SLtt_reverse_video (space_char >> 8);</div><div class='add'>+ del_eol ();</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+#if SLTT_USE_INSERT_HACK</div><div class='add'>+ else if (insert_hack_char)</div><div class='add'>+ {</div><div class='add'>+ SLtt_goto_rc (SLtt_Screen_Rows-1, SLtt_Screen_Cols-2);</div><div class='add'>+ buffer[0] = insert_hack_char;</div><div class='add'>+ buffer[1] = 0;</div><div class='add'>+ send_attr_str (buffer);</div><div class='add'>+ SLtt_goto_rc (SLtt_Screen_Rows-1, SLtt_Screen_Cols-2);</div><div class='add'>+ buffer[0] = insert_hack_prev;</div><div class='add'>+ SLtt_begin_insert ();</div><div class='add'>+ send_attr_str (buffer);</div><div class='add'>+ SLtt_end_insert ();</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (Automatic_Margins && (Cursor_c + 1 >= SLtt_Screen_Cols)) Cursor_Set = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void get_color_info (void)</div><div class='add'>+{</div><div class='add'>+ char *fg, *bg;</div><div class='add'>+</div><div class='add'>+ /* Allow easy mechanism to override inadequate termcap/terminfo files. */</div><div class='add'>+ if (SLtt_Use_Ansi_Colors == 0)</div><div class='add'>+ SLtt_Use_Ansi_Colors = (NULL != getenv ("COLORTERM"));</div><div class='add'>+</div><div class='add'>+ if (SLtt_Use_Ansi_Colors)</div><div class='add'>+ Is_Color_Terminal = 1;</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+ if (Can_Background_Color_Erase == 0)</div><div class='add'>+ Can_Background_Color_Erase = (NULL != getenv ("COLORTERM_BCE"));</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (-1 == get_default_colors (&fg, &bg))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ /* Check to see if application has already set them. */</div><div class='add'>+ if (Color_0_Modified)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ SLtt_set_color (0, NULL, fg, bg);</div><div class='add'>+ SLtt_set_color (1, NULL, bg, fg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* termcap stuff */</div><div class='add'>+</div><div class='add'>+#ifdef __unix__</div><div class='add'>+</div><div class='add'>+static int Termcap_Initalized = 0;</div><div class='add'>+</div><div class='add'>+#ifdef USE_TERMCAP</div><div class='add'>+/* Termcap based system */</div><div class='add'>+static char Termcap_Buf[4096];</div><div class='add'>+static char Termcap_String_Buf[4096];</div><div class='add'>+static char *Termcap_String_Ptr;</div><div class='add'>+extern char *tgetstr(char *, char **);</div><div class='add'>+extern int tgetent(char *, char *);</div><div class='add'>+extern int tgetnum(char *);</div><div class='add'>+extern int tgetflag(char *);</div><div class='add'>+#else</div><div class='add'>+/* Terminfo */</div><div class='add'>+static SLterminfo_Type *Terminfo;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define TGETFLAG(x) (SLtt_tgetflag(x) > 0)</div><div class='add'>+</div><div class='add'>+static char *fixup_tgetstr (char *what)</div><div class='add'>+{</div><div class='add'>+ register char *w, *w1;</div><div class='add'>+ char *wsave;</div><div class='add'>+ </div><div class='add'>+ if (what == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ /* Check for AIX brain-damage */</div><div class='add'>+ if (*what == '@')</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ /* lose pad info --- with today's technology, term is a loser if</div><div class='add'>+ it is really needed */</div><div class='add'>+ while ((*what == '.') ||</div><div class='add'>+ ((*what >= '0') && (*what <= '9'))) what++;</div><div class='add'>+ if (*what == '*') what++;</div><div class='add'>+ </div><div class='add'>+ /* lose terminfo padding--- looks like $<...> */</div><div class='add'>+ w = what;</div><div class='add'>+ while (*w) if ((*w++ == '$') && (*w == '<'))</div><div class='add'>+ {</div><div class='add'>+ w1 = w - 1;</div><div class='add'>+ while (*w && (*w != '>')) w++;</div><div class='add'>+ if (*w == 0) break;</div><div class='add'>+ w++;</div><div class='add'>+ wsave = w1;</div><div class='add'>+ while ((*w1++ = *w++) != 0);</div><div class='add'>+ w = wsave;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (*what == 0) what = NULL;</div><div class='add'>+ return what;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLtt_tgetstr (char *s)</div><div class='add'>+{</div><div class='add'>+ if (Termcap_Initalized == 0)</div><div class='add'>+ return NULL;</div><div class='add'>+ </div><div class='add'>+#ifdef USE_TERMCAP</div><div class='add'>+ s = tgetstr (s, &Termcap_String_Ptr);</div><div class='add'>+#else</div><div class='add'>+ s = _SLtt_tigetstr (Terminfo, s);</div><div class='add'>+#endif</div><div class='add'>+ return fixup_tgetstr (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_tgetnum (char *s)</div><div class='add'>+{</div><div class='add'>+ if (Termcap_Initalized == 0)</div><div class='add'>+ return -1;</div><div class='add'>+#ifdef USE_TERMCAP</div><div class='add'>+ return tgetnum (s);</div><div class='add'>+#else</div><div class='add'>+ return _SLtt_tigetnum (Terminfo, s);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_tgetflag (char *s)</div><div class='add'>+{</div><div class='add'>+ if (Termcap_Initalized == 0)</div><div class='add'>+ return -1;</div><div class='add'>+#ifdef USE_TERMCAP</div><div class='add'>+ return tgetflag (s);</div><div class='add'>+#else</div><div class='add'>+ return _SLtt_tigetflag (Terminfo, s);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int Vt100_Like = 0;</div><div class='add'>+</div><div class='add'>+void SLtt_get_terminfo (void)</div><div class='add'>+{</div><div class='add'>+ char *term;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ term = getenv ("TERM");</div><div class='add'>+ if (term == NULL)</div><div class='add'>+ SLang_exit_error("TERM environment variable needs set.");</div><div class='add'>+</div><div class='add'>+ if (0 == (status = SLtt_initialize (term)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (status == -1)</div><div class='add'>+ {</div><div class='add'>+ SLang_exit_error ("Unknown terminal: %s\n\</div><div class='add'>+Check the TERM environment variable.\n\</div><div class='add'>+Also make sure that the terminal is defined in the terminfo database.\n\</div><div class='add'>+Alternatively, set the TERMCAP environment variable to the desired\n\</div><div class='add'>+termcap entry.",</div><div class='add'>+ term);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (status == -2)</div><div class='add'>+ {</div><div class='add'>+ SLang_exit_error ("\</div><div class='add'>+Your terminal lacks the ability to clear the screen or position the cursor.\n");</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Returns 0 if all goes well, -1 if terminal capabilities cannot be deduced,</div><div class='add'>+ * or -2 if terminal cannot position the cursor.</div><div class='add'>+ */</div><div class='add'>+int SLtt_initialize (char *term)</div><div class='add'>+{</div><div class='add'>+ char *t, ch;</div><div class='add'>+ int is_xterm;</div><div class='add'>+ int almost_vtxxx;</div><div class='add'>+</div><div class='add'>+ if (SLang_TT_Write_FD == -1)</div><div class='add'>+ {</div><div class='add'>+ /* Apparantly, this cannot fail according to the man pages. */</div><div class='add'>+ SLang_TT_Write_FD = fileno (stdout);</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (term == NULL)</div><div class='add'>+ {</div><div class='add'>+ term = getenv ("TERM");</div><div class='add'>+ if (term == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Linux_Console = (!strncmp (term, "linux", 5)</div><div class='add'>+# ifdef linux</div><div class='add'>+ || !strncmp(term, "con", 3)</div><div class='add'>+# endif</div><div class='add'>+ );</div><div class='add'>+</div><div class='add'>+ t = term;</div><div class='add'>+</div><div class='add'>+ if (strcmp(t, "vt52") && (*t++ == 'v') && (*t++ == 't')</div><div class='add'>+ && (ch = *t, (ch >= '1') && (ch <= '9'))) Vt100_Like = 1;</div><div class='add'>+</div><div class='add'>+ is_xterm = ((0 == strncmp (term, "xterm", 5))</div><div class='add'>+ || (0 == strncmp (term, "rxvt", 4))</div><div class='add'>+ || (0 == strncmp (term, "Eterm", 5)));</div><div class='add'>+</div><div class='add'>+ almost_vtxxx = (Vt100_Like</div><div class='add'>+ || Linux_Console</div><div class='add'>+ || is_xterm</div><div class='add'>+ || !strcmp (term, "screen"));</div><div class='add'>+</div><div class='add'>+# ifndef USE_TERMCAP</div><div class='add'>+ if (NULL == (Terminfo = _SLtt_tigetent (term)))</div><div class='add'>+ {</div><div class='add'>+ if (almost_vtxxx) /* Special cases. */</div><div class='add'>+ {</div><div class='add'>+ int vt102 = 1;</div><div class='add'>+ if (!strcmp (term, "vt100")) vt102 = 0;</div><div class='add'>+ get_color_info ();</div><div class='add'>+ SLtt_set_term_vtxxx (&vt102);</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+# else /* USE_TERMCAP */</div><div class='add'>+ if (1 != tgetent(Termcap_Buf, term))</div><div class='add'>+ return -1;</div><div class='add'>+ Termcap_String_Ptr = Termcap_String_Buf;</div><div class='add'>+# endif /* NOT USE_TERMCAP */</div><div class='add'>+</div><div class='add'>+ Termcap_Initalized = 1;</div><div class='add'>+</div><div class='add'>+ Cls_Str = SLtt_tgetstr ("cl");</div><div class='add'>+ Curs_Pos_Str = SLtt_tgetstr ("cm");</div><div class='add'>+</div><div class='add'>+ if ((NULL == (Ins_Mode_Str = SLtt_tgetstr("im")))</div><div class='add'>+ || ( NULL == (Eins_Mode_Str = SLtt_tgetstr("ei")))</div><div class='add'>+ || ( NULL == (Del_Char_Str = SLtt_tgetstr("dc"))))</div><div class='add'>+ SLtt_Term_Cannot_Insert = 1;</div><div class='add'>+</div><div class='add'>+ Visible_Bell_Str = SLtt_tgetstr ("vb");</div><div class='add'>+ Curs_Up_Str = SLtt_tgetstr ("up");</div><div class='add'>+ Rev_Scroll_Str = SLtt_tgetstr("sr");</div><div class='add'>+ Del_N_Lines_Str = SLtt_tgetstr("DL");</div><div class='add'>+ Add_N_Lines_Str = SLtt_tgetstr("AL");</div><div class='add'>+</div><div class='add'>+ /* Actually these are used to initialize terminals that use cursor</div><div class='add'>+ * addressing. Hard to believe.</div><div class='add'>+ */</div><div class='add'>+ Term_Init_Str = SLtt_tgetstr ("ti");</div><div class='add'>+ Term_Reset_Str = SLtt_tgetstr ("te");</div><div class='add'>+</div><div class='add'>+ /* If I do this for vtxxx terminals, arrow keys start sending ESC O A,</div><div class='add'>+ * which I do not want. This is mainly for HP terminals.</div><div class='add'>+ */</div><div class='add'>+ if ((almost_vtxxx == 0) || SLtt_Force_Keypad_Init)</div><div class='add'>+ {</div><div class='add'>+ Keypad_Init_Str = SLtt_tgetstr ("ks");</div><div class='add'>+ Keypad_Reset_Str = SLtt_tgetstr ("ke");</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Make up for defective termcap/terminfo databases */</div><div class='add'>+ if ((Vt100_Like && (term[2] != '1'))</div><div class='add'>+ || Linux_Console</div><div class='add'>+ || is_xterm</div><div class='add'>+ )</div><div class='add'>+ {</div><div class='add'>+ if (Del_N_Lines_Str == NULL) Del_N_Lines_Str = "\033[%dM";</div><div class='add'>+ if (Add_N_Lines_Str == NULL) Add_N_Lines_Str = "\033[%dL";</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Scroll_R_Str = SLtt_tgetstr("cs");</div><div class='add'>+</div><div class='add'>+ SLtt_get_screen_size ();</div><div class='add'>+</div><div class='add'>+ if ((Scroll_R_Str == NULL)</div><div class='add'>+ || (((NULL == Del_N_Lines_Str) || (NULL == Add_N_Lines_Str))</div><div class='add'>+ && (NULL == Rev_Scroll_Str)))</div><div class='add'>+ {</div><div class='add'>+ if (is_xterm</div><div class='add'>+ || Linux_Console</div><div class='add'>+ )</div><div class='add'>+ {</div><div class='add'>+ /* Defective termcap mode!!!! */</div><div class='add'>+ SLtt_set_term_vtxxx (NULL);</div><div class='add'>+ }</div><div class='add'>+ else SLtt_Term_Cannot_Scroll = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Del_Eol_Str = SLtt_tgetstr("ce");</div><div class='add'>+ Del_Bol_Str = SLtt_tgetstr("cb");</div><div class='add'>+ if (is_xterm && (Del_Bol_Str == NULL))</div><div class='add'>+ Del_Bol_Str = "\033[1K";</div><div class='add'>+ if (is_xterm && (Del_Eol_Str == NULL))</div><div class='add'>+ Del_Bol_Str = "\033[K";</div><div class='add'>+</div><div class='add'>+ Rev_Vid_Str = SLtt_tgetstr("mr");</div><div class='add'>+ if (Rev_Vid_Str == NULL) Rev_Vid_Str = SLtt_tgetstr("so");</div><div class='add'>+</div><div class='add'>+ Bold_Vid_Str = SLtt_tgetstr("md");</div><div class='add'>+</div><div class='add'>+ /* Although xterm cannot blink, it does display the blinking characters</div><div class='add'>+ * as bold ones. Some Rxvt will display the background as high intensity.</div><div class='add'>+ */</div><div class='add'>+ if ((NULL == (Blink_Vid_Str = SLtt_tgetstr("mb")))</div><div class='add'>+ && is_xterm)</div><div class='add'>+ Blink_Vid_Str = "\033[5m";</div><div class='add'>+</div><div class='add'>+ UnderLine_Vid_Str = SLtt_tgetstr("us");</div><div class='add'>+</div><div class='add'>+ Start_Alt_Chars_Str = SLtt_tgetstr ("as"); /* smacs */</div><div class='add'>+ End_Alt_Chars_Str = SLtt_tgetstr ("ae"); /* rmacs */</div><div class='add'>+ Enable_Alt_Char_Set = SLtt_tgetstr ("eA"); /* enacs */</div><div class='add'>+ SLtt_Graphics_Char_Pairs = SLtt_tgetstr ("ac");</div><div class='add'>+</div><div class='add'>+ if (NULL == SLtt_Graphics_Char_Pairs)</div><div class='add'>+ {</div><div class='add'>+ /* make up for defective termcap/terminfo */</div><div class='add'>+ if (Vt100_Like)</div><div class='add'>+ {</div><div class='add'>+ Start_Alt_Chars_Str = "\016";</div><div class='add'>+ End_Alt_Chars_Str = "\017";</div><div class='add'>+ Enable_Alt_Char_Set = "\033)0";</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* aixterm added by willi */</div><div class='add'>+ if (is_xterm || !strncmp (term, "aixterm", 7))</div><div class='add'>+ {</div><div class='add'>+ Start_Alt_Chars_Str = "\016";</div><div class='add'>+ End_Alt_Chars_Str = "\017";</div><div class='add'>+ Enable_Alt_Char_Set = "\033(B\033)0";</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((SLtt_Graphics_Char_Pairs == NULL) &&</div><div class='add'>+ ((Start_Alt_Chars_Str == NULL) || (End_Alt_Chars_Str == NULL)))</div><div class='add'>+ {</div><div class='add'>+ SLtt_Has_Alt_Charset = 0;</div><div class='add'>+ Enable_Alt_Char_Set = NULL;</div><div class='add'>+ }</div><div class='add'>+ else SLtt_Has_Alt_Charset = 1;</div><div class='add'>+</div><div class='add'>+#ifdef AMIGA</div><div class='add'>+ Enable_Alt_Char_Set = Start_Alt_Chars_Str = End_Alt_Chars_Str = NULL;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ /* status line capabilities */</div><div class='add'>+ if ((SLtt_Has_Status_Line == -1)</div><div class='add'>+ && (0 != (SLtt_Has_Status_Line = TGETFLAG ("hs"))))</div><div class='add'>+ {</div><div class='add'>+ Disable_Status_line_Str = SLtt_tgetstr ("ds");</div><div class='add'>+ Return_From_Status_Line_Str = SLtt_tgetstr ("fs");</div><div class='add'>+ Goto_Status_Line_Str = SLtt_tgetstr ("ts");</div><div class='add'>+ /* Status_Line_Esc_Ok = TGETFLAG("es"); */</div><div class='add'>+ Num_Status_Line_Columns = SLtt_tgetnum ("ws");</div><div class='add'>+ if (Num_Status_Line_Columns < 0) Num_Status_Line_Columns = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (Norm_Vid_Str = SLtt_tgetstr("me")))</div><div class='add'>+ {</div><div class='add'>+ Norm_Vid_Str = SLtt_tgetstr("se");</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Cursor_Invisible_Str = SLtt_tgetstr("vi");</div><div class='add'>+ Cursor_Visible_Str = SLtt_tgetstr("ve");</div><div class='add'>+</div><div class='add'>+ Curs_F_Str = SLtt_tgetstr("RI");</div><div class='add'>+</div><div class='add'>+# if 0</div><div class='add'>+ if (NULL != Curs_F_Str)</div><div class='add'>+ {</div><div class='add'>+ Len_Curs_F_Str = strlen(Curs_F_Str);</div><div class='add'>+ }</div><div class='add'>+ else Len_Curs_F_Str = strlen(Curs_Pos_Str);</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+ Automatic_Margins = TGETFLAG ("am");</div><div class='add'>+ /* No_Move_In_Standout = !TGETFLAG ("ms"); */</div><div class='add'>+# ifdef HP_GLITCH_CODE</div><div class='add'>+ Has_HP_Glitch = TGETFLAG ("xs");</div><div class='add'>+# else</div><div class='add'>+ Worthless_Highlight = TGETFLAG ("xs");</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+ if (Worthless_Highlight == 0)</div><div class='add'>+ { /* Magic cookie glitch */</div><div class='add'>+ Worthless_Highlight = (SLtt_tgetnum ("sg") > 0);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (Worthless_Highlight)</div><div class='add'>+ SLtt_Has_Alt_Charset = 0;</div><div class='add'>+</div><div class='add'>+ Reset_Color_String = SLtt_tgetstr ("op");</div><div class='add'>+ Color_Fg_Str = SLtt_tgetstr ("AF"); /* ANSI setaf */</div><div class='add'>+ Color_Bg_Str = SLtt_tgetstr ("AB"); /* ANSI setbf */</div><div class='add'>+ if ((Color_Fg_Str == NULL) || (Color_Bg_Str == NULL))</div><div class='add'>+ {</div><div class='add'>+ Color_Fg_Str = SLtt_tgetstr ("Sf"); /* setf */</div><div class='add'>+ Color_Bg_Str = SLtt_tgetstr ("Sb"); /* setb */</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((Max_Terminfo_Colors = SLtt_tgetnum ("Co")) < 0)</div><div class='add'>+ Max_Terminfo_Colors = 8;</div><div class='add'>+</div><div class='add'>+ if ((Color_Bg_Str != NULL) && (Color_Fg_Str != NULL))</div><div class='add'>+ SLtt_Use_Ansi_Colors = 1;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+#if 0</div><div class='add'>+ Color_Fg_Str = "%?%p1%{7}%>%t\033[1;3%p1%{8}%m%dm%e\033[3%p1%dm%;";</div><div class='add'>+ Color_Bg_Str = "%?%p1%{7}%>%t\033[5;4%p1%{8}%m%dm%e\033[4%p1%dm%;";</div><div class='add'>+ Max_Terminfo_Colors = 16;</div><div class='add'>+#else</div><div class='add'>+ Color_Fg_Str = "\033[3%dm";</div><div class='add'>+ Color_Bg_Str = "\033[4%dm";</div><div class='add'>+ Max_Terminfo_Colors = 8;</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+ Can_Background_Color_Erase = TGETFLAG ("ut"); /* bce */</div><div class='add'>+ /* Modern xterms have the BCE capability as well as the linux console */</div><div class='add'>+ if (Can_Background_Color_Erase == 0)</div><div class='add'>+ {</div><div class='add'>+ Can_Background_Color_Erase = (Linux_Console</div><div class='add'>+# if SLTT_XTERM_ALWAYS_BCE</div><div class='add'>+ || is_xterm</div><div class='add'>+# endif</div><div class='add'>+ );</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ get_color_info ();</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+ if ((Cls_Str == NULL)</div><div class='add'>+ || (Curs_Pos_Str == NULL))</div><div class='add'>+ return -2;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+/* Unix */</div><div class='add'>+</div><div class='add'>+/* specific to vtxxx only */</div><div class='add'>+void SLtt_enable_cursor_keys (void)</div><div class='add'>+{</div><div class='add'>+#ifdef __unix__</div><div class='add'>+ if (Vt100_Like)</div><div class='add'>+#endif</div><div class='add'>+ tt_write_string("\033=\033[?1l");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+int SLtt_initialize (char *term)</div><div class='add'>+{</div><div class='add'>+ SLtt_get_terminfo ();</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_get_terminfo ()</div><div class='add'>+{</div><div class='add'>+ int zero = 0;</div><div class='add'>+</div><div class='add'>+ Color_Fg_Str = "\033[3%dm";</div><div class='add'>+ Color_Bg_Str = "\033[4%dm";</div><div class='add'>+ Max_Terminfo_Colors = 8;</div><div class='add'>+</div><div class='add'>+ get_color_info ();</div><div class='add'>+</div><div class='add'>+ SLtt_set_term_vtxxx(&zero);</div><div class='add'>+ Start_Alt_Chars_Str = "\016";</div><div class='add'>+ End_Alt_Chars_Str = "\017";</div><div class='add'>+ SLtt_Has_Alt_Charset = 1;</div><div class='add'>+ SLtt_Graphics_Char_Pairs = "aaffgghhjjkkllmmnnooqqssttuuvvwwxx";</div><div class='add'>+ Enable_Alt_Char_Set = "\033(B\033)0";</div><div class='add'>+ SLtt_get_screen_size ();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* This sets term for vt102 terminals it parameter vt100 is 0. If vt100</div><div class='add'>+ * is non-zero, set terminal appropriate for a only vt100</div><div class='add'>+ * (no add line capability). */</div><div class='add'>+</div><div class='add'>+void SLtt_set_term_vtxxx(int *vt100)</div><div class='add'>+{</div><div class='add'>+ Norm_Vid_Str = "\033[m";</div><div class='add'>+</div><div class='add'>+ Scroll_R_Str = "\033[%i%d;%dr";</div><div class='add'>+ Cls_Str = "\033[2J\033[H";</div><div class='add'>+ Rev_Vid_Str = "\033[7m";</div><div class='add'>+ Bold_Vid_Str = "\033[1m";</div><div class='add'>+ Blink_Vid_Str = "\033[5m";</div><div class='add'>+ UnderLine_Vid_Str = "\033[4m";</div><div class='add'>+ Del_Eol_Str = "\033[K";</div><div class='add'>+ Del_Bol_Str = "\033[1K";</div><div class='add'>+ Rev_Scroll_Str = "\033M";</div><div class='add'>+ Curs_F_Str = "\033[%dC";</div><div class='add'>+ /* Len_Curs_F_Str = 5; */</div><div class='add'>+ Curs_Pos_Str = "\033[%i%d;%dH";</div><div class='add'>+ if ((vt100 == NULL) || (*vt100 == 0))</div><div class='add'>+ {</div><div class='add'>+ Ins_Mode_Str = "\033[4h";</div><div class='add'>+ Eins_Mode_Str = "\033[4l";</div><div class='add'>+ Del_Char_Str = "\033[P";</div><div class='add'>+ Del_N_Lines_Str = "\033[%dM";</div><div class='add'>+ Add_N_Lines_Str = "\033[%dL";</div><div class='add'>+ SLtt_Term_Cannot_Insert = 0;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ Del_N_Lines_Str = NULL;</div><div class='add'>+ Add_N_Lines_Str = NULL;</div><div class='add'>+ SLtt_Term_Cannot_Insert = 1;</div><div class='add'>+ }</div><div class='add'>+ SLtt_Term_Cannot_Scroll = 0;</div><div class='add'>+ /* No_Move_In_Standout = 0; */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_init_video (void)</div><div class='add'>+{</div><div class='add'>+ /* send_string_to_term("\033[?6h"); */</div><div class='add'>+ /* relative origin mode */</div><div class='add'>+ tt_write_string (Term_Init_Str);</div><div class='add'>+ tt_write_string (Keypad_Init_Str);</div><div class='add'>+ SLtt_reset_scroll_region();</div><div class='add'>+ SLtt_end_insert();</div><div class='add'>+ tt_write_string (Enable_Alt_Char_Set);</div><div class='add'>+ Video_Initialized = 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_reset_video (void)</div><div class='add'>+{</div><div class='add'>+ SLtt_goto_rc (SLtt_Screen_Rows - 1, 0);</div><div class='add'>+ Cursor_Set = 0;</div><div class='add'>+ SLtt_normal_video (); /* MSKermit requires this */</div><div class='add'>+ tt_write_string(Norm_Vid_Str);</div><div class='add'>+</div><div class='add'>+ Current_Fgbg = 0xFFFFFFFFU;</div><div class='add'>+ SLtt_set_alt_char_set (0);</div><div class='add'>+ if (SLtt_Use_Ansi_Colors)</div><div class='add'>+ {</div><div class='add'>+ if (Reset_Color_String == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLtt_Char_Type attr;</div><div class='add'>+ if (-1 != make_color_fgbg (NULL, NULL, &attr))</div><div class='add'>+ write_attributes (attr);</div><div class='add'>+ else tt_write_string ("\033[0m\033[m");</div><div class='add'>+ }</div><div class='add'>+ else tt_write_string (Reset_Color_String);</div><div class='add'>+ Current_Fgbg = 0xFFFFFFFFU;</div><div class='add'>+ }</div><div class='add'>+ SLtt_erase_line ();</div><div class='add'>+ tt_write_string (Keypad_Reset_Str);</div><div class='add'>+ tt_write_string (Term_Reset_Str);</div><div class='add'>+ SLtt_flush_output ();</div><div class='add'>+ Video_Initialized = 0;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_bold_video (void)</div><div class='add'>+{</div><div class='add'>+ tt_write_string (Bold_Vid_Str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_set_mouse_mode (int mode, int force)</div><div class='add'>+{</div><div class='add'>+ char *term;</div><div class='add'>+</div><div class='add'>+ if (force == 0)</div><div class='add'>+ {</div><div class='add'>+ if (NULL == (term = (char *) getenv("TERM"))) return -1;</div><div class='add'>+ if (strncmp ("xterm", term, 5))</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (mode)</div><div class='add'>+ tt_write_string ("\033[?9h");</div><div class='add'>+ else</div><div class='add'>+ tt_write_string ("\033[?9l");</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_disable_status_line (void)</div><div class='add'>+{</div><div class='add'>+ if (SLtt_Has_Status_Line > 0)</div><div class='add'>+ {</div><div class='add'>+ tt_write_string (Disable_Status_line_Str);</div><div class='add'>+ SLtt_flush_output ();</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_write_to_status_line (char *s, int col)</div><div class='add'>+{</div><div class='add'>+ if ((SLtt_Has_Status_Line <= 0)</div><div class='add'>+ || (Goto_Status_Line_Str == NULL)</div><div class='add'>+ || (Return_From_Status_Line_Str == NULL))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ tt_printf (Goto_Status_Line_Str, col, 0);</div><div class='add'>+ tt_write_string (s);</div><div class='add'>+ tt_write_string (Return_From_Status_Line_Str);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_get_screen_size (void)</div><div class='add'>+{</div><div class='add'>+#ifdef VMS</div><div class='add'>+ int status, code;</div><div class='add'>+ unsigned short chan;</div><div class='add'>+ $DESCRIPTOR(dev_dsc, "SYS$INPUT:");</div><div class='add'>+#endif</div><div class='add'>+ int r = 0, c = 0;</div><div class='add'>+</div><div class='add'>+#ifdef TIOCGWINSZ</div><div class='add'>+ struct winsize wind_struct;</div><div class='add'>+</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ if ((ioctl(1,TIOCGWINSZ,&wind_struct) == 0)</div><div class='add'>+ || (ioctl(0, TIOCGWINSZ, &wind_struct) == 0)</div><div class='add'>+ || (ioctl(2, TIOCGWINSZ, &wind_struct) == 0))</div><div class='add'>+ {</div><div class='add'>+ c = (int) wind_struct.ws_col;</div><div class='add'>+ r = (int) wind_struct.ws_row;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ while (errno == EINTR);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+ status = sys$assign(&dev_dsc,&chan,0,0,0);</div><div class='add'>+ if (status & 1)</div><div class='add'>+ {</div><div class='add'>+ code = DVI$_DEVBUFSIZ;</div><div class='add'>+ status = lib$getdvi(&code, &chan,0, &c, 0,0);</div><div class='add'>+ if (!(status & 1))</div><div class='add'>+ c = 80;</div><div class='add'>+ code = DVI$_TT_PAGE;</div><div class='add'>+ status = lib$getdvi(&code, &chan,0, &r, 0,0);</div><div class='add'>+ if (!(status & 1))</div><div class='add'>+ r = 24;</div><div class='add'>+ sys$dassgn(chan);</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (r <= 0)</div><div class='add'>+ {</div><div class='add'>+ char *s = getenv ("LINES");</div><div class='add'>+ if (s != NULL) r = atoi (s);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (c <= 0)</div><div class='add'>+ {</div><div class='add'>+ char *s = getenv ("COLUMNS");</div><div class='add'>+ if (s != NULL) c = atoi (s);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (r <= 0) r = 24;</div><div class='add'>+ if (c <= 0) c = 80;</div><div class='add'>+#if 0</div><div class='add'>+ if ((r <= 0) || (r > 200)) r = 24;</div><div class='add'>+ if ((c <= 0) || (c > 250)) c = 80;</div><div class='add'>+#endif</div><div class='add'>+ SLtt_Screen_Rows = r;</div><div class='add'>+ SLtt_Screen_Cols = c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+int _SLtt_get_bce_color_offset (void)</div><div class='add'>+{</div><div class='add'>+ if ((SLtt_Use_Ansi_Colors == 0)</div><div class='add'>+ || Can_Background_Color_Erase</div><div class='add'>+ || SLtt_Use_Blink_For_ACS) /* in this case, we cannot lose a color */</div><div class='add'>+ Bce_Color_Offset = 0;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if (GET_BG(Ansi_Color_Map[0].fgbg) == SLSMG_COLOR_DEFAULT)</div><div class='add'>+ Bce_Color_Offset = 0;</div><div class='add'>+ else</div><div class='add'>+ Bce_Color_Offset = 1;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ return Bce_Color_Offset;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slerr.c b/mdk-stage1/slang/slerr.c<br/>new file mode 100644<br/>index 000000000..139b3859b<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slerr.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slerr.c</a></div><div class='hunk'>@@ -0,0 +1,181 @@</div><div class='add'>+/* error handling common to all routines. */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+void (*SLang_VMessage_Hook) (char *, va_list);</div><div class='add'>+void (*SLang_Error_Hook)(char *);</div><div class='add'>+void (*SLang_Exit_Error_Hook)(char *, va_list);</div><div class='add'>+volatile int SLang_Error = 0;</div><div class='add'>+char *SLang_Error_Message;</div><div class='add'>+volatile int SLKeyBoard_Quit = 0;</div><div class='add'>+</div><div class='add'>+static char *get_error_string (void)</div><div class='add'>+{</div><div class='add'>+ char *str;</div><div class='add'>+</div><div class='add'>+ if (!SLang_Error) SLang_Error = SL_UNKNOWN_ERROR;</div><div class='add'>+ if (SLang_Error_Message != NULL) str = SLang_Error_Message;</div><div class='add'>+ else switch(SLang_Error)</div><div class='add'>+ {</div><div class='add'>+ case SL_NOT_IMPLEMENTED: str = "Not Implemented"; break;</div><div class='add'>+ case SL_APPLICATION_ERROR: str = "Application Error"; break;</div><div class='add'>+ case SL_VARIABLE_UNINITIALIZED: str = "Variable Uninitialized"; break;</div><div class='add'>+ case SL_MALLOC_ERROR : str = "Malloc Error"; break;</div><div class='add'>+ case SL_INTERNAL_ERROR: str = "Internal Error"; break;</div><div class='add'>+ case SL_STACK_OVERFLOW: str = "Stack Overflow"; break;</div><div class='add'>+ case SL_STACK_UNDERFLOW: str = "Stack Underflow"; break;</div><div class='add'>+ case SL_INTRINSIC_ERROR: str = "Intrinsic Error"; break;</div><div class='add'>+ case SL_USER_BREAK: str = "User Break"; break;</div><div class='add'>+ case SL_UNDEFINED_NAME: str = "Undefined Name"; break;</div><div class='add'>+ case SL_SYNTAX_ERROR: str = "Syntax Error"; break;</div><div class='add'>+ case SL_DUPLICATE_DEFINITION: str = "Duplicate Definition"; break;</div><div class='add'>+ case SL_TYPE_MISMATCH: str = "Type Mismatch"; break;</div><div class='add'>+ case SL_READONLY_ERROR: str = "Variable is read-only"; break;</div><div class='add'>+ case SL_DIVIDE_ERROR: str = "Divide by zero"; break;</div><div class='add'>+ case SL_OBJ_NOPEN: str = "Object not opened"; break;</div><div class='add'>+ case SL_OBJ_UNKNOWN: str = "Object unknown"; break;</div><div class='add'>+ case SL_INVALID_PARM: str = "Invalid Parameter"; break;</div><div class='add'>+ case SL_TYPE_UNDEFINED_OP_ERROR:</div><div class='add'>+ str = "Operation not defined for datatype"; break;</div><div class='add'>+ case SL_USER_ERROR:</div><div class='add'>+ str = "User Error"; break;</div><div class='add'>+ case SL_USAGE_ERROR:</div><div class='add'>+ str = "Illegal usage of function";</div><div class='add'>+ break;</div><div class='add'>+ case SL_FLOATING_EXCEPTION:</div><div class='add'>+ str = "Floating Point Exception";</div><div class='add'>+ break;</div><div class='add'>+ case SL_UNKNOWN_ERROR:</div><div class='add'>+ default: str = "Unknown Error Code";</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_Error_Message = NULL;</div><div class='add'>+ return str;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_doerror (char *error)</div><div class='add'>+{</div><div class='add'>+ char *str = NULL;</div><div class='add'>+ char *err;</div><div class='add'>+ char *malloced_err_buf;</div><div class='add'>+ char err_buf [1024];</div><div class='add'>+</div><div class='add'>+ malloced_err_buf = NULL;</div><div class='add'>+</div><div class='add'>+ if (((SLang_Error == SL_USER_ERROR)</div><div class='add'>+ || (SLang_Error == SL_USAGE_ERROR))</div><div class='add'>+ && (error != NULL) && (*error != 0))</div><div class='add'>+ err = error;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ char *sle = "S-Lang Error: ";</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char *fmt;</div><div class='add'>+</div><div class='add'>+ str = get_error_string ();</div><div class='add'>+</div><div class='add'>+ fmt = "%s%s%s";</div><div class='add'>+ if ((error == NULL) || (*error == 0))</div><div class='add'>+ error = "";</div><div class='add'>+ else if (SLang_Error == SL_UNKNOWN_ERROR)</div><div class='add'>+ /* Do not display an unknown error message if error is non-NULL */</div><div class='add'>+ str = "";</div><div class='add'>+ else</div><div class='add'>+ fmt = "%s%s: %s";</div><div class='add'>+</div><div class='add'>+ len = strlen (sle) + strlen (str) + strlen(error) + 1;</div><div class='add'>+</div><div class='add'>+ err = err_buf;</div><div class='add'>+ if (len >= sizeof (err_buf))</div><div class='add'>+ {</div><div class='add'>+ if (NULL == (malloced_err_buf = SLmalloc (len)))</div><div class='add'>+ err = NULL;</div><div class='add'>+ else</div><div class='add'>+ err = malloced_err_buf;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (err != NULL) sprintf (err, fmt, sle, str, error);</div><div class='add'>+ else err = "Out of memory";</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (SLang_Error_Hook == NULL)</div><div class='add'>+ {</div><div class='add'>+ fputs (err, stderr);</div><div class='add'>+ fputs("\r\n", stderr);</div><div class='add'>+ fflush (stderr);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ (*SLang_Error_Hook)(err);</div><div class='add'>+</div><div class='add'>+ SLfree (malloced_err_buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_verror (int err_code, char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+ va_list ap;</div><div class='add'>+ char err [1024];</div><div class='add'>+</div><div class='add'>+ if (err_code == 0) err_code = SL_INTRINSIC_ERROR;</div><div class='add'>+ if (SLang_Error == 0) SLang_Error = err_code;</div><div class='add'>+</div><div class='add'>+ if (fmt != NULL)</div><div class='add'>+ {</div><div class='add'>+ va_start(ap, fmt);</div><div class='add'>+ (void) _SLvsnprintf (err, sizeof (err), fmt, ap);</div><div class='add'>+ fmt = err;</div><div class='add'>+ va_end(ap);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_doerror (fmt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_exit_error (char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+ va_list ap;</div><div class='add'>+</div><div class='add'>+ va_start (ap, fmt);</div><div class='add'>+ if (SLang_Exit_Error_Hook != NULL)</div><div class='add'>+ {</div><div class='add'>+ (*SLang_Exit_Error_Hook) (fmt, ap);</div><div class='add'>+ exit (1);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (fmt != NULL)</div><div class='add'>+ {</div><div class='add'>+ vfprintf (stderr, fmt, ap);</div><div class='add'>+ fputs ("\r\n", stderr);</div><div class='add'>+ fflush (stderr);</div><div class='add'>+ }</div><div class='add'>+ va_end (ap);</div><div class='add'>+</div><div class='add'>+ exit (1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_vmessage (char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+ va_list ap;</div><div class='add'>+</div><div class='add'>+ if (fmt == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ va_start (ap, fmt);</div><div class='add'>+</div><div class='add'>+ if (SLang_VMessage_Hook != NULL)</div><div class='add'>+ (*SLang_VMessage_Hook) (fmt, ap);</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ vfprintf (stdout, fmt, ap);</div><div class='add'>+ fputs ("\r\n", stdout);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ va_end (ap);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slerrno.c b/mdk-stage1/slang/slerrno.c<br/>new file mode 100644<br/>index 000000000..662fadde1<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slerrno.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slerrno.c</a></div><div class='hunk'>@@ -0,0 +1,219 @@</div><div class='add'>+/* The point of this file is to handle errno values in a system independent</div><div class='add'>+ * way so that they may be used in slang scripts.</div><div class='add'>+ */</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include <errno.h></div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *msg;</div><div class='add'>+ int sys_errno;</div><div class='add'>+ char *symbolic_name;</div><div class='add'>+}</div><div class='add'>+Errno_Map_Type;</div><div class='add'>+</div><div class='add'>+static Errno_Map_Type Errno_Map [] =</div><div class='add'>+{</div><div class='add'>+#ifndef EPERM</div><div class='add'>+# define EPERM -1</div><div class='add'>+#endif</div><div class='add'>+ {"Not owner", EPERM, "EPERM"},</div><div class='add'>+#ifndef ENOENT</div><div class='add'>+# define ENOENT -1</div><div class='add'>+#endif</div><div class='add'>+ {"No such file or directory", ENOENT, "ENOENT"},</div><div class='add'>+#ifndef ESRCH</div><div class='add'>+# define ESRCH -1</div><div class='add'>+#endif</div><div class='add'>+ {"No such process", ESRCH, "ESRCH"},</div><div class='add'>+#ifndef EINTR</div><div class='add'>+# define EINTR -1</div><div class='add'>+#endif</div><div class='add'>+ {"Interrupted system call", EINTR, "EINTR"},</div><div class='add'>+#ifndef EIO</div><div class='add'>+# define EIO -1</div><div class='add'>+#endif</div><div class='add'>+ {"I/O error", EIO, "EIO"},</div><div class='add'>+#ifndef ENXIO</div><div class='add'>+# define ENXIO -1</div><div class='add'>+#endif</div><div class='add'>+ {"No such device or address", ENXIO, "ENXIO"},</div><div class='add'>+#ifndef E2BIG</div><div class='add'>+# define E2BIG -1</div><div class='add'>+#endif</div><div class='add'>+ {"Arg list too long", E2BIG, "E2BIG"},</div><div class='add'>+#ifndef ENOEXEC</div><div class='add'>+# define ENOEXEC -1</div><div class='add'>+#endif</div><div class='add'>+ {"Exec format error", ENOEXEC,"ENOEXEC"},</div><div class='add'>+#ifndef EBADF</div><div class='add'>+# define EBADF -1</div><div class='add'>+#endif</div><div class='add'>+ {"Bad file number", EBADF, "EBADF"},</div><div class='add'>+#ifndef ECHILD</div><div class='add'>+# define ECHILD -1</div><div class='add'>+#endif</div><div class='add'>+ {"No children", ECHILD, "ECHILD"},</div><div class='add'>+#ifndef EAGAIN</div><div class='add'>+# define EAGAIN -1</div><div class='add'>+#endif</div><div class='add'>+ {"Try again", EAGAIN, "EAGAIN"},</div><div class='add'>+#ifndef ENOMEM</div><div class='add'>+# define ENOMEM -1</div><div class='add'>+#endif</div><div class='add'>+ {"Not enough core", ENOMEM, "ENOMEM"},</div><div class='add'>+#ifndef EACCES</div><div class='add'>+# define EACCES -1</div><div class='add'>+#endif</div><div class='add'>+ {"Permission denied", EACCES, "EACCES"},</div><div class='add'>+#ifndef EFAULT</div><div class='add'>+# define EFAULT -1</div><div class='add'>+#endif</div><div class='add'>+ {"Bad address", EFAULT, "EFAULT"},</div><div class='add'>+#ifndef ENOTBLK</div><div class='add'>+# define ENOTBLK -1</div><div class='add'>+#endif</div><div class='add'>+ {"Block device required", ENOTBLK, "ENOTBLK"},</div><div class='add'>+#ifndef EBUSY</div><div class='add'>+# define EBUSY -1</div><div class='add'>+#endif</div><div class='add'>+ {"Mount device busy", EBUSY, "EBUSY"},</div><div class='add'>+#ifndef EEXIST</div><div class='add'>+# define EEXIST -1</div><div class='add'>+#endif</div><div class='add'>+ {"File exists", EEXIST, "EEXIST"},</div><div class='add'>+#ifndef EXDEV</div><div class='add'>+# define EXDEV -1</div><div class='add'>+#endif</div><div class='add'>+ {"Cross-device link", EXDEV, "EXDEV"},</div><div class='add'>+#ifndef ENODEV</div><div class='add'>+# define ENODEV -1</div><div class='add'>+#endif</div><div class='add'>+ {"No such device", ENODEV, "ENODEV"},</div><div class='add'>+#ifndef ENOTDIR</div><div class='add'>+# define ENOTDIR -1</div><div class='add'>+#endif</div><div class='add'>+ {"Not a directory", ENOTDIR, "ENOTDIR"},</div><div class='add'>+#ifndef EISDIR</div><div class='add'>+# define EISDIR -1</div><div class='add'>+#endif</div><div class='add'>+ {"Is a directory", EISDIR, "EISDIR"},</div><div class='add'>+#ifndef EINVAL</div><div class='add'>+# define EINVAL -1</div><div class='add'>+#endif</div><div class='add'>+ {"Invalid argument", EINVAL, "EINVAL"},</div><div class='add'>+#ifndef ENFILE</div><div class='add'>+# define ENFILE -1</div><div class='add'>+#endif</div><div class='add'>+ {"File table overflow", ENFILE, "ENFILE"},</div><div class='add'>+#ifndef EMFILE</div><div class='add'>+# define EMFILE -1</div><div class='add'>+#endif</div><div class='add'>+ {"Too many open files", EMFILE, "EMFILE"},</div><div class='add'>+#ifndef ENOTTY</div><div class='add'>+# define ENOTTY -1</div><div class='add'>+#endif</div><div class='add'>+ {"Not a typewriter", ENOTTY, "ENOTTY"},</div><div class='add'>+#ifndef ETXTBSY</div><div class='add'>+# define ETXTBSY -1</div><div class='add'>+#endif</div><div class='add'>+ {"Text file busy", ETXTBSY, "ETXTBSY"},</div><div class='add'>+#ifndef EFBIG</div><div class='add'>+# define EFBIG -1</div><div class='add'>+#endif</div><div class='add'>+ {"File too large", EFBIG, "EFBIG"},</div><div class='add'>+#ifndef ENOSPC</div><div class='add'>+# define ENOSPC -1</div><div class='add'>+#endif</div><div class='add'>+ {"No space left on device", ENOSPC, "ENOSPC"},</div><div class='add'>+#ifndef ESPIPE</div><div class='add'>+# define ESPIPE -1</div><div class='add'>+#endif</div><div class='add'>+ {"Illegal seek", ESPIPE, "ESPIPE"},</div><div class='add'>+#ifndef EROFS</div><div class='add'>+# define EROFS -1</div><div class='add'>+#endif</div><div class='add'>+ {"Read-only file system", EROFS, "EROFS"},</div><div class='add'>+#ifndef EMLINK</div><div class='add'>+# define EMLINK -1</div><div class='add'>+#endif</div><div class='add'>+ {"Too many links", EMLINK, "EMLINK"},</div><div class='add'>+#ifndef EPIPE</div><div class='add'>+# define EPIPE -1</div><div class='add'>+#endif</div><div class='add'>+ {"Broken pipe", EPIPE, "EPIPE"},</div><div class='add'>+#ifndef ELOOP</div><div class='add'>+# define ELOOP -1</div><div class='add'>+#endif</div><div class='add'>+ {"Too many levels of symbolic links",ELOOP, "ELOOP"},</div><div class='add'>+#ifndef ENAMETOOLONG</div><div class='add'>+# define ENAMETOOLONG -1</div><div class='add'>+#endif</div><div class='add'>+ {"File name too long", ENAMETOOLONG, "ENAMETOOLONG"},</div><div class='add'>+</div><div class='add'>+ {NULL, 0, NULL}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLerrno_errno;</div><div class='add'>+</div><div class='add'>+int SLerrno_set_errno (int sys_errno)</div><div class='add'>+{</div><div class='add'>+ _SLerrno_errno = sys_errno;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLerrno_strerror (int sys_errno)</div><div class='add'>+{</div><div class='add'>+ Errno_Map_Type *e;</div><div class='add'>+</div><div class='add'>+ e = Errno_Map;</div><div class='add'>+ while (e->msg != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (e->sys_errno == sys_errno)</div><div class='add'>+ return e->msg;</div><div class='add'>+</div><div class='add'>+ e++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (sys_errno == SL_ERRNO_NOT_IMPLEMENTED)</div><div class='add'>+ return "System call not available for this platform";</div><div class='add'>+</div><div class='add'>+ return "Unknown error";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *intrin_errno_string (int *sys_errno)</div><div class='add'>+{</div><div class='add'>+ return SLerrno_strerror (*sys_errno);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLerrno_init (void)</div><div class='add'>+{</div><div class='add'>+ static Errno_Map_Type *e;</div><div class='add'>+</div><div class='add'>+ if (e != NULL) /* already initialized */</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLadd_intrinsic_function ("errno_string", (FVOID_STAR) intrin_errno_string,</div><div class='add'>+ SLANG_STRING_TYPE, 1, SLANG_INT_TYPE))</div><div class='add'>+ || (-1 == SLadd_intrinsic_variable ("errno", (VOID_STAR)&_SLerrno_errno, SLANG_INT_TYPE, 1)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ e = Errno_Map;</div><div class='add'>+ while (e->msg != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLadd_intrinsic_variable (e->symbolic_name, (VOID_STAR) &e->sys_errno, SLANG_INT_TYPE, 1))</div><div class='add'>+ return -1;</div><div class='add'>+ e++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slgetkey.c b/mdk-stage1/slang/slgetkey.c<br/>new file mode 100644<br/>index 000000000..2f2914f07<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slgetkey.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slgetkey.c</a></div><div class='hunk'>@@ -0,0 +1,306 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+unsigned int SLang_Input_Buffer_Len = 0;</div><div class='add'>+unsigned char SLang_Input_Buffer [SL_MAX_INPUT_BUFFER_LEN];</div><div class='add'>+</div><div class='add'>+int SLang_Abort_Char = 7;</div><div class='add'>+int SLang_Ignore_User_Abort = 0;</div><div class='add'>+</div><div class='add'>+/* This has the effect of mapping all characters in the range 128-169 to</div><div class='add'>+ * ESC [ something</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+unsigned int SLang_getkey (void)</div><div class='add'>+{</div><div class='add'>+ unsigned int imax;</div><div class='add'>+ unsigned int ch;</div><div class='add'>+</div><div class='add'>+ if (SLang_Input_Buffer_Len)</div><div class='add'>+ {</div><div class='add'>+ ch = (unsigned int) *SLang_Input_Buffer;</div><div class='add'>+ SLang_Input_Buffer_Len--;</div><div class='add'>+ imax = SLang_Input_Buffer_Len;</div><div class='add'>+</div><div class='add'>+ SLMEMCPY ((char *) SLang_Input_Buffer,</div><div class='add'>+ (char *) (SLang_Input_Buffer + 1), imax);</div><div class='add'>+ }</div><div class='add'>+ else if (SLANG_GETKEY_ERROR == (ch = _SLsys_getkey ())) return ch;</div><div class='add'>+</div><div class='add'>+#if _SLANG_MAP_VTXXX_8BIT</div><div class='add'>+# if !defined(IBMPC_SYSTEM)</div><div class='add'>+ if (ch & 0x80)</div><div class='add'>+ {</div><div class='add'>+ unsigned char i;</div><div class='add'>+ i = (unsigned char) (ch & 0x7F);</div><div class='add'>+ if (i < ' ')</div><div class='add'>+ {</div><div class='add'>+ i += 64;</div><div class='add'>+ SLang_ungetkey (i);</div><div class='add'>+ ch = 27;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+ return(ch);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_ungetkey_string (unsigned char *s, unsigned int n)</div><div class='add'>+{</div><div class='add'>+ register unsigned char *bmax, *b, *b1;</div><div class='add'>+ if (SLang_Input_Buffer_Len + n + 3 > SL_MAX_INPUT_BUFFER_LEN)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ b = SLang_Input_Buffer;</div><div class='add'>+ bmax = (b - 1) + SLang_Input_Buffer_Len;</div><div class='add'>+ b1 = bmax + n;</div><div class='add'>+ while (bmax >= b) *b1-- = *bmax--;</div><div class='add'>+ bmax = b + n;</div><div class='add'>+ while (b < bmax) *b++ = *s++;</div><div class='add'>+ SLang_Input_Buffer_Len += n;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_buffer_keystring (unsigned char *s, unsigned int n)</div><div class='add'>+{</div><div class='add'>+</div><div class='add'>+ if (n + SLang_Input_Buffer_Len + 3 > SL_MAX_INPUT_BUFFER_LEN) return -1;</div><div class='add'>+</div><div class='add'>+ SLMEMCPY ((char *) SLang_Input_Buffer + SLang_Input_Buffer_Len,</div><div class='add'>+ (char *) s, n);</div><div class='add'>+ SLang_Input_Buffer_Len += n;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_ungetkey (unsigned char ch)</div><div class='add'>+{</div><div class='add'>+ return SLang_ungetkey_string(&ch, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_input_pending (int tsecs)</div><div class='add'>+{</div><div class='add'>+ int n;</div><div class='add'>+ unsigned char c;</div><div class='add'>+ if (SLang_Input_Buffer_Len) return (int) SLang_Input_Buffer_Len;</div><div class='add'>+</div><div class='add'>+ n = _SLsys_input_pending (tsecs);</div><div class='add'>+</div><div class='add'>+ if (n <= 0) return 0;</div><div class='add'>+</div><div class='add'>+ c = (unsigned char) SLang_getkey ();</div><div class='add'>+ SLang_ungetkey_string (&c, 1);</div><div class='add'>+</div><div class='add'>+ return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_flush_input (void)</div><div class='add'>+{</div><div class='add'>+ int quit = SLKeyBoard_Quit;</div><div class='add'>+</div><div class='add'>+ SLang_Input_Buffer_Len = 0;</div><div class='add'>+ SLKeyBoard_Quit = 0;</div><div class='add'>+ while (_SLsys_input_pending (0) > 0)</div><div class='add'>+ {</div><div class='add'>+ (void) _SLsys_getkey ();</div><div class='add'>+ /* Set this to 0 because _SLsys_getkey may stuff keyboard buffer if</div><div class='add'>+ * key sends key sequence (OS/2, DOS, maybe VMS).</div><div class='add'>+ */</div><div class='add'>+ SLang_Input_Buffer_Len = 0;</div><div class='add'>+ }</div><div class='add'>+ SLKeyBoard_Quit = quit;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+static int Map_To_ANSI;</div><div class='add'>+int SLgetkey_map_to_ansi (int enable)</div><div class='add'>+{</div><div class='add'>+ Map_To_ANSI = enable;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int convert_scancode (unsigned int scan, </div><div class='add'>+ unsigned int shift,</div><div class='add'>+ int getkey,</div><div class='add'>+ unsigned int *ret_key)</div><div class='add'>+{</div><div class='add'>+ unsigned char buf[16];</div><div class='add'>+ unsigned char *b;</div><div class='add'>+ unsigned char end;</div><div class='add'>+ int is_arrow;</div><div class='add'>+</div><div class='add'>+ shift &= (_SLTT_KEY_ALT|_SLTT_KEY_SHIFT|_SLTT_KEY_CTRL);</div><div class='add'>+</div><div class='add'>+ b = buf;</div><div class='add'>+ if (_SLTT_KEY_ALT == shift)</div><div class='add'>+ {</div><div class='add'>+ shift = 0;</div><div class='add'>+ *b++ = 27;</div><div class='add'>+ }</div><div class='add'>+ *b++ = 27;</div><div class='add'>+ *b++ = '[';</div><div class='add'>+</div><div class='add'>+ is_arrow = 0;</div><div class='add'>+ end = '~';</div><div class='add'>+ if (shift)</div><div class='add'>+ {</div><div class='add'>+ if (shift == _SLTT_KEY_CTRL)</div><div class='add'>+ end = '^';</div><div class='add'>+ else if (shift == _SLTT_KEY_SHIFT)</div><div class='add'>+ end = '$';</div><div class='add'>+ else shift = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* These mappings correspond to what rxvt produces under Linux */</div><div class='add'>+ switch (scan & 0xFF)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ case 0x47: /* home */</div><div class='add'>+ *b++ = '1';</div><div class='add'>+ break;</div><div class='add'>+ case 0x48: /* up */</div><div class='add'>+ end = 'A';</div><div class='add'>+ is_arrow = 1;</div><div class='add'>+ break;</div><div class='add'>+ case 0x49: /* PgUp */</div><div class='add'>+ *b++ = '5';</div><div class='add'>+ break;</div><div class='add'>+ case 0x4B: /* Left */</div><div class='add'>+ end = 'D';</div><div class='add'>+ is_arrow = 1;</div><div class='add'>+ break;</div><div class='add'>+ case 0x4D: /* Right */</div><div class='add'>+ end = 'C';</div><div class='add'>+ is_arrow = 1;</div><div class='add'>+ break;</div><div class='add'>+ case 0x4F: /* End */</div><div class='add'>+ *b++ = '4';</div><div class='add'>+ break;</div><div class='add'>+ case 0x50: /* Down */</div><div class='add'>+ end = 'B';</div><div class='add'>+ is_arrow = 1;</div><div class='add'>+ break;</div><div class='add'>+ case 0x51: /* PgDn */</div><div class='add'>+ *b++ = '6';</div><div class='add'>+ break;</div><div class='add'>+ case 0x52: /* Insert */</div><div class='add'>+ *b++ = '2';</div><div class='add'>+ break;</div><div class='add'>+ case 0x53: /* Delete */</div><div class='add'>+ *b++ = '3';</div><div class='add'>+ break;</div><div class='add'>+ case ';': /* F1 */</div><div class='add'>+ *b++ = '1';</div><div class='add'>+ *b++ = '1';</div><div class='add'>+ break;</div><div class='add'>+ case '<': /* F2 */</div><div class='add'>+ *b++ = '1';</div><div class='add'>+ *b++ = '2';</div><div class='add'>+ break;</div><div class='add'>+ case '=': /* F3 */</div><div class='add'>+ *b++ = '1';</div><div class='add'>+ *b++ = '3';</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '>': /* F4 */</div><div class='add'>+ *b++ = '1';</div><div class='add'>+ *b++ = '4';</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '?': /* F5 */</div><div class='add'>+ *b++ = '1';</div><div class='add'>+ *b++ = '5';</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '@': /* F6 */</div><div class='add'>+ *b++ = '1';</div><div class='add'>+ *b++ = '7';</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'A': /* F7 */</div><div class='add'>+ *b++ = '1';</div><div class='add'>+ *b++ = '8';</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'B': /* F8 */</div><div class='add'>+ *b++ = '1';</div><div class='add'>+ *b++ = '9';</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'C': /* F9 */</div><div class='add'>+ *b++ = '2';</div><div class='add'>+ *b++ = '0';</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'D': /* F10 */</div><div class='add'>+ *b++ = '2';</div><div class='add'>+ *b++ = '1';</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 0x57: /* F11 */</div><div class='add'>+ *b++ = '2';</div><div class='add'>+ *b++ = '3';</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 0x58: /* F12 */</div><div class='add'>+ *b++ = '2';</div><div class='add'>+ *b++ = '4';</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (is_arrow && shift)</div><div class='add'>+ {</div><div class='add'>+ if (shift == _SLTT_KEY_CTRL)</div><div class='add'>+ end &= 0x1F;</div><div class='add'>+ else</div><div class='add'>+ end |= 0x20;</div><div class='add'>+ }</div><div class='add'>+ *b++ = end;</div><div class='add'>+ </div><div class='add'>+ if (getkey)</div><div class='add'>+ {</div><div class='add'>+ (void) SLang_buffer_keystring (buf + 1, (unsigned int) (b - (buf + 1)));</div><div class='add'>+ *ret_key = buf[0];</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ (void) SLang_buffer_keystring (buf, (unsigned int) (b - buf));</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+unsigned int _SLpc_convert_scancode (unsigned int scan,</div><div class='add'>+ unsigned int shift,</div><div class='add'>+ int getkey)</div><div class='add'>+{</div><div class='add'>+ unsigned char buf[16];</div><div class='add'>+</div><div class='add'>+ if (Map_To_ANSI)</div><div class='add'>+ {</div><div class='add'>+ if (0 == convert_scancode (scan, shift, getkey, &scan))</div><div class='add'>+ return scan;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (getkey)</div><div class='add'>+ {</div><div class='add'>+ buf[0] = scan & 0xFF;</div><div class='add'>+ SLang_buffer_keystring (buf, 1);</div><div class='add'>+ return (scan >> 8) & 0xFF;</div><div class='add'>+ }</div><div class='add'>+ buf[0] = (scan >> 8) & 0xFF;</div><div class='add'>+ buf[1] = scan & 0xFF;</div><div class='add'>+ (void) SLang_buffer_keystring (buf, 2);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slimport.c b/mdk-stage1/slang/slimport.c<br/>new file mode 100644<br/>index 000000000..44b4b25e1<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slimport.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slimport.c</a></div><div class='hunk'>@@ -0,0 +1,281 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#define SLANG_HAS_DYNAMIC_LINKING 1</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_DLFCN_H</div><div class='add'>+# undef SLANG_HAS_DYNAMIC_LINKING</div><div class='add'>+# define SLANG_HAS_DYNAMIC_LINKING 0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* The rest of this file is in the if block */</div><div class='add'>+#if SLANG_HAS_DYNAMIC_LINKING</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_DLFCN_H</div><div class='add'>+# include <dlfcn.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static char *Module_Path;</div><div class='add'>+#define MODULE_PATH_ENV_NAME "SLANG_MODULE_PATH"</div><div class='add'>+#ifndef MODULE_INSTALL_DIR</div><div class='add'>+# define MODULE_INSTALL_DIR "/usr/local/lib/slang/modules"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct _Handle_Type</div><div class='add'>+{</div><div class='add'>+ struct _Handle_Type *next;</div><div class='add'>+ char *name;</div><div class='add'>+ VOID_STAR handle;</div><div class='add'>+ void (*deinit_fun) (void);</div><div class='add'>+}</div><div class='add'>+Handle_Type;</div><div class='add'>+</div><div class='add'>+static Handle_Type *Handle_List;</div><div class='add'>+</div><div class='add'>+static void delete_handles (void)</div><div class='add'>+{</div><div class='add'>+ while (Handle_List != NULL)</div><div class='add'>+ {</div><div class='add'>+ Handle_Type *next = Handle_List->next;</div><div class='add'>+</div><div class='add'>+ if (Handle_List->deinit_fun != NULL)</div><div class='add'>+ Handle_List->deinit_fun ();</div><div class='add'>+ (void) dlclose (Handle_List->handle);</div><div class='add'>+ SLang_free_slstring (Handle_List->name);</div><div class='add'>+ SLfree ((char *)Handle_List);</div><div class='add'>+ Handle_List = next;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static Handle_Type *save_handle (char *name, VOID_STAR h, void (*df)(void))</div><div class='add'>+{</div><div class='add'>+ Handle_Type *l;</div><div class='add'>+</div><div class='add'>+ l = (Handle_Type *) SLmalloc (sizeof (Handle_Type));</div><div class='add'>+ if (l == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+ memset ((char *) l, 0, sizeof(Handle_Type));</div><div class='add'>+ if (NULL == (l->name = SLang_create_slstring (name)))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) l);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ l->handle = h;</div><div class='add'>+ l->next = Handle_List;</div><div class='add'>+ l->deinit_fun = df;</div><div class='add'>+ Handle_List = l;</div><div class='add'>+</div><div class='add'>+ return l;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static Handle_Type *find_handle (char *name)</div><div class='add'>+{</div><div class='add'>+ Handle_Type *l;</div><div class='add'>+</div><div class='add'>+ l = Handle_List;</div><div class='add'>+ while (l != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (0 == strcmp (l->name, name))</div><div class='add'>+ break;</div><div class='add'>+ l = l->next;</div><div class='add'>+ }</div><div class='add'>+ return l;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int import_from_library (char *name, </div><div class='add'>+ char *init_fun_name, char *deinit_fun_name,</div><div class='add'>+ char *file,</div><div class='add'>+ char *ns,</div><div class='add'>+ char *ns_init_fun_name)</div><div class='add'>+{</div><div class='add'>+ VOID_STAR handle;</div><div class='add'>+ int (*init_fun) (void);</div><div class='add'>+ int (*ns_init_fun) (char *);</div><div class='add'>+ void (*deinit_fun) (void);</div><div class='add'>+ char *err;</div><div class='add'>+ char filebuf[1024];</div><div class='add'>+ char *fun_name;</div><div class='add'>+</div><div class='add'>+ if (NULL != find_handle (name))</div><div class='add'>+ return 0; /* already loaded */</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+#ifndef RTLD_GLOBAL</div><div class='add'>+# define RTLD_GLOBAL 0</div><div class='add'>+#endif</div><div class='add'>+#ifdef RTLD_NOW</div><div class='add'>+ handle = (VOID_STAR) dlopen (file, RTLD_NOW | RTLD_GLOBAL);</div><div class='add'>+#else</div><div class='add'>+ handle = (VOID_STAR) dlopen (file, RTLD_LAZY | RTLD_GLOBAL);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (handle != NULL)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ if (NULL == strchr (file, '/'))</div><div class='add'>+ {</div><div class='add'>+ _SLsnprintf (filebuf, sizeof (filebuf), "./%s", file);</div><div class='add'>+ file = filebuf;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (err = (char *) dlerror ()))</div><div class='add'>+ err = "UNKNOWN";</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_INTRINSIC_ERROR,</div><div class='add'>+ "Error linking to %s: %s", file, err);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ fun_name = ns_init_fun_name;</div><div class='add'>+ ns_init_fun = (int (*)(char *)) dlsym (handle, fun_name);</div><div class='add'>+ if (ns_init_fun == NULL) </div><div class='add'>+ {</div><div class='add'>+ if ((ns != NULL) </div><div class='add'>+ && (0 != strcmp (ns, "Global")))</div><div class='add'>+ goto return_error;</div><div class='add'>+ </div><div class='add'>+ fun_name = init_fun_name;</div><div class='add'>+ init_fun = (int (*)(void)) dlsym (handle, fun_name);</div><div class='add'>+ if (init_fun == NULL)</div><div class='add'>+ goto return_error;</div><div class='add'>+ </div><div class='add'>+ if (-1 == (*init_fun) ())</div><div class='add'>+ {</div><div class='add'>+ dlclose (handle);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else if (-1 == (*ns_init_fun) (ns))</div><div class='add'>+ {</div><div class='add'>+ dlclose (handle);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ deinit_fun = (void (*)(void)) dlsym (handle, deinit_fun_name);</div><div class='add'>+</div><div class='add'>+ (void) save_handle (name, handle, deinit_fun);</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ </div><div class='add'>+ if (NULL == (err = (char *) dlerror ()))</div><div class='add'>+ err = "UNKNOWN";</div><div class='add'>+</div><div class='add'>+ dlclose (handle);</div><div class='add'>+ SLang_verror (SL_INTRINSIC_ERROR,</div><div class='add'>+ "Unable to get symbol %s from %s: %s",</div><div class='add'>+ name, file, err);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void import_module (void)</div><div class='add'>+{</div><div class='add'>+ char module_name[256];</div><div class='add'>+ char symbol_name[256];</div><div class='add'>+ char deinit_name[256];</div><div class='add'>+ char ns_init_name[256];</div><div class='add'>+ char *path;</div><div class='add'>+ char *file;</div><div class='add'>+ char *module;</div><div class='add'>+ char *ns = NULL;</div><div class='add'>+</div><div class='add'>+ if (SLang_Num_Function_Args == 2)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLang_pop_slstring (&ns))</div><div class='add'>+ return; </div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (-1 == SLang_pop_slstring (&module))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (ns); /* NULL ok */</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ _SLsnprintf (symbol_name, sizeof(symbol_name), "init_%s_module", module);</div><div class='add'>+ _SLsnprintf (module_name, sizeof(module_name), "%s-module.so", module);</div><div class='add'>+ _SLsnprintf (deinit_name, sizeof(deinit_name), "deinit_%s_module", module);</div><div class='add'>+ _SLsnprintf (ns_init_name, sizeof (ns_init_name), "init_%s_module_ns", module);</div><div class='add'>+</div><div class='add'>+ if (Module_Path != NULL)</div><div class='add'>+ file = SLpath_find_file_in_path (Module_Path, module_name);</div><div class='add'>+ else file = NULL;</div><div class='add'>+</div><div class='add'>+ if ((file == NULL)</div><div class='add'>+ && (NULL != (path = getenv (MODULE_PATH_ENV_NAME))))</div><div class='add'>+ file = SLpath_find_file_in_path (path, module_name);</div><div class='add'>+</div><div class='add'>+ if (file == NULL)</div><div class='add'>+ file = SLpath_find_file_in_path (MODULE_INSTALL_DIR, module_name);</div><div class='add'>+</div><div class='add'>+ if (file != NULL)</div><div class='add'>+ {</div><div class='add'>+ (void) import_from_library (symbol_name, symbol_name, deinit_name, file, ns, ns_init_name);</div><div class='add'>+ SLfree (file);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ /* Maybe the system loader can find it in LD_LIBRARY_PATH */</div><div class='add'>+ (void) import_from_library (symbol_name, symbol_name, deinit_name, module_name, ns, ns_init_name);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void set_import_module_path (char *path)</div><div class='add'>+{</div><div class='add'>+ (void) SLang_set_module_load_path (path);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *get_import_module_path (void)</div><div class='add'>+{</div><div class='add'>+ char *path;</div><div class='add'>+ if (Module_Path != NULL)</div><div class='add'>+ return Module_Path;</div><div class='add'>+ if (NULL != (path = getenv (MODULE_PATH_ENV_NAME)))</div><div class='add'>+ return path;</div><div class='add'>+ return MODULE_INSTALL_DIR;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Module_Intrins [] =</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_0("import", import_module, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("set_import_module_path", set_import_module_path, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("get_import_module_path", get_import_module_path, SLANG_STRING_TYPE),</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#endif /* SLANG_HAS_DYNAMIC_LINKING */</div><div class='add'>+</div><div class='add'>+int SLang_set_module_load_path (char *path)</div><div class='add'>+{</div><div class='add'>+#if SLANG_HAS_DYNAMIC_LINKING</div><div class='add'>+ if (NULL == (path = SLang_create_slstring (path)))</div><div class='add'>+ return -1;</div><div class='add'>+ SLang_free_slstring (Module_Path);</div><div class='add'>+ Module_Path = path;</div><div class='add'>+ return 0;</div><div class='add'>+#else</div><div class='add'>+ (void) path;</div><div class='add'>+ return -1;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_init_import (void)</div><div class='add'>+{</div><div class='add'>+#if SLANG_HAS_DYNAMIC_LINKING</div><div class='add'>+ (void) SLang_add_cleanup_function (delete_handles);</div><div class='add'>+ return SLadd_intrin_fun_table (Module_Intrins, "__IMPORT__");</div><div class='add'>+#else</div><div class='add'>+ return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slinclud.h b/mdk-stage1/slang/slinclud.h<br/>new file mode 100644<br/>index 000000000..d60a4423e<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slinclud.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slinclud.h</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+#ifndef _SLANG_INCLUDE_H_</div><div class='add'>+#define _SLANG_INCLUDE_H_</div><div class='add'>+</div><div class='add'>+#include "config.h"</div><div class='add'>+#include "sl-feat.h"</div><div class='add'>+</div><div class='add'>+#include <stdio.h></div><div class='add'>+#include <string.h></div><div class='add'>+</div><div class='add'>+#ifdef HAVE_STDLIB_H</div><div class='add'>+# include <stdlib.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_UNISTD_H</div><div class='add'>+# include <unistd.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_MALLOC_H</div><div class='add'>+# include <malloc.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_MEMORY_H</div><div class='add'>+# include <memory.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* _SLANG_INCLUDE_H_ */</div><div class='head'>diff --git a/mdk-stage1/slang/slintall.c b/mdk-stage1/slang/slintall.c<br/>new file mode 100644<br/>index 000000000..a66b9d6d2<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slintall.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slintall.c</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+int SLang_init_all (void)</div><div class='add'>+{</div><div class='add'>+ if ((-1 == SLang_init_slang ())</div><div class='add'>+ || (-1 == SLang_init_slmath ())</div><div class='add'>+ || (-1 == SLang_init_posix_dir ())</div><div class='add'>+ || (-1 == SLang_init_posix_process ())</div><div class='add'>+ || (-1 == SLang_init_stdio ())</div><div class='add'>+ || (-1 == SLang_init_array ())</div><div class='add'>+ || (-1 == SLang_init_posix_io ())</div><div class='add'>+ || (-1 == SLang_init_ospath ())</div><div class='add'>+ )</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slistruc.c b/mdk-stage1/slang/slistruc.c<br/>new file mode 100644<br/>index 000000000..06b8fd6ff<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slistruc.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slistruc.c</a></div><div class='hunk'>@@ -0,0 +1,218 @@</div><div class='add'>+/* Intrinsic Structure type implementation */</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* Intrinsic structures */</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ VOID_STAR addr;</div><div class='add'>+ SLang_IStruct_Field_Type *fields;</div><div class='add'>+}</div><div class='add'>+_SLang_IStruct_Type;</div><div class='add'>+</div><div class='add'>+static SLang_IStruct_Field_Type *istruct_pop_field (char *name, int no_readonly, VOID_STAR *addr)</div><div class='add'>+{</div><div class='add'>+ _SLang_IStruct_Type *s;</div><div class='add'>+ SLang_IStruct_Field_Type *f;</div><div class='add'>+ char *struct_addr;</div><div class='add'>+</div><div class='add'>+ /* Note: There is no need to free this object */</div><div class='add'>+ if (-1 == SLclass_pop_ptr_obj (SLANG_ISTRUCT_TYPE, (VOID_STAR *) &s))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ if (NULL == (struct_addr = *(char **)s->addr))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INTRINSIC_ERROR,</div><div class='add'>+ "%s is NULL. Unable to access field", s->name);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ f = s->fields;</div><div class='add'>+ while (f->field_name != NULL)</div><div class='add'>+ {</div><div class='add'>+ /* Since both these are slstrings, just test pointers */</div><div class='add'>+ if (f->field_name != name)</div><div class='add'>+ {</div><div class='add'>+ f++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (no_readonly && f->read_only)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_READONLY_ERROR,</div><div class='add'>+ "%s.%s is read-only", s->name, name);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *addr = (VOID_STAR) (struct_addr + f->offset);</div><div class='add'>+ return f;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH,</div><div class='add'>+ "%s has no field called %s", s->name, name);</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int istruct_sget (unsigned char type, char *name)</div><div class='add'>+{</div><div class='add'>+ SLang_IStruct_Field_Type *f;</div><div class='add'>+ VOID_STAR addr;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (NULL == (f = istruct_pop_field (name, 0, &addr)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ type = f->type;</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+ return (cl->cl_push_intrinsic)(f->type, addr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int istruct_sput (unsigned char type, char *name)</div><div class='add'>+{</div><div class='add'>+ SLang_IStruct_Field_Type *f;</div><div class='add'>+ VOID_STAR addr;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (NULL == (f = istruct_pop_field (name, 1, &addr)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ type = f->type;</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+ return (*cl->cl_pop) (type, addr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int istruct_push (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ _SLang_IStruct_Type *s;</div><div class='add'>+</div><div class='add'>+ s = *(_SLang_IStruct_Type **) ptr;</div><div class='add'>+ if ((s == NULL) </div><div class='add'>+ || (s->addr == NULL)</div><div class='add'>+ || (*(char **) s->addr == NULL))</div><div class='add'>+ return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+ return SLclass_push_ptr_obj (type, (VOID_STAR) s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int istruct_pop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ return SLclass_pop_ptr_obj (type, (VOID_STAR *)ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void istruct_destroy (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ (void) ptr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Intrinsic struct objects are not stored in a variable. So, the address that</div><div class='add'>+ * is passed here is actually a pointer to the struct. So, pass its address</div><div class='add'>+ * to istruct_push since v is a variable. Confusing, n'est pas?</div><div class='add'>+ */</div><div class='add'>+static int istruct_push_intrinsic (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+ return istruct_push (type, (VOID_STAR) &v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int init_intrin_struct (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ static int initialized;</div><div class='add'>+</div><div class='add'>+ if (initialized)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("IStruct_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ cl->cl_pop = istruct_pop;</div><div class='add'>+ cl->cl_push = istruct_push;</div><div class='add'>+ cl->cl_sget = istruct_sget;</div><div class='add'>+ cl->cl_sput = istruct_sput;</div><div class='add'>+ cl->cl_destroy = istruct_destroy;</div><div class='add'>+ cl->cl_push_intrinsic = istruct_push_intrinsic;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_ISTRUCT_TYPE, sizeof (_SLang_IStruct_Type *),</div><div class='add'>+ SLANG_CLASS_TYPE_PTR))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ initialized = 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_istruct_table (SLang_IStruct_Field_Type *fields, VOID_STAR addr, char *name)</div><div class='add'>+{</div><div class='add'>+ _SLang_IStruct_Type *s;</div><div class='add'>+ SLang_IStruct_Field_Type *f;</div><div class='add'>+</div><div class='add'>+ if (-1 == init_intrin_struct ())</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (addr == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM,</div><div class='add'>+ "SLadd_istruct_table: address must be non-NULL");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (fields == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* Make the field names slstrings so that only the pointers need to be</div><div class='add'>+ * compared. However, this table may have been already been added for</div><div class='add'>+ * another instance of the intrinsic object. So, check for the presence</div><div class='add'>+ * of an slstring.</div><div class='add'>+ */</div><div class='add'>+ f = fields;</div><div class='add'>+ while (f->field_name != NULL)</div><div class='add'>+ {</div><div class='add'>+ char *fname;</div><div class='add'>+</div><div class='add'>+ fname = SLang_create_slstring (f->field_name);</div><div class='add'>+ if (fname == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* Here is the check for the slstring */</div><div class='add'>+ if (f->field_name == fname)</div><div class='add'>+ SLang_free_slstring (fname);</div><div class='add'>+ else /* replace string literal with slstring */</div><div class='add'>+ f->field_name = fname;</div><div class='add'>+</div><div class='add'>+ f++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ s = (_SLang_IStruct_Type *)SLmalloc (sizeof (_SLang_IStruct_Type));</div><div class='add'>+ if (s == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ memset ((char *)s, 0, sizeof (_SLang_IStruct_Type));</div><div class='add'>+ if (NULL == (s->name = SLang_create_slstring (name)))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) s);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ s->addr = addr;</div><div class='add'>+ s->fields = fields;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLadd_intrinsic_variable (name, (VOID_STAR) s, SLANG_ISTRUCT_TYPE, 1))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (s->name);</div><div class='add'>+ SLfree ((char *) s);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slkeymap.c b/mdk-stage1/slang/slkeymap.c<br/>new file mode 100644<br/>index 000000000..dff65433e<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slkeymap.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slkeymap.c</a></div><div class='hunk'>@@ -0,0 +1,596 @@</div><div class='add'>+/* Keymap routines for SLang. The role of these keymap routines is simple:</div><div class='add'>+ * Just read keys from the tty and return a pointer to a keymap structure.</div><div class='add'>+ * That is, a keymap is simple a mapping of strings (keys from tty) to</div><div class='add'>+ * structures. Also included are routines for managing the keymaps.</div><div class='add'>+ */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* We need a define a rule for upperand lower case chars that user cannot</div><div class='add'>+ change! This could be a problem for international chars! */</div><div class='add'>+</div><div class='add'>+#define UPPER_CASE_KEY(x) (((x) >= 'a') && ((x) <= 'z') ? (x) - 32 : (x))</div><div class='add'>+#define LOWER_CASE_KEY(x) (((x) >= 'A') && ((x) <= 'Z') ? (x) + 32 : (x))</div><div class='add'>+</div><div class='add'>+int SLang_Key_TimeOut_Flag = 0; /* true if more than 1 sec has elapsed</div><div class='add'>+ without key in multikey sequence */</div><div class='add'>+</div><div class='add'>+int SLang_Last_Key_Char;</div><div class='add'>+</div><div class='add'>+SLKeyMap_List_Type SLKeyMap_List[SLANG_MAX_KEYMAPS];</div><div class='add'>+</div><div class='add'>+static SLang_Key_Type *malloc_key(unsigned char *str)</div><div class='add'>+{</div><div class='add'>+ SLang_Key_Type *neew;</div><div class='add'>+</div><div class='add'>+ if (NULL == (neew = (SLang_Key_Type *) SLmalloc(sizeof(SLang_Key_Type))))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ SLMEMSET ((char *) neew, 0, sizeof (SLang_Key_Type));</div><div class='add'>+ SLMEMCPY((char *) neew->str, (char *) str, (unsigned int) *str);</div><div class='add'>+ return(neew);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLKeyMap_List_Type *add_keymap (char *name, SLang_Key_Type *map)</div><div class='add'>+{</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < SLANG_MAX_KEYMAPS; i++)</div><div class='add'>+ {</div><div class='add'>+ if (SLKeyMap_List[i].keymap == NULL)</div><div class='add'>+ {</div><div class='add'>+ if (NULL == (name = SLang_create_slstring (name)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ SLKeyMap_List[i].keymap = map;</div><div class='add'>+ SLKeyMap_List[i].name = name;</div><div class='add'>+ return &SLKeyMap_List[i];</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ SLang_Error = SL_UNKNOWN_ERROR;</div><div class='add'>+ /* SLang_doerror ("Keymap quota exceeded."); */</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+FVOID_STAR SLang_find_key_function(char *name, SLKeyMap_List_Type *keymap)</div><div class='add'>+{</div><div class='add'>+ SLKeymap_Function_Type *fp = keymap -> functions;</div><div class='add'>+ char ch = *name;</div><div class='add'>+</div><div class='add'>+ while ((fp != NULL) && (fp->name != NULL))</div><div class='add'>+ {</div><div class='add'>+ if ((ch == *fp->name)</div><div class='add'>+ && (0 == strcmp(fp->name, name)))</div><div class='add'>+ return (FVOID_STAR) fp->f;</div><div class='add'>+</div><div class='add'>+ fp++;</div><div class='add'>+ }</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+/* Expand termcap string specified by s. s as passed will have the format:</div><div class='add'>+ * "XY)..." where XY represents a termcap keyname.</div><div class='add'>+ */</div><div class='add'>+static char *process_termcap_string (char *s, char *str, int *ip, int imax)</div><div class='add'>+{</div><div class='add'>+ char c[3], *val;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if ((0 == (c[0] = s[0]))</div><div class='add'>+ || (0 == (c[1] = s[1]))</div><div class='add'>+ || (s[2] != ')'))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "setkey: ^(%s is badly formed", s);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ s += 3;</div><div class='add'>+</div><div class='add'>+ c[2] = 0;</div><div class='add'>+ if ((NULL == (val = SLtt_tgetstr (c)))</div><div class='add'>+ || (*val == 0))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ i = *ip;</div><div class='add'>+ while ((i < imax) && (*val != 0))</div><div class='add'>+ {</div><div class='add'>+ str[i++] = *val++;</div><div class='add'>+ }</div><div class='add'>+ *ip = i;</div><div class='add'>+</div><div class='add'>+ return s;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* convert things like "^A" to 1 etc... The 0th char is the strlen INCLUDING</div><div class='add'>+ * the length character itself.</div><div class='add'>+ */</div><div class='add'>+char *SLang_process_keystring(char *s)</div><div class='add'>+{</div><div class='add'>+ /* FIXME: v2.0, make this thread safe */</div><div class='add'>+ static char str[32];</div><div class='add'>+ unsigned char ch;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ i = 1;</div><div class='add'>+ while (*s != 0)</div><div class='add'>+ {</div><div class='add'>+ ch = (unsigned char) *s++;</div><div class='add'>+ if (ch == '^')</div><div class='add'>+ {</div><div class='add'>+ ch = *s++;</div><div class='add'>+ if (ch == 0)</div><div class='add'>+ {</div><div class='add'>+ if (i < 32)</div><div class='add'>+ str[i++] = '^';</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+ if (ch == '(')</div><div class='add'>+ {</div><div class='add'>+ s = process_termcap_string (s, str, &i, 32);</div><div class='add'>+ if (s == NULL)</div><div class='add'>+ {</div><div class='add'>+ str[0] = 1;</div><div class='add'>+ return str;</div><div class='add'>+ }</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ ch = UPPER_CASE_KEY(ch);</div><div class='add'>+ if (ch == '?') ch = 127; else ch = ch - 'A' + 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (i >= 32) break;</div><div class='add'>+ str[i++] = ch;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (i > SLANG_MAX_KEYMAP_KEY_SEQ)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Key sequence is too long");</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ str[0] = i;</div><div class='add'>+ return(str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int key_string_compare (unsigned char *a, unsigned char *b, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ unsigned char *amax = a + len;</div><div class='add'>+ int cha, chb, cha_up, chb_up;</div><div class='add'>+</div><div class='add'>+ while (a < amax)</div><div class='add'>+ {</div><div class='add'>+ cha = *a++;</div><div class='add'>+ chb = *b++;</div><div class='add'>+</div><div class='add'>+ if (cha == chb) continue;</div><div class='add'>+</div><div class='add'>+ cha_up = UPPER_CASE_KEY(cha);</div><div class='add'>+ chb_up = UPPER_CASE_KEY(chb);</div><div class='add'>+</div><div class='add'>+ if (cha_up == chb_up)</div><div class='add'>+ {</div><div class='add'>+ /* Use case-sensitive result. */</div><div class='add'>+ return cha - chb;</div><div class='add'>+ }</div><div class='add'>+ /* Use case-insensitive result. */</div><div class='add'>+ return cha_up - chb_up;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *Define_Key_Error = "Inconsistency in define key.";</div><div class='add'>+</div><div class='add'>+/* This function also performs an insertion in an ordered way. */</div><div class='add'>+static int find_the_key (char *s, SLKeyMap_List_Type *kml, SLang_Key_Type **keyp)</div><div class='add'>+{</div><div class='add'>+ unsigned char ch;</div><div class='add'>+ unsigned int str_len;</div><div class='add'>+ SLang_Key_Type *key, *last, *neew;</div><div class='add'>+ unsigned char *str;</div><div class='add'>+</div><div class='add'>+ *keyp = NULL;</div><div class='add'>+</div><div class='add'>+ if (NULL == (str = (unsigned char *) SLang_process_keystring(s)))</div><div class='add'>+ return -2;</div><div class='add'>+</div><div class='add'>+ if (1 == (str_len = str[0]))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ ch = str[1];</div><div class='add'>+ key = kml->keymap + ch;</div><div class='add'>+</div><div class='add'>+ if (str_len == 2)</div><div class='add'>+ {</div><div class='add'>+ if (key->next != NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror (Define_Key_Error);</div><div class='add'>+ return -2;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (key->type == SLKEY_F_INTERPRET)</div><div class='add'>+ SLang_free_slstring (key->f.s);</div><div class='add'>+</div><div class='add'>+ key->str[0] = str_len;</div><div class='add'>+ key->str[1] = ch;</div><div class='add'>+</div><div class='add'>+ *keyp = key;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* insert the key definition */</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ int cmp;</div><div class='add'>+ unsigned int key_len, len;</div><div class='add'>+</div><div class='add'>+ last = key;</div><div class='add'>+ key = key->next;</div><div class='add'>+</div><div class='add'>+ if ((key != NULL) && (key->str != NULL))</div><div class='add'>+ {</div><div class='add'>+ len = key_len = key->str[0];</div><div class='add'>+ if (len > str_len) len = str_len;</div><div class='add'>+</div><div class='add'>+ cmp = key_string_compare (str + 1, key->str + 1, len - 1);</div><div class='add'>+</div><div class='add'>+ if (cmp > 0)</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ if (cmp == 0)</div><div class='add'>+ {</div><div class='add'>+ if (key_len != str_len)</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror (Define_Key_Error);</div><div class='add'>+ return -2;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (key->type == SLKEY_F_INTERPRET)</div><div class='add'>+ SLang_free_slstring (key->f.s);</div><div class='add'>+</div><div class='add'>+ *keyp = key;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ /* Drop to cmp < 0 case */</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (neew = malloc_key(str))) return -1;</div><div class='add'>+</div><div class='add'>+ neew -> next = key;</div><div class='add'>+ last -> next = neew;</div><div class='add'>+</div><div class='add'>+ *keyp = neew;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* returns -2 if inconsistent, -1 if malloc error, 0 upon success */</div><div class='add'>+int SLkm_define_key (char *s, FVOID_STAR f, SLKeyMap_List_Type *kml)</div><div class='add'>+{</div><div class='add'>+ SLang_Key_Type *key;</div><div class='add'>+ unsigned int type = SLKEY_F_INTRINSIC;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ ret = find_the_key (s, kml, &key);</div><div class='add'>+ if ((ret != 0) || (key == NULL))</div><div class='add'>+ return ret;</div><div class='add'>+</div><div class='add'>+ key->type = type;</div><div class='add'>+ key->f.f = f;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_define_key (char *s, char *funct, SLKeyMap_List_Type *kml)</div><div class='add'>+{</div><div class='add'>+ SLang_Key_Type *key;</div><div class='add'>+ FVOID_STAR f;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ ret = find_the_key (s, kml, &key);</div><div class='add'>+ if ((ret != 0) || (key == NULL))</div><div class='add'>+ return ret;</div><div class='add'>+</div><div class='add'>+ f = SLang_find_key_function(funct, kml);</div><div class='add'>+</div><div class='add'>+ if (f == NULL) /* assume interpreted */</div><div class='add'>+ {</div><div class='add'>+ char *str = SLang_create_slstring (funct);</div><div class='add'>+ if (str == NULL) return -1;</div><div class='add'>+ key->type = SLKEY_F_INTERPRET;</div><div class='add'>+ key->f.s = str;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ key->type = SLKEY_F_INTRINSIC;</div><div class='add'>+ key->f.f = f;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLkm_define_keysym (char *s, unsigned int keysym, SLKeyMap_List_Type *kml)</div><div class='add'>+{</div><div class='add'>+ SLang_Key_Type *key;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ ret = find_the_key (s, kml, &key);</div><div class='add'>+</div><div class='add'>+ if ((ret != 0) || (key == NULL))</div><div class='add'>+ return ret;</div><div class='add'>+</div><div class='add'>+ key->type = SLKEY_F_KEYSYM;</div><div class='add'>+ key->f.keysym = keysym;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Key_Type *SLang_do_key(SLKeyMap_List_Type *kml, int (*getkey)(void))</div><div class='add'>+{</div><div class='add'>+ register SLang_Key_Type *key, *next, *kmax;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ unsigned char input_ch;</div><div class='add'>+ register unsigned char chup, chlow;</div><div class='add'>+ unsigned char key_ch = 0;</div><div class='add'>+</div><div class='add'>+ SLang_Last_Key_Char = (*getkey)();</div><div class='add'>+ SLang_Key_TimeOut_Flag = 0;</div><div class='add'>+</div><div class='add'>+ if (SLANG_GETKEY_ERROR == (unsigned int) SLang_Last_Key_Char)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ input_ch = (unsigned char) SLang_Last_Key_Char;</div><div class='add'>+</div><div class='add'>+ key = (SLang_Key_Type *) &((kml->keymap)[input_ch]);</div><div class='add'>+</div><div class='add'>+ /* if the next one is null, then we know this MAY be it. */</div><div class='add'>+ while (key->next == NULL)</div><div class='add'>+ {</div><div class='add'>+ if (key->type != 0)</div><div class='add'>+ return key;</div><div class='add'>+</div><div class='add'>+ /* Try its opposite case counterpart */</div><div class='add'>+ chlow = LOWER_CASE_KEY(input_ch);</div><div class='add'>+ if (input_ch == chlow)</div><div class='add'>+ input_ch = UPPER_CASE_KEY(input_ch);</div><div class='add'>+</div><div class='add'>+ key = kml->keymap + input_ch;</div><div class='add'>+ if (key->type == 0)</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* It appears to be a prefix character in a key sequence. */</div><div class='add'>+</div><div class='add'>+ len = 1; /* already read one character */</div><div class='add'>+ key = key->next; /* Now we are in the key list */</div><div class='add'>+ kmax = NULL; /* set to end of list */</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ SLang_Key_TimeOut_Flag = 1;</div><div class='add'>+ SLang_Last_Key_Char = (*getkey)();</div><div class='add'>+ SLang_Key_TimeOut_Flag = 0;</div><div class='add'>+</div><div class='add'>+ len++;</div><div class='add'>+</div><div class='add'>+ if ((SLANG_GETKEY_ERROR == (unsigned int) SLang_Last_Key_Char)</div><div class='add'>+ || SLKeyBoard_Quit)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ input_ch = (unsigned char) SLang_Last_Key_Char;</div><div class='add'>+</div><div class='add'>+ chup = UPPER_CASE_KEY(input_ch); chlow = LOWER_CASE_KEY(input_ch);</div><div class='add'>+</div><div class='add'>+ while (key != kmax)</div><div class='add'>+ {</div><div class='add'>+ if (key->str[0] > len)</div><div class='add'>+ {</div><div class='add'>+ key_ch = key->str[len];</div><div class='add'>+ if (chup == UPPER_CASE_KEY(key_ch))</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ key = key->next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (key == kmax) break;</div><div class='add'>+</div><div class='add'>+ /* If the input character is lowercase, check to see if there is</div><div class='add'>+ * a lowercase match. If so, set key to it. Note: the</div><div class='add'>+ * algorithm assumes the sorting performed by key_string_compare.</div><div class='add'>+ */</div><div class='add'>+ if (input_ch != key_ch)</div><div class='add'>+ {</div><div class='add'>+ next = key->next;</div><div class='add'>+ while (next != kmax)</div><div class='add'>+ {</div><div class='add'>+ if (next->str[0] > len)</div><div class='add'>+ {</div><div class='add'>+ unsigned char next_ch = next->str[len];</div><div class='add'>+ if (next_ch == input_ch)</div><div class='add'>+ {</div><div class='add'>+ key = next;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ if (next_ch != chup)</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ next = next->next;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Ok, we found the first position of a possible match. If it</div><div class='add'>+ * is exact, we are done.</div><div class='add'>+ */</div><div class='add'>+ if ((unsigned int) key->str[0] == len + 1)</div><div class='add'>+ return key;</div><div class='add'>+</div><div class='add'>+ /* Apparantly, there are some ambiguities. Read next key to resolve</div><div class='add'>+ * the ambiguity. Adjust kmax to encompass ambiguities.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ next = key->next;</div><div class='add'>+ while (next != kmax)</div><div class='add'>+ {</div><div class='add'>+ if ((unsigned int) next->str[0] > len)</div><div class='add'>+ {</div><div class='add'>+ key_ch = next->str[len];</div><div class='add'>+ if (chup != UPPER_CASE_KEY(key_ch))</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ next = next->next;</div><div class='add'>+ }</div><div class='add'>+ kmax = next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_undefine_key(char *s, SLKeyMap_List_Type *kml)</div><div class='add'>+{</div><div class='add'>+ int n, i;</div><div class='add'>+ SLang_Key_Type *key, *next, *last, *key_root, *keymap;</div><div class='add'>+ unsigned char *str;</div><div class='add'>+</div><div class='add'>+ keymap = kml -> keymap;</div><div class='add'>+ if (NULL == (str = (unsigned char *) SLang_process_keystring(s)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (0 == (n = *str++ - 1)) return;</div><div class='add'>+ i = *str;</div><div class='add'>+</div><div class='add'>+ last = key_root = (SLang_Key_Type *) &(keymap[i]);</div><div class='add'>+ key = key_root->next;</div><div class='add'>+</div><div class='add'>+ while (key != NULL)</div><div class='add'>+ {</div><div class='add'>+ next = key->next;</div><div class='add'>+ if (0 == SLMEMCMP ((char *)(key->str + 1), (char *) str, n))</div><div class='add'>+ {</div><div class='add'>+ if (key->type == SLKEY_F_INTERPRET)</div><div class='add'>+ SLang_free_slstring (key->f.s);</div><div class='add'>+</div><div class='add'>+ SLfree((char *) key);</div><div class='add'>+ last->next = next;</div><div class='add'>+ }</div><div class='add'>+ else last = key;</div><div class='add'>+ key = next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (n == 1)</div><div class='add'>+ {</div><div class='add'>+ *key_root->str = 0;</div><div class='add'>+ key_root->f.f = NULL;</div><div class='add'>+ key_root->type = 0;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLang_make_keystring(unsigned char *s)</div><div class='add'>+{</div><div class='add'>+ static char buf [3 * SLANG_MAX_KEYMAP_KEY_SEQ + 1];</div><div class='add'>+ char *b;</div><div class='add'>+ int n;</div><div class='add'>+</div><div class='add'>+ n = *s++ - 1;</div><div class='add'>+</div><div class='add'>+ if (n > SLANG_MAX_KEYMAP_KEY_SEQ)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Key sequence is too long");</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ b = buf;</div><div class='add'>+ while (n--)</div><div class='add'>+ {</div><div class='add'>+ if (*s < 32)</div><div class='add'>+ {</div><div class='add'>+ *b++ = '^';</div><div class='add'>+ *b++ = *s + 'A' - 1;</div><div class='add'>+ }</div><div class='add'>+ else *b++ = *s;</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+ *b = 0;</div><div class='add'>+ return(buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Key_Type *copy_keymap(SLKeyMap_List_Type *kml)</div><div class='add'>+{</div><div class='add'>+ int i;</div><div class='add'>+ SLang_Key_Type *neew, *old, *new_root, *km;</div><div class='add'>+</div><div class='add'>+ if (NULL == (new_root = (SLang_Key_Type *) SLcalloc(256, sizeof(SLang_Key_Type))))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ if (kml == NULL) return new_root;</div><div class='add'>+ km = kml->keymap;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 256; i++)</div><div class='add'>+ {</div><div class='add'>+ old = &(km[i]);</div><div class='add'>+ neew = &(new_root[i]);</div><div class='add'>+</div><div class='add'>+ if (old->type == SLKEY_F_INTERPRET)</div><div class='add'>+ neew->f.s = SLang_create_slstring (old->f.s);</div><div class='add'>+ else</div><div class='add'>+ neew->f.f = old->f.f;</div><div class='add'>+</div><div class='add'>+ neew->type = old->type;</div><div class='add'>+ SLMEMCPY((char *) neew->str, (char *) old->str, (unsigned int) *old->str);</div><div class='add'>+</div><div class='add'>+ old = old->next;</div><div class='add'>+ while (old != NULL)</div><div class='add'>+ {</div><div class='add'>+ neew->next = malloc_key((unsigned char *) old->str);</div><div class='add'>+ neew = neew->next;</div><div class='add'>+</div><div class='add'>+ if (old->type == SLKEY_F_INTERPRET)</div><div class='add'>+ neew->f.s = SLang_create_slstring (old->f.s);</div><div class='add'>+ else</div><div class='add'>+ neew->f.f = old->f.f;</div><div class='add'>+</div><div class='add'>+ neew->type = old->type;</div><div class='add'>+ old = old->next;</div><div class='add'>+ }</div><div class='add'>+ neew->next = NULL;</div><div class='add'>+ }</div><div class='add'>+ return(new_root);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLKeyMap_List_Type *SLang_create_keymap(char *name, SLKeyMap_List_Type *map)</div><div class='add'>+{</div><div class='add'>+ SLang_Key_Type *neew;</div><div class='add'>+ SLKeyMap_List_Type *new_map;</div><div class='add'>+</div><div class='add'>+ if ((NULL == (neew = copy_keymap(map)))</div><div class='add'>+ || (NULL == (new_map = add_keymap(name, neew)))) return NULL;</div><div class='add'>+</div><div class='add'>+ if (map != NULL) new_map -> functions = map -> functions;</div><div class='add'>+</div><div class='add'>+ return new_map;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLKeyMap_List_Type *SLang_find_keymap(char *name)</div><div class='add'>+{</div><div class='add'>+ SLKeyMap_List_Type *kmap, *kmap_max;</div><div class='add'>+</div><div class='add'>+ kmap = SLKeyMap_List;</div><div class='add'>+ kmap_max = kmap + SLANG_MAX_KEYMAPS;</div><div class='add'>+</div><div class='add'>+ while (kmap < kmap_max)</div><div class='add'>+ {</div><div class='add'>+ if ((kmap->name != NULL)</div><div class='add'>+ && (0 == strcmp (kmap->name, name)))</div><div class='add'>+ return kmap;</div><div class='add'>+</div><div class='add'>+ kmap++;</div><div class='add'>+ }</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slkeypad.c b/mdk-stage1/slang/slkeypad.c<br/>new file mode 100644<br/>index 000000000..524dc80fa<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slkeypad.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slkeypad.c</a></div><div class='hunk'>@@ -0,0 +1,163 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static SLKeyMap_List_Type *Keymap_List;</div><div class='add'>+</div><div class='add'>+int SLkp_init (void)</div><div class='add'>+{</div><div class='add'>+ char esc_seq[10];</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if (NULL == (Keymap_List = SLang_create_keymap ("_SLKeypad", NULL)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ esc_seq[1] = 0;</div><div class='add'>+ for (i = 1; i < 256; i++)</div><div class='add'>+ {</div><div class='add'>+ esc_seq[0] = (char) i;</div><div class='add'>+ SLkm_define_keysym (esc_seq, i, Keymap_List);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Now add most common ones. */</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ SLkm_define_keysym ("^@", 0, Keymap_List);</div><div class='add'>+</div><div class='add'>+ SLkm_define_keysym ("\033[A", SL_KEY_UP, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("\033OA", SL_KEY_UP, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("\033[B", SL_KEY_DOWN, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("\033OB", SL_KEY_DOWN, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("\033[C", SL_KEY_RIGHT, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("\033OC", SL_KEY_RIGHT, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("\033[D", SL_KEY_LEFT, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("\033OD", SL_KEY_LEFT, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("\033[2~", SL_KEY_IC, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("\033[7~", SL_KEY_HOME, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("\033[5~", SL_KEY_PPAGE, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("\033[6~", SL_KEY_NPAGE, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("\033[8~", SL_KEY_END, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("\033[3~", SL_KEY_DELETE, Keymap_List);</div><div class='add'>+#else</div><div class='add'>+ /* Note: This will not work if SLgetkey_map_to_ansi (1) has</div><div class='add'>+ * been called.</div><div class='add'>+ */</div><div class='add'>+ SLkm_define_keysym ("^@\x48", SL_KEY_UP, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("^@\x50", SL_KEY_DOWN, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("^@\x4d", SL_KEY_RIGHT, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("^@\x4b", SL_KEY_LEFT, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("^@\x47", SL_KEY_HOME, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("^@\x49", SL_KEY_PPAGE, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("^@\x51", SL_KEY_NPAGE, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("^@\x4f", SL_KEY_END, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("^@\x52", SL_KEY_IC, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("^@\x53", SL_KEY_DELETE, Keymap_List );</div><div class='add'>+ </div><div class='add'>+ SLkm_define_keysym ("\xE0\x48", SL_KEY_UP, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("\xE0\x50", SL_KEY_DOWN, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("\xE0\x4d", SL_KEY_RIGHT, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("\xE0\x4b", SL_KEY_LEFT, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("\xE0\x47", SL_KEY_HOME, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("\xE0\x49", SL_KEY_PPAGE, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("\xE0\x51", SL_KEY_NPAGE, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("\xE0\x4f", SL_KEY_END, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("\xE0\x52", SL_KEY_IC, Keymap_List );</div><div class='add'>+ SLkm_define_keysym ("\xE0\x53", SL_KEY_DELETE, Keymap_List );</div><div class='add'>+</div><div class='add'>+ strcpy (esc_seq, "^@ "); /* guarantees esc_seq[3] = 0. */</div><div class='add'>+</div><div class='add'>+ for (i = 0x3b; i < 0x45; i++)</div><div class='add'>+ {</div><div class='add'>+ esc_seq [2] = i;</div><div class='add'>+ SLkm_define_keysym (esc_seq, SL_KEY_F(i - 0x3a), Keymap_List);</div><div class='add'>+ }</div><div class='add'>+ esc_seq[2] = 0x57; SLkm_define_keysym (esc_seq, SL_KEY_F(11), Keymap_List);</div><div class='add'>+ esc_seq[2] = 0x58; SLkm_define_keysym (esc_seq, SL_KEY_F(12), Keymap_List);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+ strcpy (esc_seq, "^(kX)");</div><div class='add'>+ for (i = 0; i <= 9; i++)</div><div class='add'>+ {</div><div class='add'>+ esc_seq[3] = '0' + i;</div><div class='add'>+ SLkm_define_keysym (esc_seq, SL_KEY_F(i), Keymap_List);</div><div class='add'>+ }</div><div class='add'>+ SLkm_define_keysym ("^(k;)", SL_KEY_F(10), Keymap_List);</div><div class='add'>+</div><div class='add'>+ SLkm_define_keysym ("^(ku)", SL_KEY_UP, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(kd)", SL_KEY_DOWN, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(kl)", SL_KEY_LEFT, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(kr)", SL_KEY_RIGHT, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(kP)", SL_KEY_PPAGE, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(kN)", SL_KEY_NPAGE, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(kh)", SL_KEY_HOME, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(@7)", SL_KEY_END, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(K1)", SL_KEY_A1, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(K3)", SL_KEY_A3, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(K2)", SL_KEY_B2, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(K4)", SL_KEY_C1, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(K5)", SL_KEY_C3, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(%0)", SL_KEY_REDO, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(&8)", SL_KEY_UNDO, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(kb)", SL_KEY_BACKSPACE, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(@8)", SL_KEY_ENTER, Keymap_List);</div><div class='add'>+ SLkm_define_keysym ("^(kD)", SL_KEY_DELETE, Keymap_List);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ return -1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLkp_getkey (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Key_Type *key;</div><div class='add'>+</div><div class='add'>+ key = SLang_do_key (Keymap_List, (int (*)(void)) SLang_getkey);</div><div class='add'>+ if ((key == NULL) || (key->type != SLKEY_F_KEYSYM))</div><div class='add'>+ {</div><div class='add'>+ SLang_flush_input ();</div><div class='add'>+ return SL_KEY_ERR;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return key->f.keysym;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLkp_define_keysym (char *keystr, unsigned int keysym)</div><div class='add'>+{</div><div class='add'>+ if (SLkm_define_keysym (keystr, keysym, Keymap_List) < 0)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+int main (int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+ int ch;</div><div class='add'>+</div><div class='add'>+ SLtt_get_terminfo ();</div><div class='add'>+</div><div class='add'>+ if (-1 == SLkp_init ())</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+ SLang_init_tty (-1, 0, 0);</div><div class='add'>+</div><div class='add'>+ while ('q' != (ch = SLkp_getkey ()))</div><div class='add'>+ {</div><div class='add'>+ fprintf (stdout, "Keycode = %d\r\n", ch);</div><div class='add'>+ fflush (stdout);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_reset_tty ();</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/sllimits.h b/mdk-stage1/slang/sllimits.h<br/>new file mode 100644<br/>index 000000000..c4ae03b83<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sllimits.h?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sllimits.h</a></div><div class='hunk'>@@ -0,0 +1,64 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+/* sllimits.h */</div><div class='add'>+</div><div class='add'>+/* slstring.c: Size of the hash table used for strings (prime numbers) */</div><div class='add'>+#ifdef __MSDOS_16BIT__</div><div class='add'>+# define SLSTRING_HASH_TABLE_SIZE 601</div><div class='add'>+# define SLASSOC_HASH_TABLE_SIZE 601</div><div class='add'>+#else</div><div class='add'>+# define SLSTRING_HASH_TABLE_SIZE 2909</div><div class='add'>+# define SLASSOC_HASH_TABLE_SIZE 2909</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* slang.c: maximum size of run time stack */</div><div class='add'>+#ifdef __MSDOS_16BIT__</div><div class='add'>+# define SLANG_MAX_STACK_LEN 500</div><div class='add'>+#else</div><div class='add'>+# define SLANG_MAX_STACK_LEN 2500</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* slang.c: This sets the size on the depth of function calls */</div><div class='add'>+#ifdef __MSDOS_16BIT__</div><div class='add'>+# define SLANG_MAX_RECURSIVE_DEPTH 50</div><div class='add'>+#else</div><div class='add'>+# define SLANG_MAX_RECURSIVE_DEPTH 250</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* slang.c: Size of the stack used for local variables */</div><div class='add'>+#ifdef __MSDOS_16BIT__</div><div class='add'>+# define SLANG_MAX_LOCAL_STACK 200</div><div class='add'>+#else</div><div class='add'>+# define SLANG_MAX_LOCAL_STACK 1024</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* slang.c: The size of the hash table used for local and global objects.</div><div class='add'>+ * These should be prime numbers.</div><div class='add'>+ */</div><div class='add'>+#define SLGLOBALS_HASH_TABLE_SIZE 2909</div><div class='add'>+#define SLLOCALS_HASH_TABLE_SIZE 73</div><div class='add'>+#define SLSTATIC_HASH_TABLE_SIZE 73</div><div class='add'>+</div><div class='add'>+/* Size of the keyboard buffer use by the ungetkey routines */</div><div class='add'>+#ifdef __MSDOS_16BIT__</div><div class='add'>+# define SL_MAX_INPUT_BUFFER_LEN 40</div><div class='add'>+#else</div><div class='add'>+# define SL_MAX_INPUT_BUFFER_LEN 1024</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Maximum number of nested switch statements */</div><div class='add'>+#define SLANG_MAX_NESTED_SWITCH 10</div><div class='add'>+</div><div class='add'>+/* Size of the block stack (used in byte-compiling) */</div><div class='add'>+#define SLANG_MAX_BLOCK_STACK_LEN 50</div><div class='add'>+</div><div class='add'>+/* slfile.c: Max number of open file pointers */</div><div class='add'>+#ifdef __MSDOS_16BIT__</div><div class='add'>+# define SL_MAX_FILES 32</div><div class='add'>+#else</div><div class='add'>+# define SL_MAX_FILES 256</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slmalloc.c b/mdk-stage1/slang/slmalloc.c<br/>new file mode 100644<br/>index 000000000..914e1e0ef<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmalloc.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmalloc.c</a></div><div class='hunk'>@@ -0,0 +1,165 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#ifdef SL_MALLOC_DEBUG</div><div class='add'>+# undef SL_MALLOC_DEBUG</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifdef __alpha</div><div class='add'>+# define Chunk 8</div><div class='add'>+#else</div><div class='add'>+# define Chunk 4</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static long Total_Allocated;</div><div class='add'>+static long Max_Single_Allocation;</div><div class='add'>+static long Max_Allocated;</div><div class='add'>+/* #define SLDEBUG_DOUT */</div><div class='add'>+</div><div class='add'>+#ifdef SLDEBUG_DOUT</div><div class='add'>+static FILE *dout;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+void SLmalloc_dump_statistics (void)</div><div class='add'>+{</div><div class='add'>+#ifdef SLDEBUG_DOUT</div><div class='add'>+ fflush (dout);</div><div class='add'>+#endif</div><div class='add'>+ fprintf (stderr, "Total Allocated: %ld\nHighest single allocation: %ld\nHighest Total Allocated:%ld\n",</div><div class='add'>+ Total_Allocated, Max_Single_Allocation, Max_Allocated);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void register_at_exit_fun (void)</div><div class='add'>+{</div><div class='add'>+ static int is_registered = 0;</div><div class='add'>+ if (is_registered)</div><div class='add'>+ return;</div><div class='add'>+ is_registered = 1;</div><div class='add'>+</div><div class='add'>+#ifdef SLDEBUG_DOUT</div><div class='add'>+ if (dout == NULL) dout = fopen ("malloc.out", "w");</div><div class='add'>+#endif</div><div class='add'>+ SLang_add_cleanup_function (SLmalloc_dump_statistics);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void fixup (unsigned char *p, unsigned long n, char *what)</div><div class='add'>+{</div><div class='add'>+ register_at_exit_fun ();</div><div class='add'>+</div><div class='add'>+ p += Chunk;</div><div class='add'>+ *(p - 4)= (unsigned char) ((n >> 24) & 0xFF);</div><div class='add'>+ *(p - 3) = (unsigned char) ((n >> 16) & 0xFF);</div><div class='add'>+ *(p - 2) = (unsigned char) ((n >> 8) & 0xFF);</div><div class='add'>+ *(p - 1) = (unsigned char) (n & 0xFF);</div><div class='add'>+ *(p + (int) n) = 27;</div><div class='add'>+ *(p + (int) (n + 1)) = 182;</div><div class='add'>+ *(p + (int) (n + 2)) = 81;</div><div class='add'>+ *(p + (int) (n + 3)) = 86;</div><div class='add'>+ Total_Allocated += (long) n;</div><div class='add'>+ if (Total_Allocated > Max_Allocated) Max_Allocated = Total_Allocated;</div><div class='add'>+ if ((long) n > Max_Single_Allocation)</div><div class='add'>+ Max_Single_Allocation = (long) n;</div><div class='add'>+</div><div class='add'>+#ifdef SLDEBUG_DOUT</div><div class='add'>+ fprintf (dout, "ALLOC: %s\t%p %ld\n", what, p, (long) n);</div><div class='add'>+#else</div><div class='add'>+ (void) what;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void SLmalloc_doerror (char *buf)</div><div class='add'>+{</div><div class='add'>+ SLang_doerror (buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int check_memory (unsigned char *p, char *what)</div><div class='add'>+{</div><div class='add'>+ char buf[128];</div><div class='add'>+ unsigned long n;</div><div class='add'>+</div><div class='add'>+ register_at_exit_fun ();</div><div class='add'>+</div><div class='add'>+ n = ((unsigned long) *(p - 4)) << 24;</div><div class='add'>+ n |= ((unsigned long) *(p - 3)) << 16;</div><div class='add'>+ n |= ((unsigned long) *(p - 2)) << 8;</div><div class='add'>+ n |= (unsigned long) *(p - 1);</div><div class='add'>+</div><div class='add'>+ if (n == 0xFFFFFFFFUL)</div><div class='add'>+ {</div><div class='add'>+ sprintf (buf, "%s: %p: Already FREE! Abort NOW.", what, p - Chunk);</div><div class='add'>+ SLmalloc_doerror (buf);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((*(p + (int) n) != 27)</div><div class='add'>+ || (*(p + (int) (n + 1)) != 182)</div><div class='add'>+ || (*(p + (int) (n + 2)) != 81)</div><div class='add'>+ || (*(p + (int) (n + 3)) != 86))</div><div class='add'>+ {</div><div class='add'>+ sprintf (buf, "\007%s: %p: Memory corrupt! Abort NOW.", what, p);</div><div class='add'>+ SLmalloc_doerror (buf);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *(p - 4) = *(p - 3) = *(p - 2) = *(p - 1) = 0xFF;</div><div class='add'>+</div><div class='add'>+ Total_Allocated -= (long) n;</div><div class='add'>+ if (Total_Allocated < 0)</div><div class='add'>+ {</div><div class='add'>+ sprintf (buf, "\007%s: %p\nFreed %ld, Allocated is: %ld!\n",</div><div class='add'>+ what, p, (long) n, Total_Allocated);</div><div class='add'>+ SLang_doerror (buf);</div><div class='add'>+ }</div><div class='add'>+#ifdef SLDEBUG_DOUT</div><div class='add'>+ fprintf (dout, "FREE: %s:\t%p %ld\n", what, p, (long) n);</div><div class='add'>+#endif</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLdebug_free (char *p)</div><div class='add'>+{</div><div class='add'>+ if (p == NULL) return;</div><div class='add'>+ if (-1 == check_memory ((unsigned char *) p, "FREE")) return;</div><div class='add'>+</div><div class='add'>+ SLFREE (p - Chunk);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLdebug_malloc (unsigned long n)</div><div class='add'>+{</div><div class='add'>+ char *p;</div><div class='add'>+</div><div class='add'>+ if ((p = (char *) SLMALLOC (n + 2 * Chunk)) == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+ fixup ((unsigned char *) p, n, "MALLOC");</div><div class='add'>+ return p + Chunk;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLdebug_realloc (char *p, unsigned long n)</div><div class='add'>+{</div><div class='add'>+ if (-1 == check_memory ((unsigned char *) p, "REALLOC")) return NULL;</div><div class='add'>+ if ((p = (char *) SLREALLOC (p - Chunk, n + 2 * Chunk)) == NULL) return NULL;</div><div class='add'>+ fixup ((unsigned char *) p, n, "REALLOC");</div><div class='add'>+ return p + Chunk;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLdebug_calloc (unsigned long n, unsigned long size)</div><div class='add'>+{</div><div class='add'>+ char *p;</div><div class='add'>+ int m;</div><div class='add'>+</div><div class='add'>+ /* This is tough -- hope this is a good assumption!! */</div><div class='add'>+ if (size >= Chunk) m = 1; else m = Chunk;</div><div class='add'>+</div><div class='add'>+ if ((p = (char *) SLCALLOC (n + m + m, size)) == NULL) return NULL;</div><div class='add'>+ fixup ((unsigned char *) p, size * n, "CALLOC");</div><div class='add'>+ return p + Chunk;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slmath.c b/mdk-stage1/slang/slmath.c<br/>new file mode 100644<br/>index 000000000..1d61e14d3<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmath.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmath.c</a></div><div class='hunk'>@@ -0,0 +1,565 @@</div><div class='add'>+/* sin, cos, etc, for S-Lang */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include <math.h></div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifdef PI</div><div class='add'>+# undef PI</div><div class='add'>+#endif</div><div class='add'>+#define PI 3.14159265358979323846264338327950288</div><div class='add'>+</div><div class='add'>+#if defined(__unix__)</div><div class='add'>+#include <signal.h></div><div class='add'>+#include <errno.h></div><div class='add'>+</div><div class='add'>+#define SIGNAL SLsignal</div><div class='add'>+</div><div class='add'>+static void math_floating_point_exception (int sig)</div><div class='add'>+{</div><div class='add'>+ sig = errno;</div><div class='add'>+ if (SLang_Error == 0) SLang_Error = SL_FLOATING_EXCEPTION;</div><div class='add'>+ (void) SIGNAL (SIGFPE, math_floating_point_exception);</div><div class='add'>+ errno = sig;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+double SLmath_hypot (double x, double y)</div><div class='add'>+{</div><div class='add'>+ double fr, fi, ratio;</div><div class='add'>+</div><div class='add'>+ fr = fabs(x);</div><div class='add'>+ fi = fabs(y);</div><div class='add'>+</div><div class='add'>+ if (fr > fi)</div><div class='add'>+ {</div><div class='add'>+ ratio = y / x;</div><div class='add'>+ x = fr * sqrt (1.0 + ratio * ratio);</div><div class='add'>+ }</div><div class='add'>+ else if (fi == 0.0) x = 0.0;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ ratio = x / y;</div><div class='add'>+ x = fi * sqrt (1.0 + ratio * ratio);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return x;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* usage here is a1 a2 ... an n x ==> a1x^n + a2 x ^(n - 1) + ... + an */</div><div class='add'>+static double math_poly (void)</div><div class='add'>+{</div><div class='add'>+ int n;</div><div class='add'>+ double xn = 1.0, sum = 0.0;</div><div class='add'>+ double an, x;</div><div class='add'>+</div><div class='add'>+ if ((SLang_pop_double(&x, NULL, NULL))</div><div class='add'>+ || (SLang_pop_integer(&n))) return(0.0);</div><div class='add'>+</div><div class='add'>+ while (n-- > 0)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_pop_double(&an, NULL, NULL)) break;</div><div class='add'>+ sum += an * xn;</div><div class='add'>+ xn = xn * x;</div><div class='add'>+ }</div><div class='add'>+ return (double) sum;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int double_math_op_result (int op, unsigned char a, unsigned char *b)</div><div class='add'>+{</div><div class='add'>+ (void) op;</div><div class='add'>+</div><div class='add'>+ if (a != SLANG_FLOAT_TYPE)</div><div class='add'>+ *b = SLANG_DOUBLE_TYPE;</div><div class='add'>+ else</div><div class='add'>+ *b = a;</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_ASINH</div><div class='add'>+# define ASINH_FUN asinh</div><div class='add'>+#else</div><div class='add'>+# define ASINH_FUN my_asinh</div><div class='add'>+static double my_asinh (double x)</div><div class='add'>+{</div><div class='add'>+ return log (x + sqrt (x*x + 1));</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_ACOSH</div><div class='add'>+# define ACOSH_FUN acosh</div><div class='add'>+#else</div><div class='add'>+# define ACOSH_FUN my_acosh</div><div class='add'>+static double my_acosh (double x)</div><div class='add'>+{</div><div class='add'>+ return log (x + sqrt(x*x - 1)); /* x >= 1 */</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_ATANH</div><div class='add'>+# define ATANH_FUN atanh</div><div class='add'>+#else</div><div class='add'>+# define ATANH_FUN my_atanh</div><div class='add'>+static double my_atanh (double x)</div><div class='add'>+{</div><div class='add'>+ return 0.5 * log ((1.0 + x)/(1.0 - x)); /* 0 <= x^2 < 1 */</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int double_math_op (int op,</div><div class='add'>+ unsigned char type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ double *a, *b;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ double (*fun) (double);</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ a = (double *) ap;</div><div class='add'>+ b = (double *) bp;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLMATH_SINH:</div><div class='add'>+ fun = sinh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_COSH:</div><div class='add'>+ fun = cosh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_TANH:</div><div class='add'>+ fun = tanh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_TAN:</div><div class='add'>+ fun = tan;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ASIN:</div><div class='add'>+ fun = asin;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ACOS:</div><div class='add'>+ fun = acos;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ATAN:</div><div class='add'>+ fun = atan;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_EXP:</div><div class='add'>+ fun = exp;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_LOG:</div><div class='add'>+ fun = log;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_LOG10:</div><div class='add'>+ fun = log10;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_SQRT:</div><div class='add'>+ fun = sqrt;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_SIN:</div><div class='add'>+ fun = sin;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_COS:</div><div class='add'>+ fun = cos;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLMATH_ASINH:</div><div class='add'>+ fun = ASINH_FUN;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ATANH:</div><div class='add'>+ fun = ATANH_FUN;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ACOSH:</div><div class='add'>+ fun = ACOSH_FUN;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLMATH_CONJ:</div><div class='add'>+ case SLMATH_REAL:</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ b[i] = a[i];</div><div class='add'>+ return 1;</div><div class='add'>+ case SLMATH_IMAG:</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ b[i] = 0.0;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ b[i] = (*fun) (a[i]);</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int float_math_op (int op,</div><div class='add'>+ unsigned char type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ float *a, *b;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ double (*fun) (double);</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ a = (float *) ap;</div><div class='add'>+ b = (float *) bp;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLMATH_SINH:</div><div class='add'>+ fun = sinh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_COSH:</div><div class='add'>+ fun = cosh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_TANH:</div><div class='add'>+ fun = tanh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_TAN:</div><div class='add'>+ fun = tan;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ASIN:</div><div class='add'>+ fun = asin;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ACOS:</div><div class='add'>+ fun = acos;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ATAN:</div><div class='add'>+ fun = atan;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_EXP:</div><div class='add'>+ fun = exp;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_LOG:</div><div class='add'>+ fun = log;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_LOG10:</div><div class='add'>+ fun = log10;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_SQRT:</div><div class='add'>+ fun = sqrt;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_SIN:</div><div class='add'>+ fun = sin;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_COS:</div><div class='add'>+ fun = cos;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLMATH_ASINH:</div><div class='add'>+ fun = ASINH_FUN;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ATANH:</div><div class='add'>+ fun = ATANH_FUN;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ACOSH:</div><div class='add'>+ fun = ACOSH_FUN;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLMATH_CONJ:</div><div class='add'>+ case SLMATH_REAL:</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ b[i] = a[i];</div><div class='add'>+ return 1;</div><div class='add'>+ case SLMATH_IMAG:</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ b[i] = 0.0;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ b[i] = (float) (*fun) ((double) a[i]);</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int generic_math_op (int op,</div><div class='add'>+ unsigned char type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ double *b;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ SLang_To_Double_Fun_Type to_double;</div><div class='add'>+ double (*fun) (double);</div><div class='add'>+ unsigned int da;</div><div class='add'>+ char *a;</div><div class='add'>+</div><div class='add'>+ if (NULL == (to_double = SLarith_get_to_double_fun (type, &da)))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ b = (double *) bp;</div><div class='add'>+ a = (char *) ap;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLMATH_SINH:</div><div class='add'>+ fun = sinh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_COSH:</div><div class='add'>+ fun = cosh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_TANH:</div><div class='add'>+ fun = tanh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_TAN:</div><div class='add'>+ fun = tan;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ASIN:</div><div class='add'>+ fun = asin;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ACOS:</div><div class='add'>+ fun = acos;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ATAN:</div><div class='add'>+ fun = atan;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_EXP:</div><div class='add'>+ fun = exp;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_LOG:</div><div class='add'>+ fun = log;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_LOG10:</div><div class='add'>+ fun = log10;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_SQRT:</div><div class='add'>+ fun = sqrt;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_SIN:</div><div class='add'>+ fun = sin;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_COS:</div><div class='add'>+ fun = cos;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLMATH_ASINH:</div><div class='add'>+ fun = ASINH_FUN;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ATANH:</div><div class='add'>+ fun = ATANH_FUN;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ACOSH:</div><div class='add'>+ fun = ACOSH_FUN;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ case SLMATH_CONJ:</div><div class='add'>+ case SLMATH_REAL:</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ {</div><div class='add'>+ b[i] = to_double((VOID_STAR) a);</div><div class='add'>+ a += da;</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+ case SLMATH_IMAG:</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ b[i] = 0.0;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ {</div><div class='add'>+ b[i] = (*fun) (to_double ((VOID_STAR) a));</div><div class='add'>+ a += da;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+static int complex_math_op_result (int op, unsigned char a, unsigned char *b)</div><div class='add'>+{</div><div class='add'>+ (void) a;</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ *b = SLANG_COMPLEX_TYPE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLMATH_REAL:</div><div class='add'>+ case SLMATH_IMAG:</div><div class='add'>+ *b = SLANG_DOUBLE_TYPE;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_math_op (int op,</div><div class='add'>+ unsigned char type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ double *a, *b;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ unsigned int na2 = na * 2;</div><div class='add'>+ double *(*fun) (double *, double *);</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ a = (double *) ap;</div><div class='add'>+ b = (double *) bp;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLMATH_REAL:</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ b[i] = a[2 * i];</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+ case SLMATH_IMAG:</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ b[i] = a[2 * i + 1];</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+ case SLMATH_CONJ:</div><div class='add'>+ for (i = 0; i < na2; i += 2)</div><div class='add'>+ {</div><div class='add'>+ b[i] = a[i];</div><div class='add'>+ b[i+1] = -a[i+1];</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+ case SLMATH_ATANH:</div><div class='add'>+ fun = SLcomplex_atanh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ACOSH:</div><div class='add'>+ fun = SLcomplex_acosh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ASINH:</div><div class='add'>+ fun = SLcomplex_asinh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_EXP:</div><div class='add'>+ fun = SLcomplex_exp;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_LOG:</div><div class='add'>+ fun = SLcomplex_log;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_LOG10:</div><div class='add'>+ fun = SLcomplex_log10;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_SQRT:</div><div class='add'>+ fun = SLcomplex_sqrt;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_SIN:</div><div class='add'>+ fun = SLcomplex_sin;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_COS:</div><div class='add'>+ fun = SLcomplex_cos;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_SINH:</div><div class='add'>+ fun = SLcomplex_sinh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_COSH:</div><div class='add'>+ fun = SLcomplex_cosh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_TANH:</div><div class='add'>+ fun = SLcomplex_tanh;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_TAN:</div><div class='add'>+ fun = SLcomplex_tan;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ASIN:</div><div class='add'>+ fun = SLcomplex_asin;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ACOS:</div><div class='add'>+ fun = SLcomplex_acos;</div><div class='add'>+ break;</div><div class='add'>+ case SLMATH_ATAN:</div><div class='add'>+ fun = SLcomplex_atan;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < na2; i += 2)</div><div class='add'>+ (void) (*fun) (b + i, a + i);</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_DConstant_Type DConst_Table [] =</div><div class='add'>+{</div><div class='add'>+ MAKE_DCONSTANT("E", 2.718281828459045),</div><div class='add'>+ MAKE_DCONSTANT("PI", 3.14159265358979323846264338327950288),</div><div class='add'>+ SLANG_END_DCONST_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static SLang_Math_Unary_Type SLmath_Table [] =</div><div class='add'>+{</div><div class='add'>+ MAKE_MATH_UNARY("sinh", SLMATH_SINH),</div><div class='add'>+ MAKE_MATH_UNARY("asinh", SLMATH_ASINH),</div><div class='add'>+ MAKE_MATH_UNARY("cosh", SLMATH_COSH),</div><div class='add'>+ MAKE_MATH_UNARY("acosh", SLMATH_ACOSH),</div><div class='add'>+ MAKE_MATH_UNARY("tanh", SLMATH_TANH),</div><div class='add'>+ MAKE_MATH_UNARY("atanh", SLMATH_ATANH),</div><div class='add'>+ MAKE_MATH_UNARY("sin", SLMATH_SIN),</div><div class='add'>+ MAKE_MATH_UNARY("cos", SLMATH_COS),</div><div class='add'>+ MAKE_MATH_UNARY("tan", SLMATH_TAN),</div><div class='add'>+ MAKE_MATH_UNARY("atan", SLMATH_ATAN),</div><div class='add'>+ MAKE_MATH_UNARY("acos", SLMATH_ACOS),</div><div class='add'>+ MAKE_MATH_UNARY("asin", SLMATH_ASIN),</div><div class='add'>+ MAKE_MATH_UNARY("exp", SLMATH_EXP),</div><div class='add'>+ MAKE_MATH_UNARY("log", SLMATH_LOG),</div><div class='add'>+ MAKE_MATH_UNARY("sqrt", SLMATH_SQRT),</div><div class='add'>+ MAKE_MATH_UNARY("log10", SLMATH_LOG10),</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ MAKE_MATH_UNARY("Real", SLMATH_REAL),</div><div class='add'>+ MAKE_MATH_UNARY("Imag", SLMATH_IMAG),</div><div class='add'>+ MAKE_MATH_UNARY("Conj", SLMATH_CONJ),</div><div class='add'>+#endif</div><div class='add'>+ SLANG_END_MATH_UNARY_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type SLang_Math_Table [] =</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_0("polynom", math_poly, SLANG_DOUBLE_TYPE),</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLang_init_slmath (void)</div><div class='add'>+{</div><div class='add'>+ unsigned char *int_types;</div><div class='add'>+</div><div class='add'>+#if defined(__unix__)</div><div class='add'>+ (void) SIGNAL (SIGFPE, math_floating_point_exception);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ int_types = _SLarith_Arith_Types;</div><div class='add'>+</div><div class='add'>+ while (*int_types != SLANG_FLOAT_TYPE)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLclass_add_math_op (*int_types, generic_math_op, double_math_op_result))</div><div class='add'>+ return -1;</div><div class='add'>+ int_types++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLclass_add_math_op (SLANG_FLOAT_TYPE, float_math_op, double_math_op_result))</div><div class='add'>+ || (-1 == SLclass_add_math_op (SLANG_DOUBLE_TYPE, double_math_op, double_math_op_result))</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ || (-1 == SLclass_add_math_op (SLANG_COMPLEX_TYPE, complex_math_op, complex_math_op_result))</div><div class='add'>+#endif</div><div class='add'>+ )</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLadd_math_unary_table (SLmath_Table, "__SLMATH__"))</div><div class='add'>+ || (-1 == SLadd_intrin_fun_table (SLang_Math_Table, NULL))</div><div class='add'>+ || (-1 == SLadd_dconstant_table (DConst_Table, NULL)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slmemchr.c b/mdk-stage1/slang/slmemchr.c<br/>new file mode 100644<br/>index 000000000..1417bc549<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmemchr.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemchr.c</a></div><div class='hunk'>@@ -0,0 +1,47 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* These routines are fast memcpy, memset routines. When available, I</div><div class='add'>+ use system rouines. For msdos, I use inline assembly. */</div><div class='add'>+</div><div class='add'>+/* The current versions only work in the forward direction only!! */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+char *SLmemchr(register char *p, register char c, register int n)</div><div class='add'>+{</div><div class='add'>+ int n2;</div><div class='add'>+ register char *pmax;</div><div class='add'>+</div><div class='add'>+ pmax = p + (n - 32);</div><div class='add'>+</div><div class='add'>+ while (p <= pmax)</div><div class='add'>+ {</div><div class='add'>+ if ((*p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+ || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+ || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+ || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+ || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+ || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+ || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+ || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c))</div><div class='add'>+ return p;</div><div class='add'>+ p++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ n2 = n % 32;</div><div class='add'>+</div><div class='add'>+ while (n2--)</div><div class='add'>+ {</div><div class='add'>+ if (*p == c) return p;</div><div class='add'>+ p++;</div><div class='add'>+ }</div><div class='add'>+ return(NULL);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slmemcmp.c b/mdk-stage1/slang/slmemcmp.c<br/>new file mode 100644<br/>index 000000000..c5ed50095<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmemcmp.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemcmp.c</a></div><div class='hunk'>@@ -0,0 +1,76 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* These routines are fast memcpy, memset routines. When available, I</div><div class='add'>+ use system rouines. For msdos, I use inline assembly. */</div><div class='add'>+</div><div class='add'>+/* The current versions only work in the forward direction only!! */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* This is an UNSIGNED comparison designed for systems that either do not have</div><div class='add'>+* this function or performed a signed comparison (SunOS)</div><div class='add'>+*/</div><div class='add'>+int SLmemcmp(register char *s1, register char *s2, int n)</div><div class='add'>+{</div><div class='add'>+ register int cmp;</div><div class='add'>+ register char *s1max;</div><div class='add'>+</div><div class='add'>+ s1max = s1 + (n - 32);</div><div class='add'>+</div><div class='add'>+ while (s1 <= s1max)</div><div class='add'>+ {</div><div class='add'>+ if (*s1 != *s2) return ((unsigned char) *s1 - (unsigned char) *s2);</div><div class='add'>+ if (*(s1 + 1) != *(s2 + 1)) return ((unsigned char) *(s1 + 1) - (unsigned char) *(s2 + 1));</div><div class='add'>+ if (*(s1 + 2) != *(s2 + 2)) return ((unsigned char) *(s1 + 2) - (unsigned char) *(s2 + 2));</div><div class='add'>+ if (*(s1 + 3) != *(s2 + 3)) return ((unsigned char) *(s1 + 3) - (unsigned char) *(s2 + 3));</div><div class='add'>+ if (*(s1 + 4) != *(s2 + 4)) return ((unsigned char) *(s1 + 4) - (unsigned char) *(s2 + 4));</div><div class='add'>+ if (*(s1 + 5) != *(s2 + 5)) return ((unsigned char) *(s1 + 5) - (unsigned char) *(s2 + 5));</div><div class='add'>+ if (*(s1 + 6) != *(s2 + 6)) return ((unsigned char) *(s1 + 6) - (unsigned char) *(s2 + 6));</div><div class='add'>+ if (*(s1 + 7) != *(s2 + 7)) return ((unsigned char) *(s1 + 7) - (unsigned char) *(s2 + 7));</div><div class='add'>+ if (*(s1 + 8) != *(s2 + 8)) return ((unsigned char) *(s1 + 8) - (unsigned char) *(s2 + 8));</div><div class='add'>+ if (*(s1 + 9) != *(s2 + 9)) return ((unsigned char) *(s1 + 9) - (unsigned char) *(s2 + 9));</div><div class='add'>+ if (*(s1 + 10) != *(s2 + 10)) return ((unsigned char) *(s1 + 10) - (unsigned char) *(s2 + 10));</div><div class='add'>+ if (*(s1 + 11) != *(s2 + 11)) return ((unsigned char) *(s1 + 11) - (unsigned char) *(s2 + 11));</div><div class='add'>+ if (*(s1 + 12) != *(s2 + 12)) return ((unsigned char) *(s1 + 12) - (unsigned char) *(s2 + 12));</div><div class='add'>+ if (*(s1 + 13) != *(s2 + 13)) return ((unsigned char) *(s1 + 13) - (unsigned char) *(s2 + 13));</div><div class='add'>+ if (*(s1 + 14) != *(s2 + 14)) return ((unsigned char) *(s1 + 14) - (unsigned char) *(s2 + 14));</div><div class='add'>+ if (*(s1 + 15) != *(s2 + 15)) return ((unsigned char) *(s1 + 15) - (unsigned char) *(s2 + 15));</div><div class='add'>+ if (*(s1 + 16) != *(s2 + 16)) return ((unsigned char) *(s1 + 16) - (unsigned char) *(s2 + 16));</div><div class='add'>+ if (*(s1 + 17) != *(s2 + 17)) return ((unsigned char) *(s1 + 17) - (unsigned char) *(s2 + 17));</div><div class='add'>+ if (*(s1 + 18) != *(s2 + 18)) return ((unsigned char) *(s1 + 18) - (unsigned char) *(s2 + 18));</div><div class='add'>+ if (*(s1 + 19) != *(s2 + 19)) return ((unsigned char) *(s1 + 19) - (unsigned char) *(s2 + 19));</div><div class='add'>+ if (*(s1 + 20) != *(s2 + 20)) return ((unsigned char) *(s1 + 20) - (unsigned char) *(s2 + 20));</div><div class='add'>+ if (*(s1 + 21) != *(s2 + 21)) return ((unsigned char) *(s1 + 21) - (unsigned char) *(s2 + 21));</div><div class='add'>+ if (*(s1 + 22) != *(s2 + 22)) return ((unsigned char) *(s1 + 22) - (unsigned char) *(s2 + 22));</div><div class='add'>+ if (*(s1 + 23) != *(s2 + 23)) return ((unsigned char) *(s1 + 23) - (unsigned char) *(s2 + 23));</div><div class='add'>+ if (*(s1 + 24) != *(s2 + 24)) return ((unsigned char) *(s1 + 24) - (unsigned char) *(s2 + 24));</div><div class='add'>+ if (*(s1 + 25) != *(s2 + 25)) return ((unsigned char) *(s1 + 25) - (unsigned char) *(s2 + 25));</div><div class='add'>+ if (*(s1 + 26) != *(s2 + 26)) return ((unsigned char) *(s1 + 26) - (unsigned char) *(s2 + 26));</div><div class='add'>+ if (*(s1 + 27) != *(s2 + 27)) return ((unsigned char) *(s1 + 27) - (unsigned char) *(s2 + 27));</div><div class='add'>+ if (*(s1 + 28) != *(s2 + 28)) return ((unsigned char) *(s1 + 28) - (unsigned char) *(s2 + 28));</div><div class='add'>+ if (*(s1 + 29) != *(s2 + 29)) return ((unsigned char) *(s1 + 29) - (unsigned char) *(s2 + 29));</div><div class='add'>+ if (*(s1 + 30) != *(s2 + 30)) return ((unsigned char) *(s1 + 30) - (unsigned char) *(s2 + 30));</div><div class='add'>+ if (*(s1 + 31) != *(s2 + 31)) return ((unsigned char) *(s1 + 31) - (unsigned char) *(s2 + 31));</div><div class='add'>+ s1 += 32; s2 += 32;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ s1max = s1 + (n % 32);</div><div class='add'>+</div><div class='add'>+ while (s1 < s1max)</div><div class='add'>+ {</div><div class='add'>+ cmp = (unsigned char) *s1 - (unsigned char) *s2;</div><div class='add'>+ if (cmp) return(cmp);</div><div class='add'>+ s1++;</div><div class='add'>+ s2++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return(0);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slmemcpy.c b/mdk-stage1/slang/slmemcpy.c<br/>new file mode 100644<br/>index 000000000..e8665e4c6<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmemcpy.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemcpy.c</a></div><div class='hunk'>@@ -0,0 +1,49 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* These routines are fast memcpy, memset routines. When available, I</div><div class='add'>+ use system rouines. For msdos, I use inline assembly. */</div><div class='add'>+</div><div class='add'>+/* The current versions only work in the forward direction only!! */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+char *SLmemcpy(char *s1, char *s2, int n)</div><div class='add'>+{</div><div class='add'>+#if defined(__BORLANDC__) && defined(__MSDOS__)</div><div class='add'>+ asm mov ax, ds</div><div class='add'>+ asm mov bx, si</div><div class='add'>+ asm mov dx, di</div><div class='add'>+ asm mov cx, n</div><div class='add'>+ asm les di, s1</div><div class='add'>+ asm lds si, s2</div><div class='add'>+ asm cld</div><div class='add'>+ asm rep movsb</div><div class='add'>+ asm mov ds, ax</div><div class='add'>+ asm mov si, bx</div><div class='add'>+ asm mov di, dx</div><div class='add'>+ return(s1);</div><div class='add'>+</div><div class='add'>+#else</div><div class='add'>+ register char *smax, *s = s1;</div><div class='add'>+ int n2;</div><div class='add'>+</div><div class='add'>+ n2 = n % 4;</div><div class='add'>+ smax = s + (n - 4);</div><div class='add'>+ while (s <= smax)</div><div class='add'>+ {</div><div class='add'>+ *s = *s2; *(s + 1) = *(s2 + 1); *(s + 2) = *(s2 + 2); *(s + 3) = *(s2 + 3);</div><div class='add'>+ s += 4;</div><div class='add'>+ s2 += 4;</div><div class='add'>+ }</div><div class='add'>+ while (n2--) *s++ = *s2++;</div><div class='add'>+ return(s1);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slmemset.c b/mdk-stage1/slang/slmemset.c<br/>new file mode 100644<br/>index 000000000..3851663c5<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmemset.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemset.c</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* These routines are fast memcpy, memset routines. When available, I</div><div class='add'>+ use system rouines. For msdos, I use inline assembly. */</div><div class='add'>+</div><div class='add'>+/* The current versions only work in the forward direction only!! */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+void SLmemset(char *p, char space, int n)</div><div class='add'>+{</div><div class='add'>+#if defined(__BORLANDC__) && defined(__MSDOS__)</div><div class='add'>+ asm mov al, space</div><div class='add'>+ asm mov dx, di</div><div class='add'>+ asm mov cx, n</div><div class='add'>+ asm les di, p</div><div class='add'>+ asm cld</div><div class='add'>+ asm rep stosb</div><div class='add'>+ asm mov di, dx</div><div class='add'>+#else</div><div class='add'>+ register char *pmax;</div><div class='add'>+</div><div class='add'>+ pmax = p + (n - 4);</div><div class='add'>+ n = n % 4;</div><div class='add'>+ while (p <= pmax)</div><div class='add'>+ {</div><div class='add'>+ *p++ = space; *p++ = space; *p++ = space; *p++= space;</div><div class='add'>+ }</div><div class='add'>+ while (n--) *p++ = space;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slmisc.c b/mdk-stage1/slang/slmisc.c<br/>new file mode 100644<br/>index 000000000..ccc7a9bdf<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmisc.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmisc.c</a></div><div class='hunk'>@@ -0,0 +1,330 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#define DEBUG_MALLOC 0</div><div class='add'>+</div><div class='add'>+#if DEBUG_MALLOC</div><div class='add'>+# define SLREALLOC_FUN SLdebug_realloc</div><div class='add'>+# define SLMALLOC_FUN SLdebug_malloc</div><div class='add'>+# define SLFREE_FUN SLdebug_free</div><div class='add'>+#else</div><div class='add'>+# define SLREALLOC_FUN SLREALLOC</div><div class='add'>+# define SLMALLOC_FUN SLMALLOC</div><div class='add'>+# define SLFREE_FUN SLFREE</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Version information goes here since this file is always needed. */</div><div class='add'>+int SLang_Version = SLANG_VERSION;</div><div class='add'>+char *SLang_Version_String = SLANG_VERSION_STRING;</div><div class='add'>+</div><div class='add'>+char *SLmake_string(char *str)</div><div class='add'>+{</div><div class='add'>+ return SLmake_nstring(str, strlen (str));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLmake_nstring (char *str, unsigned int n)</div><div class='add'>+{</div><div class='add'>+ char *ptr;</div><div class='add'>+</div><div class='add'>+ if (NULL == (ptr = SLmalloc(n + 1)))</div><div class='add'>+ {</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ SLMEMCPY (ptr, str, n);</div><div class='add'>+ ptr[n] = 0;</div><div class='add'>+ return(ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLmake_lut (unsigned char *lut, unsigned char *range, unsigned char reverse)</div><div class='add'>+{</div><div class='add'>+ register unsigned char *l = lut, *lmax = lut + 256;</div><div class='add'>+ int i, r1, r2;</div><div class='add'>+</div><div class='add'>+ while (l < lmax) *l++ = reverse;</div><div class='add'>+ reverse = !reverse;</div><div class='add'>+</div><div class='add'>+ r1 = *range++;</div><div class='add'>+ while (r1)</div><div class='add'>+ {</div><div class='add'>+ r2 = *range++;</div><div class='add'>+ if ((r2 == '-') && (*range != 0))</div><div class='add'>+ {</div><div class='add'>+ r2 = *range++;</div><div class='add'>+ for (i = r1; i <= r2; i++) lut[i] = reverse;</div><div class='add'>+ r1 = *range++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ lut[r1] = reverse;</div><div class='add'>+ r1 = r2;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLmalloc (unsigned int len)</div><div class='add'>+{</div><div class='add'>+ char *p;</div><div class='add'>+</div><div class='add'>+ p = (char *) SLMALLOC_FUN (len);</div><div class='add'>+ if (p == NULL)</div><div class='add'>+ SLang_Error = SL_MALLOC_ERROR;</div><div class='add'>+</div><div class='add'>+ return p;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLfree (char *p)</div><div class='add'>+{</div><div class='add'>+ if (p != NULL) SLFREE_FUN (p);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLrealloc (char *p, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ if (len == 0)</div><div class='add'>+ {</div><div class='add'>+ SLfree (p);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (p == NULL) p = SLmalloc (len);</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ p = (char *)SLREALLOC_FUN (p, len);</div><div class='add'>+ if (p == NULL)</div><div class='add'>+ SLang_Error = SL_MALLOC_ERROR;</div><div class='add'>+ }</div><div class='add'>+ return p;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLcalloc (unsigned int nelems, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ char *p;</div><div class='add'>+</div><div class='add'>+ len = nelems * len;</div><div class='add'>+ p = SLmalloc (len);</div><div class='add'>+ if (p != NULL) SLMEMSET (p, 0, len);</div><div class='add'>+ return p;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* p and ch may point to the same buffer */</div><div class='add'>+char *_SLexpand_escaped_char(char *p, char *ch)</div><div class='add'>+{</div><div class='add'>+ int i = 0;</div><div class='add'>+ int max = 0, num, base = 0;</div><div class='add'>+ char ch1;</div><div class='add'>+</div><div class='add'>+ ch1 = *p++;</div><div class='add'>+</div><div class='add'>+ switch (ch1)</div><div class='add'>+ {</div><div class='add'>+ default: num = ch1; break;</div><div class='add'>+ case 'n': num = '\n'; break;</div><div class='add'>+ case 't': num = '\t'; break;</div><div class='add'>+ case 'v': num = '\v'; break;</div><div class='add'>+ case 'b': num = '\b'; break;</div><div class='add'>+ case 'r': num = '\r'; break;</div><div class='add'>+ case 'f': num = '\f'; break;</div><div class='add'>+ case 'E': case 'e': num = 27; break;</div><div class='add'>+ case 'a': num = 7;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* octal */</div><div class='add'>+ case '0': case '1': case '2': case '3':</div><div class='add'>+ case '4': case '5': case '6': case '7':</div><div class='add'>+ max = '7';</div><div class='add'>+ base = 8; i = 2; num = ch1 - '0';</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'd': /* decimal -- S-Lang extension */</div><div class='add'>+ base = 10;</div><div class='add'>+ i = 3;</div><div class='add'>+ max = '9';</div><div class='add'>+ num = 0;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'x': /* hex */</div><div class='add'>+ base = 16;</div><div class='add'>+ max = '9';</div><div class='add'>+ i = 2;</div><div class='add'>+ num = 0;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (i--)</div><div class='add'>+ {</div><div class='add'>+ ch1 = *p;</div><div class='add'>+</div><div class='add'>+ if ((ch1 <= max) && (ch1 >= '0'))</div><div class='add'>+ {</div><div class='add'>+ num = base * num + (ch1 - '0');</div><div class='add'>+ }</div><div class='add'>+ else if (base == 16)</div><div class='add'>+ {</div><div class='add'>+ ch1 |= 0x20;</div><div class='add'>+ if ((ch1 < 'a') || ((ch1 > 'f'))) break;</div><div class='add'>+ num = base * num + 10 + (ch1 - 'a');</div><div class='add'>+ }</div><div class='add'>+ else break;</div><div class='add'>+ p++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *ch = (char) num;</div><div class='add'>+ return p;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* s and t could represent the same space */</div><div class='add'>+void SLexpand_escaped_string (register char *s, register char *t,</div><div class='add'>+ register char *tmax)</div><div class='add'>+{</div><div class='add'>+ char ch;</div><div class='add'>+</div><div class='add'>+ while (t < tmax)</div><div class='add'>+ {</div><div class='add'>+ ch = *t++;</div><div class='add'>+ if (ch == '\\')</div><div class='add'>+ {</div><div class='add'>+ t = _SLexpand_escaped_char (t, &ch);</div><div class='add'>+ }</div><div class='add'>+ *s++ = ch;</div><div class='add'>+ }</div><div class='add'>+ *s = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLextract_list_element (char *list, unsigned int nth, char delim,</div><div class='add'>+ char *elem, unsigned int buflen)</div><div class='add'>+{</div><div class='add'>+ char *el, *elmax;</div><div class='add'>+ char ch;</div><div class='add'>+</div><div class='add'>+ while (nth > 0)</div><div class='add'>+ {</div><div class='add'>+ while ((0 != (ch = *list)) && (ch != delim))</div><div class='add'>+ list++;</div><div class='add'>+</div><div class='add'>+ if (ch == 0) return -1;</div><div class='add'>+</div><div class='add'>+ list++;</div><div class='add'>+ nth--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ el = elem;</div><div class='add'>+ elmax = el + (buflen - 1);</div><div class='add'>+</div><div class='add'>+ while ((0 != (ch = *list)) && (ch != delim) && (el < elmax))</div><div class='add'>+ *el++ = *list++;</div><div class='add'>+ *el = 0;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_VSNPRINTF</div><div class='add'>+int _SLvsnprintf (char *buf, unsigned int buflen, char *fmt, va_list ap)</div><div class='add'>+{</div><div class='add'>+#if 1</div><div class='add'>+ unsigned int len;</div><div class='add'>+</div><div class='add'>+ /* On some systems vsprintf returns useless information. So, punt */</div><div class='add'>+ vsprintf (buf, fmt, ap);</div><div class='add'>+ len = strlen (buf);</div><div class='add'>+ if (len >= buflen)</div><div class='add'>+ {</div><div class='add'>+ SLang_exit_error ("\</div><div class='add'>+Your system lacks the vsnprintf system call and vsprintf overflowed a buffer.\n\</div><div class='add'>+The integrity of this program has been violated.\n");</div><div class='add'>+ return EOF; /* NOT reached */</div><div class='add'>+ }</div><div class='add'>+ return (int)len;</div><div class='add'>+#else</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ status = vsprintf (buf, fmt, ap);</div><div class='add'>+ if (status >= (int) buflen)</div><div class='add'>+ {</div><div class='add'>+ /* If we are lucky, we will get this far. The real solution is to</div><div class='add'>+ * provide a working version of vsnprintf</div><div class='add'>+ */</div><div class='add'>+ SLang_exit_error ("\</div><div class='add'>+Your system lacks the vsnprintf system call and vsprintf overflowed a buffer.\n\</div><div class='add'>+The integrity of this program has been violated.\n");</div><div class='add'>+ return EOF; /* NOT reached */</div><div class='add'>+ }</div><div class='add'>+ return status;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_SNPRINTF</div><div class='add'>+int _SLsnprintf (char *buf, unsigned int buflen, char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ va_list ap;</div><div class='add'>+</div><div class='add'>+ va_start (ap, fmt);</div><div class='add'>+ status = _SLvsnprintf (buf, buflen, fmt, ap);</div><div class='add'>+ va_end (ap);</div><div class='add'>+</div><div class='add'>+ return status;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct _Cleanup_Function_Type</div><div class='add'>+{</div><div class='add'>+ struct _Cleanup_Function_Type *next;</div><div class='add'>+ void (*f)(void);</div><div class='add'>+}</div><div class='add'>+Cleanup_Function_Type;</div><div class='add'>+</div><div class='add'>+static Cleanup_Function_Type *Cleanup_Function_List;</div><div class='add'>+</div><div class='add'>+static void cleanup_slang (void)</div><div class='add'>+{</div><div class='add'>+ while (Cleanup_Function_List != NULL)</div><div class='add'>+ {</div><div class='add'>+ Cleanup_Function_Type *next = Cleanup_Function_List->next;</div><div class='add'>+ (*Cleanup_Function_List->f)();</div><div class='add'>+ SLFREE_FUN ((char *) Cleanup_Function_List);</div><div class='add'>+ Cleanup_Function_List = next;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_ATEXIT</div><div class='add'>+# ifdef HAVE_ON_EXIT</div><div class='add'>+static void on_exit_cleanup_slang (int arg_unused)</div><div class='add'>+{</div><div class='add'>+ (void) arg_unused;</div><div class='add'>+ cleanup_slang ();</div><div class='add'>+}</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLang_add_cleanup_function (void (*f)(void))</div><div class='add'>+{</div><div class='add'>+ Cleanup_Function_Type *l;</div><div class='add'>+</div><div class='add'>+ l = (Cleanup_Function_Type *) SLMALLOC_FUN (sizeof (Cleanup_Function_Type));</div><div class='add'>+ if (l == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ l->f = f;</div><div class='add'>+ l->next = Cleanup_Function_List;</div><div class='add'>+</div><div class='add'>+ if (Cleanup_Function_List == NULL)</div><div class='add'>+ {</div><div class='add'>+#ifdef HAVE_ATEXIT</div><div class='add'>+ (void) atexit (cleanup_slang);</div><div class='add'>+#else</div><div class='add'>+# ifdef HAVE_ON_EXIT</div><div class='add'>+ (void) on_exit (on_exit_cleanup_slang, 0);</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+ Cleanup_Function_List = l;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slnspace.c b/mdk-stage1/slang/slnspace.c<br/>new file mode 100644<br/>index 000000000..174ba7c81<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slnspace.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slnspace.c</a></div><div class='hunk'>@@ -0,0 +1,242 @@</div><div class='add'>+/* -*- mode: C; mode: fold; -*- */</div><div class='add'>+/* slnspace.c --- Name Space implementation */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static SLang_NameSpace_Type *Namespace_Tables;</div><div class='add'>+</div><div class='add'>+static SLang_NameSpace_Type *find_name_table (char *name)</div><div class='add'>+{</div><div class='add'>+ SLang_NameSpace_Type *table_list;</div><div class='add'>+</div><div class='add'>+ table_list = Namespace_Tables;</div><div class='add'>+ while (table_list != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (0 == strcmp (table_list->name, name))</div><div class='add'>+ break;</div><div class='add'>+ table_list = table_list->next;</div><div class='add'>+ }</div><div class='add'>+ return table_list;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_NameSpace_Type *_SLns_find_namespace (char *name)</div><div class='add'>+{</div><div class='add'>+ SLang_NameSpace_Type *table_list;</div><div class='add'>+</div><div class='add'>+ table_list = Namespace_Tables;</div><div class='add'>+ while (table_list != NULL)</div><div class='add'>+ {</div><div class='add'>+ if ((table_list->namespace_name != NULL)</div><div class='add'>+ && (0 == strcmp (table_list->namespace_name, name)))</div><div class='add'>+ break;</div><div class='add'>+ table_list = table_list->next;</div><div class='add'>+ }</div><div class='add'>+ return table_list;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_NameSpace_Type *_SLns_allocate_namespace (char *name, unsigned int size)</div><div class='add'>+{</div><div class='add'>+ SLang_NameSpace_Type *table_list;</div><div class='add'>+ SLang_Name_Type **nt;</div><div class='add'>+ </div><div class='add'>+ if (NULL != (table_list = find_name_table (name)))</div><div class='add'>+ return table_list;</div><div class='add'>+</div><div class='add'>+ if (NULL == (name = SLang_create_slstring (name)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ if (NULL == (table_list = (SLang_NameSpace_Type *)</div><div class='add'>+ SLmalloc (sizeof (SLang_NameSpace_Type))))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (name);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (NULL == (nt = (SLang_Name_Type **) SLmalloc (sizeof (SLang_Name_Type *) * size)))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (name);</div><div class='add'>+ SLfree ((char *)table_list);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ memset ((char *)nt, 0, size * sizeof (SLang_Name_Type *));</div><div class='add'>+ memset ((char *) table_list, 0, sizeof (SLang_NameSpace_Type));</div><div class='add'>+</div><div class='add'>+ table_list->name = name;</div><div class='add'>+ table_list->table = nt;</div><div class='add'>+ table_list->table_size = size;</div><div class='add'>+</div><div class='add'>+ table_list->next = Namespace_Tables;</div><div class='add'>+ Namespace_Tables = table_list;</div><div class='add'>+</div><div class='add'>+ return table_list;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLns_set_namespace_name (SLang_NameSpace_Type *t, char *name)</div><div class='add'>+{</div><div class='add'>+ SLang_NameSpace_Type *t1;</div><div class='add'>+ </div><div class='add'>+ t1 = _SLns_find_namespace (name);</div><div class='add'>+ if (t1 == NULL)</div><div class='add'>+ t1 = t;</div><div class='add'>+ </div><div class='add'>+ if ((t != t1) || (*name == 0))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INTRINSIC_ERROR, "Namespace \"%s\" already exists",</div><div class='add'>+ name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (name = SLang_create_slstring (name)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ SLang_free_slstring (t->namespace_name); /* NULL ok */</div><div class='add'>+ t->namespace_name = name;</div><div class='add'>+ </div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Array_Type *_SLnspace_apropos (SLang_NameSpace_Type *ns, char *pat, unsigned int what)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ unsigned int table_size;</div><div class='add'>+ SLang_Name_Type *t, **table;</div><div class='add'>+ int num_matches;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ SLRegexp_Type rexp;</div><div class='add'>+ unsigned char rbuf[512];</div><div class='add'>+ unsigned int two;</div><div class='add'>+ </div><div class='add'>+ at = NULL;</div><div class='add'>+</div><div class='add'>+ if ((ns == NULL)</div><div class='add'>+ || ((table = ns->table) == NULL))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ memset ((char *) &rexp, 0, sizeof (SLRegexp_Type));</div><div class='add'>+ rexp.case_sensitive = 1;</div><div class='add'>+ rexp.buf = rbuf;</div><div class='add'>+ rexp.buf_len = sizeof (rbuf);</div><div class='add'>+ rexp.pat = (unsigned char *)pat;</div><div class='add'>+</div><div class='add'>+ if (0 != SLang_regexp_compile (&rexp))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Invalid regular expression: %s", pat);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ table_size = ns->table_size;</div><div class='add'>+</div><div class='add'>+ two = 2;</div><div class='add'>+ while (two != 0)</div><div class='add'>+ {</div><div class='add'>+ two--;</div><div class='add'>+ </div><div class='add'>+ num_matches = 0;</div><div class='add'>+ for (i = 0; i < table_size; i++)</div><div class='add'>+ {</div><div class='add'>+ t = table[i];</div><div class='add'>+ while (t != NULL)</div><div class='add'>+ {</div><div class='add'>+ unsigned int flags;</div><div class='add'>+ char *name = t->name;</div><div class='add'>+</div><div class='add'>+ switch (t->name_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_GVARIABLE:</div><div class='add'>+ flags = 8;</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case SLANG_ICONSTANT:</div><div class='add'>+ case SLANG_DCONSTANT:</div><div class='add'>+ case SLANG_RVARIABLE:</div><div class='add'>+ case SLANG_IVARIABLE:</div><div class='add'>+ flags = 4;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_INTRINSIC:</div><div class='add'>+ case SLANG_MATH_UNARY:</div><div class='add'>+ case SLANG_APP_UNARY:</div><div class='add'>+ flags = 1;</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case SLANG_FUNCTION:</div><div class='add'>+ flags = 2;</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ default:</div><div class='add'>+ flags = 0;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if ((flags & what)</div><div class='add'>+ && (NULL != SLang_regexp_match ((unsigned char *)name, strlen (name), &rexp)))</div><div class='add'>+ {</div><div class='add'>+ if (at != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLang_set_array_element (at, &num_matches, (VOID_STAR)&name))</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+ num_matches++;</div><div class='add'>+ }</div><div class='add'>+ t = t->next;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (at == NULL)</div><div class='add'>+ {</div><div class='add'>+ at = SLang_create_array (SLANG_STRING_TYPE, 0, NULL, &num_matches, 1);</div><div class='add'>+ if (at == NULL)</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ return at;</div><div class='add'>+ </div><div class='add'>+ return_error:</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_NameSpace_Type *SLns_create_namespace (char *namespace_name)</div><div class='add'>+{ </div><div class='add'>+ SLang_NameSpace_Type *ns;</div><div class='add'>+ static int num;</div><div class='add'>+ char name[64];</div><div class='add'>+</div><div class='add'>+ if (namespace_name == NULL)</div><div class='add'>+ namespace_name = "Global";</div><div class='add'>+</div><div class='add'>+ ns = _SLns_find_namespace (namespace_name);</div><div class='add'>+ if (ns != NULL)</div><div class='add'>+ return ns;</div><div class='add'>+ </div><div class='add'>+ sprintf (name, " *** internal ns <%d> *** ", num);</div><div class='add'>+</div><div class='add'>+ if (NULL == (ns = _SLns_allocate_namespace (name, SLSTATIC_HASH_TABLE_SIZE)))</div><div class='add'>+ return NULL;</div><div class='add'>+ </div><div class='add'>+ num++;</div><div class='add'>+ if (-1 == _SLns_set_namespace_name (ns, namespace_name))</div><div class='add'>+ {</div><div class='add'>+ SLns_delete_namespace (ns);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ return ns;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLns_delete_namespace (SLang_NameSpace_Type *ns)</div><div class='add'>+{</div><div class='add'>+ (void) ns;</div><div class='add'>+ /* V2.0 */</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slospath.c b/mdk-stage1/slang/slospath.c<br/>new file mode 100644<br/>index 000000000..644931e81<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slospath.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slospath.c</a></div><div class='hunk'>@@ -0,0 +1,73 @@</div><div class='add'>+/* Pathname intrinsic functions */</div><div class='add'>+/* Copyright (c) 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static void path_concat (char *a, char *b)</div><div class='add'>+{</div><div class='add'>+ SLang_push_malloced_string (SLpath_dircat (a,b));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void path_extname (char *path)</div><div class='add'>+{</div><div class='add'>+#ifdef VMS</div><div class='add'>+ char *p;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ path = SLpath_extname (path);</div><div class='add'>+#ifndef VMS</div><div class='add'>+ SLang_push_string (path);</div><div class='add'>+#else</div><div class='add'>+ p = strchr (path, ';');</div><div class='add'>+ if (p == NULL)</div><div class='add'>+ (void)SLang_push_string (p);</div><div class='add'>+ else</div><div class='add'>+ (void)SLang_push_malloced_string (SLmake_nstring (path, (unsigned int)(p - path)));</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void path_basename (char *path)</div><div class='add'>+{</div><div class='add'>+ (void) SLang_push_string (SLpath_basename (path));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void path_dirname (char *path)</div><div class='add'>+{</div><div class='add'>+ (void) SLang_push_malloced_string (SLpath_dirname (path));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void path_sans_extname (char *path)</div><div class='add'>+{</div><div class='add'>+ (void) SLang_push_malloced_string (SLpath_pathname_sans_extname (path));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Path_Name_Table [] =</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_SS("path_concat", path_concat, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("path_extname", path_extname, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("path_dirname", path_dirname, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("path_basename", path_basename, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("path_sans_extname", path_sans_extname, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("path_is_absolute", SLpath_is_absolute_path, SLANG_INT_TYPE),</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLang_init_ospath (void)</div><div class='add'>+{</div><div class='add'>+ if (-1 == SLadd_intrin_fun_table(Path_Name_Table, "__OSPATH__"))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slpack.c b/mdk-stage1/slang/slpack.c<br/>new file mode 100644<br/>index 000000000..53ef63643<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slpack.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slpack.c</a></div><div class='hunk'>@@ -0,0 +1,785 @@</div><div class='add'>+/* Pack objects as a binary string */</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include <ctype.h></div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifndef isdigit</div><div class='add'>+# define isdigit(c) (((c)>='0')&&((c)<= '9'))</div><div class='add'>+#endif</div><div class='add'>+#ifndef isspace</div><div class='add'>+# define isspace(c) (((c)==' ') || ((c)=='\t') || ((c)=='\n'))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* format description:</div><div class='add'>+ *</div><div class='add'>+ * s = string (null padded)</div><div class='add'>+ * S = string (space padded)</div><div class='add'>+ * c = signed char</div><div class='add'>+ * C = unsigned char</div><div class='add'>+ * h = short</div><div class='add'>+ * H = unsigned short</div><div class='add'>+ * i = int</div><div class='add'>+ * I = unsigned int</div><div class='add'>+ * l = long</div><div class='add'>+ * L = unsigned long</div><div class='add'>+ * j = 16 bit signed integer (short)</div><div class='add'>+ * J = 16 bit unsigned integer (short)</div><div class='add'>+ * k = 32 bit signed integer (long)</div><div class='add'>+ * K = 32 bit unsigned integer (long)</div><div class='add'>+ * f = float (native format)</div><div class='add'>+ * F = 32 bit double</div><div class='add'>+ * d = double (native format)</div><div class='add'>+ * D = 64 bit double</div><div class='add'>+ * x = null pad byte</div><div class='add'>+ * > = big-endian mode</div><div class='add'>+ * < = little-endian mode</div><div class='add'>+ * = = native mode</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define NATIVE_ORDER 0</div><div class='add'>+#define BIGENDIAN_ORDER 1</div><div class='add'>+#define LILENDIAN_ORDER 2</div><div class='add'>+static int Native_Byte_Order = NATIVE_ORDER;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char format_type;</div><div class='add'>+ unsigned char data_type;</div><div class='add'>+ unsigned int repeat;</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+ char pad;</div><div class='add'>+ int byteorder;</div><div class='add'>+ int is_scalar;</div><div class='add'>+}</div><div class='add'>+Format_Type;</div><div class='add'>+</div><div class='add'>+static int get_int_type_for_size (unsigned int size, unsigned char *s, unsigned char *u)</div><div class='add'>+{</div><div class='add'>+ if (sizeof (int) == size)</div><div class='add'>+ {</div><div class='add'>+ if (s != NULL) *s = SLANG_INT_TYPE;</div><div class='add'>+ if (u != NULL) *u = SLANG_UINT_TYPE;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (sizeof (short) == size)</div><div class='add'>+ {</div><div class='add'>+ if (s != NULL) *s = SLANG_SHORT_TYPE;</div><div class='add'>+ if (u != NULL) *u = SLANG_USHORT_TYPE;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (sizeof (long) == size)</div><div class='add'>+ {</div><div class='add'>+ if (s != NULL) *s = SLANG_LONG_TYPE;</div><div class='add'>+ if (u != NULL) *u = SLANG_ULONG_TYPE;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (s != NULL) *s = 0;</div><div class='add'>+ if (u != NULL) *u = 0;</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "This OS does not support a %u byte int", size);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_float_type_for_size (unsigned int size, unsigned char *s)</div><div class='add'>+{</div><div class='add'>+ if (sizeof (float) == size)</div><div class='add'>+ {</div><div class='add'>+ *s = SLANG_FLOAT_TYPE;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (sizeof (double) == size)</div><div class='add'>+ {</div><div class='add'>+ *s = SLANG_DOUBLE_TYPE;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "This OS does not support a %u byte float", size);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_a_format (char **format, Format_Type *ft)</div><div class='add'>+{</div><div class='add'>+ char *f;</div><div class='add'>+ char ch;</div><div class='add'>+ unsigned repeat;</div><div class='add'>+</div><div class='add'>+ f = *format;</div><div class='add'>+</div><div class='add'>+ while (((ch = *f++) != 0)</div><div class='add'>+ && isspace (ch))</div><div class='add'>+ ;</div><div class='add'>+</div><div class='add'>+ switch (ch)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ ft->byteorder = NATIVE_ORDER;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '=':</div><div class='add'>+ ft->byteorder = NATIVE_ORDER;</div><div class='add'>+ ch = *f++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '>':</div><div class='add'>+ ft->byteorder = BIGENDIAN_ORDER;</div><div class='add'>+ ch = *f++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '<':</div><div class='add'>+ ft->byteorder = LILENDIAN_ORDER;</div><div class='add'>+ ch = *f++;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ch == 0)</div><div class='add'>+ {</div><div class='add'>+ f--;</div><div class='add'>+ *format = f;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ft->format_type = ch;</div><div class='add'>+ ft->repeat = 1;</div><div class='add'>+</div><div class='add'>+ if (isdigit (*f))</div><div class='add'>+ {</div><div class='add'>+ repeat = (unsigned int) (*f - '0');</div><div class='add'>+ f++;</div><div class='add'>+</div><div class='add'>+ while (isdigit (*f))</div><div class='add'>+ {</div><div class='add'>+ unsigned int repeat10 = 10 * repeat + (unsigned int)(*f - '0');</div><div class='add'>+</div><div class='add'>+ /* Check overflow */</div><div class='add'>+ if (repeat != repeat10 / 10)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_OVERFLOW,</div><div class='add'>+ "Repeat count too large in [un]pack format");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ repeat = repeat10;</div><div class='add'>+ f++;</div><div class='add'>+ }</div><div class='add'>+ ft->repeat = repeat;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *format = f;</div><div class='add'>+</div><div class='add'>+ ft->is_scalar = 1;</div><div class='add'>+ ft->pad = 0;</div><div class='add'>+</div><div class='add'>+ switch (ft->format_type)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "[un]pack format character '%c' not supported", ft->format_type);</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ case 'D':</div><div class='add'>+ ft->sizeof_type = 8;</div><div class='add'>+ if (-1 == get_float_type_for_size (8, &ft->data_type))</div><div class='add'>+ return -1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'd':</div><div class='add'>+ ft->data_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+ ft->sizeof_type = sizeof (double);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'F':</div><div class='add'>+ ft->sizeof_type = 4;</div><div class='add'>+ if (-1 == get_float_type_for_size (4, &ft->data_type))</div><div class='add'>+ return -1;</div><div class='add'>+ break;</div><div class='add'>+ case 'f':</div><div class='add'>+ ft->data_type = SLANG_FLOAT_TYPE;</div><div class='add'>+ ft->sizeof_type = sizeof (float);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'h':</div><div class='add'>+ ft->data_type = SLANG_SHORT_TYPE;</div><div class='add'>+ ft->sizeof_type = sizeof (short);</div><div class='add'>+ break;</div><div class='add'>+ case 'H':</div><div class='add'>+ ft->data_type = SLANG_USHORT_TYPE;</div><div class='add'>+ ft->sizeof_type = sizeof (unsigned short);</div><div class='add'>+ break;</div><div class='add'>+ case 'i':</div><div class='add'>+ ft->data_type = SLANG_INT_TYPE;</div><div class='add'>+ ft->sizeof_type = sizeof (int);</div><div class='add'>+ break;</div><div class='add'>+ case 'I':</div><div class='add'>+ ft->data_type = SLANG_UINT_TYPE;</div><div class='add'>+ ft->sizeof_type = sizeof (unsigned int);</div><div class='add'>+ break;</div><div class='add'>+ case 'l':</div><div class='add'>+ ft->data_type = SLANG_LONG_TYPE;</div><div class='add'>+ ft->sizeof_type = sizeof (long);</div><div class='add'>+ break;</div><div class='add'>+ case 'L':</div><div class='add'>+ ft->data_type = SLANG_ULONG_TYPE;</div><div class='add'>+ ft->sizeof_type = sizeof (unsigned long);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* 16 bit ints */</div><div class='add'>+ case 'j':</div><div class='add'>+ ft->sizeof_type = 2;</div><div class='add'>+ if (-1 == get_int_type_for_size (2, &ft->data_type, NULL))</div><div class='add'>+ return -1;</div><div class='add'>+ break;</div><div class='add'>+ case 'J':</div><div class='add'>+ ft->sizeof_type = 2;</div><div class='add'>+ if (-1 == get_int_type_for_size (2, NULL, &ft->data_type))</div><div class='add'>+ return -1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* 32 bit ints */</div><div class='add'>+ case 'k':</div><div class='add'>+ ft->sizeof_type = 4;</div><div class='add'>+ if (-1 == get_int_type_for_size (4, &ft->data_type, NULL))</div><div class='add'>+ return -1;</div><div class='add'>+ break;</div><div class='add'>+ case 'K':</div><div class='add'>+ ft->sizeof_type = 4;</div><div class='add'>+ if (-1 == get_int_type_for_size (4, NULL, &ft->data_type))</div><div class='add'>+ return -1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'x':</div><div class='add'>+ ft->sizeof_type = 1;</div><div class='add'>+ ft->data_type = 0;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'c':</div><div class='add'>+ ft->sizeof_type = 1;</div><div class='add'>+ ft->data_type = SLANG_CHAR_TYPE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'C':</div><div class='add'>+ ft->data_type = SLANG_UCHAR_TYPE;</div><div class='add'>+ ft->sizeof_type = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'S':</div><div class='add'>+ case 'A':</div><div class='add'>+ ft->pad = ' ';</div><div class='add'>+ case 'a':</div><div class='add'>+ case 's':</div><div class='add'>+ ft->data_type = SLANG_BSTRING_TYPE;</div><div class='add'>+ ft->sizeof_type = 1;</div><div class='add'>+ ft->is_scalar = 0;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int compute_size_for_format (char *format, unsigned int *num_bytes)</div><div class='add'>+{</div><div class='add'>+ unsigned int size;</div><div class='add'>+ Format_Type ft;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ *num_bytes = size = 0;</div><div class='add'>+</div><div class='add'>+ while (1 == (status = parse_a_format (&format, &ft)))</div><div class='add'>+ size += ft.repeat * ft.sizeof_type;</div><div class='add'>+</div><div class='add'>+ *num_bytes = size;</div><div class='add'>+ return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void byte_swap64 (unsigned char *ss, unsigned int n) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ unsigned char *p, *pmax, ch;</div><div class='add'>+</div><div class='add'>+ if (n == 0) return;</div><div class='add'>+ p = (unsigned char *) ss;</div><div class='add'>+ pmax = p + 8 * n;</div><div class='add'>+ while (p < pmax)</div><div class='add'>+ {</div><div class='add'>+ ch = *p;</div><div class='add'>+ *p = *(p + 7);</div><div class='add'>+ *(p + 7) = ch;</div><div class='add'>+</div><div class='add'>+ ch = *(p + 6);</div><div class='add'>+ *(p + 6) = *(p + 1);</div><div class='add'>+ *(p + 1) = ch;</div><div class='add'>+</div><div class='add'>+ ch = *(p + 5);</div><div class='add'>+ *(p + 5) = *(p + 2);</div><div class='add'>+ *(p + 2) = ch;</div><div class='add'>+</div><div class='add'>+ ch = *(p + 4);</div><div class='add'>+ *(p + 4) = *(p + 3);</div><div class='add'>+ *(p + 3) = ch;</div><div class='add'>+</div><div class='add'>+ p += 8;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+static void byte_swap32 (unsigned char *ss, unsigned int n) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ unsigned char *p, *pmax, ch;</div><div class='add'>+</div><div class='add'>+ p = (unsigned char *) ss;</div><div class='add'>+ pmax = p + 4 * n;</div><div class='add'>+ while (p < pmax)</div><div class='add'>+ {</div><div class='add'>+ ch = *p;</div><div class='add'>+ *p = *(p + 3);</div><div class='add'>+ *(p + 3) = ch;</div><div class='add'>+</div><div class='add'>+ ch = *(p + 1);</div><div class='add'>+ *(p + 1) = *(p + 2);</div><div class='add'>+ *(p + 2) = ch;</div><div class='add'>+ p += 4;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+static void byte_swap16 (unsigned char *p, unsigned int nread) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ unsigned char *pmax, ch;</div><div class='add'>+</div><div class='add'>+ pmax = p + 2 * nread;</div><div class='add'>+ while (p < pmax)</div><div class='add'>+ {</div><div class='add'>+ ch = *p;</div><div class='add'>+ *p = *(p + 1);</div><div class='add'>+ *(p + 1) = ch;</div><div class='add'>+ p += 2;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int byteswap (int order, unsigned char *b, unsigned int size, unsigned int num)</div><div class='add'>+{</div><div class='add'>+ if (Native_Byte_Order == order)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ switch (size)</div><div class='add'>+ {</div><div class='add'>+ case 2:</div><div class='add'>+ byte_swap16 (b, num);</div><div class='add'>+ break;</div><div class='add'>+ case 4:</div><div class='add'>+ byte_swap32 (b, num);</div><div class='add'>+ break;</div><div class='add'>+ case 8:</div><div class='add'>+ byte_swap64 (b, num);</div><div class='add'>+ break;</div><div class='add'>+ default:</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void check_native_byte_order (void)</div><div class='add'>+{</div><div class='add'>+ unsigned short x;</div><div class='add'>+</div><div class='add'>+ if (Native_Byte_Order != NATIVE_ORDER)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ x = 0xFF;</div><div class='add'>+ if (*(unsigned char *)&x == 0xFF)</div><div class='add'>+ Native_Byte_Order = LILENDIAN_ORDER;</div><div class='add'>+ else</div><div class='add'>+ Native_Byte_Order = BIGENDIAN_ORDER;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_BString_Type *</div><div class='add'>+pack_according_to_format (char *format, unsigned int nitems)</div><div class='add'>+{</div><div class='add'>+ unsigned int size, num;</div><div class='add'>+ unsigned char *buf, *b;</div><div class='add'>+ SLang_BString_Type *bs;</div><div class='add'>+ Format_Type ft;</div><div class='add'>+</div><div class='add'>+ buf = NULL;</div><div class='add'>+</div><div class='add'>+ if (-1 == compute_size_for_format (format, &size))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (NULL == (buf = (unsigned char *) SLmalloc (size + 1)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ b = buf;</div><div class='add'>+</div><div class='add'>+ while (1 == parse_a_format (&format, &ft))</div><div class='add'>+ {</div><div class='add'>+ unsigned char *ptr;</div><div class='add'>+ unsigned int repeat;</div><div class='add'>+</div><div class='add'>+ repeat = ft.repeat;</div><div class='add'>+ if (ft.data_type == 0)</div><div class='add'>+ {</div><div class='add'>+ memset ((char *) b, ft.pad, repeat);</div><div class='add'>+ b += repeat;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ft.is_scalar)</div><div class='add'>+ {</div><div class='add'>+ unsigned char *bstart;</div><div class='add'>+ num = repeat;</div><div class='add'>+</div><div class='add'>+ bstart = b;</div><div class='add'>+ while (repeat != 0)</div><div class='add'>+ {</div><div class='add'>+ unsigned int nelements;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ if (nitems == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM,</div><div class='add'>+ "Not enough items for pack format");</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_array_of_type (&at, ft.data_type))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ nelements = at->num_elements;</div><div class='add'>+ if (repeat < nelements)</div><div class='add'>+ nelements = repeat;</div><div class='add'>+ repeat -= nelements;</div><div class='add'>+</div><div class='add'>+ nelements = nelements * ft.sizeof_type;</div><div class='add'>+ memcpy ((char *)b, (char *)at->data, nelements);</div><div class='add'>+</div><div class='add'>+ b += nelements;</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ nitems--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ft.byteorder != NATIVE_ORDER)</div><div class='add'>+ byteswap (ft.byteorder, bstart, ft.sizeof_type, num);</div><div class='add'>+</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Otherwise we have a string */</div><div class='add'>+ if (-1 == SLang_pop_bstring (&bs))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ ptr = SLbstring_get_pointer (bs, &num);</div><div class='add'>+ if (repeat < num) num = repeat;</div><div class='add'>+ memcpy ((char *)b, (char *)ptr, num);</div><div class='add'>+ b += num;</div><div class='add'>+ repeat -= num;</div><div class='add'>+ memset ((char *)b, ft.pad, repeat);</div><div class='add'>+ SLbstring_free (bs);</div><div class='add'>+ b += repeat;</div><div class='add'>+ nitems--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *b = 0;</div><div class='add'>+ bs = SLbstring_create_malloced (buf, size, 0);</div><div class='add'>+ if (bs == NULL)</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ SLdo_pop_n (nitems);</div><div class='add'>+ return bs;</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ SLdo_pop_n (nitems);</div><div class='add'>+ if (buf != NULL)</div><div class='add'>+ SLfree ((char *) buf);</div><div class='add'>+</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLpack (void)</div><div class='add'>+{</div><div class='add'>+ SLang_BString_Type *bs;</div><div class='add'>+ char *fmt;</div><div class='add'>+ int nitems;</div><div class='add'>+</div><div class='add'>+ check_native_byte_order ();</div><div class='add'>+</div><div class='add'>+ nitems = SLang_Num_Function_Args;</div><div class='add'>+ if (nitems <= 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR,</div><div class='add'>+ "pack: not enough arguments");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLreverse_stack (nitems))</div><div class='add'>+ || (-1 == SLang_pop_slstring (&fmt)))</div><div class='add'>+ bs = NULL;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ bs = pack_according_to_format (fmt, (unsigned int)nitems - 1);</div><div class='add'>+ SLang_free_slstring (fmt);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_push_bstring (bs);</div><div class='add'>+ SLbstring_free (bs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLunpack (char *format, SLang_BString_Type *bs)</div><div class='add'>+{</div><div class='add'>+ Format_Type ft;</div><div class='add'>+ unsigned char *b;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ unsigned int num_bytes;</div><div class='add'>+</div><div class='add'>+ check_native_byte_order ();</div><div class='add'>+</div><div class='add'>+ if (-1 == compute_size_for_format (format, &num_bytes))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ b = SLbstring_get_pointer (bs, &len);</div><div class='add'>+ if (b == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (len < num_bytes)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM,</div><div class='add'>+ "unpack format %s is too large for input string",</div><div class='add'>+ format);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (1 == parse_a_format (&format, &ft))</div><div class='add'>+ {</div><div class='add'>+ char *str, *s;</div><div class='add'>+</div><div class='add'>+ if (ft.repeat == 0)</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ if (ft.data_type == 0)</div><div class='add'>+ { /* skip padding */</div><div class='add'>+ b += ft.repeat;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ft.is_scalar)</div><div class='add'>+ {</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int dims;</div><div class='add'>+</div><div class='add'>+ if (ft.repeat == 1)</div><div class='add'>+ {</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (ft.data_type);</div><div class='add'>+ memcpy ((char *)cl->cl_transfer_buf, (char *)b, ft.sizeof_type);</div><div class='add'>+ if (ft.byteorder != NATIVE_ORDER)</div><div class='add'>+ byteswap (ft.byteorder, (unsigned char *)cl->cl_transfer_buf, ft.sizeof_type, 1);</div><div class='add'>+</div><div class='add'>+ if (-1 == (cl->cl_apush (ft.data_type, cl->cl_transfer_buf)))</div><div class='add'>+ return;</div><div class='add'>+ b += ft.sizeof_type;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ dims = (int) ft.repeat;</div><div class='add'>+ at = SLang_create_array (ft.data_type, 0, NULL, &dims, 1);</div><div class='add'>+ if (at == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ num_bytes = ft.repeat * ft.sizeof_type;</div><div class='add'>+ memcpy ((char *)at->data, (char *)b, num_bytes);</div><div class='add'>+ if (ft.byteorder != NATIVE_ORDER)</div><div class='add'>+ byteswap (ft.byteorder, (unsigned char *)at->data, ft.sizeof_type, ft.repeat);</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_push_array (at, 1))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ b += num_bytes;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ len = ft.repeat;</div><div class='add'>+ str = SLmalloc (len + 1);</div><div class='add'>+ if (str == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ memcpy ((char *) str, (char *)b, len);</div><div class='add'>+ str [len] = 0;</div><div class='add'>+</div><div class='add'>+ if (ft.pad == ' ')</div><div class='add'>+ {</div><div class='add'>+ unsigned int new_len;</div><div class='add'>+</div><div class='add'>+ s = str + len;</div><div class='add'>+ while (s > str)</div><div class='add'>+ {</div><div class='add'>+ s--;</div><div class='add'>+ if ((*s != ' ') && (*s != 0))</div><div class='add'>+ {</div><div class='add'>+ s++;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ *s = 0;</div><div class='add'>+ }</div><div class='add'>+ new_len = (unsigned int) (s - str);</div><div class='add'>+</div><div class='add'>+ if (new_len != len)</div><div class='add'>+ {</div><div class='add'>+ s = SLrealloc (str, new_len + 1);</div><div class='add'>+ if (s == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLfree (str);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ str = s;</div><div class='add'>+ len = new_len;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Avoid a bstring if possible */</div><div class='add'>+ s = SLmemchr (str, 0, len);</div><div class='add'>+ if (s == NULL)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLang_push_malloced_string (str))</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ SLang_BString_Type *new_bs;</div><div class='add'>+</div><div class='add'>+ new_bs = SLbstring_create_malloced ((unsigned char *)str, len, 1);</div><div class='add'>+ if (new_bs == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_push_bstring (new_bs))</div><div class='add'>+ {</div><div class='add'>+ SLfree (str);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ SLbstring_free (new_bs);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ b += ft.repeat;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int _SLpack_compute_size (char *format)</div><div class='add'>+{</div><div class='add'>+ unsigned int n;</div><div class='add'>+</div><div class='add'>+ n = 0;</div><div class='add'>+ (void) compute_size_for_format (format, &n);</div><div class='add'>+ return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLpack_pad_format (char *format)</div><div class='add'>+{</div><div class='add'>+ unsigned int len, max_len;</div><div class='add'>+ Format_Type ft;</div><div class='add'>+ char *buf, *b;</div><div class='add'>+</div><div class='add'>+ check_native_byte_order ();</div><div class='add'>+</div><div class='add'>+ /* Just check the syntax */</div><div class='add'>+ if (-1 == compute_size_for_format (format, &max_len))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ /* This should be sufficient to handle any needed xyy padding characters.</div><div class='add'>+ * I cannot see how this will be overrun</div><div class='add'>+ */</div><div class='add'>+ max_len = 4 * (strlen (format) + 1);</div><div class='add'>+ if (NULL == (buf = SLmalloc (max_len + 1)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ b = buf;</div><div class='add'>+ len = 0;</div><div class='add'>+ while (1 == parse_a_format (&format, &ft))</div><div class='add'>+ {</div><div class='add'>+ struct { char a; short b; } s_h;</div><div class='add'>+ struct { char a; int b; } s_i;</div><div class='add'>+ struct { char a; long b; } s_l;</div><div class='add'>+ struct { char a; float b; } s_f;</div><div class='add'>+ struct { char a; double b; } s_d;</div><div class='add'>+ unsigned int pad;</div><div class='add'>+</div><div class='add'>+ if (ft.repeat == 0)</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ if (ft.data_type == 0)</div><div class='add'>+ { /* pad */</div><div class='add'>+ sprintf (b, "x%u", ft.repeat);</div><div class='add'>+ b += strlen (b);</div><div class='add'>+ len += ft.repeat;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ switch (ft.data_type)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ case SLANG_STRING_TYPE:</div><div class='add'>+ case SLANG_BSTRING_TYPE:</div><div class='add'>+ case SLANG_CHAR_TYPE:</div><div class='add'>+ case SLANG_UCHAR_TYPE:</div><div class='add'>+ pad = 0;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_SHORT_TYPE:</div><div class='add'>+ case SLANG_USHORT_TYPE:</div><div class='add'>+ pad = ((unsigned int) ((char *)&s_h.b - (char *)&s_h.a));</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_INT_TYPE:</div><div class='add'>+ case SLANG_UINT_TYPE:</div><div class='add'>+ pad = ((unsigned int) ((char *)&s_i.b - (char *)&s_i.a));</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_LONG_TYPE:</div><div class='add'>+ case SLANG_ULONG_TYPE:</div><div class='add'>+ pad = ((unsigned int) ((char *)&s_l.b - (char *)&s_l.a));</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ pad = ((unsigned int) ((char *)&s_f.b - (char *)&s_f.a));</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ pad = ((unsigned int) ((char *)&s_d.b - (char *)&s_d.a));</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Pad to a length that is an integer multiple of pad. */</div><div class='add'>+ if (pad)</div><div class='add'>+ pad = pad * ((len + pad - 1)/pad) - len;</div><div class='add'>+</div><div class='add'>+ if (pad)</div><div class='add'>+ {</div><div class='add'>+ sprintf (b, "x%u", pad);</div><div class='add'>+ b += strlen (b);</div><div class='add'>+ len += pad;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *b++ = ft.format_type;</div><div class='add'>+ if (ft.repeat > 1)</div><div class='add'>+ {</div><div class='add'>+ sprintf (b, "%u", ft.repeat);</div><div class='add'>+ b += strlen (b);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ len += ft.repeat * ft.sizeof_type;</div><div class='add'>+ }</div><div class='add'>+ *b = 0;</div><div class='add'>+</div><div class='add'>+ (void) SLang_push_malloced_string (buf);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slparse.c b/mdk-stage1/slang/slparse.c<br/>new file mode 100644<br/>index 000000000..bc709d1fb<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slparse.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slparse.c</a></div><div class='hunk'>@@ -0,0 +1,1970 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static SLang_Load_Type *LLT;</div><div class='add'>+int _SLang_Compile_Line_Num_Info;</div><div class='add'>+</div><div class='add'>+static void free_token (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ register unsigned int nrefs = t->num_refs;</div><div class='add'>+</div><div class='add'>+ if (nrefs == 0)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (nrefs == 1)</div><div class='add'>+ {</div><div class='add'>+ if (t->free_sval_flag)</div><div class='add'>+ {</div><div class='add'>+ if (t->type == BSTRING_TOKEN)</div><div class='add'>+ SLbstring_free (t->v.b_val);</div><div class='add'>+ else</div><div class='add'>+ _SLfree_hashed_string (t->v.s_val, strlen (t->v.s_val), t->hash);</div><div class='add'>+ t->v.s_val = NULL;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ t->num_refs = nrefs - 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void init_token (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ memset ((char *) t, 0, sizeof (_SLang_Token_Type));</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ t->line_number = -1;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Allow room for one push back of a token. This is necessary for</div><div class='add'>+ * multiple assignment.</div><div class='add'>+ */</div><div class='add'>+static unsigned int Use_Next_Token;</div><div class='add'>+static _SLang_Token_Type Next_Token;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+static int Last_Line_Number = -1;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int unget_token (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ return -1;</div><div class='add'>+ if (Use_Next_Token != 0)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("unget_token failed", ctok, 0);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Use_Next_Token++;</div><div class='add'>+ Next_Token = *ctok;</div><div class='add'>+ init_token (ctok);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_token (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ if (ctok->num_refs)</div><div class='add'>+ free_token (ctok);</div><div class='add'>+</div><div class='add'>+ if (Use_Next_Token)</div><div class='add'>+ {</div><div class='add'>+ Use_Next_Token--;</div><div class='add'>+ *ctok = Next_Token;</div><div class='add'>+ return ctok->type;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return _SLget_token (ctok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int compile_token (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ if (_SLang_Compile_Line_Num_Info</div><div class='add'>+ && (t->line_number != Last_Line_Number)</div><div class='add'>+ && (t->line_number != -1))</div><div class='add'>+ {</div><div class='add'>+ _SLang_Token_Type tok;</div><div class='add'>+ tok.type = LINE_NUM_TOKEN;</div><div class='add'>+ tok.v.long_val = Last_Line_Number = t->line_number;</div><div class='add'>+ (*_SLcompile_ptr) (&tok);</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ (*_SLcompile_ptr) (t);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+#define USE_PARANOID_MAGIC 0</div><div class='add'>+#if USE_PARANOID_MAGIC</div><div class='add'>+ unsigned long magic;</div><div class='add'>+#endif</div><div class='add'>+ _SLang_Token_Type *stack;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ unsigned int size;</div><div class='add'>+}</div><div class='add'>+Token_List_Type;</div><div class='add'>+</div><div class='add'>+#define MAX_TOKEN_LISTS 16</div><div class='add'>+static Token_List_Type Token_List_Stack [MAX_TOKEN_LISTS];</div><div class='add'>+static unsigned int Token_List_Stack_Depth = 0;</div><div class='add'>+static Token_List_Type *Token_List = NULL;</div><div class='add'>+</div><div class='add'>+static void init_token_list (Token_List_Type *t)</div><div class='add'>+{</div><div class='add'>+ t->size = 0;</div><div class='add'>+ t->len = 0;</div><div class='add'>+ t->stack = NULL;</div><div class='add'>+#if USE_PARANOID_MAGIC</div><div class='add'>+ t->magic = 0xABCDEF12;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void free_token_list (Token_List_Type *t)</div><div class='add'>+{</div><div class='add'>+ _SLang_Token_Type *s;</div><div class='add'>+</div><div class='add'>+ if (t == NULL)</div><div class='add'>+ return;</div><div class='add'>+#if USE_PARANOID_MAGIC</div><div class='add'>+ if (t->magic != 0xABCDEF12)</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror ("Magic error.");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ s = t->stack;</div><div class='add'>+ if (s != NULL)</div><div class='add'>+ {</div><div class='add'>+ _SLang_Token_Type *smax = s + t->len;</div><div class='add'>+ while (s != smax)</div><div class='add'>+ {</div><div class='add'>+ if (s->num_refs) free_token (s);</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLfree ((char *) t->stack);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ memset ((char *) t, 0, sizeof (Token_List_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static Token_List_Type *push_token_list (void)</div><div class='add'>+{</div><div class='add'>+ if (Token_List_Stack_Depth == MAX_TOKEN_LISTS)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Token list stack size exceeded", NULL, 0);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Token_List = Token_List_Stack + Token_List_Stack_Depth;</div><div class='add'>+ Token_List_Stack_Depth++;</div><div class='add'>+ init_token_list (Token_List);</div><div class='add'>+ return Token_List;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_token_list (int do_free)</div><div class='add'>+{</div><div class='add'>+ if (Token_List_Stack_Depth == 0)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error == 0)</div><div class='add'>+ _SLparse_error ("Token list stack underflow", NULL, 0);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ Token_List_Stack_Depth--;</div><div class='add'>+</div><div class='add'>+ if (do_free) free_token_list (Token_List);</div><div class='add'>+</div><div class='add'>+ if (Token_List_Stack_Depth != 0)</div><div class='add'>+ Token_List = Token_List_Stack + (Token_List_Stack_Depth - 1);</div><div class='add'>+ else</div><div class='add'>+ Token_List = NULL;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int check_token_list_space (Token_List_Type *t, unsigned int delta_size)</div><div class='add'>+{</div><div class='add'>+ _SLang_Token_Type *st;</div><div class='add'>+ unsigned int len;</div><div class='add'>+#if USE_PARANOID_MAGIC</div><div class='add'>+ if (t->magic != 0xABCDEF12)</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror ("Magic error.");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ len = t->len + delta_size;</div><div class='add'>+ if (len <= t->size) return 0;</div><div class='add'>+</div><div class='add'>+ if (delta_size < 4)</div><div class='add'>+ {</div><div class='add'>+ delta_size = 4;</div><div class='add'>+ len = t->len + delta_size;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ st = (_SLang_Token_Type *) SLrealloc((char *) t->stack,</div><div class='add'>+ len * sizeof(_SLang_Token_Type));</div><div class='add'>+ if (st == NULL)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Malloc error", NULL, 0);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ memset ((char *) (st + t->len), 0, delta_size);</div><div class='add'>+</div><div class='add'>+ t->stack = st;</div><div class='add'>+ t->size = len;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int append_token (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+ if (-1 == check_token_list_space (Token_List, 1))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ Token_List->stack [Token_List->len] = *t;</div><div class='add'>+ Token_List->len += 1;</div><div class='add'>+ t->num_refs = 0; /* stealing it */</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int append_token_of_type (unsigned char t)</div><div class='add'>+{</div><div class='add'>+ _SLang_Token_Type *tok;</div><div class='add'>+</div><div class='add'>+ if (-1 == check_token_list_space (Token_List, 1))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* The memset when the list was created ensures that the other fields</div><div class='add'>+ * are properly initialized.</div><div class='add'>+ */</div><div class='add'>+ tok = Token_List->stack + Token_List->len;</div><div class='add'>+ init_token (tok);</div><div class='add'>+ tok->type = t;</div><div class='add'>+ Token_List->len += 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static _SLang_Token_Type *get_last_token (void)</div><div class='add'>+{</div><div class='add'>+ unsigned int len;</div><div class='add'>+</div><div class='add'>+ if ((Token_List == NULL)</div><div class='add'>+ || (0 == (len = Token_List->len)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ len--;</div><div class='add'>+ return Token_List->stack + len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function does NOT free the list. */</div><div class='add'>+static int compile_token_list_with_fun (int dir, Token_List_Type *list,</div><div class='add'>+ int (*f)(_SLang_Token_Type *))</div><div class='add'>+{</div><div class='add'>+ _SLang_Token_Type *t0, *t1;</div><div class='add'>+</div><div class='add'>+ if (list == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (f == NULL)</div><div class='add'>+ f = compile_token;</div><div class='add'>+</div><div class='add'>+ t0 = list->stack;</div><div class='add'>+ t1 = t0 + list->len;</div><div class='add'>+</div><div class='add'>+ if (dir < 0)</div><div class='add'>+ {</div><div class='add'>+ /* backwards */</div><div class='add'>+</div><div class='add'>+ while ((SLang_Error == 0) && (t1 > t0))</div><div class='add'>+ {</div><div class='add'>+ t1--;</div><div class='add'>+ (*f) (t1);</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* forward */</div><div class='add'>+ while ((SLang_Error == 0) && (t0 < t1))</div><div class='add'>+ {</div><div class='add'>+ (*f) (t0);</div><div class='add'>+ t0++;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int compile_token_list (void)</div><div class='add'>+{</div><div class='add'>+ if (Token_List == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ compile_token_list_with_fun (1, Token_List, NULL);</div><div class='add'>+ pop_token_list (1);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Take all elements in the list from pos2 to the end and exchange them</div><div class='add'>+ * with the elements at pos1, e.g.,</div><div class='add'>+ * ...ABCDEabc ==> ...abcABCDE</div><div class='add'>+ * where pos1 denotes A and pos2 denotes a.</div><div class='add'>+ */</div><div class='add'>+static int token_list_element_exchange (unsigned int pos1, unsigned int pos2)</div><div class='add'>+{</div><div class='add'>+ _SLang_Token_Type *s, *s1, *s2;</div><div class='add'>+ unsigned int len, nloops;</div><div class='add'>+</div><div class='add'>+ if (Token_List == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ s = Token_List->stack;</div><div class='add'>+ len = Token_List->len;</div><div class='add'>+</div><div class='add'>+ if ((s == NULL) || (len == 0)</div><div class='add'>+ || (pos2 >= len))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* This may not be the most efficient algorithm but the number to swap</div><div class='add'>+ * is most-likely going to be small, e.g, 3</div><div class='add'>+ * The algorithm is to rotate the list. The particular rotation</div><div class='add'>+ * direction was chosen to make insert_token fast.</div><div class='add'>+ * It works like:</div><div class='add'>+ * @ ABCabcde --> BCabcdeA --> CabcdeAB --> abcdefAB</div><div class='add'>+ * which is optimal for Abcdef sequence produced by function calls.</div><div class='add'>+ *</div><div class='add'>+ * Profiling indicates that nloops is almost always 1, whereas the inner</div><div class='add'>+ * loop can loop many times (e.g., 9 times).</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ s2 = s + (len - 1);</div><div class='add'>+ s1 = s + pos1;</div><div class='add'>+ nloops = pos2 - pos1;</div><div class='add'>+</div><div class='add'>+ while (nloops)</div><div class='add'>+ {</div><div class='add'>+ _SLang_Token_Type save;</div><div class='add'>+</div><div class='add'>+ s = s1;</div><div class='add'>+ save = *s;</div><div class='add'>+</div><div class='add'>+ while (s < s2)</div><div class='add'>+ {</div><div class='add'>+ *s = *(s + 1);</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+ *s = save;</div><div class='add'>+</div><div class='add'>+ nloops--;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+static int insert_token (_SLang_Token_Type *t, unsigned int pos)</div><div class='add'>+{</div><div class='add'>+ if (-1 == append_token (t))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return token_list_element_exchange (pos, Token_List->len - 1);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+static void compile_token_of_type (unsigned char t)</div><div class='add'>+{</div><div class='add'>+ _SLang_Token_Type tok;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ tok.line_number = -1;</div><div class='add'>+#endif</div><div class='add'>+ tok.type = t;</div><div class='add'>+ compile_token(&tok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void statement (_SLang_Token_Type *);</div><div class='add'>+static void compound_statement (_SLang_Token_Type *);</div><div class='add'>+static void expression_with_parenthesis (_SLang_Token_Type *);</div><div class='add'>+static void handle_semicolon (_SLang_Token_Type *);</div><div class='add'>+static void statement_list (_SLang_Token_Type *);</div><div class='add'>+static void variable_list (_SLang_Token_Type *, unsigned char);</div><div class='add'>+static void struct_declaration (_SLang_Token_Type *);</div><div class='add'>+static void define_function_args (_SLang_Token_Type *);</div><div class='add'>+static void typedef_definition (_SLang_Token_Type *);</div><div class='add'>+static void function_args_expression (_SLang_Token_Type *, int);</div><div class='add'>+static void expression (_SLang_Token_Type *);</div><div class='add'>+static void expression_with_commas (_SLang_Token_Type *, int);</div><div class='add'>+static void simple_expression (_SLang_Token_Type *);</div><div class='add'>+static void unary_expression (_SLang_Token_Type *);</div><div class='add'>+static void postfix_expression (_SLang_Token_Type *);</div><div class='add'>+static int check_for_lvalue (unsigned char, _SLang_Token_Type *);</div><div class='add'>+/* static void primary_expression (_SLang_Token_Type *); */</div><div class='add'>+static void block (_SLang_Token_Type *);</div><div class='add'>+static void inline_array_expression (_SLang_Token_Type *);</div><div class='add'>+static void array_index_expression (_SLang_Token_Type *);</div><div class='add'>+static void do_multiple_assignment (_SLang_Token_Type *);</div><div class='add'>+static void try_multiple_assignment (_SLang_Token_Type *);</div><div class='add'>+#if 0</div><div class='add'>+static void not_implemented (char *what)</div><div class='add'>+{</div><div class='add'>+ char err [256];</div><div class='add'>+ sprintf (err, "Expression not implemented: %s", what);</div><div class='add'>+ _SLparse_error (err, NULL, 0);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+static void rpn_parse_line (_SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ /* multiple RPN tokens possible when the file looks like:</div><div class='add'>+ * . <end of line></div><div class='add'>+ * . <end of line></div><div class='add'>+ */</div><div class='add'>+ if (tok->type != RPN_TOKEN)</div><div class='add'>+ compile_token (tok);</div><div class='add'>+ free_token (tok);</div><div class='add'>+ }</div><div class='add'>+ while (EOF_TOKEN != _SLget_rpn_token (tok));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_identifier_token (_SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+ if (IDENT_TOKEN == get_token (tok))</div><div class='add'>+ return IDENT_TOKEN;</div><div class='add'>+</div><div class='add'>+ _SLparse_error ("Expecting identifier", tok, 0);</div><div class='add'>+ return tok->type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void define_function (_SLang_Token_Type *ctok, unsigned char type)</div><div class='add'>+{</div><div class='add'>+ _SLang_Token_Type fname;</div><div class='add'>+ </div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case STATIC_TOKEN:</div><div class='add'>+ type = DEFINE_STATIC_TOKEN;</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case PUBLIC_TOKEN:</div><div class='add'>+ type = DEFINE_PUBLIC_TOKEN;</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case PRIVATE_TOKEN:</div><div class='add'>+ type = DEFINE_PRIVATE_TOKEN;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ init_token (&fname);</div><div class='add'>+ if (IDENT_TOKEN != get_identifier_token (&fname))</div><div class='add'>+ {</div><div class='add'>+ free_token (&fname);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ compile_token_of_type(OPAREN_TOKEN);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ define_function_args (ctok);</div><div class='add'>+ compile_token_of_type(FARG_TOKEN);</div><div class='add'>+</div><div class='add'>+ if (ctok->type == OBRACE_TOKEN)</div><div class='add'>+ compound_statement(ctok);</div><div class='add'>+</div><div class='add'>+ else if (ctok->type != SEMICOLON_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error("Expecting {", ctok, 0);</div><div class='add'>+ free_token (&fname);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ fname.type = type;</div><div class='add'>+ compile_token (&fname);</div><div class='add'>+ free_token (&fname);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* statement:</div><div class='add'>+ * compound-statement</div><div class='add'>+ * if ( expression ) statement</div><div class='add'>+ * if ( expression ) statement else statement</div><div class='add'>+ * !if ( expression ) statement</div><div class='add'>+ * loop ( expression ) statement</div><div class='add'>+ * _for ( expression ) statement</div><div class='add'>+ * foreach ( expression ) statement</div><div class='add'>+ * foreach (expression ) using (expression-list) statement</div><div class='add'>+ * while ( expression ) statement</div><div class='add'>+ * do statement while (expression) ;</div><div class='add'>+ * for ( expressionopt ; expressionopt ; expressionopt ) statement</div><div class='add'>+ * ERROR_BLOCK statement</div><div class='add'>+ * EXIT_BLOCK statement</div><div class='add'>+ * USER_BLOCK0 statement</div><div class='add'>+ * USER_BLOCK1 statement</div><div class='add'>+ * USER_BLOCK2 statement</div><div class='add'>+ * USER_BLOCK3 statement</div><div class='add'>+ * USER_BLOCK4 statement</div><div class='add'>+ * forever statement</div><div class='add'>+ * break ;</div><div class='add'>+ * continue ;</div><div class='add'>+ * return expressionopt ;</div><div class='add'>+ * variable variable-list ;</div><div class='add'>+ * struct struct-decl ;</div><div class='add'>+ * define identifier function-args ;</div><div class='add'>+ * define identifier function-args compound-statement</div><div class='add'>+ * switch ( expression ) statement</div><div class='add'>+ * rpn-line</div><div class='add'>+ * at-line</div><div class='add'>+ * push ( expression )</div><div class='add'>+ * ( expression ) = expression ;</div><div class='add'>+ * expression ;</div><div class='add'>+ * expression :</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Note: This function does not return with a new token. It is up to the</div><div class='add'>+ * calling routine to handle that.</div><div class='add'>+ */</div><div class='add'>+static void statement (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ unsigned char type;</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ LLT->parse_level += 1;</div><div class='add'>+</div><div class='add'>+ switch (ctok->type)</div><div class='add'>+ {</div><div class='add'>+ case OBRACE_TOKEN:</div><div class='add'>+ compound_statement (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case IF_TOKEN:</div><div class='add'>+ case IFNOT_TOKEN:</div><div class='add'>+ type = ctok->type;</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ expression_with_parenthesis (ctok);</div><div class='add'>+ block (ctok);</div><div class='add'>+</div><div class='add'>+ if (ELSE_TOKEN != get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ compile_token_of_type (type);</div><div class='add'>+ unget_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ block (ctok);</div><div class='add'>+ if (type == IF_TOKEN) type = ELSE_TOKEN; else type = NOTELSE_TOKEN;</div><div class='add'>+ compile_token_of_type (type);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* case IFNOT_TOKEN: */</div><div class='add'>+ case LOOP_TOKEN:</div><div class='add'>+ case _FOR_TOKEN:</div><div class='add'>+ type = ctok->type;</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ expression_with_parenthesis (ctok);</div><div class='add'>+ block (ctok);</div><div class='add'>+ compile_token_of_type (type);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case FOREACH_TOKEN:</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ expression_with_parenthesis (ctok);</div><div class='add'>+</div><div class='add'>+ if (NULL == push_token_list ())</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ append_token_of_type (ARG_TOKEN);</div><div class='add'>+ if (ctok->type == USING_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ if (OPAREN_TOKEN != get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expected 'using ('", ctok, 0);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ function_args_expression (ctok, 0);</div><div class='add'>+ }</div><div class='add'>+ append_token_of_type (EARG_TOKEN);</div><div class='add'>+</div><div class='add'>+ compile_token_list ();</div><div class='add'>+</div><div class='add'>+ block (ctok);</div><div class='add'>+ compile_token_of_type (FOREACH_TOKEN);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case WHILE_TOKEN:</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ compile_token_of_type (OBRACE_TOKEN);</div><div class='add'>+ expression_with_parenthesis (ctok);</div><div class='add'>+ compile_token_of_type (CBRACE_TOKEN);</div><div class='add'>+ block (ctok);</div><div class='add'>+ compile_token_of_type (WHILE_TOKEN);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case DO_TOKEN:</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ block (ctok);</div><div class='add'>+</div><div class='add'>+ if (WHILE_TOKEN != get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error("Expecting while", ctok, 0);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ get_token (ctok);</div><div class='add'>+</div><div class='add'>+ compile_token_of_type (OBRACE_TOKEN);</div><div class='add'>+ expression_with_parenthesis (ctok);</div><div class='add'>+ compile_token_of_type (CBRACE_TOKEN);</div><div class='add'>+ compile_token_of_type (DOWHILE_TOKEN);</div><div class='add'>+ handle_semicolon (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case FOR_TOKEN:</div><div class='add'>+</div><div class='add'>+ /* Look for (exp_opt ; exp_opt ; exp_opt ) */</div><div class='add'>+</div><div class='add'>+ if (OPAREN_TOKEN != get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error("Expecting (.", ctok, 0);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == push_token_list ())</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ append_token_of_type (OBRACE_TOKEN);</div><div class='add'>+ if (SEMICOLON_TOKEN != get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ expression (ctok);</div><div class='add'>+ if (ctok->type != SEMICOLON_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error("Expecting ;", ctok, 0);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ append_token_of_type (CBRACE_TOKEN);</div><div class='add'>+</div><div class='add'>+ append_token_of_type (OBRACE_TOKEN);</div><div class='add'>+ if (SEMICOLON_TOKEN != get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ expression (ctok);</div><div class='add'>+ if (ctok->type != SEMICOLON_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error("Expecting ;", ctok, 0);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ append_token_of_type (CBRACE_TOKEN);</div><div class='add'>+</div><div class='add'>+ append_token_of_type (OBRACE_TOKEN);</div><div class='add'>+ if (CPAREN_TOKEN != get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ expression (ctok);</div><div class='add'>+ if (ctok->type != CPAREN_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error("Expecting ).", ctok, 0);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ append_token_of_type (CBRACE_TOKEN);</div><div class='add'>+</div><div class='add'>+ compile_token_list ();</div><div class='add'>+</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ block (ctok);</div><div class='add'>+ compile_token_of_type (FOR_TOKEN);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case ERRBLK_TOKEN:</div><div class='add'>+ case EXITBLK_TOKEN:</div><div class='add'>+ case USRBLK0_TOKEN:</div><div class='add'>+ case USRBLK1_TOKEN:</div><div class='add'>+ case USRBLK2_TOKEN:</div><div class='add'>+ case USRBLK3_TOKEN:</div><div class='add'>+ case USRBLK4_TOKEN:</div><div class='add'>+ case FOREVER_TOKEN:</div><div class='add'>+ type = ctok->type;</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ block (ctok);</div><div class='add'>+ compile_token_of_type (type);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case BREAK_TOKEN:</div><div class='add'>+ case CONT_TOKEN:</div><div class='add'>+ compile_token_of_type (ctok->type);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ handle_semicolon (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case RETURN_TOKEN:</div><div class='add'>+ if (SEMICOLON_TOKEN != get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ if (NULL == push_token_list ())</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ expression (ctok);</div><div class='add'>+</div><div class='add'>+ if (ctok->type != SEMICOLON_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting ;", ctok, 0);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ compile_token_list ();</div><div class='add'>+ }</div><div class='add'>+ compile_token_of_type (RETURN_TOKEN);</div><div class='add'>+ handle_semicolon (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case STATIC_TOKEN:</div><div class='add'>+ case PRIVATE_TOKEN:</div><div class='add'>+ case PUBLIC_TOKEN:</div><div class='add'>+ type = ctok->type;</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ if (ctok->type == VARIABLE_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ variable_list (ctok, type);</div><div class='add'>+ handle_semicolon (ctok);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ if (ctok->type == DEFINE_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ define_function (ctok, type);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ _SLparse_error ("Expecting 'variable' or 'define'", ctok, 0);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case VARIABLE_TOKEN:</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ variable_list (ctok, OBRACKET_TOKEN);</div><div class='add'>+ handle_semicolon (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case TYPEDEF_TOKEN:</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ if (NULL == push_token_list ())</div><div class='add'>+ break;</div><div class='add'>+ typedef_definition (ctok);</div><div class='add'>+ compile_token_list ();</div><div class='add'>+</div><div class='add'>+ handle_semicolon (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case DEFINE_TOKEN:</div><div class='add'>+ define_function (ctok, DEFINE_TOKEN);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SWITCH_TOKEN:</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ expression_with_parenthesis (ctok);</div><div class='add'>+</div><div class='add'>+ while ((SLang_Error == 0)</div><div class='add'>+ && (OBRACE_TOKEN == ctok->type))</div><div class='add'>+ {</div><div class='add'>+ compile_token_of_type (OBRACE_TOKEN);</div><div class='add'>+ compound_statement (ctok);</div><div class='add'>+ compile_token_of_type (CBRACE_TOKEN);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ }</div><div class='add'>+ compile_token_of_type (SWITCH_TOKEN);</div><div class='add'>+ unget_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EOF_TOKEN:</div><div class='add'>+ break;</div><div class='add'>+#if 0</div><div class='add'>+ case PUSH_TOKEN:</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ expression_list_with_parenthesis (ctok);</div><div class='add'>+ handle_semicolon (ctok);</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ case SEMICOLON_TOKEN:</div><div class='add'>+ handle_semicolon (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case RPN_TOKEN:</div><div class='add'>+ if (POUND_TOKEN == get_token (ctok))</div><div class='add'>+ _SLcompile_byte_compiled ();</div><div class='add'>+ else if (ctok->type != EOF_TOKEN)</div><div class='add'>+ rpn_parse_line (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case OPAREN_TOKEN: /* multiple assignment */</div><div class='add'>+ try_multiple_assignment (ctok);</div><div class='add'>+ if (ctok->type == COLON_TOKEN)</div><div class='add'>+ compile_token_of_type (COLON_TOKEN);</div><div class='add'>+ else handle_semicolon (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+</div><div class='add'>+ if (NULL == push_token_list ())</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ expression (ctok);</div><div class='add'>+ compile_token_list ();</div><div class='add'>+</div><div class='add'>+ if (ctok->type == COLON_TOKEN)</div><div class='add'>+ compile_token_of_type (COLON_TOKEN);</div><div class='add'>+ else handle_semicolon (ctok);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ LLT->parse_level -= 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void block (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ compile_token_of_type (OBRACE_TOKEN);</div><div class='add'>+ statement (ctok);</div><div class='add'>+ compile_token_of_type (CBRACE_TOKEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * statement-list:</div><div class='add'>+ * statement</div><div class='add'>+ * statement-list statement</div><div class='add'>+ */</div><div class='add'>+static void statement_list (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ while ((SLang_Error == 0)</div><div class='add'>+ && (ctok->type != CBRACE_TOKEN)</div><div class='add'>+ && (ctok->type != EOF_TOKEN))</div><div class='add'>+ {</div><div class='add'>+ statement(ctok);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* compound-statement:</div><div class='add'>+ * { statement-list }</div><div class='add'>+ */</div><div class='add'>+static void compound_statement (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ /* ctok->type is OBRACE_TOKEN here */</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ statement_list(ctok);</div><div class='add'>+ if (CBRACE_TOKEN != ctok->type)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting '}'", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function is only called from statement. */</div><div class='add'>+static void expression_with_parenthesis (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ if (ctok->type != OPAREN_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error("Expecting (", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == push_token_list ())</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ expression (ctok);</div><div class='add'>+</div><div class='add'>+ if (ctok->type != CPAREN_TOKEN)</div><div class='add'>+ _SLparse_error("Expecting )", ctok, 0);</div><div class='add'>+</div><div class='add'>+ compile_token_list ();</div><div class='add'>+</div><div class='add'>+ get_token (ctok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void handle_semicolon (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ if ((ctok->type == SEMICOLON_TOKEN)</div><div class='add'>+ || (ctok->type == EOF_TOKEN))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ _SLparse_error ("Expecting ;", ctok, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLparse_start (SLang_Load_Type *llt)</div><div class='add'>+{</div><div class='add'>+ _SLang_Token_Type ctok;</div><div class='add'>+ SLang_Load_Type *save_llt;</div><div class='add'>+ unsigned int save_use_next_token;</div><div class='add'>+ _SLang_Token_Type save_next_token;</div><div class='add'>+ Token_List_Type *save_list;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ int save_last_line_number = Last_Line_Number;</div><div class='add'>+</div><div class='add'>+ Last_Line_Number = -1;</div><div class='add'>+#endif</div><div class='add'>+ save_use_next_token = Use_Next_Token;</div><div class='add'>+ save_next_token = Next_Token;</div><div class='add'>+ save_list = Token_List;</div><div class='add'>+ save_llt = LLT;</div><div class='add'>+ LLT = llt;</div><div class='add'>+</div><div class='add'>+ init_token (&Next_Token);</div><div class='add'>+ Use_Next_Token = 0;</div><div class='add'>+ init_token (&ctok);</div><div class='add'>+ get_token (&ctok);</div><div class='add'>+</div><div class='add'>+ llt->parse_level = 0;</div><div class='add'>+ statement_list (&ctok);</div><div class='add'>+</div><div class='add'>+ if ((SLang_Error == 0)</div><div class='add'>+ && (ctok.type != EOF_TOKEN))</div><div class='add'>+ _SLparse_error ("Parse ended prematurely", &ctok, 0);</div><div class='add'>+ </div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_Error < 0) /* severe error */</div><div class='add'>+ save_list = NULL;</div><div class='add'>+</div><div class='add'>+ while (Token_List != save_list)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == pop_token_list (1))</div><div class='add'>+ break; /* ??? when would this happen? */</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ free_token (&ctok);</div><div class='add'>+ LLT = save_llt;</div><div class='add'>+ if (Use_Next_Token)</div><div class='add'>+ free_token (&Next_Token);</div><div class='add'>+ Use_Next_Token = save_use_next_token;</div><div class='add'>+ Next_Token = save_next_token;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ Last_Line_Number = save_last_line_number;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* variable-list:</div><div class='add'>+ * variable-decl</div><div class='add'>+ * variable-decl variable-list</div><div class='add'>+ *</div><div class='add'>+ * variable-decl:</div><div class='add'>+ * identifier</div><div class='add'>+ * identifier = simple-expression</div><div class='add'>+ */</div><div class='add'>+static void variable_list (_SLang_Token_Type *name_token, unsigned char variable_type)</div><div class='add'>+{</div><div class='add'>+ int declaring;</div><div class='add'>+ _SLang_Token_Type tok;</div><div class='add'>+</div><div class='add'>+ if (name_token->type != IDENT_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting a variable name", name_token, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ declaring = 0;</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ if (declaring == 0)</div><div class='add'>+ {</div><div class='add'>+ declaring = 1;</div><div class='add'>+ compile_token_of_type (variable_type);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ compile_token (name_token);</div><div class='add'>+</div><div class='add'>+ init_token (&tok);</div><div class='add'>+ if (ASSIGN_TOKEN == get_token (&tok))</div><div class='add'>+ {</div><div class='add'>+ compile_token_of_type (CBRACKET_TOKEN);</div><div class='add'>+ declaring = 0;</div><div class='add'>+</div><div class='add'>+ get_token (&tok);</div><div class='add'>+</div><div class='add'>+ push_token_list ();</div><div class='add'>+ simple_expression (&tok);</div><div class='add'>+ compile_token_list ();</div><div class='add'>+</div><div class='add'>+ name_token->type = _SCALAR_ASSIGN_TOKEN;</div><div class='add'>+ compile_token (name_token);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ free_token (name_token);</div><div class='add'>+ *name_token = tok;</div><div class='add'>+ }</div><div class='add'>+ while ((name_token->type == COMMA_TOKEN)</div><div class='add'>+ && (IDENT_TOKEN == get_token (name_token)));</div><div class='add'>+</div><div class='add'>+ if (declaring) compile_token_of_type (CBRACKET_TOKEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* struct-declaration:</div><div class='add'>+ * struct { struct-field-list };</div><div class='add'>+ *</div><div class='add'>+ * struct-field-list:</div><div class='add'>+ * struct-field-name , struct-field-list</div><div class='add'>+ * struct-field-name</div><div class='add'>+ *</div><div class='add'>+ * Generates code: "field-name-1" ... "field-name-N" N STRUCT_TOKEN</div><div class='add'>+ */</div><div class='add'>+static void struct_declaration (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ int n;</div><div class='add'>+ _SLang_Token_Type num_tok;</div><div class='add'>+</div><div class='add'>+ if (ctok->type != OBRACE_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting {", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ n = 0;</div><div class='add'>+ while (IDENT_TOKEN == get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ n++;</div><div class='add'>+ ctok->type = STRING_TOKEN;</div><div class='add'>+ append_token (ctok);</div><div class='add'>+ if (COMMA_TOKEN != get_token (ctok))</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ctok->type != CBRACE_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting }", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ if (n == 0)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("struct requires at least 1 field", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ init_token (&num_tok);</div><div class='add'>+ num_tok.type = INT_TOKEN;</div><div class='add'>+ num_tok.v.long_val = n;</div><div class='add'>+ append_token (&num_tok);</div><div class='add'>+ append_token_of_type (STRUCT_TOKEN);</div><div class='add'>+</div><div class='add'>+ get_token (ctok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* struct-declaration:</div><div class='add'>+ * typedef struct { struct-field-list } Type_Name;</div><div class='add'>+ *</div><div class='add'>+ * struct-field-list:</div><div class='add'>+ * struct-field-name , struct-field-list</div><div class='add'>+ * struct-field-name</div><div class='add'>+ *</div><div class='add'>+ * Generates code: "field-name-1" ... "field-name-N" N STRUCT_TOKEN typedef</div><div class='add'>+ */</div><div class='add'>+static void typedef_definition (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+</div><div class='add'>+ if (t->type != STRUCT_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting `struct'", t, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ get_token (t);</div><div class='add'>+</div><div class='add'>+ struct_declaration (t);</div><div class='add'>+ if (t->type != IDENT_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting identifier", t, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ t->type = STRING_TOKEN;</div><div class='add'>+ append_token (t);</div><div class='add'>+ append_token_of_type (TYPEDEF_TOKEN);</div><div class='add'>+</div><div class='add'>+ get_token (t);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* function-args:</div><div class='add'>+ * ( args-dec-opt )</div><div class='add'>+ *</div><div class='add'>+ * args-decl-opt:</div><div class='add'>+ * identifier</div><div class='add'>+ * args-decl , identifier</div><div class='add'>+ */</div><div class='add'>+static void define_function_args (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ if (CPAREN_TOKEN == get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ compile_token_of_type(OBRACKET_TOKEN);</div><div class='add'>+</div><div class='add'>+ while ((SLang_Error == 0)</div><div class='add'>+ && (ctok->type == IDENT_TOKEN))</div><div class='add'>+ {</div><div class='add'>+ compile_token (ctok);</div><div class='add'>+ if (COMMA_TOKEN != get_token (ctok))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (CPAREN_TOKEN != ctok->type)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error("Expecting )", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ compile_token_of_type(CBRACKET_TOKEN);</div><div class='add'>+</div><div class='add'>+ get_token (ctok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void try_multiple_assignment (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ /* This is called with ctok->type == OPAREN_TOKEN. We have no idea</div><div class='add'>+ * what follows this. There are various possibilities such as:</div><div class='add'>+ * @ () = x;</div><div class='add'>+ * @ ( expression ) = x;</div><div class='add'>+ * @ ( expression ) ;</div><div class='add'>+ * @ ( expression ) OP expression;</div><div class='add'>+ * @ ( expression ) [expression] = expression;</div><div class='add'>+ * and only the first two constitute a multiple assignment. The last</div><div class='add'>+ * two forms create the difficulty.</div><div class='add'>+ *</div><div class='add'>+ * Here is the plan. First parse (expression) and then check next token.</div><div class='add'>+ * If it is an equal operator, then it will be parsed as a multiple</div><div class='add'>+ * assignment. In fact, that is the easy part.</div><div class='add'>+ *</div><div class='add'>+ * The hard part stems from the fact that by parsing (expression), we</div><div class='add'>+ * have effectly truncated the parse if (expression) is part of a binary</div><div class='add'>+ * or unary expression. Somehow, the parsing must be resumed. The trick</div><div class='add'>+ * here is to use a dummy literal that generates no code: NO_OP_LITERAL</div><div class='add'>+ * Using it, we just call 'expression' and proceed.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ if (NULL == push_token_list ())</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ get_token (ctok);</div><div class='add'>+</div><div class='add'>+ if (ctok->type != CPAREN_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ expression_with_commas (ctok, 1);</div><div class='add'>+ if (ctok->type != CPAREN_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting )", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ switch (get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ case ASSIGN_TOKEN:</div><div class='add'>+ case PLUSEQS_TOKEN:</div><div class='add'>+ case MINUSEQS_TOKEN:</div><div class='add'>+ case TIMESEQS_TOKEN:</div><div class='add'>+ case DIVEQS_TOKEN:</div><div class='add'>+ case BOREQS_TOKEN:</div><div class='add'>+ case BANDEQS_TOKEN:</div><div class='add'>+ do_multiple_assignment (ctok);</div><div class='add'>+ pop_token_list (1);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ unget_token (ctok);</div><div class='add'>+ ctok->type = NO_OP_LITERAL;</div><div class='add'>+ expression (ctok);</div><div class='add'>+ compile_token_list ();</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note: expression never gets compiled directly. Rather, it gets</div><div class='add'>+ * appended to the token list and then compiled by a calling</div><div class='add'>+ * routine.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* expression:</div><div class='add'>+ * simple_expression</div><div class='add'>+ * simple-expression , expression</div><div class='add'>+ * <none></div><div class='add'>+ */</div><div class='add'>+static void expression_with_commas (_SLang_Token_Type *ctok, int save_comma)</div><div class='add'>+{</div><div class='add'>+ while (SLang_Error == 0)</div><div class='add'>+ {</div><div class='add'>+ if (ctok->type != COMMA_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ if (ctok->type == CPAREN_TOKEN)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ simple_expression (ctok);</div><div class='add'>+</div><div class='add'>+ if (ctok->type != COMMA_TOKEN)</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ if (save_comma) append_token (ctok);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void expression (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ expression_with_commas (ctok, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* priority levels of binary operations */</div><div class='add'>+static unsigned char Binop_Level[] =</div><div class='add'>+{</div><div class='add'>+/* ADD_TOKEN */ 2,</div><div class='add'>+/* SUB_TOKEN */ 2,</div><div class='add'>+/* MUL_TOKEN */ 1,</div><div class='add'>+/* DIV_TOKEN */ 1,</div><div class='add'>+/* LT_TOKEN */ 4,</div><div class='add'>+/* LE_TOKEN */ 4,</div><div class='add'>+/* GT_TOKEN */ 4,</div><div class='add'>+/* GE_TOKEN */ 4,</div><div class='add'>+/* EQ_TOKEN */ 5,</div><div class='add'>+/* NE_TOKEN */ 5,</div><div class='add'>+/* AND_TOKEN */ 9,</div><div class='add'>+/* OR_TOKEN */ 10,</div><div class='add'>+/* MOD_TOKEN */ 1,</div><div class='add'>+/* BAND_TOKEN */ 6,</div><div class='add'>+/* SHL_TOKEN */ 3,</div><div class='add'>+/* SHR_TOKEN */ 3,</div><div class='add'>+/* BXOR_TOKEN */ 7,</div><div class='add'>+/* BOR_TOKEN */ 8,</div><div class='add'>+/* POUND_TOKEN */ 1 /* Matrix Multiplication */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* % Note: simple-expression groups operators OP1 at same level. The</div><div class='add'>+ * % actual implementation will not do this.</div><div class='add'>+ * simple-expression:</div><div class='add'>+ * unary-expression</div><div class='add'>+ * binary-expression BINARY-OP unary-expression</div><div class='add'>+ * andelse xxelse-expression-list</div><div class='add'>+ * orelse xxelse-expression-list</div><div class='add'>+ *</div><div class='add'>+ * xxelse-expression-list:</div><div class='add'>+ * { expression }</div><div class='add'>+ * xxelse-expression-list { expression }</div><div class='add'>+ * binary-expression:</div><div class='add'>+ * unary-expression</div><div class='add'>+ * unary-expression BINARY-OP binary-expression</div><div class='add'>+ */</div><div class='add'>+static void simple_expression (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ unsigned char type;</div><div class='add'>+ unsigned char op_stack [64];</div><div class='add'>+ unsigned char level_stack [64];</div><div class='add'>+ unsigned char level;</div><div class='add'>+ unsigned int op_num;</div><div class='add'>+</div><div class='add'>+ switch (ctok->type)</div><div class='add'>+ {</div><div class='add'>+ case ANDELSE_TOKEN:</div><div class='add'>+ case ORELSE_TOKEN:</div><div class='add'>+ type = ctok->type;</div><div class='add'>+ if (OBRACE_TOKEN != get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting '{'", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (ctok->type == OBRACE_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ append_token (ctok);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ expression (ctok);</div><div class='add'>+ if (CBRACE_TOKEN != ctok->type)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error("Expecting }", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ append_token (ctok);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ }</div><div class='add'>+ append_token_of_type (type);</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ /* avoid unary-expression if possible */</div><div class='add'>+ case STRING_TOKEN:</div><div class='add'>+ append_token (ctok);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ unary_expression (ctok);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (SEMICOLON_TOKEN == (type = ctok->type))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ op_num = 0;</div><div class='add'>+</div><div class='add'>+ while ((SLang_Error == 0)</div><div class='add'>+ && (IS_BINARY_OP(type)))</div><div class='add'>+ {</div><div class='add'>+ level = Binop_Level[type - FIRST_BINARY_OP];</div><div class='add'>+</div><div class='add'>+ while ((op_num > 0) && (level_stack [op_num - 1] <= level))</div><div class='add'>+ append_token_of_type (op_stack [--op_num]);</div><div class='add'>+</div><div class='add'>+ if (op_num >= sizeof (op_stack) - 1)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Binary op stack overflow", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ op_stack [op_num] = type;</div><div class='add'>+ level_stack [op_num] = level;</div><div class='add'>+ op_num++;</div><div class='add'>+</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ unary_expression (ctok);</div><div class='add'>+ type = ctok->type;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (op_num > 0)</div><div class='add'>+ append_token_of_type(op_stack[--op_num]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* unary-expression:</div><div class='add'>+ * postfix-expression</div><div class='add'>+ * ++ postfix-expression</div><div class='add'>+ * -- postfix-expression</div><div class='add'>+ * case unary-expression</div><div class='add'>+ * OP3 unary-expression</div><div class='add'>+ * (OP3: + - ~ & not @)</div><div class='add'>+ *</div><div class='add'>+ * Note: This grammar permits: case case case WHATEVER</div><div class='add'>+ */</div><div class='add'>+static void unary_expression (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ unsigned char save_unary_ops [16];</div><div class='add'>+ unsigned int num_unary_ops;</div><div class='add'>+ unsigned char type;</div><div class='add'>+ _SLang_Token_Type *last_token;</div><div class='add'>+</div><div class='add'>+ num_unary_ops = 0;</div><div class='add'>+ while (SLang_Error == 0)</div><div class='add'>+ {</div><div class='add'>+ type = ctok->type;</div><div class='add'>+</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case PLUSPLUS_TOKEN:</div><div class='add'>+ case MINUSMINUS_TOKEN:</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ postfix_expression (ctok);</div><div class='add'>+ check_for_lvalue (type, NULL);</div><div class='add'>+ goto out_of_switch;</div><div class='add'>+</div><div class='add'>+ case ADD_TOKEN:</div><div class='add'>+ get_token (ctok); /* skip it-- it's unary here */</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SUB_TOKEN:</div><div class='add'>+ (void) get_token (ctok);</div><div class='add'>+ if (IS_INTEGER_TOKEN (ctok->type))</div><div class='add'>+ {</div><div class='add'>+ ctok->v.long_val = -ctok->v.long_val;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (num_unary_ops == 16)</div><div class='add'>+ goto stack_overflow_error;</div><div class='add'>+ save_unary_ops [num_unary_ops++] = CHS_TOKEN;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case DEREF_TOKEN:</div><div class='add'>+ case BNOT_TOKEN:</div><div class='add'>+ case NOT_TOKEN:</div><div class='add'>+ case CASE_TOKEN:</div><div class='add'>+ if (num_unary_ops == 16)</div><div class='add'>+ goto stack_overflow_error;</div><div class='add'>+</div><div class='add'>+ save_unary_ops [num_unary_ops++] = type;</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* Try to avoid ->postfix_expression->primary_expression</div><div class='add'>+ * subroutine calls.</div><div class='add'>+ */</div><div class='add'>+ case STRING_TOKEN:</div><div class='add'>+ append_token (ctok);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ goto out_of_switch;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ postfix_expression (ctok);</div><div class='add'>+ goto out_of_switch;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ out_of_switch:</div><div class='add'>+ if (num_unary_ops == 0)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if ((DEREF_TOKEN == save_unary_ops[num_unary_ops - 1])</div><div class='add'>+ && (NULL != (last_token = get_last_token ()))</div><div class='add'>+ && (IS_ASSIGN_TOKEN(last_token->type)))</div><div class='add'>+ {</div><div class='add'>+ /* FIXME: Priority=medium</div><div class='add'>+ * This needs generalized so that things like @a.y = 1 will work properly.</div><div class='add'>+ */</div><div class='add'>+ if ((num_unary_ops != 1)</div><div class='add'>+ || (last_token->type != _SCALAR_ASSIGN_TOKEN))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, </div><div class='add'>+ "Only derefence assignments to simple variables are possible");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ last_token->type += (_DEREF_ASSIGN_TOKEN - _SCALAR_ASSIGN_TOKEN);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (num_unary_ops)</div><div class='add'>+ {</div><div class='add'>+ num_unary_ops--;</div><div class='add'>+ append_token_of_type (save_unary_ops [num_unary_ops]);</div><div class='add'>+ }</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ stack_overflow_error:</div><div class='add'>+ _SLparse_error ("Too many unary operators.", ctok, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int combine_namespace_tokens (_SLang_Token_Type *a, _SLang_Token_Type *b)</div><div class='add'>+{</div><div class='add'>+ char *sa, *sb, *sc;</div><div class='add'>+ unsigned int lena, lenb;</div><div class='add'>+ unsigned long hash;</div><div class='add'>+</div><div class='add'>+ /* This is somewhat of a hack. Combine the TWO identifier names</div><div class='add'>+ * (NAMESPACE) and (name) into the form NAMESPACE->name. Then when the</div><div class='add'>+ * byte compiler compiles the object it will not be found. It will then</div><div class='add'>+ * check for this hack and make the appropriate namespace lookup.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ sa = a->v.s_val;</div><div class='add'>+ sb = b->v.s_val;</div><div class='add'>+</div><div class='add'>+ lena = strlen (sa);</div><div class='add'>+ lenb = strlen (sb);</div><div class='add'>+</div><div class='add'>+ sc = SLmalloc (lena + lenb + 3);</div><div class='add'>+ if (sc == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ strcpy (sc, sa);</div><div class='add'>+ strcpy (sc + lena, "->");</div><div class='add'>+ strcpy (sc + lena + 2, sb);</div><div class='add'>+</div><div class='add'>+ sb = _SLstring_make_hashed_string (sc, lena + lenb + 2, &hash);</div><div class='add'>+ SLfree (sc);</div><div class='add'>+ if (sb == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* I can free this string because no other token should be referencing it.</div><div class='add'>+ * (num_refs == 1).</div><div class='add'>+ */</div><div class='add'>+ _SLfree_hashed_string (sa, lena, a->hash);</div><div class='add'>+ a->v.s_val = sb;</div><div class='add'>+ a->hash = hash;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void append_identifier_token (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ _SLang_Token_Type *last_token;</div><div class='add'>+</div><div class='add'>+ append_token (ctok);</div><div class='add'>+</div><div class='add'>+ if (NAMESPACE_TOKEN != get_token (ctok))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (IDENT_TOKEN != get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting name-space identifier", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ last_token = get_last_token ();</div><div class='add'>+ if (-1 == combine_namespace_tokens (last_token, ctok))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ (void) get_token (ctok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_identifier_expr_token (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ _SLang_Token_Type next_token;</div><div class='add'>+</div><div class='add'>+ if (IDENT_TOKEN != get_identifier_token (ctok))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ init_token (&next_token);</div><div class='add'>+ if (NAMESPACE_TOKEN != get_token (&next_token))</div><div class='add'>+ {</div><div class='add'>+ unget_token (&next_token);</div><div class='add'>+ return IDENT_TOKEN;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (IDENT_TOKEN != get_identifier_token (&next_token))</div><div class='add'>+ {</div><div class='add'>+ free_token (&next_token);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == combine_namespace_tokens (ctok, &next_token))</div><div class='add'>+ {</div><div class='add'>+ free_token (&next_token);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ free_token (&next_token);</div><div class='add'>+ return IDENT_TOKEN;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* postfix-expression:</div><div class='add'>+ * primary-expression</div><div class='add'>+ * postfix-expression [ expression ]</div><div class='add'>+ * postfix-expression ( function-args-expression )</div><div class='add'>+ * postfix-expression . identifier</div><div class='add'>+ * postfix-expression ^ unary-expression</div><div class='add'>+ * postfix-expression ++</div><div class='add'>+ * postfix-expression --</div><div class='add'>+ * postfix-expression = simple-expression</div><div class='add'>+ * postfix-expression += simple-expression</div><div class='add'>+ * postfix-expression -= simple-expression</div><div class='add'>+ *</div><div class='add'>+ * primary-expression:</div><div class='add'>+ * literal</div><div class='add'>+ * identifier-expr</div><div class='add'>+ * ( expression_opt )</div><div class='add'>+ * [ inline-array-expression ]</div><div class='add'>+ * &identifier-expr</div><div class='add'>+ * struct-definition</div><div class='add'>+ * __tmp(identifier-expr)</div><div class='add'>+ *</div><div class='add'>+ * identifier-expr:</div><div class='add'>+ * identifier</div><div class='add'>+ * identifier->identifier</div><div class='add'>+ */</div><div class='add'>+static void postfix_expression (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ unsigned int start_pos, end_pos;</div><div class='add'>+ unsigned char type;</div><div class='add'>+</div><div class='add'>+ if (Token_List == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ start_pos = Token_List->len;</div><div class='add'>+</div><div class='add'>+ switch (ctok->type)</div><div class='add'>+ {</div><div class='add'>+ case IDENT_TOKEN:</div><div class='add'>+ append_identifier_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case CHAR_TOKEN:</div><div class='add'>+ case SHORT_TOKEN:</div><div class='add'>+ case INT_TOKEN:</div><div class='add'>+ case LONG_TOKEN:</div><div class='add'>+ case UCHAR_TOKEN:</div><div class='add'>+ case USHORT_TOKEN:</div><div class='add'>+ case UINT_TOKEN:</div><div class='add'>+ case ULONG_TOKEN:</div><div class='add'>+ case STRING_TOKEN:</div><div class='add'>+ case BSTRING_TOKEN:</div><div class='add'>+#ifdef SLANG_HAS_FLOAT</div><div class='add'>+ case DOUBLE_TOKEN:</div><div class='add'>+ case FLOAT_TOKEN:</div><div class='add'>+#endif</div><div class='add'>+#ifdef SLANG_HAS_COMPLEX</div><div class='add'>+ case COMPLEX_TOKEN:</div><div class='add'>+#endif</div><div class='add'>+ append_token (ctok);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case OPAREN_TOKEN:</div><div class='add'>+ if (CPAREN_TOKEN != get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ expression (ctok);</div><div class='add'>+ if (ctok->type != CPAREN_TOKEN)</div><div class='add'>+ _SLparse_error("Expecting )", ctok, 0);</div><div class='add'>+ }</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case BAND_TOKEN:</div><div class='add'>+ if (IDENT_TOKEN != get_identifier_expr_token (ctok))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ ctok->type = _REF_TOKEN;</div><div class='add'>+ append_token (ctok);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case OBRACKET_TOKEN:</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ inline_array_expression (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case NO_OP_LITERAL:</div><div class='add'>+ /* This token was introduced by try_multiple_assignment. There,</div><div class='add'>+ * a new token_list was pushed and (expression) was evaluated.</div><div class='add'>+ * NO_OP_LITERAL represents the result of expression. However,</div><div class='add'>+ * we need to tweak the start_pos variable to point to the beginning</div><div class='add'>+ * of the token list to complete the equivalence.</div><div class='add'>+ */</div><div class='add'>+ start_pos = 0;</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case STRUCT_TOKEN:</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ struct_declaration (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case TMP_TOKEN:</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ if (ctok->type == OPAREN_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ if (IDENT_TOKEN == get_identifier_expr_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ ctok->type = TMP_TOKEN;</div><div class='add'>+ append_token (ctok);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ if (ctok->type == CPAREN_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ _SLparse_error ("Expecting form __tmp(NAME)", ctok, 0);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ if (IS_INTERNAL_FUNC(ctok->type))</div><div class='add'>+ {</div><div class='add'>+ append_token (ctok);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ _SLparse_error("Expecting a PRIMARY", ctok, 0);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (SLang_Error == 0)</div><div class='add'>+ {</div><div class='add'>+ end_pos = Token_List->len;</div><div class='add'>+ type = ctok->type;</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case OBRACKET_TOKEN: /* X[args] ==> [args] X ARRAY */</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ append_token_of_type (ARG_TOKEN);</div><div class='add'>+ if (ctok->type != CBRACKET_TOKEN) </div><div class='add'>+ array_index_expression (ctok);</div><div class='add'>+</div><div class='add'>+ if (ctok->type != CBRACKET_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting ']'", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ /* append_token_of_type (EARG_TOKEN); -- ARRAY_TOKEN implicitely does this */</div><div class='add'>+ token_list_element_exchange (start_pos, end_pos);</div><div class='add'>+ append_token_of_type (ARRAY_TOKEN);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case OPAREN_TOKEN:</div><div class='add'>+ /* f(args) ==> args f */</div><div class='add'>+ if (CPAREN_TOKEN != get_token (ctok))</div><div class='add'>+ {</div><div class='add'>+ function_args_expression (ctok, 1);</div><div class='add'>+ token_list_element_exchange (start_pos, end_pos);</div><div class='add'>+ }</div><div class='add'>+ else get_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case DOT_TOKEN:</div><div class='add'>+ /* S.a ==> "a" S DOT</div><div class='add'>+ * This means that if S is X[b], then X[b].a ==> a b X ARRAY DOT</div><div class='add'>+ * and f(a).X[b].c ==> "c" b "X" a f . ARRAY .</div><div class='add'>+ * Also, f(a).X[b] = g(x); ==> x g b "X" a f .</div><div class='add'>+ */</div><div class='add'>+ if (IDENT_TOKEN != get_identifier_token (ctok))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ ctok->type = DOT_TOKEN;</div><div class='add'>+ append_token (ctok);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case PLUSPLUS_TOKEN:</div><div class='add'>+ case MINUSMINUS_TOKEN:</div><div class='add'>+ check_for_lvalue (type, NULL);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case ASSIGN_TOKEN:</div><div class='add'>+ case PLUSEQS_TOKEN:</div><div class='add'>+ case MINUSEQS_TOKEN:</div><div class='add'>+ case TIMESEQS_TOKEN:</div><div class='add'>+ case DIVEQS_TOKEN:</div><div class='add'>+ case BOREQS_TOKEN:</div><div class='add'>+ case BANDEQS_TOKEN:</div><div class='add'>+ check_for_lvalue (type, NULL);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ simple_expression (ctok);</div><div class='add'>+ token_list_element_exchange (start_pos, end_pos);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case POW_TOKEN:</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ unary_expression (ctok);</div><div class='add'>+ append_token_of_type (POW_TOKEN);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void function_args_expression (_SLang_Token_Type *ctok, int handle_num_args)</div><div class='add'>+{</div><div class='add'>+ unsigned char last_type, this_type;</div><div class='add'>+</div><div class='add'>+ if (handle_num_args) append_token_of_type (ARG_TOKEN);</div><div class='add'>+</div><div class='add'>+ last_type = COMMA_TOKEN;</div><div class='add'>+</div><div class='add'>+ while (SLang_Error == 0)</div><div class='add'>+ {</div><div class='add'>+ this_type = ctok->type;</div><div class='add'>+</div><div class='add'>+ switch (this_type)</div><div class='add'>+ {</div><div class='add'>+ case COMMA_TOKEN:</div><div class='add'>+ if (last_type == COMMA_TOKEN)</div><div class='add'>+ append_token_of_type (_NULL_TOKEN);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case CPAREN_TOKEN:</div><div class='add'>+ if (last_type == COMMA_TOKEN)</div><div class='add'>+ append_token_of_type (_NULL_TOKEN);</div><div class='add'>+ if (handle_num_args) append_token_of_type (EARG_TOKEN);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ simple_expression (ctok);</div><div class='add'>+ if ((ctok->type != COMMA_TOKEN)</div><div class='add'>+ && (ctok->type != CPAREN_TOKEN))</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting ')'", ctok, 0);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ last_type = this_type;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int check_for_lvalue (unsigned char eqs_type, _SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ unsigned char type;</div><div class='add'>+</div><div class='add'>+ if ((ctok == NULL)</div><div class='add'>+ && (NULL == (ctok = get_last_token ())))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ type = ctok->type;</div><div class='add'>+</div><div class='add'>+ eqs_type -= ASSIGN_TOKEN;</div><div class='add'>+</div><div class='add'>+ if (type == IDENT_TOKEN)</div><div class='add'>+ eqs_type += _SCALAR_ASSIGN_TOKEN;</div><div class='add'>+ else if (type == ARRAY_TOKEN)</div><div class='add'>+ eqs_type += _ARRAY_ASSIGN_TOKEN;</div><div class='add'>+ else if (type == DOT_TOKEN)</div><div class='add'>+ eqs_type += _STRUCT_ASSIGN_TOKEN;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting LVALUE", ctok, 0);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ctok->type = eqs_type;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_index_expression (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ unsigned int num_commas;</div><div class='add'>+</div><div class='add'>+ num_commas = 0;</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ switch (ctok->type)</div><div class='add'>+ {</div><div class='add'>+ case COLON_TOKEN:</div><div class='add'>+ if (num_commas)</div><div class='add'>+ _SLparse_error ("Misplaced ':'", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ </div><div class='add'>+ case TIMES_TOKEN:</div><div class='add'>+ append_token_of_type (_INLINE_WILDCARD_ARRAY_TOKEN);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case COMMA_TOKEN:</div><div class='add'>+ _SLparse_error ("Misplaced ','", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ </div><div class='add'>+ default:</div><div class='add'>+ simple_expression (ctok);</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (ctok->type != COMMA_TOKEN)</div><div class='add'>+ return;</div><div class='add'>+ num_commas++;</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* inline-array-expression:</div><div class='add'>+ * array_index_expression</div><div class='add'>+ * simple_expression : simple_expression</div><div class='add'>+ * simple_expression : simple_expression : simple_expression</div><div class='add'>+ */</div><div class='add'>+static void inline_array_expression (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ int num_colons = 0;</div><div class='add'>+</div><div class='add'>+ append_token_of_type (ARG_TOKEN);</div><div class='add'>+</div><div class='add'>+ if (ctok->type == COLON_TOKEN) /* [:...] */</div><div class='add'>+ append_token_of_type (_NULL_TOKEN);</div><div class='add'>+ else if (ctok->type != CBRACKET_TOKEN) </div><div class='add'>+ array_index_expression (ctok);</div><div class='add'>+</div><div class='add'>+ if (ctok->type == COLON_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ num_colons++;</div><div class='add'>+ if ((COLON_TOKEN == get_token (ctok))</div><div class='add'>+ || (ctok->type == CBRACKET_TOKEN))</div><div class='add'>+ append_token_of_type (_NULL_TOKEN);</div><div class='add'>+ else</div><div class='add'>+ simple_expression (ctok);</div><div class='add'>+</div><div class='add'>+ if (ctok->type == COLON_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ num_colons++;</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ simple_expression (ctok);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ctok->type != CBRACKET_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Expecting ']'", ctok, 0);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* append_token_of_type (EARG_TOKEN); */</div><div class='add'>+ if (num_colons)</div><div class='add'>+ append_token_of_type (_INLINE_IMPLICIT_ARRAY_TOKEN);</div><div class='add'>+ else</div><div class='add'>+ append_token_of_type (_INLINE_ARRAY_TOKEN);</div><div class='add'>+ get_token (ctok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_multiple_assignment (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+ _SLang_Token_Type *s;</div><div class='add'>+ unsigned int i, k, len;</div><div class='add'>+ unsigned char assign_type;</div><div class='add'>+</div><div class='add'>+ assign_type = ctok->type;</div><div class='add'>+</div><div class='add'>+ /* The LHS token list has already been pushed. Here we do the RHS</div><div class='add'>+ * so push to another token list, process it, then come back to</div><div class='add'>+ * LHS for assignment.</div><div class='add'>+ */</div><div class='add'>+ if (NULL == push_token_list ())</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ get_token (ctok);</div><div class='add'>+ expression (ctok);</div><div class='add'>+ compile_token_list ();</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ /* Finally compile the LHS of the assignment expression</div><div class='add'>+ * that has been saved.</div><div class='add'>+ */</div><div class='add'>+ s = Token_List->stack;</div><div class='add'>+ len = Token_List->len;</div><div class='add'>+</div><div class='add'>+ if (len == 0)</div><div class='add'>+ {</div><div class='add'>+ compile_token_of_type (POP_TOKEN);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (len > 0)</div><div class='add'>+ {</div><div class='add'>+ /* List is of form:</div><div class='add'>+ * a , b, c d e, f , g , , , h ,</div><div class='add'>+ * The missing expressions will be replaced by a POP</div><div class='add'>+ * ,,a</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ /* Start from back looking for a COMMA */</div><div class='add'>+ k = len - 1;</div><div class='add'>+ if (s[k].type == COMMA_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ compile_token_of_type (POP_TOKEN);</div><div class='add'>+ len = k;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == check_for_lvalue (assign_type, s + k))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ if (s[k].type == COMMA_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ i = k + 1;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (k == 0)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ k--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (i < len)</div><div class='add'>+ {</div><div class='add'>+ compile_token (s + i);</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ len = k;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (s[0].type == COMMA_TOKEN)</div><div class='add'>+ compile_token_of_type (POP_TOKEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slpath.c b/mdk-stage1/slang/slpath.c<br/>new file mode 100644<br/>index 000000000..831bd34df<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slpath.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slpath.c</a></div><div class='hunk'>@@ -0,0 +1,344 @@</div><div class='add'>+/* Pathname and filename functions */</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_IO_H</div><div class='add'>+# include <io.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include <sys/types.h></div><div class='add'>+#include <sys/stat.h></div><div class='add'>+#include <signal.h></div><div class='add'>+#include <time.h></div><div class='add'>+</div><div class='add'>+#include <errno.h></div><div class='add'>+#include <string.h></div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* In this file, all file names are assumed to be specified in the Unix</div><div class='add'>+ * format, or in the native format.</div><div class='add'>+ *</div><div class='add'>+ * Aboout VMS:</div><div class='add'>+ * VMS pathnames are a mess. In general, they look like</div><div class='add'>+ * node::device:[dir.dir]file.ext;version</div><div class='add'>+ * and I do not know of a well-defined Unix representation for them. So,</div><div class='add'>+ * I am going to punt and encourage users to stick to the native</div><div class='add'>+ * representation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#if defined(IBMPC_SYSTEM)</div><div class='add'>+# define PATH_SEP '\\'</div><div class='add'>+# define DRIVE_SPECIFIER ':'</div><div class='add'>+# define SEARCH_PATH_DELIMITER ';'</div><div class='add'>+# define THIS_DIR_STRING "."</div><div class='add'>+#else</div><div class='add'>+# if defined(VMS)</div><div class='add'>+# define PATH_SEP ']'</div><div class='add'>+# define DRIVE_SPECIFIER ':'</div><div class='add'>+# define SEARCH_PATH_DELIMITER ' '</div><div class='add'>+# define THIS_DIR_STRING "[]" /* Is this correct?? */</div><div class='add'>+# else</div><div class='add'>+# define PATH_SEP '/'</div><div class='add'>+# define UNIX_PATHNAMES_OK</div><div class='add'>+# define SEARCH_PATH_DELIMITER ':'</div><div class='add'>+# define THIS_DIR_STRING "."</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef UNIX_PATHNAMES_OK</div><div class='add'>+# define IS_PATH_SEP(x) ((x) == PATH_SEP)</div><div class='add'>+#else</div><div class='add'>+# define IS_PATH_SEP(x) (((x) == PATH_SEP) || ((x) == '/'))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* If file is /a/b/c/basename, this function returns a pointer to basename */</div><div class='add'>+char *SLpath_basename (char *file)</div><div class='add'>+{</div><div class='add'>+ char *b;</div><div class='add'>+</div><div class='add'>+ if (file == NULL) return NULL;</div><div class='add'>+ b = file + strlen (file);</div><div class='add'>+</div><div class='add'>+ while (b != file)</div><div class='add'>+ {</div><div class='add'>+ b--;</div><div class='add'>+ if (IS_PATH_SEP(*b))</div><div class='add'>+ return b + 1;</div><div class='add'>+#ifdef DRIVE_SPECIFIER</div><div class='add'>+ if (*b == DRIVE_SPECIFIER)</div><div class='add'>+ return b + 1;</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Returns a malloced string */</div><div class='add'>+char *SLpath_pathname_sans_extname (char *file)</div><div class='add'>+{</div><div class='add'>+ char *b;</div><div class='add'>+</div><div class='add'>+ file = SLmake_string (file);</div><div class='add'>+ if (file == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ b = file + strlen (file);</div><div class='add'>+</div><div class='add'>+ while (b != file)</div><div class='add'>+ {</div><div class='add'>+ b--;</div><div class='add'>+ if (*b == '.')</div><div class='add'>+ {</div><div class='add'>+ *b = 0;</div><div class='add'>+ return file;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return file;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* If path looks like: A/B/C/D/whatever, it returns A/B/C/D as a malloced </div><div class='add'>+ * string.</div><div class='add'>+ */</div><div class='add'>+char *SLpath_dirname (char *file)</div><div class='add'>+{</div><div class='add'>+ char *b;</div><div class='add'>+</div><div class='add'>+ if (file == NULL) return NULL;</div><div class='add'>+ b = file + strlen (file);</div><div class='add'>+</div><div class='add'>+ while (b != file)</div><div class='add'>+ {</div><div class='add'>+ b--;</div><div class='add'>+ if (IS_PATH_SEP(*b))</div><div class='add'>+ {</div><div class='add'>+ if (b == file) b++;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#ifdef DRIVE_SPECIFIER</div><div class='add'>+ if (*b == DRIVE_SPECIFIER)</div><div class='add'>+ {</div><div class='add'>+ b++;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (b == file)</div><div class='add'>+ return SLmake_string (THIS_DIR_STRING);</div><div class='add'>+ </div><div class='add'>+ return SLmake_nstring (file, (unsigned int) (b - file));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note: VMS filenames also contain version numbers. The caller will have</div><div class='add'>+ * to deal with that.</div><div class='add'>+ * </div><div class='add'>+ * The extension includes the '.'. If no extension is present, "" is returned.</div><div class='add'>+ */</div><div class='add'>+char *SLpath_extname (char *file)</div><div class='add'>+{</div><div class='add'>+ char *b;</div><div class='add'>+</div><div class='add'>+ if (NULL == (file = SLpath_basename (file)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ b = file + strlen (file);</div><div class='add'>+ while (b != file)</div><div class='add'>+ {</div><div class='add'>+ b--;</div><div class='add'>+ if (*b == '.')</div><div class='add'>+ return b;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (*b == '.')</div><div class='add'>+ return b;</div><div class='add'>+</div><div class='add'>+ /* Do not return a literal "" */</div><div class='add'>+ return file + strlen (file);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+static void convert_slashes (char *f)</div><div class='add'>+{</div><div class='add'>+ while (*f)</div><div class='add'>+ {</div><div class='add'>+ if (*f == '/') *f = PATH_SEP;</div><div class='add'>+ f++;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLpath_is_absolute_path (char *name)</div><div class='add'>+{</div><div class='add'>+#ifdef UNIX_PATHNAMES_OK</div><div class='add'>+ return (*name == '/');</div><div class='add'>+#else</div><div class='add'>+ if (IS_PATH_SEP (*name))</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+# ifdef DRIVE_SPECIFIER</div><div class='add'>+ /* Look for a drive specifier */</div><div class='add'>+ while (*name)</div><div class='add'>+ {</div><div class='add'>+ if (*name == DRIVE_SPECIFIER)</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+ name++;</div><div class='add'>+ }</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This returns a MALLOCED string */</div><div class='add'>+char *SLpath_dircat (char *dir, char *name)</div><div class='add'>+{</div><div class='add'>+ unsigned int len, dirlen;</div><div class='add'>+ char *file;</div><div class='add'>+#ifndef VMS</div><div class='add'>+ int requires_fixup;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (name == NULL)</div><div class='add'>+ name = "";</div><div class='add'>+</div><div class='add'>+ if ((dir == NULL) || (SLpath_is_absolute_path (name)))</div><div class='add'>+ dir = "";</div><div class='add'>+</div><div class='add'>+ /* Both VMS and MSDOS have default directories associated with each drive.</div><div class='add'>+ * That is, the meaning of something like C:X depends upon more than just</div><div class='add'>+ * the syntax of the string. Since this concept has more power under VMS</div><div class='add'>+ * it will be honored here. However, I am going to treat C:X as C:\X</div><div class='add'>+ * under MSDOS.</div><div class='add'>+ *</div><div class='add'>+ * Note!!!</div><div class='add'>+ * VMS has problems of its own regarding path names, so I am simply</div><div class='add'>+ * going to strcat. Hopefully the VMS RTL is smart enough to deal with</div><div class='add'>+ * the result.</div><div class='add'>+ */</div><div class='add'>+ dirlen = strlen (dir);</div><div class='add'>+#ifndef VMS</div><div class='add'>+ requires_fixup = (dirlen && (0 == IS_PATH_SEP(dir[dirlen - 1])));</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ len = dirlen + strlen (name) + 2;</div><div class='add'>+ if (NULL == (file = SLmalloc (len)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ strcpy (file, dir);</div><div class='add'>+</div><div class='add'>+#ifndef VMS</div><div class='add'>+ if (requires_fixup)</div><div class='add'>+ file[dirlen++] = PATH_SEP;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ strcpy (file + dirlen, name);</div><div class='add'>+</div><div class='add'>+#if defined(IBMPC_SYSTEM)</div><div class='add'>+ convert_slashes (file);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ return file;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLpath_file_exists (char *file)</div><div class='add'>+{</div><div class='add'>+ struct stat st;</div><div class='add'>+ int m;</div><div class='add'>+</div><div class='add'>+#if defined(__os2__) && !defined(S_IFMT)</div><div class='add'>+/* IBM VA3 doesn't declare S_IFMT */</div><div class='add'>+# define S_IFMT (S_IFDIR | S_IFCHR | S_IFREG)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef _S_IFDIR</div><div class='add'>+# ifndef S_IFDIR</div><div class='add'>+# define S_IFDIR _S_IFDIR</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISDIR</div><div class='add'>+# ifdef S_IFDIR</div><div class='add'>+# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)</div><div class='add'>+# else</div><div class='add'>+# define S_ISDIR(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (file == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (stat(file, &st) < 0) return 0;</div><div class='add'>+ m = st.st_mode;</div><div class='add'>+</div><div class='add'>+ if (S_ISDIR(m)) return (2);</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLpath_find_file_in_path (char *path, char *name)</div><div class='add'>+{</div><div class='add'>+ unsigned int max_path_len;</div><div class='add'>+ unsigned int this_path_len;</div><div class='add'>+ char *file, *dir;</div><div class='add'>+ char *p;</div><div class='add'>+ unsigned int nth;</div><div class='add'>+</div><div class='add'>+ if ((path == NULL) || (*path == 0)</div><div class='add'>+ || (name == NULL) || (*name == 0))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ max_path_len = 0;</div><div class='add'>+ this_path_len = 0;</div><div class='add'>+ p = path;</div><div class='add'>+ while (*p != 0)</div><div class='add'>+ {</div><div class='add'>+ if (*p++ == SEARCH_PATH_DELIMITER)</div><div class='add'>+ {</div><div class='add'>+ if (this_path_len > max_path_len) max_path_len = this_path_len;</div><div class='add'>+ this_path_len = 0;</div><div class='add'>+ }</div><div class='add'>+ else this_path_len++;</div><div class='add'>+ }</div><div class='add'>+ if (this_path_len > max_path_len) max_path_len = this_path_len;</div><div class='add'>+ max_path_len++;</div><div class='add'>+</div><div class='add'>+ if (NULL == (dir = SLmalloc (max_path_len)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ nth = 0;</div><div class='add'>+ while (-1 != SLextract_list_element (path, nth, SEARCH_PATH_DELIMITER,</div><div class='add'>+ dir, max_path_len))</div><div class='add'>+ {</div><div class='add'>+ nth++;</div><div class='add'>+ if (*dir == 0)</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ if (NULL == (file = SLpath_dircat (dir, name)))</div><div class='add'>+ {</div><div class='add'>+ SLfree (dir);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (1 == SLpath_file_exists (file))</div><div class='add'>+ {</div><div class='add'>+ SLfree (dir);</div><div class='add'>+ return file;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLfree (file);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLfree (dir);</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slposdir.c b/mdk-stage1/slang/slposdir.c<br/>new file mode 100644<br/>index 000000000..33799e574<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slposdir.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slposdir.c</a></div><div class='hunk'>@@ -0,0 +1,1057 @@</div><div class='add'>+/* file intrinsics for S-Lang */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#if defined(__unix__) || (defined (__os2__) && defined (__EMX__))</div><div class='add'>+# include <sys/types.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_IO_H</div><div class='add'>+# include <io.h> /* for chmod */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include <process.h></div><div class='add'>+# include <dos.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_FCNTL_H</div><div class='add'>+# include <fcntl.h></div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SYS_FCNTL_H</div><div class='add'>+# include <sys/fcntl.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __unix__</div><div class='add'>+# include <sys/file.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include <dir.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(_MSC_VER)</div><div class='add'>+# include <io.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__DECC) && defined(VMS)</div><div class='add'>+# include <unixio.h></div><div class='add'>+# include <unixlib.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+# include <stat.h></div><div class='add'>+#else</div><div class='add'>+# include <sys/stat.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(VMS)</div><div class='add'>+# define USE_LISTDIR_INTRINSIC 0</div><div class='add'>+#else</div><div class='add'>+# define USE_LISTDIR_INTRINSIC 1</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if USE_LISTDIR_INTRINSIC</div><div class='add'>+</div><div class='add'>+#if defined(__WIN32__)</div><div class='add'>+# include <windows.h></div><div class='add'>+#else</div><div class='add'>+# if defined(__OS2__) && defined(__IBMC__)</div><div class='add'>+# define INCL_DOS</div><div class='add'>+# define INCL_ERRORS</div><div class='add'>+# include <os2.h></div><div class='add'>+# include <direct.h></div><div class='add'>+# include <ctype.h></div><div class='add'>+# else</div><div class='add'>+# ifdef HAVE_DIRENT_H</div><div class='add'>+# include <dirent.h></div><div class='add'>+# else</div><div class='add'>+# ifdef HAVE_DIRECT_H</div><div class='add'>+# include <direct.h></div><div class='add'>+# else</div><div class='add'>+# define dirent direct</div><div class='add'>+# define NEED_D_NAMLEN</div><div class='add'>+# if HAVE_SYS_NDIR_H</div><div class='add'>+# include <sys/ndir.h></div><div class='add'>+# endif</div><div class='add'>+# if HAVE_SYS_DIR_H</div><div class='add'>+# include <sys/dir.h></div><div class='add'>+# endif</div><div class='add'>+# if HAVE_NDIR_H</div><div class='add'>+# include <ndir.h></div><div class='add'>+# endif</div><div class='add'>+# endif</div><div class='add'>+# endif</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* USE_LISTDIR_INTRINSIC */</div><div class='add'>+</div><div class='add'>+#include <errno.h></div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static int push_stat_struct (struct stat *st, int opt_attrs)</div><div class='add'>+{</div><div class='add'>+ char *field_names [12];</div><div class='add'>+ unsigned char field_types[12];</div><div class='add'>+ VOID_STAR field_values [12];</div><div class='add'>+ int int_values [12];</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ field_names [0] = "st_dev"; int_values [0] = (int) st->st_dev;</div><div class='add'>+ field_names [1] = "st_ino"; int_values [1] = (int) st->st_ino;</div><div class='add'>+ field_names [2] = "st_mode"; int_values [2] = (int) st->st_mode;</div><div class='add'>+ field_names [3] = "st_nlink"; int_values [3] = (int) st->st_nlink;</div><div class='add'>+ field_names [4] = "st_uid"; int_values [4] = (int) st->st_uid;</div><div class='add'>+ field_names [5] = "st_gid"; int_values [5] = (int) st->st_gid;</div><div class='add'>+ field_names [6] = "st_rdev"; int_values [6] = (int) st->st_rdev;</div><div class='add'>+ field_names [7] = "st_size"; int_values [7] = (int) st->st_size;</div><div class='add'>+ field_names [8] = "st_atime"; int_values [8] = (int) st->st_atime;</div><div class='add'>+ field_names [9] = "st_mtime"; int_values [9] = (int) st->st_mtime;</div><div class='add'>+ field_names [10] = "st_ctime"; int_values [10] = (int) st->st_ctime;</div><div class='add'>+</div><div class='add'>+ field_names [11] = "st_opt_attrs"; int_values[11] = opt_attrs;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 12; i++)</div><div class='add'>+ {</div><div class='add'>+ field_types [i] = SLANG_INT_TYPE;</div><div class='add'>+ field_values [i] = (VOID_STAR) (int_values + i);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return SLstruct_create_struct (12, field_names, field_types, field_values);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void stat_cmd (char *file)</div><div class='add'>+{</div><div class='add'>+ struct stat st;</div><div class='add'>+ int status;</div><div class='add'>+ int opt_attrs;</div><div class='add'>+</div><div class='add'>+ status = stat (file, &st);</div><div class='add'>+</div><div class='add'>+#if defined(__MSDOS__) || defined(__WIN32__)</div><div class='add'>+ if (status == -1)</div><div class='add'>+ {</div><div class='add'>+ unsigned int len = strlen (file);</div><div class='add'>+ if (len && ((file[len-1] == '\\') || (file[len-1] == '/')))</div><div class='add'>+ {</div><div class='add'>+ file = SLmake_nstring (file, len-1);</div><div class='add'>+ if (file == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ status = stat (file, &st);</div><div class='add'>+ SLfree (file);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ if (status == -1)</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+ opt_attrs = GetFileAttributes (file);</div><div class='add'>+#else</div><div class='add'>+ opt_attrs = 0;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ push_stat_struct (&st, opt_attrs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void lstat_cmd (char *file)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_LSTAT</div><div class='add'>+ struct stat st;</div><div class='add'>+ int opt_attrs;</div><div class='add'>+</div><div class='add'>+ if (-1 == lstat (file, &st))</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+ opt_attrs = GetFileAttributes (file);</div><div class='add'>+#else</div><div class='add'>+ opt_attrs = 0;</div><div class='add'>+#endif</div><div class='add'>+ </div><div class='add'>+ push_stat_struct (&st, opt_attrs);</div><div class='add'>+#else</div><div class='add'>+ stat_cmd (file);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Well, it appears that on some systems, these are not defined. Here I</div><div class='add'>+ * provide them. These are derived from the Linux stat.h file.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifdef __os2__</div><div class='add'>+# ifdef __IBMC__</div><div class='add'>+/* IBM VA3 doesn't declare S_IFMT */</div><div class='add'>+# define S_IFMT (S_IFDIR | S_IFCHR | S_IFREG)</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISLNK</div><div class='add'>+# ifdef S_IFLNK</div><div class='add'>+# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)</div><div class='add'>+# else</div><div class='add'>+# define S_ISLNK(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISREG</div><div class='add'>+# ifdef S_IFREG</div><div class='add'>+# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)</div><div class='add'>+# else</div><div class='add'>+# define S_ISREG(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISDIR</div><div class='add'>+# ifdef S_IFDIR</div><div class='add'>+# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)</div><div class='add'>+# else</div><div class='add'>+# define S_ISDIR(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISCHR</div><div class='add'>+# ifdef S_IFCHR</div><div class='add'>+# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)</div><div class='add'>+# else</div><div class='add'>+# define S_ISCHR(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISBLK</div><div class='add'>+# ifdef S_IFBLK</div><div class='add'>+# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)</div><div class='add'>+# else</div><div class='add'>+# define S_ISBLK(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISFIFO</div><div class='add'>+# ifdef S_IFIFO</div><div class='add'>+# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)</div><div class='add'>+# else</div><div class='add'>+# define S_ISFIFO(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISSOCK</div><div class='add'>+# ifdef S_IFSOCK</div><div class='add'>+# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)</div><div class='add'>+# else</div><div class='add'>+# define S_ISSOCK(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static char stat_is_cmd (char *what, int *mode_ptr)</div><div class='add'>+{</div><div class='add'>+ int ret;</div><div class='add'>+ int st_mode = *mode_ptr;</div><div class='add'>+</div><div class='add'>+ if (!strcmp (what, "sock")) ret = S_ISSOCK(st_mode);</div><div class='add'>+ else if (!strcmp (what, "fifo")) ret = S_ISFIFO(st_mode);</div><div class='add'>+ else if (!strcmp (what, "blk")) ret = S_ISBLK(st_mode);</div><div class='add'>+ else if (!strcmp (what, "chr")) ret = S_ISCHR(st_mode);</div><div class='add'>+ else if (!strcmp (what, "dir")) ret = S_ISDIR(st_mode);</div><div class='add'>+ else if (!strcmp (what, "reg")) ret = S_ISREG(st_mode);</div><div class='add'>+ else if (!strcmp (what, "lnk")) ret = S_ISLNK(st_mode);</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "stat_is: Unrecognized type: %s", what);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return (char) (ret != 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_READLINK</div><div class='add'>+static void readlink_cmd (char *s)</div><div class='add'>+{</div><div class='add'>+ char buf[2048];</div><div class='add'>+ int n;</div><div class='add'>+</div><div class='add'>+ n = readlink (s, buf, sizeof (buf)-1);</div><div class='add'>+ if (n == -1)</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ s = NULL;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ buf[n] = 0;</div><div class='add'>+ s = buf;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ (void) SLang_push_string (s);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int chmod_cmd (char *file, int *mode)</div><div class='add'>+{</div><div class='add'>+ if (-1 == chmod(file, (mode_t) *mode))</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_CHOWN</div><div class='add'>+static int chown_cmd (char *file, int *owner, int *group)</div><div class='add'>+{</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (-1 == (ret = chown(file, (uid_t) *owner, (gid_t) *group)))</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* add trailing slash to dir */</div><div class='add'>+static void fixup_dir (char *dir)</div><div class='add'>+{</div><div class='add'>+#ifndef VMS</div><div class='add'>+ int n;</div><div class='add'>+</div><div class='add'>+ if ((n = strlen(dir)) > 1)</div><div class='add'>+ {</div><div class='add'>+ n--;</div><div class='add'>+#if defined(IBMPC_SYSTEM)</div><div class='add'>+ if ( dir[n] != '/' && dir[n] != '\\' )</div><div class='add'>+ strcat(dir, "\\" );</div><div class='add'>+#else</div><div class='add'>+ if (dir[n] != '/' )</div><div class='add'>+ strcat(dir, "/" );</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+#endif /* !VMS */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void slget_cwd (void)</div><div class='add'>+{</div><div class='add'>+ char cwd[1024];</div><div class='add'>+ char *p;</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_GETCWD</div><div class='add'>+ p = getwd (cwd);</div><div class='add'>+#else</div><div class='add'>+# if defined (__EMX__)</div><div class='add'>+ p = _getcwd2(cwd, 1022); /* includes drive specifier */</div><div class='add'>+# else</div><div class='add'>+ p = getcwd(cwd, 1022); /* djggp includes drive specifier */</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (p == NULL)</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#ifndef VMS</div><div class='add'>+#ifdef __GO32__</div><div class='add'>+ /* You never know about djgpp since it favors unix */</div><div class='add'>+ {</div><div class='add'>+ char ch;</div><div class='add'>+ p = cwd;</div><div class='add'>+ while ((ch = *p) != 0)</div><div class='add'>+ {</div><div class='add'>+ if (ch == '/') *p = '\\';</div><div class='add'>+ p++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ fixup_dir (cwd);</div><div class='add'>+#endif</div><div class='add'>+ SLang_push_string (cwd);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int chdir_cmd (char *s)</div><div class='add'>+{</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ while (-1 == (ret = chdir (s)))</div><div class='add'>+ {</div><div class='add'>+#ifdef EINTR</div><div class='add'>+ if (errno == EINTR)</div><div class='add'>+ continue;</div><div class='add'>+#endif</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+static int remove_cmd (char *);</div><div class='add'>+/* If the file looks like xxx, then change it to xxx.dir. If</div><div class='add'>+ * it looks like A:[B.xxx] then change it to A:[B]xxx.dir.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static char *vms_convert_dirspec_to_vms_dir (char *str)</div><div class='add'>+{</div><div class='add'>+ char *s;</div><div class='add'>+ char *version;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char *dot;</div><div class='add'>+</div><div class='add'>+ len = strlen (str);</div><div class='add'>+</div><div class='add'>+ version = strchr (str, ';');</div><div class='add'>+ if (version == NULL)</div><div class='add'>+ version = str + len;</div><div class='add'>+ /* version points to the version of the input string */</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+ if (NULL == (s = SLmalloc (len + 8)))/* allow extra space to work with */</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ len = (unsigned int) (version - str);</div><div class='add'>+ strncpy (s, str, len);</div><div class='add'>+ s[len] = 0;</div><div class='add'>+ str = s;</div><div class='add'>+ </div><div class='add'>+ /* Lowercase the whole thing */</div><div class='add'>+ while (*s != 0)</div><div class='add'>+ {</div><div class='add'>+ *s = LOWER_CASE(*s);</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((s > str)</div><div class='add'>+ && (s[-1] != ']'))</div><div class='add'>+ {</div><div class='add'>+ if ((s >= str + 4)</div><div class='add'>+ && (0 == strcmp (s - 4, ".dir")))</div><div class='add'>+ s -= 4;</div><div class='add'>+ goto add_dir_version;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Check for one of two possibilities:</div><div class='add'>+ * </div><div class='add'>+ * dev:[x] --> dev:x</div><div class='add'>+ * dev:[a.x] --> dev:[a]x</div><div class='add'>+ */</div><div class='add'>+ </div><div class='add'>+ if (NULL == (dot = strchr (str, '.')))</div><div class='add'>+ {</div><div class='add'>+ /* First possibility */</div><div class='add'>+ if (NULL == (s = strchr (str, '[')))</div><div class='add'>+ return str; /* let someone else figure this out */</div><div class='add'>+ while (s[1] != ']')</div><div class='add'>+ {</div><div class='add'>+ s[0] = s[1];</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+ *s = 0;</div><div class='add'>+ goto add_dir_version;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ while (NULL != (s = strchr (dot + 1, '.')))</div><div class='add'>+ dot = s;</div><div class='add'>+ </div><div class='add'>+ *dot = ']';</div><div class='add'>+ s = str + (len - 1);</div><div class='add'>+ </div><div class='add'>+ /* Drop */</div><div class='add'>+</div><div class='add'>+ add_dir_version:</div><div class='add'>+ strcpy (s, ".dir");</div><div class='add'>+ strcpy (s+4, version);</div><div class='add'>+ return str;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int rmdir_cmd (char *s)</div><div class='add'>+{</div><div class='add'>+#ifdef VMS</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ if (NULL == (s = vms_convert_dirspec_to_vms_dir (s)))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ status = remove_cmd (s);</div><div class='add'>+ SLfree (s);</div><div class='add'>+ </div><div class='add'>+ return status;</div><div class='add'>+</div><div class='add'>+#else</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ while (-1 == (ret = rmdir (s)))</div><div class='add'>+ {</div><div class='add'>+#ifdef EINTR</div><div class='add'>+ if (errno == EINTR)</div><div class='add'>+ continue;</div><div class='add'>+#endif</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return ret;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int remove_cmd (char *s)</div><div class='add'>+{</div><div class='add'>+ int ret;</div><div class='add'>+#ifdef VMS</div><div class='add'>+# define REMOVE delete</div><div class='add'>+#else</div><div class='add'>+# ifdef REAL_UNIX_SYSTEM</div><div class='add'>+# define REMOVE unlink</div><div class='add'>+# else</div><div class='add'>+# define REMOVE remove</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ while (-1 == (ret = REMOVE (s)))</div><div class='add'>+ {</div><div class='add'>+#ifdef EINTR</div><div class='add'>+ if (errno == EINTR)</div><div class='add'>+ continue;</div><div class='add'>+#endif</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rename_cmd (char *oldpath, char *newpath)</div><div class='add'>+{</div><div class='add'>+ int ret;</div><div class='add'>+ while (-1 == (ret = rename (oldpath, newpath)))</div><div class='add'>+ {</div><div class='add'>+#ifdef EINTR</div><div class='add'>+ if (errno == EINTR)</div><div class='add'>+ continue;</div><div class='add'>+#endif</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int mkdir_cmd (char *s, int *mode_ptr)</div><div class='add'>+{</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ (void) mode_ptr;</div><div class='add'>+ errno = 0;</div><div class='add'>+</div><div class='add'>+#if defined (__MSDOS__) && !defined(__GO32__)</div><div class='add'>+# define MKDIR(x,y) mkdir(x)</div><div class='add'>+#else</div><div class='add'>+# if defined (__os2__) && !defined (__EMX__)</div><div class='add'>+# define MKDIR(x,y) mkdir(x)</div><div class='add'>+# else</div><div class='add'>+# if defined (__WIN32__) && !defined (__CYGWIN32__)</div><div class='add'>+# define MKDIR(x,y) mkdir(x)</div><div class='add'>+# else</div><div class='add'>+# define MKDIR mkdir</div><div class='add'>+# endif</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ while (-1 == (ret = MKDIR(s, *mode_ptr)))</div><div class='add'>+ {</div><div class='add'>+#ifdef EINTR</div><div class='add'>+ if (errno == EINTR)</div><div class='add'>+ continue;</div><div class='add'>+#endif</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_MKFIFO</div><div class='add'>+static int mkfifo_cmd (char *path, int *mode)</div><div class='add'>+{</div><div class='add'>+ if (-1 == mkfifo (path, *mode))</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if USE_LISTDIR_INTRINSIC</div><div class='add'>+</div><div class='add'>+static void free_dir_list (char **list, unsigned int num)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ if (list == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < num; i++)</div><div class='add'>+ SLang_free_slstring (list[i]);</div><div class='add'>+ SLfree ((char *) list);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if defined(__WIN32__) || defined(__os2__) && defined(__IBMC__)</div><div class='add'>+static int build_dirlist (char *file, char *opt, char ***listp, unsigned int *nump, unsigned int *maxnum)</div><div class='add'>+{</div><div class='add'>+# ifdef __WIN32__</div><div class='add'>+ DWORD status;</div><div class='add'>+ HANDLE h;</div><div class='add'>+ WIN32_FIND_DATA fd;</div><div class='add'>+# else</div><div class='add'>+ APIRET rc;</div><div class='add'>+ FILESTATUS3 status;</div><div class='add'>+ HDIR h;</div><div class='add'>+ FILEFINDBUF3 fd;</div><div class='add'>+ ULONG cFileNames;</div><div class='add'>+# endif</div><div class='add'>+ char *pat;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char **list;</div><div class='add'>+ unsigned int num;</div><div class='add'>+ unsigned int max_num;</div><div class='add'>+ int hok;</div><div class='add'>+</div><div class='add'>+ /* If an option is present, assume ok to list hidden files. Later</div><div class='add'>+ * I will formalize this.</div><div class='add'>+ */</div><div class='add'>+ hok = (opt != NULL);</div><div class='add'>+</div><div class='add'>+# ifdef __WIN32__</div><div class='add'>+ status = GetFileAttributes (file);</div><div class='add'>+# else</div><div class='add'>+ rc = DosQueryPathInfo(file, FIL_STANDARD, &status, sizeof(FILESTATUS3));</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# ifdef __WIN32__</div><div class='add'>+ if (status == (DWORD)-1)</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = ENOENT;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ if (0 == (status & FILE_ATTRIBUTE_DIRECTORY))</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = ENOTDIR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+# else</div><div class='add'>+ if ((rc != 0) || (status.attrFile & FILE_DIRECTORY) == 0)</div><div class='add'>+ {</div><div class='add'>+ /* ENOTDIR isn't defined in VA3. */</div><div class='add'>+ _SLerrno_errno = ENOENT;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+ len = strlen (file);</div><div class='add'>+ pat = SLmalloc (len + 3);</div><div class='add'>+ if (pat == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ strcpy (pat, file);</div><div class='add'>+ file = pat;</div><div class='add'>+ while (*file != 0)</div><div class='add'>+ {</div><div class='add'>+ if (*file == '/') *file = '\\';</div><div class='add'>+ file++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (len && (pat[len-1] != '\\'))</div><div class='add'>+ {</div><div class='add'>+ pat[len] = '\\';</div><div class='add'>+ len++;</div><div class='add'>+ }</div><div class='add'>+ pat[len++] = '*';</div><div class='add'>+ pat[len] = 0;</div><div class='add'>+</div><div class='add'>+ num = 0;</div><div class='add'>+ max_num = 50;</div><div class='add'>+ list = (char **)SLmalloc (max_num * sizeof(char *));</div><div class='add'>+ if (list == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLfree (pat);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+# ifdef __WIN32__</div><div class='add'>+ h = FindFirstFile(pat, &fd);</div><div class='add'>+ if (h == INVALID_HANDLE_VALUE)</div><div class='add'>+ {</div><div class='add'>+ if (ERROR_NO_MORE_FILES != GetLastError())</div><div class='add'>+ {</div><div class='add'>+ SLfree (pat);</div><div class='add'>+ SLfree ((char *)list);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+# else</div><div class='add'>+ h = HDIR_CREATE;</div><div class='add'>+ cFileNames = 1;</div><div class='add'>+ rc = DosFindFirst(pat, &h, FILE_READONLY | FILE_DIRECTORY |</div><div class='add'>+ FILE_ARCHIVED, &fd, sizeof(fd), &cFileNames, FIL_STANDARD);</div><div class='add'>+ if (rc != 0)</div><div class='add'>+ {</div><div class='add'>+ if (rc != ERROR_NO_MORE_FILES)</div><div class='add'>+ {</div><div class='add'>+ SLfree (pat);</div><div class='add'>+ SLfree ((char *)list);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+# endif </div><div class='add'>+ else while (1)</div><div class='add'>+ {</div><div class='add'>+ /* Do not include hidden files in the list. Also, do not</div><div class='add'>+ * include "." and ".." entries.</div><div class='add'>+ */</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+ file = fd.cFileName;</div><div class='add'>+#else</div><div class='add'>+ file = fd.achName;</div><div class='add'>+#endif</div><div class='add'>+ if (</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+ (hok || (0 == (fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)))</div><div class='add'>+#else</div><div class='add'>+ (hok || (0 == (fd.attrFile & FILE_HIDDEN)))</div><div class='add'>+#endif</div><div class='add'>+ && ((*file != '.')</div><div class='add'>+ || ((0 != strcmp (file, "."))</div><div class='add'>+ && (0 != strcmp (file, "..")))))</div><div class='add'>+ {</div><div class='add'>+ if (num == max_num)</div><div class='add'>+ {</div><div class='add'>+ char **new_list;</div><div class='add'>+</div><div class='add'>+ max_num += 100;</div><div class='add'>+ new_list = (char **)SLrealloc ((char *)list, max_num * sizeof (char *));</div><div class='add'>+ if (new_list == NULL)</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ list = new_list;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ file = SLang_create_slstring (file);</div><div class='add'>+ if (file == NULL)</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ list[num] = file;</div><div class='add'>+ num++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+ if (FALSE == FindNextFile(h, &fd))</div><div class='add'>+ {</div><div class='add'>+ if (ERROR_NO_MORE_FILES == GetLastError())</div><div class='add'>+ {</div><div class='add'>+ FindClose (h);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ FindClose (h);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ cFileNames = 1;</div><div class='add'>+ rc = DosFindNext(h, &fd, sizeof(fd), &cFileNames);</div><div class='add'>+ if (rc != 0)</div><div class='add'>+ {</div><div class='add'>+ if (rc == ERROR_NO_MORE_FILES)</div><div class='add'>+ {</div><div class='add'>+ DosFindClose (h);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ DosFindClose (h);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLfree (pat);</div><div class='add'>+ *maxnum = max_num;</div><div class='add'>+ *nump = num;</div><div class='add'>+ *listp = list;</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ free_dir_list (list, num);</div><div class='add'>+ SLfree (pat);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#else /* NOT __WIN32__ */</div><div class='add'>+</div><div class='add'>+static int build_dirlist (char *dir, char *opt, char ***listp, unsigned int *nump, unsigned int *maxnum)</div><div class='add'>+{</div><div class='add'>+ DIR *dp;</div><div class='add'>+ struct dirent *ep;</div><div class='add'>+ unsigned int num_files;</div><div class='add'>+ unsigned int max_num_files;</div><div class='add'>+ char **list;</div><div class='add'>+</div><div class='add'>+ (void) opt;</div><div class='add'>+</div><div class='add'>+ if (NULL == (dp = opendir (dir)))</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ num_files = max_num_files = 0;</div><div class='add'>+ list = NULL;</div><div class='add'>+ while (NULL != (ep = readdir (dp)))</div><div class='add'>+ {</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char *name;</div><div class='add'>+</div><div class='add'>+ name = ep->d_name;</div><div class='add'>+# ifdef NEED_D_NAMLEN</div><div class='add'>+ len = ep->d_namlen;</div><div class='add'>+# else</div><div class='add'>+ len = strlen (name);</div><div class='add'>+# endif</div><div class='add'>+ if ((*name == '.') && (len <= 2))</div><div class='add'>+ {</div><div class='add'>+ if (len == 1) continue;</div><div class='add'>+ if (name [1] == '.') continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (num_files == max_num_files)</div><div class='add'>+ {</div><div class='add'>+ char **new_list;</div><div class='add'>+</div><div class='add'>+ max_num_files += 100;</div><div class='add'>+ if (NULL == (new_list = (char **) SLrealloc ((char *)list, max_num_files * sizeof(char *))))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ list = new_list;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (list[num_files] = SLang_create_nslstring (name, len)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ num_files++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ closedir (dp);</div><div class='add'>+ *nump = num_files;</div><div class='add'>+ *maxnum = max_num_files;</div><div class='add'>+ *listp = list;</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ if (dp != NULL)</div><div class='add'>+ closedir (dp);</div><div class='add'>+ free_dir_list (list, num_files);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+# endif /* NOT __WIN32__ */</div><div class='add'>+</div><div class='add'>+static void listdir_cmd (char *dir, char *opt)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ unsigned int num_files;</div><div class='add'>+ unsigned int max_num_files;</div><div class='add'>+ int inum_files;</div><div class='add'>+ char **list;</div><div class='add'>+</div><div class='add'>+ if (-1 == build_dirlist (dir, opt, &list, &num_files, &max_num_files))</div><div class='add'>+ {</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ /* If max_num_files == 0, then num_files == 0 and list == NULL. </div><div class='add'>+ * The realloc step below will malloc list for us.</div><div class='add'>+ */</div><div class='add'>+ if (num_files + 1 < max_num_files)</div><div class='add'>+ {</div><div class='add'>+ char **new_list;</div><div class='add'>+ if (NULL == (new_list = (char **) SLrealloc ((char *)list, (num_files + 1)* sizeof(char*))))</div><div class='add'>+ {</div><div class='add'>+ free_dir_list (list, num_files);</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ list = new_list;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ inum_files = (int) num_files;</div><div class='add'>+ if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, (VOID_STAR) list, &inum_files, 1)))</div><div class='add'>+ {</div><div class='add'>+ free_dir_list (list, num_files);</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Allow the array to free this list if push fails */</div><div class='add'>+ if (-1 == SLang_push_array (at, 1))</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void listdir_cmd_wrap (void)</div><div class='add'>+{</div><div class='add'>+ char *s, *sopt;</div><div class='add'>+</div><div class='add'>+ sopt = NULL;</div><div class='add'>+ switch (SLang_Num_Function_Args)</div><div class='add'>+ {</div><div class='add'>+ case 2:</div><div class='add'>+ if (-1 == SLang_pop_slstring (&sopt))</div><div class='add'>+ return;</div><div class='add'>+ case 1:</div><div class='add'>+ if (-1 == SLang_pop_slstring (&s))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (sopt);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ default:</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "usage: listdir (string, [opt-string]");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ listdir_cmd (s, sopt);</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+ SLang_free_slstring (sopt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* USE_LISTDIR_INTRINSIC */</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_UMASK</div><div class='add'>+static int umask_cmd (int *u)</div><div class='add'>+{</div><div class='add'>+ return umask (*u);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type PosixDir_Name_Table [] =</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_READLINK</div><div class='add'>+ MAKE_INTRINSIC_S("readlink", readlink_cmd, SLANG_VOID_TYPE),</div><div class='add'>+#endif</div><div class='add'>+ MAKE_INTRINSIC_S("lstat_file", lstat_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("stat_file", stat_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SI("stat_is", stat_is_cmd, SLANG_CHAR_TYPE),</div><div class='add'>+#ifdef HAVE_MKFIFO</div><div class='add'>+ MAKE_INTRINSIC_SI("mkfifo", mkfifo_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_CHOWN</div><div class='add'>+ MAKE_INTRINSIC_SII("chown", chown_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+ MAKE_INTRINSIC_SI("chmod", chmod_cmd, SLANG_INT_TYPE),</div><div class='add'>+#ifdef HAVE_UMASK</div><div class='add'>+ MAKE_INTRINSIC_I("umask", umask_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+ MAKE_INTRINSIC_0("getcwd", slget_cwd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SI("mkdir", mkdir_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("chdir", chdir_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("rmdir", rmdir_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("remove", remove_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SS("rename", rename_cmd, SLANG_INT_TYPE),</div><div class='add'>+#if USE_LISTDIR_INTRINSIC</div><div class='add'>+ MAKE_INTRINSIC("listdir", listdir_cmd_wrap, SLANG_VOID_TYPE, 0),</div><div class='add'>+#endif</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static SLang_IConstant_Type PosixDir_Consts [] =</div><div class='add'>+{</div><div class='add'>+#ifndef S_IRWXU</div><div class='add'>+# define S_IRWXU 00700</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("S_IRWXU", S_IRWXU),</div><div class='add'>+#ifndef S_IRUSR</div><div class='add'>+# define S_IRUSR 00400</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("S_IRUSR", S_IRUSR),</div><div class='add'>+#ifndef S_IWUSR</div><div class='add'>+# define S_IWUSR 00200</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("S_IWUSR", S_IWUSR),</div><div class='add'>+#ifndef S_IXUSR</div><div class='add'>+# define S_IXUSR 00100</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("S_IXUSR", S_IXUSR),</div><div class='add'>+#ifndef S_IRWXG</div><div class='add'>+# define S_IRWXG 00070</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("S_IRWXG", S_IRWXG),</div><div class='add'>+#ifndef S_IRGRP</div><div class='add'>+# define S_IRGRP 00040</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("S_IRGRP", S_IRGRP),</div><div class='add'>+#ifndef S_IWGRP</div><div class='add'>+# define S_IWGRP 00020</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("S_IWGRP", S_IWGRP),</div><div class='add'>+#ifndef S_IXGRP</div><div class='add'>+# define S_IXGRP 00010</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("S_IXGRP", S_IXGRP),</div><div class='add'>+#ifndef S_IRWXO</div><div class='add'>+# define S_IRWXO 00007</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("S_IRWXO", S_IRWXO),</div><div class='add'>+#ifndef S_IROTH</div><div class='add'>+# define S_IROTH 00004</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("S_IROTH", S_IROTH),</div><div class='add'>+#ifndef S_IWOTH</div><div class='add'>+# define S_IWOTH 00002</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("S_IWOTH", S_IWOTH),</div><div class='add'>+#ifndef S_IXOTH</div><div class='add'>+# define S_IXOTH 00001</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("S_IXOTH", S_IXOTH),</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+ MAKE_ICONSTANT("FILE_ATTRIBUTE_ARCHIVE", FILE_ATTRIBUTE_ARCHIVE),</div><div class='add'>+ MAKE_ICONSTANT("FILE_ATTRIBUTE_COMPRESSED", FILE_ATTRIBUTE_COMPRESSED),</div><div class='add'>+ MAKE_ICONSTANT("FILE_ATTRIBUTE_NORMAL", FILE_ATTRIBUTE_NORMAL),</div><div class='add'>+ MAKE_ICONSTANT("FILE_ATTRIBUTE_DIRECTORY", FILE_ATTRIBUTE_DIRECTORY),</div><div class='add'>+ MAKE_ICONSTANT("FILE_ATTRIBUTE_HIDDEN", FILE_ATTRIBUTE_HIDDEN),</div><div class='add'>+ MAKE_ICONSTANT("FILE_ATTRIBUTE_READONLY", FILE_ATTRIBUTE_READONLY),</div><div class='add'>+ MAKE_ICONSTANT("FILE_ATTRIBUTE_SYSTEM", FILE_ATTRIBUTE_SYSTEM),</div><div class='add'>+ MAKE_ICONSTANT("FILE_ATTRIBUTE_TEMPORARY", FILE_ATTRIBUTE_TEMPORARY),</div><div class='add'>+#endif</div><div class='add'>+ SLANG_END_ICONST_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int Initialized;</div><div class='add'>+</div><div class='add'>+int SLang_init_posix_dir (void)</div><div class='add'>+{</div><div class='add'>+ if (Initialized)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLadd_intrin_fun_table(PosixDir_Name_Table, "__POSIX_DIR__"))</div><div class='add'>+ || (-1 == SLadd_iconstant_table (PosixDir_Consts, NULL))</div><div class='add'>+ || (-1 == _SLerrno_init ()))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ Initialized = 1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slposio.c b/mdk-stage1/slang/slposio.c<br/>new file mode 100644<br/>index 000000000..ab1e9f689<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slposio.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slposio.c</a></div><div class='hunk'>@@ -0,0 +1,568 @@</div><div class='add'>+/* This module implements an interface to posix system calls */</div><div class='add'>+/* file stdio intrinsics for S-Lang */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#if defined(__unix__) || (defined (__os2__) && defined (__EMX__))</div><div class='add'>+# include <sys/types.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_FCNTL_H</div><div class='add'>+# include <fcntl.h></div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SYS_FCNTL_H</div><div class='add'>+# include <sys/fcntl.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __unix__</div><div class='add'>+# include <sys/file.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_IO_H</div><div class='add'>+# include <io.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include <dir.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__DECC) && defined(VMS)</div><div class='add'>+# include <unixio.h></div><div class='add'>+# include <unixlib.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+# include <stat.h></div><div class='add'>+#else</div><div class='add'>+# include <sys/stat.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include <errno.h></div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+struct _SLFile_FD_Type</div><div class='add'>+{</div><div class='add'>+ char *name;</div><div class='add'>+ unsigned int num_refs; /* reference counting */</div><div class='add'>+ int fd;</div><div class='add'>+ SLang_MMT_Type *stdio_mmt; /* fdopen'd stdio object */</div><div class='add'>+</div><div class='add'>+ /* methods */</div><div class='add'>+ int (*close)(int);</div><div class='add'>+ int (*read) (int, char *, unsigned int *);</div><div class='add'>+ int (*write)(int, char *, unsigned int *);</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int close_method (int fd)</div><div class='add'>+{</div><div class='add'>+ return close (fd);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int write_method (int fd, char *buf, unsigned int *nump)</div><div class='add'>+{</div><div class='add'>+ int num;</div><div class='add'>+</div><div class='add'>+ if (-1 == (num = write (fd, buf, *nump)))</div><div class='add'>+ {</div><div class='add'>+ *nump = 0;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *nump = (unsigned int) num;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int read_method (int fd, char *buf, unsigned int *nump)</div><div class='add'>+{</div><div class='add'>+ int num;</div><div class='add'>+</div><div class='add'>+ num = read (fd, buf, *nump);</div><div class='add'>+ if (num == -1)</div><div class='add'>+ {</div><div class='add'>+ *nump = 0;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ *nump = (unsigned int) num;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int check_fd (int fd)</div><div class='add'>+{</div><div class='add'>+ if (fd == -1)</div><div class='add'>+ {</div><div class='add'>+#ifdef EBADF</div><div class='add'>+ _SLerrno_errno = EBADF;</div><div class='add'>+#endif</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int posix_close (SLFile_FD_Type *f)</div><div class='add'>+{</div><div class='add'>+ if (-1 == check_fd (f->fd))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((f->close != NULL)</div><div class='add'>+ && (-1 == f->close (f->fd)))</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (f->stdio_mmt != NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_free_mmt (f->stdio_mmt);</div><div class='add'>+ f->stdio_mmt = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ f->fd = -1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Usage: Uint write (f, buf); */</div><div class='add'>+static void posix_write (SLFile_FD_Type *f, SLang_BString_Type *bstr)</div><div class='add'>+{</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char *p;</div><div class='add'>+</div><div class='add'>+ if ((-1 == check_fd (f->fd))</div><div class='add'>+ || (NULL == (p = (char *)SLbstring_get_pointer (bstr, &len))))</div><div class='add'>+ {</div><div class='add'>+ SLang_push_integer (-1);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == f->write (f->fd, p, &len))</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ SLang_push_integer (-1);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ (void) SLang_push_uinteger (len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Usage: nn = read (f, &buf, n); */</div><div class='add'>+static void posix_read (SLFile_FD_Type *f, SLang_Ref_Type *ref, unsigned int *nbytes)</div><div class='add'>+{</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char *b;</div><div class='add'>+ SLang_BString_Type *bstr;</div><div class='add'>+</div><div class='add'>+ b = NULL;</div><div class='add'>+</div><div class='add'>+ len = *nbytes;</div><div class='add'>+ if ((-1 == check_fd (f->fd))</div><div class='add'>+ || (NULL == (b = SLmalloc (len + 1))))</div><div class='add'>+ goto return_error;</div><div class='add'>+ </div><div class='add'>+ if (-1 == f->read (f->fd, b, &len))</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (len != *nbytes)</div><div class='add'>+ {</div><div class='add'>+ char *b1 = SLrealloc (b, len + 1);</div><div class='add'>+ if (b1 == NULL)</div><div class='add'>+ goto return_error;</div><div class='add'>+ b = b1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ bstr = SLbstring_create_malloced ((unsigned char *) b, len, 0);</div><div class='add'>+ if (bstr != NULL)</div><div class='add'>+ {</div><div class='add'>+ if ((-1 != SLang_assign_to_ref (ref, SLANG_BSTRING_TYPE, (VOID_STAR)&bstr))</div><div class='add'>+ && (-1 != SLang_push_uinteger (len)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ SLbstring_free (bstr);</div><div class='add'>+ b = NULL;</div><div class='add'>+ /* drop */</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ return_error:</div><div class='add'>+ if (b != NULL) SLfree ((char *)b);</div><div class='add'>+ (void) SLang_assign_to_ref (ref, SLANG_NULL_TYPE, NULL);</div><div class='add'>+ (void) SLang_push_integer (-1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLFile_FD_Type *SLfile_create_fd (char *name, int fd)</div><div class='add'>+{</div><div class='add'>+ SLFile_FD_Type *f;</div><div class='add'>+</div><div class='add'>+ if (NULL == (f = (SLFile_FD_Type *) SLmalloc (sizeof (SLFile_FD_Type))))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ memset ((char *) f, 0, sizeof (SLFile_FD_Type));</div><div class='add'>+ if (NULL == (f->name = SLang_create_slstring (name)))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *)f);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ f->fd = fd;</div><div class='add'>+ f->num_refs = 1;</div><div class='add'>+</div><div class='add'>+ f->close = close_method;</div><div class='add'>+ f->read = read_method;</div><div class='add'>+ f->write = write_method;</div><div class='add'>+</div><div class='add'>+ return f;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLFile_FD_Type *SLfile_dup_fd (SLFile_FD_Type *f0)</div><div class='add'>+{</div><div class='add'>+ SLFile_FD_Type *f;</div><div class='add'>+ int fd0, fd;</div><div class='add'>+</div><div class='add'>+ if (f0 == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+ fd0 = f0->fd;</div><div class='add'>+ if (-1 == check_fd (fd0))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ while (-1 == (fd = dup (fd0)))</div><div class='add'>+ {</div><div class='add'>+#ifdef EINTR</div><div class='add'>+ if (errno == EINTR)</div><div class='add'>+ continue;</div><div class='add'>+#endif</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (NULL == (f = SLfile_create_fd (f0->name, fd)))</div><div class='add'>+ {</div><div class='add'>+ f0->close (fd);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ return f;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLfile_get_fd (SLFile_FD_Type *f, int *fd)</div><div class='add'>+{</div><div class='add'>+ if (f == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ *fd = f->fd;</div><div class='add'>+ if (-1 == check_fd (*fd))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLfile_free_fd (SLFile_FD_Type *f)</div><div class='add'>+{</div><div class='add'>+ if (f == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (f->num_refs > 1)</div><div class='add'>+ {</div><div class='add'>+ f->num_refs -= 1;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (f->fd != -1)</div><div class='add'>+ {</div><div class='add'>+ if (f->close != NULL)</div><div class='add'>+ (void) f->close (f->fd);</div><div class='add'>+</div><div class='add'>+ f->fd = -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (f->stdio_mmt != NULL)</div><div class='add'>+ SLang_free_mmt (f->stdio_mmt);</div><div class='add'>+</div><div class='add'>+ SLfree ((char *) f);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_string_int (char **s, int *i)</div><div class='add'>+{</div><div class='add'>+ *s = NULL;</div><div class='add'>+ if ((-1 == SLang_pop_integer (i))</div><div class='add'>+ || (-1 == SLang_pop_slstring (s)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_string_int_int (char **s, int *a, int *b)</div><div class='add'>+{</div><div class='add'>+ *s = NULL;</div><div class='add'>+ if ((-1 == SLang_pop_integer (b))</div><div class='add'>+ || (-1 == pop_string_int (s, a)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void posix_open (void)</div><div class='add'>+{</div><div class='add'>+ char *file;</div><div class='add'>+ int mode, flags;</div><div class='add'>+ SLFile_FD_Type *f;</div><div class='add'>+</div><div class='add'>+ switch (SLang_Num_Function_Args)</div><div class='add'>+ {</div><div class='add'>+ case 3:</div><div class='add'>+ if (-1 == pop_string_int_int (&file, &flags, &mode))</div><div class='add'>+ {</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 2:</div><div class='add'>+ default:</div><div class='add'>+ if (-1 == pop_string_int (&file, &flags))</div><div class='add'>+ return;</div><div class='add'>+ mode = 0777;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ f = SLfile_create_fd (file, -1);</div><div class='add'>+ if (f == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (file);</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ SLang_free_slstring (file);</div><div class='add'>+</div><div class='add'>+ if (-1 == (f->fd = open (f->name, flags, mode)))</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ SLfile_free_fd (f);</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLfile_push_fd (f))</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ SLfile_free_fd (f);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void posix_fileno (void)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+ int fd;</div><div class='add'>+ SLFile_FD_Type *f;</div><div class='add'>+ char *name;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_fileptr (&mmt, &fp))</div><div class='add'>+ {</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ name = SLang_get_name_from_fileptr (mmt);</div><div class='add'>+ fd = fileno (fp);</div><div class='add'>+</div><div class='add'>+ f = SLfile_create_fd (name, fd);</div><div class='add'>+ if (f != NULL)</div><div class='add'>+ f->close = NULL; /* prevent fd from being closed </div><div class='add'>+ * when it goes out of scope</div><div class='add'>+ */</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+</div><div class='add'>+ if (-1 == SLfile_push_fd (f))</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ SLfile_free_fd (f);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void posix_fdopen (SLFile_FD_Type *f, char *mode)</div><div class='add'>+{</div><div class='add'>+ if (f->stdio_mmt == NULL)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == _SLstdio_fdopen (f->name, f->fd, mode))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (NULL == (f->stdio_mmt = SLang_pop_mmt (SLANG_FILE_PTR_TYPE)))</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ (void) SLang_push_mmt (f->stdio_mmt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static long posix_lseek (SLFile_FD_Type *f, long ofs, int whence)</div><div class='add'>+{</div><div class='add'>+ long status;</div><div class='add'>+ </div><div class='add'>+ if (-1 == (status = lseek (f->fd, ofs, whence)))</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ </div><div class='add'>+ return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int posix_isatty (void)</div><div class='add'>+{</div><div class='add'>+ int ret;</div><div class='add'>+ SLFile_FD_Type *f;</div><div class='add'>+</div><div class='add'>+ if (SLang_peek_at_stack () == SLANG_FILE_PTR_TYPE)</div><div class='add'>+ {</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+ FILE *fp;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_fileptr (&mmt, &fp))</div><div class='add'>+ return 0; /* invalid descriptor */</div><div class='add'>+</div><div class='add'>+ ret = isatty (fileno (fp));</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+ return ret;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLfile_pop_fd (&f))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ ret = isatty (f->fd);</div><div class='add'>+ SLfile_free_fd (f);</div><div class='add'>+</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void posix_dup (SLFile_FD_Type *f)</div><div class='add'>+{</div><div class='add'>+ if ((NULL == (f = SLfile_dup_fd (f)))</div><div class='add'>+ || (-1 == SLfile_push_fd (f)))</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ </div><div class='add'>+ SLfile_free_fd (f);</div><div class='add'>+}</div><div class='add'>+ </div><div class='add'>+#define I SLANG_INT_TYPE</div><div class='add'>+#define V SLANG_VOID_TYPE</div><div class='add'>+#define F SLANG_FILE_FD_TYPE</div><div class='add'>+#define B SLANG_BSTRING_TYPE</div><div class='add'>+#define R SLANG_REF_TYPE</div><div class='add'>+#define U SLANG_UINT_TYPE</div><div class='add'>+#define S SLANG_STRING_TYPE</div><div class='add'>+#define L SLANG_LONG_TYPE</div><div class='add'>+static SLang_Intrin_Fun_Type Fd_Name_Table [] =</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_0("fileno", posix_fileno, V),</div><div class='add'>+ MAKE_INTRINSIC_0("isatty", posix_isatty, I),</div><div class='add'>+ MAKE_INTRINSIC_0("open", posix_open, V),</div><div class='add'>+ MAKE_INTRINSIC_3("read", posix_read, V, F, R, U),</div><div class='add'>+ MAKE_INTRINSIC_3("lseek", posix_lseek, L, F, L, I),</div><div class='add'>+ MAKE_INTRINSIC_2("fdopen", posix_fdopen, V, F, S),</div><div class='add'>+ MAKE_INTRINSIC_2("write", posix_write, V, F, B),</div><div class='add'>+ MAKE_INTRINSIC_1("dup_fd", posix_dup, V, F),</div><div class='add'>+ MAKE_INTRINSIC_1("close", posix_close, I, F),</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+#undef I</div><div class='add'>+#undef V</div><div class='add'>+#undef F</div><div class='add'>+#undef B</div><div class='add'>+#undef R</div><div class='add'>+#undef S</div><div class='add'>+#undef L</div><div class='add'>+#undef U</div><div class='add'>+</div><div class='add'>+static SLang_IConstant_Type PosixIO_Consts [] =</div><div class='add'>+{</div><div class='add'>+#ifdef O_RDONLY</div><div class='add'>+ MAKE_ICONSTANT("O_RDONLY", O_RDONLY),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_WRONLY</div><div class='add'>+ MAKE_ICONSTANT("O_WRONLY", O_WRONLY),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_RDWR</div><div class='add'>+ MAKE_ICONSTANT("O_RDWR", O_RDWR),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_APPEND</div><div class='add'>+ MAKE_ICONSTANT("O_APPEND", O_APPEND),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_CREAT</div><div class='add'>+ MAKE_ICONSTANT("O_CREAT", O_CREAT),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_EXCL</div><div class='add'>+ MAKE_ICONSTANT("O_EXCL", O_EXCL),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_NOCTTY</div><div class='add'>+ MAKE_ICONSTANT("O_NOCTTY", O_NOCTTY),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_NONBLOCK</div><div class='add'>+ MAKE_ICONSTANT("O_NONBLOCK", O_NONBLOCK),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_TRUNC</div><div class='add'>+ MAKE_ICONSTANT("O_TRUNC", O_TRUNC),</div><div class='add'>+#endif</div><div class='add'>+#ifndef O_BINARY</div><div class='add'>+# define O_BINARY 0</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("O_BINARY", O_BINARY),</div><div class='add'>+#ifndef O_TEXT</div><div class='add'>+# define O_TEXT 0</div><div class='add'>+#endif</div><div class='add'>+ MAKE_ICONSTANT("O_TEXT", O_TEXT),</div><div class='add'>+</div><div class='add'>+ SLANG_END_ICONST_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLfile_push_fd (SLFile_FD_Type *f)</div><div class='add'>+{</div><div class='add'>+ if (f == NULL)</div><div class='add'>+ return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+ f->num_refs += 1;</div><div class='add'>+</div><div class='add'>+ if (0 == SLclass_push_ptr_obj (SLANG_FILE_FD_TYPE, (VOID_STAR) f))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ f->num_refs -= 1;</div><div class='add'>+</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLfile_pop_fd (SLFile_FD_Type **f)</div><div class='add'>+{</div><div class='add'>+ return SLclass_pop_ptr_obj (SLANG_FILE_FD_TYPE, (VOID_STAR *) f);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void destroy_fd_type (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ SLfile_free_fd (*(SLFile_FD_Type **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int fd_push (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ return SLfile_push_fd (*(SLFile_FD_Type **)v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_init_posix_io (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("FD_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+ cl->cl_destroy = destroy_fd_type;</div><div class='add'>+ (void) SLclass_set_push_function (cl, fd_push);</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_FILE_FD_TYPE, sizeof (SLFile_FD_Type), SLANG_CLASS_TYPE_PTR))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLadd_intrin_fun_table(Fd_Name_Table, "__POSIXIO__"))</div><div class='add'>+ || (-1 == SLadd_iconstant_table (PosixIO_Consts, NULL))</div><div class='add'>+ || (-1 == _SLerrno_init ()))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slprepr.c b/mdk-stage1/slang/slprepr.c<br/>new file mode 100644<br/>index 000000000..358eeb874<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slprepr.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slprepr.c</a></div><div class='hunk'>@@ -0,0 +1,427 @@</div><div class='add'>+/* Copyright (c) 1996, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/*--------------------------------*-C-*---------------------------------*</div><div class='add'>+ * File: slprepr.c</div><div class='add'>+ *</div><div class='add'>+ * preprocessing routines</div><div class='add'>+ */</div><div class='add'>+/*{{{ notes: */</div><div class='add'>+/*</div><div class='add'>+ * various preprocessing tokens supported</div><div class='add'>+ *</div><div class='add'>+ * #ifdef TOKEN1 TOKEN2 ...</div><div class='add'>+ * - True if any of TOKEN1 TOKEN2 ... are defined</div><div class='add'>+ *</div><div class='add'>+ * #ifndef TOKEN1 TOKEN2 ...</div><div class='add'>+ * - True if none of TOKEN1 TOKEN2 ... are defined</div><div class='add'>+ *</div><div class='add'>+ * #iftrue</div><div class='add'>+ * #ifnfalse</div><div class='add'>+ * - always True</div><div class='add'>+ *</div><div class='add'>+ * #iffalse</div><div class='add'>+ * #ifntrue</div><div class='add'>+ * - always False</div><div class='add'>+ *</div><div class='add'>+ * #if$ENV</div><div class='add'>+ * - True if the enviroment variable ENV is set</div><div class='add'>+ *</div><div class='add'>+ * #ifn$ENV</div><div class='add'>+ * - True if the enviroment variable ENV is not set</div><div class='add'>+ *</div><div class='add'>+ * #if$ENV TOKEN1 TOKEN2 ...</div><div class='add'>+ * - True if the contents of enviroment variable ENV match</div><div class='add'>+ * any of TOKEN1 TOKEN2 ...</div><div class='add'>+ *</div><div class='add'>+ * #ifn$ENV TOKEN1 TOKEN2 ...</div><div class='add'>+ * - True if the contents of enviroment variable ENV do not match</div><div class='add'>+ * any of TOKEN1 TOKEN2 ...</div><div class='add'>+ *</div><div class='add'>+ * NB: For $ENV, the tokens may contain wildcard characters:</div><div class='add'>+ * '?' - match any single character</div><div class='add'>+ * '*' - match any number of characters</div><div class='add'>+ *</div><div class='add'>+ * #elif...</div><div class='add'>+ * #else</div><div class='add'>+ * #endif</div><div class='add'>+ *</div><div class='add'>+ *</div><div class='add'>+ * mj olesen</div><div class='add'>+ *----------------------------------------------------------------------*/</div><div class='add'>+/*}}}*/</div><div class='add'>+/*{{{ includes: */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int (*SLprep_exists_hook) (char *, char);</div><div class='add'>+int (*_SLprep_eval_hook) (char *);</div><div class='add'>+</div><div class='add'>+/*{{{ SLprep_open_prep (), SLprep_close_prep () */</div><div class='add'>+int SLprep_open_prep (SLPreprocess_Type *pt)</div><div class='add'>+{</div><div class='add'>+ pt->this_level = 0;</div><div class='add'>+ pt->exec_level = 0;</div><div class='add'>+ pt->prev_exec_level = 0;</div><div class='add'>+ pt->comment_char = '%';</div><div class='add'>+ pt->preprocess_char = '#';</div><div class='add'>+ pt->flags = 0;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLprep_close_prep (SLPreprocess_Type *pt)</div><div class='add'>+{</div><div class='add'>+ (void) pt;</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLwildcard () */</div><div class='add'>+/*----------------------------------------------------------------------*</div><div class='add'>+ * Does `string' match `pattern' ?</div><div class='add'>+ *</div><div class='add'>+ * '*' in pattern matches any sub-string (including the null string)</div><div class='add'>+ * '?' matches any single char.</div><div class='add'>+ *</div><div class='add'>+ * Code taken from that donated by Paul Hudson <paulh@harlequin.co.uk></div><div class='add'>+ * to the fvwm project.</div><div class='add'>+ * It is public domain, no strings attached. No guarantees either.</div><div class='add'>+ *----------------------------------------------------------------------*/</div><div class='add'>+static int SLwildcard (char *pattern, char *string)</div><div class='add'>+{</div><div class='add'>+ if (pattern == NULL || *pattern == '\0' || !strcmp (pattern, "*"))</div><div class='add'>+ return 1;</div><div class='add'>+ else if (string == NULL)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ while (*pattern && *string) switch (*pattern)</div><div class='add'>+ {</div><div class='add'>+ case '?':</div><div class='add'>+ /* match any single character */</div><div class='add'>+ pattern++;</div><div class='add'>+ string++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '*':</div><div class='add'>+ /* see if rest of pattern matches any trailing */</div><div class='add'>+ /* substring of the string. */</div><div class='add'>+ if (*++pattern == '\0')</div><div class='add'>+ return 1; /* trailing * must match rest */</div><div class='add'>+</div><div class='add'>+ while (*string)</div><div class='add'>+ {</div><div class='add'>+ if (SLwildcard (pattern, string)) return 1;</div><div class='add'>+ string++;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ /* break; */</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ if (*pattern == '\\')</div><div class='add'>+ {</div><div class='add'>+ if (*++pattern == '\0')</div><div class='add'>+ pattern--; /* don't skip trailing backslash */</div><div class='add'>+ }</div><div class='add'>+ if (*pattern++ != *string++) return 0;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return ((*string == '\0')</div><div class='add'>+ && ((*pattern == '\0') || !strcmp (pattern, "*")));</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+#if defined(__16_BIT_SYSTEM__)</div><div class='add'>+# define MAX_DEFINES 10</div><div class='add'>+#else</div><div class='add'>+# define MAX_DEFINES 128</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* The extra one is for NULL termination */</div><div class='add'>+char *_SLdefines [MAX_DEFINES + 1];</div><div class='add'>+</div><div class='add'>+int SLdefine_for_ifdef (char *s) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < MAX_DEFINES; i++)</div><div class='add'>+ {</div><div class='add'>+ char *s1 = _SLdefines [i];</div><div class='add'>+</div><div class='add'>+ if (s1 == s)</div><div class='add'>+ return 0; /* already defined (hashed string) */</div><div class='add'>+</div><div class='add'>+ if (s1 != NULL)</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ s = SLang_create_slstring (s);</div><div class='add'>+ if (s == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ _SLdefines[i] = s;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ static functions */</div><div class='add'>+static int is_any_defined(char *buf, char comment) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char *sys;</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ register char ch;</div><div class='add'>+</div><div class='add'>+ /* Skip whitespace */</div><div class='add'>+ while (((ch = *buf) == ' ') || (ch == '\t'))</div><div class='add'>+ buf++;</div><div class='add'>+</div><div class='add'>+ if ((ch == '\n') || (ch == 0) || (ch == comment))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ while (NULL != (sys = _SLdefines [i++]))</div><div class='add'>+ {</div><div class='add'>+ unsigned int n;</div><div class='add'>+</div><div class='add'>+ if (*sys != ch)</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ n = strlen (sys);</div><div class='add'>+ if (0 == strncmp (buf, sys, n))</div><div class='add'>+ {</div><div class='add'>+ char ch1 = *(buf + n);</div><div class='add'>+</div><div class='add'>+ if ((ch1 == '\n') || (ch1 == 0) ||</div><div class='add'>+ (ch1 == ' ') || (ch1 == '\t') || (ch1 == comment))</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Skip past word */</div><div class='add'>+ while (((ch = *buf) != ' ')</div><div class='add'>+ && (ch != '\n')</div><div class='add'>+ && (ch != 0)</div><div class='add'>+ && (ch != '\t')</div><div class='add'>+ && (ch != comment))</div><div class='add'>+ buf++;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static unsigned char *tokenize (unsigned char *buf, char *token, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ register char *token_end;</div><div class='add'>+</div><div class='add'>+ token_end = token + (len - 1); /* allow room for \0 */</div><div class='add'>+</div><div class='add'>+ while ((token < token_end) && (*buf > ' '))</div><div class='add'>+ *token++ = *buf++;</div><div class='add'>+</div><div class='add'>+ if (*buf > ' ') return NULL; /* token too long */</div><div class='add'>+</div><div class='add'>+ *token = '\0';</div><div class='add'>+</div><div class='add'>+ while ((*buf == ' ') || (*buf == '\t')) buf++;</div><div class='add'>+</div><div class='add'>+ return buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int is_env_defined (char *buf, char comment) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char * env, token [32];</div><div class='add'>+</div><div class='add'>+ if ((*buf <= ' ') || (*buf == comment)) return 0; /* no token */</div><div class='add'>+</div><div class='add'>+ if (NULL == (buf = (char *) tokenize ((unsigned char *) buf,</div><div class='add'>+ token, sizeof (token))))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ if (NULL == (env = getenv (token)))</div><div class='add'>+ return 0; /* ENV not defined */</div><div class='add'>+</div><div class='add'>+ if ((*buf == '\0') || (*buf == '\n') || (*buf == comment))</div><div class='add'>+ return 1; /* no tokens, but getenv() worked */</div><div class='add'>+</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ buf = (char *) tokenize ((unsigned char *) buf, token, sizeof (token));</div><div class='add'>+ if (buf == NULL) return 0;</div><div class='add'>+</div><div class='add'>+ if (SLwildcard (token, env))</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+ while (*buf && (*buf != '\n') && (*buf != comment));</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int SLprep_line_ok (char *buf, SLPreprocess_Type *pt) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ int level, prev_exec_level, exec_level;</div><div class='add'>+</div><div class='add'>+ if ((buf == NULL) || (pt == NULL)) return 1;</div><div class='add'>+</div><div class='add'>+ if (*buf != pt->preprocess_char)</div><div class='add'>+ {</div><div class='add'>+ if (pt->this_level != pt->exec_level)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ if (*buf == '\n') return pt->flags & SLPREP_BLANK_LINES_OK;</div><div class='add'>+ if (*buf == pt->comment_char) return pt->flags & SLPREP_COMMENT_LINES_OK;</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ level = pt->this_level;</div><div class='add'>+ exec_level = pt->exec_level;</div><div class='add'>+ prev_exec_level = pt->prev_exec_level;</div><div class='add'>+</div><div class='add'>+ buf++;</div><div class='add'>+</div><div class='add'>+ /* Allow '#!' to pass. This could be a shell script with something</div><div class='add'>+ like '#! /local/bin/slang' */</div><div class='add'>+ if ((*buf == '!') && (pt->preprocess_char == '#'))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ /* Allow whitespace as in '# ifdef' */</div><div class='add'>+ while ((*buf == ' ') || (*buf == '\t')) buf++;</div><div class='add'>+ if (*buf < 'a') return (level == exec_level);</div><div class='add'>+</div><div class='add'>+ if (!strncmp(buf, "endif", 5))</div><div class='add'>+ {</div><div class='add'>+ if (level == exec_level)</div><div class='add'>+ {</div><div class='add'>+ exec_level--;</div><div class='add'>+ prev_exec_level = exec_level;</div><div class='add'>+ }</div><div class='add'>+ level--;</div><div class='add'>+ if (level < prev_exec_level) prev_exec_level = level;</div><div class='add'>+ goto done;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((buf[0] == 'e') && (buf[1] == 'l')) /* else, elifdef, ... */</div><div class='add'>+ {</div><div class='add'>+ if ((level == exec_level + 1)</div><div class='add'>+ && (prev_exec_level != level))</div><div class='add'>+ {</div><div class='add'>+ /* We are in position to execute */</div><div class='add'>+ buf += 2;</div><div class='add'>+ if ((buf[0] == 's') && (buf[1] == 'e'))</div><div class='add'>+ {</div><div class='add'>+ /* "else" */</div><div class='add'>+ exec_level = level;</div><div class='add'>+ goto done;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* drop through to ifdef testing. First set variable</div><div class='add'>+ * to values appropriate for ifdef testing.</div><div class='add'>+ */</div><div class='add'>+ level--; /* now == to exec level */</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if (level == exec_level)</div><div class='add'>+ {</div><div class='add'>+ exec_level--;</div><div class='add'>+ }</div><div class='add'>+ goto done;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((buf[0] == 'i') && (buf[1] == 'f'))</div><div class='add'>+ {</div><div class='add'>+ int truth;</div><div class='add'>+</div><div class='add'>+ if (level != exec_level)</div><div class='add'>+ {</div><div class='add'>+ /* Not interested */</div><div class='add'>+ level++;</div><div class='add'>+ goto done;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ level++;</div><div class='add'>+</div><div class='add'>+ buf += 2;</div><div class='add'>+ if (buf[0] == 'n')</div><div class='add'>+ {</div><div class='add'>+ truth = 0;</div><div class='add'>+ buf++;</div><div class='add'>+ }</div><div class='add'>+ else truth = 1;</div><div class='add'>+</div><div class='add'>+ if (!strncmp (buf, "def", 3))</div><div class='add'>+ truth = (truth == is_any_defined(buf + 3, pt->comment_char));</div><div class='add'>+</div><div class='add'>+ else if (!strncmp (buf, "false", 5))</div><div class='add'>+ truth = !truth;</div><div class='add'>+</div><div class='add'>+ else if (*buf == '$')</div><div class='add'>+ truth = (truth == is_env_defined (buf + 1, pt->comment_char));</div><div class='add'>+</div><div class='add'>+ else if (!strncmp (buf, "exists", 6)</div><div class='add'>+ && (SLprep_exists_hook != NULL))</div><div class='add'>+ truth = (truth == (*SLprep_exists_hook)(buf + 6, pt->comment_char));</div><div class='add'>+</div><div class='add'>+ else if (!strncmp (buf, "eval", 4)</div><div class='add'>+ && (_SLprep_eval_hook != NULL))</div><div class='add'>+ truth = (truth == (*_SLprep_eval_hook) (buf + 4));</div><div class='add'>+ </div><div class='add'>+ else if (0 != strncmp (buf, "true", 4))</div><div class='add'>+ return 1; /* let it bomb */</div><div class='add'>+</div><div class='add'>+ if (truth)</div><div class='add'>+ {</div><div class='add'>+ exec_level = level;</div><div class='add'>+ prev_exec_level = exec_level;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else return 1; /* let it bomb. */</div><div class='add'>+</div><div class='add'>+ done:</div><div class='add'>+</div><div class='add'>+ if (exec_level < 0) return 1;</div><div class='add'>+</div><div class='add'>+ pt->this_level = level;</div><div class='add'>+ pt->exec_level = exec_level;</div><div class='add'>+ pt->prev_exec_level = prev_exec_level;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ main() - for testing only */</div><div class='add'>+#if 0</div><div class='add'>+int main ()</div><div class='add'>+{</div><div class='add'>+ char buf[1024];</div><div class='add'>+ SLPreprocess_Type pt;</div><div class='add'>+</div><div class='add'>+ SLprep_open_prep (&pt);</div><div class='add'>+</div><div class='add'>+ SLdefine_for_ifdef ("UNIX");</div><div class='add'>+</div><div class='add'>+ while (NULL != fgets (buf, sizeof (buf) - 1, stdin))</div><div class='add'>+ {</div><div class='add'>+ if (SLprep_line_ok (buf, &pt))</div><div class='add'>+ {</div><div class='add'>+ fputs (buf, stdout);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLprep_close_prep (&pt);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+/*}}}*/</div><div class='head'>diff --git a/mdk-stage1/slang/slproc.c b/mdk-stage1/slang/slproc.c<br/>new file mode 100644<br/>index 000000000..8b266f28f<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slproc.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slproc.c</a></div><div class='hunk'>@@ -0,0 +1,155 @@</div><div class='add'>+/* Process specific system calls */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_IO_H</div><div class='add'>+# include <io.h> /* for chmod */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_PROCESS_H</div><div class='add'>+# include <process.h> /* for getpid */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include <dos.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include <sys/types.h></div><div class='add'>+#include <sys/stat.h></div><div class='add'>+#include <signal.h></div><div class='add'>+#include <time.h></div><div class='add'>+</div><div class='add'>+#include <errno.h></div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_KILL</div><div class='add'>+static int kill_cmd (int *pid, int *sig)</div><div class='add'>+{</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (-1 == (ret = kill ((pid_t) *pid, *sig)))</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int getpid_cmd (void)</div><div class='add'>+{</div><div class='add'>+ return getpid ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_GETPPID</div><div class='add'>+static int getppid_cmd (void)</div><div class='add'>+{</div><div class='add'>+ return getppid ();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_GETGID</div><div class='add'>+static int getgid_cmd (void)</div><div class='add'>+{</div><div class='add'>+ return getgid ();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_GETEGID</div><div class='add'>+static int getegid_cmd (void)</div><div class='add'>+{</div><div class='add'>+ return getegid ();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_GETEUID</div><div class='add'>+static int geteuid_cmd (void)</div><div class='add'>+{</div><div class='add'>+ return geteuid ();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_GETUID</div><div class='add'>+static int getuid_cmd (void)</div><div class='add'>+{</div><div class='add'>+ return getuid ();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SETGID</div><div class='add'>+static int setgid_cmd (int *gid)</div><div class='add'>+{</div><div class='add'>+ if (0 == setgid (*gid))</div><div class='add'>+ return 0;</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SETPGID</div><div class='add'>+static int setpgid_cmd (int *pid, int *pgid)</div><div class='add'>+{</div><div class='add'>+ if (0 == setpgid (*pid, *pgid))</div><div class='add'>+ return 0;</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SETUID</div><div class='add'>+static int setuid_cmd (int *uid)</div><div class='add'>+{</div><div class='add'>+ if (0 == setuid (*uid))</div><div class='add'>+ return 0;</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Process_Name_Table[] =</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_0("getpid", getpid_cmd, SLANG_INT_TYPE),</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_GETPPID</div><div class='add'>+ MAKE_INTRINSIC_0("getppid", getppid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_GETGID</div><div class='add'>+ MAKE_INTRINSIC_0("getgid", getgid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_GETEGID</div><div class='add'>+ MAKE_INTRINSIC_0("getegid", getegid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_GETEUID</div><div class='add'>+ MAKE_INTRINSIC_0("geteuid", geteuid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_GETUID</div><div class='add'>+ MAKE_INTRINSIC_0("getuid", getuid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SETGID</div><div class='add'>+ MAKE_INTRINSIC_I("setgid", setgid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SETPGID</div><div class='add'>+ MAKE_INTRINSIC_II("setpgid", setpgid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SETUID</div><div class='add'>+ MAKE_INTRINSIC_I("setuid", setuid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_KILL</div><div class='add'>+ MAKE_INTRINSIC_II("kill", kill_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLang_init_posix_process (void)</div><div class='add'>+{</div><div class='add'>+ if ((-1 == SLadd_intrin_fun_table (Process_Name_Table, "__POSIX_PROCESS__"))</div><div class='add'>+ || (-1 == _SLerrno_init ()))</div><div class='add'>+ return -1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slregexp.c b/mdk-stage1/slang/slregexp.c<br/>new file mode 100644<br/>index 000000000..6592a5a63<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slregexp.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slregexp.c</a></div><div class='hunk'>@@ -0,0 +1,935 @@</div><div class='add'>+/* ed style regular expressions */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#define SET_BIT(b, n) b[(unsigned int) (n) >> 3] |= 1 << ((unsigned int) (n) % 8)</div><div class='add'>+#define TEST_BIT(b, n) (b[(unsigned int)(n) >> 3] & (1 << ((unsigned int) (n) % 8)))</div><div class='add'>+#define LITERAL 1</div><div class='add'>+#define RANGE 2 /* [...] */</div><div class='add'>+#define ANY 3 /* . */</div><div class='add'>+#define BOL 4 /* ^ */</div><div class='add'>+#define EOL 5 /* $ */</div><div class='add'>+#define NTH_MATCH 6 /* \1 \2 ... \9 */</div><div class='add'>+#define OPAREN 7 /* \( */</div><div class='add'>+#define CPAREN 0x8 /* \) */</div><div class='add'>+#define ANY_DIGIT 0x9 /* \d */</div><div class='add'>+#define BOW 0xA /* \< */</div><div class='add'>+#define EOW 0xB /* \> */</div><div class='add'>+#if 0</div><div class='add'>+#define NOT_LITERAL 0xC /* \~ */</div><div class='add'>+#endif</div><div class='add'>+#define STAR 0x80 /* * */</div><div class='add'>+#define LEAST_ONCE 0x40 /* + */</div><div class='add'>+#define MAYBE_ONCE 0x20 /* ? */</div><div class='add'>+#define MANY 0x10 /* {n,m} */</div><div class='add'>+/* The rest are additions */</div><div class='add'>+#define YES_CASE (STAR | BOL)</div><div class='add'>+#define NO_CASE (STAR | EOL)</div><div class='add'>+</div><div class='add'>+#define UPPERCASE(x) (cs ? (x) : UPPER_CASE(x))</div><div class='add'>+#define LOWERCASE(x) (cs ? (x) : LOWER_CASE(x))</div><div class='add'>+</div><div class='add'>+static unsigned char Word_Chars[256];</div><div class='add'>+#define IS_WORD_CHAR(x) Word_Chars[(unsigned int) (x)]</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+static int ctx->open_paren_number;</div><div class='add'>+static char Closed_Paren_Matches[10];</div><div class='add'>+</div><div class='add'>+static SLRegexp_Type *This_Reg;</div><div class='add'>+static unsigned char *This_Str;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ SLRegexp_Type *reg;</div><div class='add'>+ unsigned char *str;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char closed_paren_matches[10];</div><div class='add'>+ int open_paren_number;</div><div class='add'>+}</div><div class='add'>+Re_Context_Type;</div><div class='add'>+</div><div class='add'>+static unsigned char *do_nth_match (Re_Context_Type *ctx, int n, unsigned char *str, unsigned char *estr)</div><div class='add'>+{</div><div class='add'>+ unsigned char *bpos;</div><div class='add'>+</div><div class='add'>+ if (ctx->closed_paren_matches[n] == 0)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ bpos = ctx->reg->beg_matches[n] + ctx->str;</div><div class='add'>+ n = ctx->reg->end_matches[n];</div><div class='add'>+ if (n == 0) return(str);</div><div class='add'>+ if (n > (int) (estr - str)) return (NULL);</div><div class='add'>+</div><div class='add'>+ /* This needs fixed for case sensitive match */</div><div class='add'>+ if (0 != strncmp((char *) str, (char *) bpos, (unsigned int) n)) return (NULL);</div><div class='add'>+ str += n;</div><div class='add'>+ return (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* returns pointer to the end of regexp or NULL */</div><div class='add'>+static unsigned char *regexp_looking_at (Re_Context_Type *ctx, register unsigned char *str, unsigned char *estr, unsigned char *buf, register int cs)</div><div class='add'>+{</div><div class='add'>+ register unsigned char p, p1;</div><div class='add'>+ unsigned char *save_str, *tmpstr;</div><div class='add'>+ int n, n0, n1;</div><div class='add'>+ int save_num_open;</div><div class='add'>+ char save_closed_matches[10];</div><div class='add'>+</div><div class='add'>+ p = *buf++;</div><div class='add'>+</div><div class='add'>+ while (p != 0)</div><div class='add'>+ {</div><div class='add'>+ /* p1 = UPPERCASE(*buf); */</div><div class='add'>+ /* if (str < estr) c = UPPERCASE(*str); */</div><div class='add'>+</div><div class='add'>+ switch((unsigned char) p)</div><div class='add'>+ {</div><div class='add'>+ case BOW:</div><div class='add'>+ if ((str != ctx->str)</div><div class='add'>+ && ((str >= estr)</div><div class='add'>+ || IS_WORD_CHAR(*(str - 1))</div><div class='add'>+ || (0 == IS_WORD_CHAR(*str)))) return NULL;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case EOW:</div><div class='add'>+ if ((str < estr)</div><div class='add'>+ && IS_WORD_CHAR (*str)) return NULL;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case YES_CASE: cs = 1; break;</div><div class='add'>+ case NO_CASE: cs = 0; break;</div><div class='add'>+</div><div class='add'>+ case OPAREN:</div><div class='add'>+ ctx->open_paren_number++;</div><div class='add'>+ ctx->reg->beg_matches[ctx->open_paren_number] = (int) (str - ctx->str);</div><div class='add'>+ break;</div><div class='add'>+ case CPAREN:</div><div class='add'>+ n = ctx->open_paren_number;</div><div class='add'>+ while (n > 0)</div><div class='add'>+ {</div><div class='add'>+ if (ctx->closed_paren_matches[n] != 0)</div><div class='add'>+ {</div><div class='add'>+ n--;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ ctx->closed_paren_matches[n] = 1;</div><div class='add'>+ ctx->reg->end_matches[n] = (unsigned int) (str - (ctx->str + ctx->reg->beg_matches[n]));</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+#ifdef NOT_LITERAL</div><div class='add'>+ case NOT_LITERAL:</div><div class='add'>+ if ((str >= estr) || (*buf == UPPERCASE(*str))) return (NULL);</div><div class='add'>+ str++; buf++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case MAYBE_ONCE | NOT_LITERAL:</div><div class='add'>+ save_str = str;</div><div class='add'>+ if ((str < estr) && (*buf != UPPERCASE(*str))) str++;</div><div class='add'>+ buf++;</div><div class='add'>+ goto match_rest;</div><div class='add'>+</div><div class='add'>+ case NOT_LITERAL | LEAST_ONCE: /* match at least once */</div><div class='add'>+ if ((str >= estr) || (UPPERCASE(*str) == UPPERCASE(*buf))) return (NULL);</div><div class='add'>+ str++;</div><div class='add'>+ /* drop */</div><div class='add'>+ case STAR | NOT_LITERAL:</div><div class='add'>+ save_str = str; p1 = *buf;</div><div class='add'>+ while ((str < estr) && (UPPERCASE(*str) != p1)) str++;</div><div class='add'>+ buf++;</div><div class='add'>+ goto match_rest;</div><div class='add'>+</div><div class='add'>+ /* this type consists of the expression + two bytes that</div><div class='add'>+ determine number of matches to perform */</div><div class='add'>+ case MANY | NOT_LITERAL:</div><div class='add'>+ p1 = *buf; buf++;</div><div class='add'>+ n = n0 = (int) (unsigned char) *buf++;</div><div class='add'>+ /* minimum number to match--- could be 0 */</div><div class='add'>+ n1 = (int) (unsigned char) *buf++;</div><div class='add'>+ /* maximum number to match */</div><div class='add'>+</div><div class='add'>+ while (n && (str < estr) && (p1 != *str))</div><div class='add'>+ {</div><div class='add'>+ n--;</div><div class='add'>+ str++;</div><div class='add'>+ }</div><div class='add'>+ if (n) return (NULL);</div><div class='add'>+</div><div class='add'>+ save_str = str;</div><div class='add'>+ n = n1 - n0;</div><div class='add'>+ while (n && (str < estr) && (p1 != *str))</div><div class='add'>+ {</div><div class='add'>+ n--;</div><div class='add'>+ str++;</div><div class='add'>+ }</div><div class='add'>+ goto match_rest;</div><div class='add'>+#endif /* NOT_LITERAL */</div><div class='add'>+ case LITERAL:</div><div class='add'>+ if ((str >= estr) || (*buf != UPPERCASE(*str))) return (NULL);</div><div class='add'>+ str++; buf++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case MAYBE_ONCE | LITERAL:</div><div class='add'>+ save_str = str;</div><div class='add'>+ if ((str < estr) && (*buf == UPPERCASE(*str))) str++;</div><div class='add'>+ buf++;</div><div class='add'>+ goto match_rest;</div><div class='add'>+</div><div class='add'>+ case LITERAL | LEAST_ONCE: /* match at least once */</div><div class='add'>+ if ((str >= estr) || (UPPERCASE(*str) != UPPERCASE(*buf))) return (NULL);</div><div class='add'>+ str++;</div><div class='add'>+ /* drop */</div><div class='add'>+ case STAR | LITERAL:</div><div class='add'>+ save_str = str; p1 = *buf;</div><div class='add'>+ while ((str < estr) && (UPPERCASE(*str) == p1)) str++;</div><div class='add'>+ buf++;</div><div class='add'>+ goto match_rest;</div><div class='add'>+</div><div class='add'>+ /* this type consists of the expression + two bytes that</div><div class='add'>+ determine number of matches to perform */</div><div class='add'>+ case MANY | LITERAL:</div><div class='add'>+ p1 = *buf; buf++;</div><div class='add'>+ n = n0 = (int) (unsigned char) *buf++;</div><div class='add'>+ /* minimum number to match--- could be 0 */</div><div class='add'>+ n1 = (int) (unsigned char) *buf++;</div><div class='add'>+ /* maximum number to match */</div><div class='add'>+</div><div class='add'>+ while (n && (str < estr) && (p1 == *str))</div><div class='add'>+ {</div><div class='add'>+ n--;</div><div class='add'>+ str++;</div><div class='add'>+ }</div><div class='add'>+ if (n) return (NULL);</div><div class='add'>+</div><div class='add'>+ save_str = str;</div><div class='add'>+ n = n1 - n0;</div><div class='add'>+ while (n && (str < estr) && (p1 == *str))</div><div class='add'>+ {</div><div class='add'>+ n--;</div><div class='add'>+ str++;</div><div class='add'>+ }</div><div class='add'>+ goto match_rest;</div><div class='add'>+</div><div class='add'>+ case NTH_MATCH:</div><div class='add'>+ if ((str = do_nth_match(ctx, (int) (unsigned char) *buf, str, estr)) == NULL) return(NULL);</div><div class='add'>+ buf++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case MAYBE_ONCE | NTH_MATCH:</div><div class='add'>+ save_str = str;</div><div class='add'>+ tmpstr = do_nth_match (ctx, (int) (unsigned char) *buf, str, estr);</div><div class='add'>+ buf++;</div><div class='add'>+ if (tmpstr != NULL)</div><div class='add'>+ {</div><div class='add'>+ str = tmpstr;</div><div class='add'>+ goto match_rest;</div><div class='add'>+ }</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ case LEAST_ONCE | NTH_MATCH:</div><div class='add'>+ if ((str = do_nth_match(ctx, (int) (unsigned char) *buf, str, estr)) == NULL) return(NULL);</div><div class='add'>+ /* drop */</div><div class='add'>+ case STAR | NTH_MATCH:</div><div class='add'>+ save_str = str;</div><div class='add'>+ while (NULL != (tmpstr = do_nth_match(ctx, (int) (unsigned char) *buf, str, estr)))</div><div class='add'>+ {</div><div class='add'>+ str = tmpstr;</div><div class='add'>+ }</div><div class='add'>+ buf++;</div><div class='add'>+ goto match_rest;</div><div class='add'>+</div><div class='add'>+ case MANY | NTH_MATCH: return(NULL);</div><div class='add'>+ /* needs done */</div><div class='add'>+</div><div class='add'>+ case RANGE:</div><div class='add'>+ if (str >= estr) return (NULL);</div><div class='add'>+ if (TEST_BIT(buf, UPPERCASE(*str)) == 0) return (NULL);</div><div class='add'>+ buf += 32; str++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case MAYBE_ONCE | RANGE:</div><div class='add'>+ save_str = str;</div><div class='add'>+ if ((str < estr) && TEST_BIT(buf, UPPERCASE(*str))) str++;</div><div class='add'>+ buf += 32;</div><div class='add'>+ goto match_rest;</div><div class='add'>+</div><div class='add'>+ case LEAST_ONCE | RANGE:</div><div class='add'>+ if ((str >= estr) || (0 == TEST_BIT(buf, UPPERCASE(*str)))) return NULL;</div><div class='add'>+ str++;</div><div class='add'>+ /* drop */</div><div class='add'>+ case STAR | RANGE:</div><div class='add'>+ save_str = str;</div><div class='add'>+ while ((str < estr) && TEST_BIT(buf, UPPERCASE(*str))) str++;</div><div class='add'>+ buf += 32;</div><div class='add'>+ goto match_rest;</div><div class='add'>+</div><div class='add'>+ /* The first 32 bytes correspond to the range and the two</div><div class='add'>+ * following bytes indicate the min and max number of matches.</div><div class='add'>+ */</div><div class='add'>+ case MANY | RANGE:</div><div class='add'>+ /* minimum number to match--- could be 0 */</div><div class='add'>+ n = n0 = (int) (unsigned char) *(buf + 32);</div><div class='add'>+ /* maximum number to match */</div><div class='add'>+ n1 = (int) (unsigned char) *(buf + 33);</div><div class='add'>+</div><div class='add'>+ while (n && (str < estr) && (TEST_BIT(buf, UPPERCASE(*str))))</div><div class='add'>+ {</div><div class='add'>+ n--;</div><div class='add'>+ str++;</div><div class='add'>+ }</div><div class='add'>+ if (n) return (NULL);</div><div class='add'>+ save_str = str;</div><div class='add'>+ n = n1 - n0;</div><div class='add'>+ while (n && (str < estr) && (TEST_BIT(buf, UPPERCASE(*str))))</div><div class='add'>+ {</div><div class='add'>+ n--;</div><div class='add'>+ str++;</div><div class='add'>+ }</div><div class='add'>+ buf += 34; /* 32 + 2 */</div><div class='add'>+ goto match_rest;</div><div class='add'>+</div><div class='add'>+ case ANY_DIGIT:</div><div class='add'>+ if ((str >= estr) || (*str > '9') || (*str < '0')) return (NULL);</div><div class='add'>+ str++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case MAYBE_ONCE | ANY_DIGIT:</div><div class='add'>+ save_str = str;</div><div class='add'>+ if ((str < estr) && ((*str > '9') || (*str < '0'))) str++;</div><div class='add'>+ goto match_rest;</div><div class='add'>+</div><div class='add'>+ case LEAST_ONCE | ANY_DIGIT:</div><div class='add'>+ if ((str >= estr) || ((*str > '9') || (*str < '0'))) return NULL;</div><div class='add'>+ str++;</div><div class='add'>+ /* drop */</div><div class='add'>+ case STAR | ANY_DIGIT:</div><div class='add'>+ save_str = str;</div><div class='add'>+ while ((str < estr) && ((*str <= '9') && (*str >= '0'))) str++;</div><div class='add'>+ goto match_rest;</div><div class='add'>+</div><div class='add'>+ case MANY | ANY_DIGIT:</div><div class='add'>+ /* needs finished */</div><div class='add'>+ return (NULL);</div><div class='add'>+</div><div class='add'>+ case ANY:</div><div class='add'>+ if ((str >= estr) || (*str == '\n')) return (NULL);</div><div class='add'>+ str++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case MAYBE_ONCE | ANY:</div><div class='add'>+ save_str = str;</div><div class='add'>+ if ((str < estr) && (*str != '\n')) str++;</div><div class='add'>+ goto match_rest;</div><div class='add'>+</div><div class='add'>+ case LEAST_ONCE | ANY:</div><div class='add'>+ if ((str >= estr) || (*str == '\n')) return (NULL);</div><div class='add'>+ str++;</div><div class='add'>+ /* drop */</div><div class='add'>+ case STAR | ANY:</div><div class='add'>+ save_str = str;</div><div class='add'>+ while ((str < estr) && (*str != '\n')) str++;</div><div class='add'>+ goto match_rest;</div><div class='add'>+</div><div class='add'>+ case MANY | ANY:</div><div class='add'>+ return (NULL);</div><div class='add'>+ /* needs finished */</div><div class='add'>+</div><div class='add'>+ case EOL:</div><div class='add'>+ if ((str >= estr) || (*str == '\n')) return (str);</div><div class='add'>+ return(NULL);</div><div class='add'>+</div><div class='add'>+ default: return (NULL);</div><div class='add'>+ }</div><div class='add'>+ p = *buf++;</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ match_rest:</div><div class='add'>+ if (save_str == str)</div><div class='add'>+ {</div><div class='add'>+ p = *buf++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* if (p == EOL)</div><div class='add'>+ * {</div><div class='add'>+ * if (str < estr) return (NULL); else return (str);</div><div class='add'>+ * }</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ SLMEMCPY(save_closed_matches, ctx->closed_paren_matches, sizeof(save_closed_matches));</div><div class='add'>+ save_num_open = ctx->open_paren_number;</div><div class='add'>+ while (str >= save_str)</div><div class='add'>+ {</div><div class='add'>+ tmpstr = regexp_looking_at (ctx, str, estr, buf, cs);</div><div class='add'>+ if (tmpstr != NULL) return(tmpstr);</div><div class='add'>+ SLMEMCPY(ctx->closed_paren_matches, save_closed_matches, sizeof(ctx->closed_paren_matches));</div><div class='add'>+ ctx->open_paren_number = save_num_open;</div><div class='add'>+ str--;</div><div class='add'>+ }</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ if ((p != 0) && (p != EOL)) return (NULL); else return (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+fixup_beg_end_matches (Re_Context_Type *ctx, SLRegexp_Type *r, unsigned char *str, unsigned char *epos)</div><div class='add'>+{</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if (str == NULL)</div><div class='add'>+ {</div><div class='add'>+ r->beg_matches[0] = -1;</div><div class='add'>+ r->end_matches[0] = 0;</div><div class='add'>+ SLMEMSET(ctx->closed_paren_matches, 0, sizeof(ctx->closed_paren_matches));</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ r->beg_matches[0] = (int) (str - ctx->str);</div><div class='add'>+ r->end_matches[0] = (unsigned int) (epos - str);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (i = 1; i < 10; i++)</div><div class='add'>+ {</div><div class='add'>+ if (ctx->closed_paren_matches [i] == 0)</div><div class='add'>+ {</div><div class='add'>+ r->beg_matches[i] = -1;</div><div class='add'>+ r->end_matches[i] = 0;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void init_re_context (Re_Context_Type *ctx, SLRegexp_Type *reg, </div><div class='add'>+ unsigned char *str, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ memset ((char *) ctx, 0, sizeof (Re_Context_Type));</div><div class='add'>+ ctx->reg = reg;</div><div class='add'>+ ctx->str = str;</div><div class='add'>+ ctx->len = len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned char *SLang_regexp_match(unsigned char *str,</div><div class='add'>+ unsigned int len, SLRegexp_Type *reg)</div><div class='add'>+{</div><div class='add'>+ register unsigned char c = 0, *estr = str + len;</div><div class='add'>+ int cs = reg->case_sensitive, lit = 0;</div><div class='add'>+ unsigned char *buf = reg->buf, *epos = NULL;</div><div class='add'>+ Re_Context_Type ctx_buf;</div><div class='add'>+</div><div class='add'>+ if (reg->min_length > len) return NULL;</div><div class='add'>+</div><div class='add'>+ init_re_context (&ctx_buf, reg, str, len);</div><div class='add'>+</div><div class='add'>+ if (*buf == BOL)</div><div class='add'>+ {</div><div class='add'>+ if (NULL == (epos = regexp_looking_at (&ctx_buf, str, estr, buf + 1, cs)))</div><div class='add'>+ str = NULL;</div><div class='add'>+</div><div class='add'>+ fixup_beg_end_matches (&ctx_buf, reg, str, epos);</div><div class='add'>+ return str;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (*buf == NO_CASE)</div><div class='add'>+ {</div><div class='add'>+ buf++; cs = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (*buf == YES_CASE)</div><div class='add'>+ {</div><div class='add'>+ buf++; cs = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (*buf == LITERAL)</div><div class='add'>+ {</div><div class='add'>+ lit = 1;</div><div class='add'>+ c = *(buf + 1);</div><div class='add'>+ }</div><div class='add'>+ else if ((*buf == OPAREN) && (*(buf + 1) == LITERAL))</div><div class='add'>+ {</div><div class='add'>+ lit = 1;</div><div class='add'>+ c = *(buf + 2);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (str < estr)</div><div class='add'>+ {</div><div class='add'>+ ctx_buf.open_paren_number = 0;</div><div class='add'>+ memset (ctx_buf.closed_paren_matches, 0, sizeof(ctx_buf.closed_paren_matches));</div><div class='add'>+ /* take care of leading chars */</div><div class='add'>+ if (lit)</div><div class='add'>+ {</div><div class='add'>+ while ((str < estr) && (c != UPPERCASE(*str))) str++;</div><div class='add'>+ if (str >= estr)</div><div class='add'>+ break; /* failed */</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL != (epos = regexp_looking_at(&ctx_buf, str, estr, buf, cs)))</div><div class='add'>+ {</div><div class='add'>+ fixup_beg_end_matches (&ctx_buf, reg, str, epos);</div><div class='add'>+ return str;</div><div class='add'>+ }</div><div class='add'>+ str++;</div><div class='add'>+ }</div><div class='add'>+ fixup_beg_end_matches (&ctx_buf, reg, NULL, epos);</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char *convert_digit(unsigned char *pat, int *nn)</div><div class='add'>+{</div><div class='add'>+ int n = 0, m = 0;</div><div class='add'>+ unsigned char c;</div><div class='add'>+ while (c = (unsigned char) *pat, (c <= '9') && (c >= '0'))</div><div class='add'>+ {</div><div class='add'>+ pat++;</div><div class='add'>+ n = 10 * n + (c - '0');</div><div class='add'>+ m++;</div><div class='add'>+ }</div><div class='add'>+ if (m == 0)</div><div class='add'>+ {</div><div class='add'>+ return (NULL);</div><div class='add'>+ }</div><div class='add'>+ *nn = n;</div><div class='add'>+ return pat;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define ERROR return (int) (pat - reg->pat)</div><div class='add'>+</div><div class='add'>+/* Returns 0 if successful or offset in pattern of error */</div><div class='add'>+int SLang_regexp_compile (SLRegexp_Type *reg)</div><div class='add'>+{</div><div class='add'>+ register unsigned char *buf, *ebuf, *pat;</div><div class='add'>+ unsigned char *last = NULL, *tmppat;</div><div class='add'>+ register unsigned char c;</div><div class='add'>+ int i, reverse = 0, n, cs;</div><div class='add'>+ int oparen = 0, nparen = 0;</div><div class='add'>+ /* substring stuff */</div><div class='add'>+ int count, last_count, this_max_mm = 0, max_mm = 0, ordinary_search,</div><div class='add'>+ no_osearch = 0, min_length = 0;</div><div class='add'>+ unsigned char *mm_p = NULL, *this_mm_p = NULL;</div><div class='add'>+ static int already_initialized;</div><div class='add'>+</div><div class='add'>+ reg->beg_matches[0] = reg->end_matches[0] = 0;</div><div class='add'>+ buf = reg->buf;</div><div class='add'>+ ebuf = (reg->buf + reg->buf_len) - 2; /* make some room */</div><div class='add'>+ pat = reg->pat;</div><div class='add'>+ cs = reg->case_sensitive;</div><div class='add'>+</div><div class='add'>+ if (already_initialized == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_init_case_tables ();</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+ SLmake_lut (Word_Chars, (unsigned char *) "_0-9a-zA-Z\200-\232\240-\245\341-\353", 0);</div><div class='add'>+#else</div><div class='add'>+ SLmake_lut (Word_Chars, (unsigned char *) "_0-9a-zA-Z\277-\326\330-\336\340-\366\370-\376", 0);</div><div class='add'>+#endif</div><div class='add'>+ already_initialized = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ i = 1; while (i < 10)</div><div class='add'>+ {</div><div class='add'>+ reg->beg_matches[i] = -1;</div><div class='add'>+ reg->end_matches[i] = 0;</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (*pat == '\\')</div><div class='add'>+ {</div><div class='add'>+ if (pat[1] == 'c')</div><div class='add'>+ {</div><div class='add'>+ cs = 1;</div><div class='add'>+ pat += 2;</div><div class='add'>+ no_osearch = 1;</div><div class='add'>+ }</div><div class='add'>+ else if (pat[1] == 'C')</div><div class='add'>+ {</div><div class='add'>+ cs = 0;</div><div class='add'>+ pat += 2;</div><div class='add'>+ no_osearch = 1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (*pat == '^')</div><div class='add'>+ {</div><div class='add'>+ pat++;</div><div class='add'>+ *buf++ = BOL;</div><div class='add'>+ reg->must_match_bol = 1;</div><div class='add'>+ }</div><div class='add'>+ else reg->must_match_bol = 0;</div><div class='add'>+</div><div class='add'>+ if (cs != reg->case_sensitive)</div><div class='add'>+ {</div><div class='add'>+ if (cs) *buf++ = YES_CASE; </div><div class='add'>+ else *buf++ = NO_CASE; </div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *buf = 0;</div><div class='add'>+</div><div class='add'>+ last_count = count = 0;</div><div class='add'>+ while ((c = *pat++) != 0)</div><div class='add'>+ {</div><div class='add'>+ if (buf >= ebuf - 3)</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror ("Pattern too large to be compiled.");</div><div class='add'>+ ERROR;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ count++;</div><div class='add'>+ switch (c)</div><div class='add'>+ {</div><div class='add'>+ case '$':</div><div class='add'>+ if (*pat != 0) goto literal_char;</div><div class='add'>+ *buf++ = EOL;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '\\':</div><div class='add'>+ c = *pat++;</div><div class='add'>+ no_osearch = 1;</div><div class='add'>+ switch(c)</div><div class='add'>+ {</div><div class='add'>+ case 'e': c = 033; goto literal_char;</div><div class='add'>+ case 'n': c = '\n'; goto literal_char;</div><div class='add'>+ case 't': c = '\t'; goto literal_char;</div><div class='add'>+ case 'C': cs = 0; *buf++ = NO_CASE; break;</div><div class='add'>+ case 'c': cs = 1; *buf++ = YES_CASE; break;</div><div class='add'>+ case '1': case '2': case '3': case '4': case '5':</div><div class='add'>+ case '6': case '7': case '8': case '9':</div><div class='add'>+ c = c - '0';</div><div class='add'>+ if ((int) c > nparen) ERROR;</div><div class='add'>+ last = buf;</div><div class='add'>+ *buf++ = NTH_MATCH; *buf++ = c;</div><div class='add'>+ break;</div><div class='add'>+#ifdef NOT_LITERAL</div><div class='add'>+ case '~': /* slang extension */</div><div class='add'>+ if ((c = *pat) == 0) ERROR;</div><div class='add'>+ pat++;</div><div class='add'>+ last = buf;</div><div class='add'>+ *buf++ = NOT_LITERAL;</div><div class='add'>+ *buf++ = c;</div><div class='add'>+ min_length++;</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ case 'd': /* slang extension */</div><div class='add'>+ last = buf;</div><div class='add'>+ *buf++ = ANY_DIGIT;</div><div class='add'>+ min_length++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '<':</div><div class='add'>+ last = NULL;</div><div class='add'>+ *buf++ = BOW;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '>':</div><div class='add'>+ last = NULL;</div><div class='add'>+ *buf++ = EOW;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '{':</div><div class='add'>+ if (last == NULL) goto literal_char;</div><div class='add'>+ *last |= MANY;</div><div class='add'>+ tmppat = convert_digit(pat, &n);</div><div class='add'>+ if (tmppat == NULL) ERROR;</div><div class='add'>+ pat = tmppat;</div><div class='add'>+ *buf++ = n;</div><div class='add'>+</div><div class='add'>+ min_length += (n - 1);</div><div class='add'>+</div><div class='add'>+ if (*pat == '\\')</div><div class='add'>+ {</div><div class='add'>+ *buf++ = n;</div><div class='add'>+ }</div><div class='add'>+ else if (*pat == ',')</div><div class='add'>+ {</div><div class='add'>+ pat++;</div><div class='add'>+ if (*pat == '\\')</div><div class='add'>+ {</div><div class='add'>+ n = 255;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ tmppat = convert_digit(pat, &n);</div><div class='add'>+ if (tmppat == NULL) ERROR;</div><div class='add'>+ pat = tmppat;</div><div class='add'>+ if (*pat != '\\') ERROR;</div><div class='add'>+ }</div><div class='add'>+ *buf++ = n;</div><div class='add'>+ }</div><div class='add'>+ else ERROR;</div><div class='add'>+ last = NULL;</div><div class='add'>+ pat++;</div><div class='add'>+ if (*pat != '}') ERROR;</div><div class='add'>+ pat++;</div><div class='add'>+ break; /* case '{' */</div><div class='add'>+</div><div class='add'>+ case '(':</div><div class='add'>+ oparen++;</div><div class='add'>+ if (oparen > 9) ERROR;</div><div class='add'>+ *buf++ = OPAREN;</div><div class='add'>+ break;</div><div class='add'>+ case ')':</div><div class='add'>+ if (oparen == 0) ERROR;</div><div class='add'>+ oparen--;</div><div class='add'>+ nparen++;</div><div class='add'>+ *buf++ = CPAREN;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 0: ERROR;</div><div class='add'>+ default:</div><div class='add'>+ goto literal_char;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '[':</div><div class='add'>+</div><div class='add'>+ *buf = RANGE;</div><div class='add'>+ last = buf++;</div><div class='add'>+</div><div class='add'>+ if (buf + 32 >= ebuf) ERROR;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 32; i++) buf[i] = 0;</div><div class='add'>+ c = *pat++;</div><div class='add'>+ if (c == '^')</div><div class='add'>+ {</div><div class='add'>+ reverse = 1;</div><div class='add'>+ SET_BIT(buf, '\n');</div><div class='add'>+ c = *pat++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (c == ']')</div><div class='add'>+ {</div><div class='add'>+ SET_BIT(buf, c);</div><div class='add'>+ c = *pat++;</div><div class='add'>+ }</div><div class='add'>+ while (c && (c != ']'))</div><div class='add'>+ {</div><div class='add'>+ if (c == '\\')</div><div class='add'>+ {</div><div class='add'>+ c = *pat++;</div><div class='add'>+ switch(c)</div><div class='add'>+ {</div><div class='add'>+ case 'n': c = '\n'; break;</div><div class='add'>+ case 't': c = '\t'; break;</div><div class='add'>+ case 0: ERROR;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (*pat == '-')</div><div class='add'>+ {</div><div class='add'>+ pat++;</div><div class='add'>+ while (c < *pat)</div><div class='add'>+ {</div><div class='add'>+ if (cs == 0)</div><div class='add'>+ {</div><div class='add'>+ SET_BIT(buf, UPPERCASE(c));</div><div class='add'>+ SET_BIT(buf, LOWERCASE(c));</div><div class='add'>+ }</div><div class='add'>+ else SET_BIT(buf, c);</div><div class='add'>+ c++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ if (cs == 0)</div><div class='add'>+ {</div><div class='add'>+ SET_BIT(buf, UPPERCASE(c));</div><div class='add'>+ SET_BIT(buf, LOWERCASE(c));</div><div class='add'>+ }</div><div class='add'>+ else SET_BIT(buf, c);</div><div class='add'>+ c = *pat++;</div><div class='add'>+ }</div><div class='add'>+ if (c != ']') ERROR;</div><div class='add'>+ if (reverse) for (i = 0; i < 32; i++) buf[i] = buf[i] ^ 0xFF;</div><div class='add'>+ reverse = 0;</div><div class='add'>+ buf += 32;</div><div class='add'>+ min_length++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '.':</div><div class='add'>+ last = buf;</div><div class='add'>+ *buf++ = ANY;</div><div class='add'>+ min_length++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '*':</div><div class='add'>+ if (last == NULL) goto literal_char;</div><div class='add'>+ *last |= STAR;</div><div class='add'>+ min_length--;</div><div class='add'>+ last = NULL;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '+':</div><div class='add'>+ if (last == NULL) goto literal_char;</div><div class='add'>+ *last |= LEAST_ONCE;</div><div class='add'>+ last = NULL;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '?':</div><div class='add'>+ if (last == NULL) goto literal_char;</div><div class='add'>+ *last |= MAYBE_ONCE;</div><div class='add'>+ last = NULL;</div><div class='add'>+ min_length--;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ literal_char:</div><div class='add'>+ default:</div><div class='add'>+ /* This is to keep track of longest substring */</div><div class='add'>+ min_length++;</div><div class='add'>+ this_max_mm++;</div><div class='add'>+ if (last_count + 1 == count)</div><div class='add'>+ {</div><div class='add'>+ if (this_max_mm == 1)</div><div class='add'>+ {</div><div class='add'>+ this_mm_p = buf;</div><div class='add'>+ }</div><div class='add'>+ else if (max_mm < this_max_mm)</div><div class='add'>+ {</div><div class='add'>+ mm_p = this_mm_p;</div><div class='add'>+ max_mm = this_max_mm;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ this_mm_p = buf;</div><div class='add'>+ this_max_mm = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ last_count = count;</div><div class='add'>+</div><div class='add'>+ last = buf;</div><div class='add'>+ *buf++ = LITERAL;</div><div class='add'>+ *buf++ = UPPERCASE(c);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ *buf = 0;</div><div class='add'>+ /* Check for ordinary search */</div><div class='add'>+ ebuf = buf;</div><div class='add'>+ buf = reg->buf;</div><div class='add'>+</div><div class='add'>+ if (no_osearch) ordinary_search = 0;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ ordinary_search = 1;</div><div class='add'>+ while (buf < ebuf)</div><div class='add'>+ {</div><div class='add'>+ if (*buf != LITERAL)</div><div class='add'>+ {</div><div class='add'>+ ordinary_search = 0;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ buf += 2;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ reg->osearch = ordinary_search;</div><div class='add'>+ reg->must_match_str[15] = 0;</div><div class='add'>+ reg->min_length = (min_length > 0) ? (unsigned int) min_length : 0;</div><div class='add'>+ if (ordinary_search)</div><div class='add'>+ {</div><div class='add'>+ strncpy((char *) reg->must_match_str, (char *) reg->pat, 15);</div><div class='add'>+ reg->must_match = 1;</div><div class='add'>+ return(0);</div><div class='add'>+ }</div><div class='add'>+ /* check for longest substring of pattern */</div><div class='add'>+ reg->must_match = 0;</div><div class='add'>+ if ((mm_p == NULL) && (this_mm_p != NULL)) mm_p = this_mm_p;</div><div class='add'>+ if (mm_p == NULL)</div><div class='add'>+ {</div><div class='add'>+ return (0);</div><div class='add'>+ }</div><div class='add'>+ n = 15;</div><div class='add'>+ pat = reg->must_match_str;</div><div class='add'>+ buf = mm_p;</div><div class='add'>+ while (n--)</div><div class='add'>+ {</div><div class='add'>+ if (*buf++ != LITERAL) break;</div><div class='add'>+ *pat++ = *buf++;</div><div class='add'>+ }</div><div class='add'>+ *pat = 0;</div><div class='add'>+ if (pat != reg->must_match_str) reg->must_match = 1;</div><div class='add'>+ return(0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLregexp_quote_string (char *re, char *buf, unsigned int buflen)</div><div class='add'>+{</div><div class='add'>+ char ch;</div><div class='add'>+ char *b, *bmax;</div><div class='add'>+</div><div class='add'>+ if (re == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+ b = buf;</div><div class='add'>+ bmax = buf + buflen;</div><div class='add'>+</div><div class='add'>+ while (b < bmax)</div><div class='add'>+ {</div><div class='add'>+ switch (ch = *re++)</div><div class='add'>+ {</div><div class='add'>+ case 0:</div><div class='add'>+ *b = 0;</div><div class='add'>+ return buf;</div><div class='add'>+</div><div class='add'>+ case '$':</div><div class='add'>+ case '\\':</div><div class='add'>+ case '[':</div><div class='add'>+ case ']':</div><div class='add'>+ case '.':</div><div class='add'>+ case '^':</div><div class='add'>+ case '*':</div><div class='add'>+ case '+':</div><div class='add'>+ case '?':</div><div class='add'>+ *b++ = '\\';</div><div class='add'>+ if (b == bmax) break;</div><div class='add'>+ /* drop */</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ *b++ = ch;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+#define MAX_EXP 4096</div><div class='add'>+int main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+ char *regexp, *file;</div><div class='add'>+ char expbuf[MAX_EXP], buf[512];</div><div class='add'>+ SLRegexp_Type reg;</div><div class='add'>+</div><div class='add'>+ file = argv[2];</div><div class='add'>+ regexp = argv[1];</div><div class='add'>+</div><div class='add'>+ if (NULL == (fp = fopen(file, "r")))</div><div class='add'>+ {</div><div class='add'>+ fprintf(stderr, "File not open\n");</div><div class='add'>+ return(1);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ reg.buf = expbuf;</div><div class='add'>+ reg.buf_len = MAX_EXP;</div><div class='add'>+ reg.pat = regexp;</div><div class='add'>+ reg.case_sensitive = 1;</div><div class='add'>+</div><div class='add'>+ if (!regexp_compile(&reg)) while (NULL != fgets(buf, 511, fp))</div><div class='add'>+ {</div><div class='add'>+ if (reg.osearch)</div><div class='add'>+ {</div><div class='add'>+ if (NULL == strstr(buf, reg.pat)) continue;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if (reg.must_match && (NULL == strstr(buf, reg.must_match_str))) continue;</div><div class='add'>+ if (0 == regexp_match(buf, buf + strlen(buf), &reg)) continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ fputs(buf, stdout);</div><div class='add'>+ }</div><div class='add'>+ return (0);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slrline.c b/mdk-stage1/slang/slrline.c<br/>new file mode 100644<br/>index 000000000..1874be0bb<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slrline.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slrline.c</a></div><div class='hunk'>@@ -0,0 +1,836 @@</div><div class='add'>+/* SLang_read_line interface --- uses SLang tty stuff */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+int SLang_RL_EOF_Char = 4;</div><div class='add'>+#else</div><div class='add'>+int SLang_RL_EOF_Char = 26;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLang_Rline_Quit;</div><div class='add'>+static SLang_RLine_Info_Type *This_RLI;</div><div class='add'>+</div><div class='add'>+static unsigned char Char_Widths[256];</div><div class='add'>+static void position_cursor (int);</div><div class='add'>+</div><div class='add'>+static void rl_beep (void)</div><div class='add'>+{</div><div class='add'>+ putc(7, stdout);</div><div class='add'>+ fflush (stdout);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* editing functions */</div><div class='add'>+static int rl_bol (void)</div><div class='add'>+{</div><div class='add'>+ if (This_RLI->point == 0) return 0;</div><div class='add'>+ This_RLI->point = 0;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_eol (void)</div><div class='add'>+{</div><div class='add'>+ if (This_RLI->point == This_RLI->len) return 0;</div><div class='add'>+ This_RLI->point = This_RLI->len;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_right (void)</div><div class='add'>+{</div><div class='add'>+ if (This_RLI->point == This_RLI->len) return 0;</div><div class='add'>+ This_RLI->point++;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_left (void)</div><div class='add'>+{</div><div class='add'>+ if (This_RLI->point == 0) return 0;</div><div class='add'>+ This_RLI->point--;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_self_insert (void)</div><div class='add'>+{</div><div class='add'>+ unsigned char *pmin, *p;</div><div class='add'>+</div><div class='add'>+ if (This_RLI->len == This_RLI->buf_len)</div><div class='add'>+ {</div><div class='add'>+ rl_beep ();</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ pmin = This_RLI->buf + This_RLI->point;</div><div class='add'>+ p = This_RLI->buf + This_RLI->len;</div><div class='add'>+ while (p > pmin)</div><div class='add'>+ {</div><div class='add'>+ *p = *(p - 1);</div><div class='add'>+ p--;</div><div class='add'>+ }</div><div class='add'>+ *pmin = SLang_Last_Key_Char;</div><div class='add'>+</div><div class='add'>+ This_RLI->len++;</div><div class='add'>+ This_RLI->point++;</div><div class='add'>+ if ((This_RLI->curs_pos + 2 >= This_RLI->edit_width)</div><div class='add'>+ || (This_RLI->tt_insert == NULL)</div><div class='add'>+ || (Char_Widths[SLang_Last_Key_Char] != 1)) return 1;</div><div class='add'>+</div><div class='add'>+ (*This_RLI->tt_insert)((char) SLang_Last_Key_Char);</div><div class='add'>+ /* update screen buf */</div><div class='add'>+ p = This_RLI->old_upd + (This_RLI->len - 1);</div><div class='add'>+ pmin = This_RLI->old_upd + (This_RLI->point - 1);</div><div class='add'>+ while (p > pmin)</div><div class='add'>+ {</div><div class='add'>+ *p = *(p - 1);</div><div class='add'>+ p--;</div><div class='add'>+ }</div><div class='add'>+ *pmin = SLang_Last_Key_Char;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_rline_insert (char *s)</div><div class='add'>+{</div><div class='add'>+ unsigned char *pmin, *p;</div><div class='add'>+ int n;</div><div class='add'>+</div><div class='add'>+ n = strlen (s);</div><div class='add'>+ if (n > This_RLI->buf_len - This_RLI->len)</div><div class='add'>+ n = This_RLI->buf_len - This_RLI->len;</div><div class='add'>+</div><div class='add'>+ if (n == 0) return 0;</div><div class='add'>+</div><div class='add'>+ pmin = This_RLI->buf + This_RLI->point;</div><div class='add'>+ p = This_RLI->buf + (This_RLI->len - 1);</div><div class='add'>+</div><div class='add'>+ while (p >= pmin)</div><div class='add'>+ {</div><div class='add'>+ *(p + n) = *p;</div><div class='add'>+ p--;</div><div class='add'>+ }</div><div class='add'>+ SLMEMCPY ((char *) pmin, s, n);</div><div class='add'>+</div><div class='add'>+ This_RLI->len += n;</div><div class='add'>+ This_RLI->point += n;</div><div class='add'>+ return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_deln (int n)</div><div class='add'>+{</div><div class='add'>+ unsigned char *pmax, *p;</div><div class='add'>+</div><div class='add'>+ p = This_RLI->buf + This_RLI->point;</div><div class='add'>+ pmax = This_RLI->buf + This_RLI->len;</div><div class='add'>+</div><div class='add'>+ if (p + n > pmax) n = (int) (pmax - p);</div><div class='add'>+ while (p < pmax)</div><div class='add'>+ {</div><div class='add'>+ *p = *(p + n);</div><div class='add'>+ p++;</div><div class='add'>+ }</div><div class='add'>+ This_RLI->len -= n;</div><div class='add'>+ return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_del (void)</div><div class='add'>+{</div><div class='add'>+ return rl_deln(1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_quote_insert (void)</div><div class='add'>+{</div><div class='add'>+ int err = SLang_Error;</div><div class='add'>+ SLang_Error = 0;</div><div class='add'>+ SLang_Last_Key_Char = (*This_RLI->getkey)();</div><div class='add'>+ rl_self_insert ();</div><div class='add'>+ if (SLang_Error == SL_USER_BREAK) SLang_Error = 0;</div><div class='add'>+ else SLang_Error = err;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_trim (void)</div><div class='add'>+{</div><div class='add'>+ unsigned char *p, *pmax, *p1;</div><div class='add'>+ p = This_RLI->buf + This_RLI->point;</div><div class='add'>+ pmax = This_RLI->buf + This_RLI->len;</div><div class='add'>+</div><div class='add'>+ if (p == pmax)</div><div class='add'>+ {</div><div class='add'>+ if (p == This_RLI->buf) return 0;</div><div class='add'>+ p--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((*p != ' ') && (*p != '\t')) return 0;</div><div class='add'>+ p1 = p;</div><div class='add'>+ while ((p1 < pmax) && ((*p1 == ' ') || (*p1 == '\t'))) p1++;</div><div class='add'>+ pmax = p1;</div><div class='add'>+ p1 = This_RLI->buf;</div><div class='add'>+</div><div class='add'>+ while ((p >= p1) && ((*p == ' ') || (*p == '\t'))) p--;</div><div class='add'>+ if (p == pmax) return 0;</div><div class='add'>+ p++;</div><div class='add'>+</div><div class='add'>+ This_RLI->point = (int) (p - p1);</div><div class='add'>+ return rl_deln ((int) (pmax - p));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_bdel (void)</div><div class='add'>+{</div><div class='add'>+ if (rl_left()) return rl_del();</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_deleol (void)</div><div class='add'>+{</div><div class='add'>+ if (This_RLI->point == This_RLI->len) return 0;</div><div class='add'>+ *(This_RLI->buf + This_RLI->point) = 0;</div><div class='add'>+ This_RLI->len = This_RLI->point;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_delete_line (void)</div><div class='add'>+{</div><div class='add'>+ This_RLI->point = 0;</div><div class='add'>+ *(This_RLI->buf + This_RLI->point) = 0;</div><div class='add'>+ This_RLI->len = 0;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_enter (void)</div><div class='add'>+{</div><div class='add'>+ *(This_RLI->buf + This_RLI->len) = 0;</div><div class='add'>+ SLang_Rline_Quit = 1;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLKeyMap_List_Type *RL_Keymap;</div><div class='add'>+</div><div class='add'>+/* This update is designed for dumb terminals. It assumes only that the</div><div class='add'>+ * terminal can backspace via ^H, and move cursor to start of line via ^M.</div><div class='add'>+ * There is a hook so the user can provide a more sophisticated update if</div><div class='add'>+ * necessary.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static void position_cursor (int col)</div><div class='add'>+{</div><div class='add'>+ unsigned char *p, *pmax;</div><div class='add'>+ int dc;</div><div class='add'>+</div><div class='add'>+ if (col == This_RLI->curs_pos)</div><div class='add'>+ {</div><div class='add'>+ fflush (stdout);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (This_RLI->tt_goto_column != NULL)</div><div class='add'>+ {</div><div class='add'>+ (*This_RLI->tt_goto_column)(col);</div><div class='add'>+ This_RLI->curs_pos = col;</div><div class='add'>+ fflush (stdout);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ dc = This_RLI->curs_pos - col;</div><div class='add'>+ if (dc < 0)</div><div class='add'>+ {</div><div class='add'>+ p = This_RLI->new_upd + This_RLI->curs_pos;</div><div class='add'>+ pmax = This_RLI->new_upd + col;</div><div class='add'>+ while (p < pmax) putc((char) *p++, stdout);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if (dc < col)</div><div class='add'>+ {</div><div class='add'>+ while (dc--) putc(8, stdout);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ putc('\r', stdout);</div><div class='add'>+ p = This_RLI->new_upd;</div><div class='add'>+ pmax = This_RLI->new_upd + col;</div><div class='add'>+ while (p < pmax) putc((char) *p++, stdout);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ This_RLI->curs_pos = col;</div><div class='add'>+ fflush (stdout);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void erase_eol (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+ unsigned char *p, *pmax;</div><div class='add'>+</div><div class='add'>+ p = rli->old_upd + rli->curs_pos;</div><div class='add'>+ pmax = rli->old_upd + rli->old_upd_len;</div><div class='add'>+</div><div class='add'>+ while (p++ < pmax) putc(' ', stdout);</div><div class='add'>+</div><div class='add'>+ rli->curs_pos = rli->old_upd_len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char *spit_out(SLang_RLine_Info_Type *rli, unsigned char *p)</div><div class='add'>+{</div><div class='add'>+ unsigned char *pmax;</div><div class='add'>+ position_cursor ((int) (p - rli->new_upd));</div><div class='add'>+ pmax = rli->new_upd + rli->new_upd_len;</div><div class='add'>+ while (p < pmax) putc((char) *p++, stdout);</div><div class='add'>+ rli->curs_pos = rli->new_upd_len;</div><div class='add'>+ return pmax;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void really_update (SLang_RLine_Info_Type *rli, int new_curs_position)</div><div class='add'>+{</div><div class='add'>+ unsigned char *b = rli->old_upd, *p = rli->new_upd, chb, chp;</div><div class='add'>+ unsigned char *pmax;</div><div class='add'>+</div><div class='add'>+ if (rli->update_hook != NULL)</div><div class='add'>+ {</div><div class='add'>+ (*rli->update_hook)(p, rli->edit_width, new_curs_position);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ pmax = p + rli->edit_width;</div><div class='add'>+ while (p < pmax)</div><div class='add'>+ {</div><div class='add'>+ chb = *b++; chp = *p++;</div><div class='add'>+ if (chb == chp) continue;</div><div class='add'>+</div><div class='add'>+ if (rli->old_upd_len <= rli->new_upd_len)</div><div class='add'>+ {</div><div class='add'>+ /* easy one */</div><div class='add'>+ (void) spit_out (rli, p - 1);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ spit_out(rli, p - 1);</div><div class='add'>+ erase_eol (rli);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ position_cursor (new_curs_position);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* update finished, so swap */</div><div class='add'>+</div><div class='add'>+ rli->old_upd_len = rli->new_upd_len;</div><div class='add'>+ p = rli->old_upd;</div><div class='add'>+ rli->old_upd = rli->new_upd;</div><div class='add'>+ rli->new_upd = p;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void RLupdate (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+ int len, dlen, start_len = 0, prompt_len = 0, tw = 0, count;</div><div class='add'>+ int want_cursor_pos;</div><div class='add'>+ unsigned char *b, chb, *b_point, *p;</div><div class='add'>+ int no_echo;</div><div class='add'>+</div><div class='add'>+ no_echo = rli->flags & SL_RLINE_NO_ECHO;</div><div class='add'>+</div><div class='add'>+ b_point = (unsigned char *) (rli->buf + rli->point);</div><div class='add'>+ *(rli->buf + rli->len) = 0;</div><div class='add'>+</div><div class='add'>+ /* expand characters for output buffer --- handle prompt first.</div><div class='add'>+ * Do two passes --- first to find out where to begin upon horiz</div><div class='add'>+ * scroll and the second to actually fill the buffer. */</div><div class='add'>+ len = 0;</div><div class='add'>+ count = 2; /* once for prompt and once for buf */</div><div class='add'>+</div><div class='add'>+ b = (unsigned char *) rli->prompt;</div><div class='add'>+ while (count--)</div><div class='add'>+ {</div><div class='add'>+ if ((count == 0) && no_echo)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* The prompt could be NULL */</div><div class='add'>+ if (b != NULL) while ((chb = *b) != 0)</div><div class='add'>+ {</div><div class='add'>+ /* This will ensure that the screen is scrolled a third of the edit</div><div class='add'>+ * width each time */</div><div class='add'>+ if (b_point == b) break;</div><div class='add'>+ dlen = Char_Widths[chb];</div><div class='add'>+ if ((chb == '\t') && tw)</div><div class='add'>+ {</div><div class='add'>+ dlen = tw * ((len - prompt_len) / tw + 1) - (len - prompt_len);</div><div class='add'>+ }</div><div class='add'>+ len += dlen;</div><div class='add'>+ b++;</div><div class='add'>+ }</div><div class='add'>+ tw = rli->tab;</div><div class='add'>+ b = (unsigned char *) rli->buf;</div><div class='add'>+ if (count == 1) want_cursor_pos = prompt_len = len;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (len < rli->edit_width - rli->dhscroll) start_len = 0;</div><div class='add'>+ else if ((rli->start_column > len)</div><div class='add'>+ || (rli->start_column + rli->edit_width <= len))</div><div class='add'>+ {</div><div class='add'>+ start_len = len - (rli->edit_width - rli->dhscroll);</div><div class='add'>+ if (start_len < 0) start_len = 0;</div><div class='add'>+ }</div><div class='add'>+ else start_len = rli->start_column;</div><div class='add'>+ rli->start_column = start_len;</div><div class='add'>+</div><div class='add'>+ want_cursor_pos = len - start_len;</div><div class='add'>+</div><div class='add'>+ /* second pass */</div><div class='add'>+ p = rli->new_upd;</div><div class='add'>+</div><div class='add'>+ len = 0;</div><div class='add'>+ count = 2;</div><div class='add'>+ b = (unsigned char *) rli->prompt;</div><div class='add'>+ if (b == NULL) b = (unsigned char *) "";</div><div class='add'>+</div><div class='add'>+ while ((len < start_len) && (*b))</div><div class='add'>+ {</div><div class='add'>+ len += Char_Widths[*b++];</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ tw = 0;</div><div class='add'>+ if (*b == 0)</div><div class='add'>+ {</div><div class='add'>+ b = (unsigned char *) rli->buf;</div><div class='add'>+ while (len < start_len)</div><div class='add'>+ {</div><div class='add'>+ len += Char_Widths[*b++];</div><div class='add'>+ }</div><div class='add'>+ tw = rli->tab;</div><div class='add'>+ count--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ len = 0;</div><div class='add'>+ while (count--)</div><div class='add'>+ {</div><div class='add'>+ if ((count == 0) && (no_echo))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ while ((len < rli->edit_width) && ((chb = *b++) != 0))</div><div class='add'>+ {</div><div class='add'>+ dlen = Char_Widths[chb];</div><div class='add'>+ if (dlen == 1) *p++ = chb;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if ((chb == '\t') && tw)</div><div class='add'>+ {</div><div class='add'>+ dlen = tw * ((len + start_len - prompt_len) / tw + 1) - (len + start_len - prompt_len);</div><div class='add'>+ len += dlen; /* ok since dlen comes out 0 */</div><div class='add'>+ if (len > rli->edit_width) dlen = len - rli->edit_width;</div><div class='add'>+ while (dlen--) *p++ = ' ';</div><div class='add'>+ dlen = 0;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if (dlen == 3)</div><div class='add'>+ {</div><div class='add'>+ chb &= 0x7F;</div><div class='add'>+ *p++ = '~';</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *p++ = '^';</div><div class='add'>+ if (chb == 127) *p++ = '?';</div><div class='add'>+ else *p++ = chb + '@';</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ len += dlen;</div><div class='add'>+ }</div><div class='add'>+ /* if (start_len > prompt_len) break; */</div><div class='add'>+ tw = rli->tab;</div><div class='add'>+ b = (unsigned char *) rli->buf;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ rli->new_upd_len = (int) (p - rli->new_upd);</div><div class='add'>+ while (p < rli->new_upd + rli->edit_width) *p++ = ' ';</div><div class='add'>+ really_update (rli, want_cursor_pos);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLrline_redraw (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+ unsigned char *p = rli->new_upd;</div><div class='add'>+ unsigned char *pmax = p + rli->edit_width;</div><div class='add'>+ while (p < pmax) *p++ = ' ';</div><div class='add'>+ rli->new_upd_len = rli->edit_width;</div><div class='add'>+ really_update (rli, 0);</div><div class='add'>+ RLupdate (rli);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_eof_insert (void)</div><div class='add'>+{</div><div class='add'>+ if (This_RLI->len == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Last_Key_Char = SLang_RL_EOF_Char;</div><div class='add'>+ /* rl_self_insert (); */</div><div class='add'>+ return rl_enter ();</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is very naive. It knows very little about nesting and nothing</div><div class='add'>+ * about quoting.</div><div class='add'>+ */</div><div class='add'>+static void blink_match (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+ unsigned char bra, ket;</div><div class='add'>+ unsigned int delta_column;</div><div class='add'>+ unsigned char *p, *pmin;</div><div class='add'>+ int dq_level, sq_level;</div><div class='add'>+ int level;</div><div class='add'>+</div><div class='add'>+ pmin = rli->buf;</div><div class='add'>+ p = pmin + rli->point;</div><div class='add'>+ if (pmin == p)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ ket = SLang_Last_Key_Char;</div><div class='add'>+ switch (ket)</div><div class='add'>+ {</div><div class='add'>+ case ')':</div><div class='add'>+ bra = '(';</div><div class='add'>+ break;</div><div class='add'>+ case ']':</div><div class='add'>+ bra = '[';</div><div class='add'>+ break;</div><div class='add'>+ case '}':</div><div class='add'>+ bra = '{';</div><div class='add'>+ break;</div><div class='add'>+ default:</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ level = 0;</div><div class='add'>+ sq_level = dq_level = 0;</div><div class='add'>+</div><div class='add'>+ delta_column = 0;</div><div class='add'>+ while (p > pmin)</div><div class='add'>+ {</div><div class='add'>+ char ch;</div><div class='add'>+</div><div class='add'>+ p--;</div><div class='add'>+ delta_column++;</div><div class='add'>+ ch = *p;</div><div class='add'>+</div><div class='add'>+ if (ch == ket)</div><div class='add'>+ {</div><div class='add'>+ if ((dq_level == 0) && (sq_level == 0))</div><div class='add'>+ level++;</div><div class='add'>+ }</div><div class='add'>+ else if (ch == bra)</div><div class='add'>+ {</div><div class='add'>+ if ((dq_level != 0) || (sq_level != 0))</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ level--;</div><div class='add'>+ if (level == 0)</div><div class='add'>+ {</div><div class='add'>+ rli->point -= delta_column;</div><div class='add'>+ RLupdate (rli);</div><div class='add'>+ (*rli->input_pending)(10);</div><div class='add'>+ rli->point += delta_column;</div><div class='add'>+ RLupdate (rli);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ if (level < 0)</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ else if (ch == '"') dq_level = !dq_level;</div><div class='add'>+ else if (ch == '\'') sq_level = !sq_level;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_read_line (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+ unsigned char *p, *pmax;</div><div class='add'>+ SLang_Key_Type *key;</div><div class='add'>+</div><div class='add'>+ SLang_Rline_Quit = 0;</div><div class='add'>+ This_RLI = rli;</div><div class='add'>+ p = rli->old_upd; pmax = p + rli->edit_width;</div><div class='add'>+ while (p < pmax) *p++ = ' ';</div><div class='add'>+</div><div class='add'>+ /* Sanity checking */</div><div class='add'>+ rli->len = strlen ((char *) rli->buf);</div><div class='add'>+ if (rli->len >= rli->buf_len)</div><div class='add'>+ {</div><div class='add'>+ rli->len = 0;</div><div class='add'>+ *rli->buf = 0;</div><div class='add'>+ }</div><div class='add'>+ if (rli->point > rli->len) rli->point = rli->len;</div><div class='add'>+ if (rli->point < 0) rli->point = 0;</div><div class='add'>+</div><div class='add'>+ rli->curs_pos = rli->start_column = 0;</div><div class='add'>+ rli->new_upd_len = rli->old_upd_len = 0;</div><div class='add'>+</div><div class='add'>+ This_RLI->last_fun = NULL;</div><div class='add'>+ if (rli->update_hook == NULL)</div><div class='add'>+ putc ('\r', stdout);</div><div class='add'>+</div><div class='add'>+ RLupdate (rli);</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ key = SLang_do_key (RL_Keymap, (int (*)(void)) rli->getkey);</div><div class='add'>+</div><div class='add'>+ if ((key == NULL) || (key->f.f == NULL))</div><div class='add'>+ rl_beep ();</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if ((SLang_Last_Key_Char == SLang_RL_EOF_Char)</div><div class='add'>+ && (*key->str == 2)</div><div class='add'>+ && (This_RLI->len == 0))</div><div class='add'>+ rl_eof_insert ();</div><div class='add'>+ else if (key->type == SLKEY_F_INTRINSIC)</div><div class='add'>+ {</div><div class='add'>+ if ((key->f.f)())</div><div class='add'>+ RLupdate (rli);</div><div class='add'>+</div><div class='add'>+ if ((rli->flags & SL_RLINE_BLINK_MATCH)</div><div class='add'>+ && (rli->input_pending != NULL))</div><div class='add'>+ blink_match (rli);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (SLang_Rline_Quit)</div><div class='add'>+ {</div><div class='add'>+ This_RLI->buf[This_RLI->len] = 0;</div><div class='add'>+ if (SLang_Error == SL_USER_BREAK)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = 0;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return This_RLI->len;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ if (key != NULL)</div><div class='add'>+ This_RLI->last_fun = key->f.f;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_abort (void)</div><div class='add'>+{</div><div class='add'>+ rl_delete_line ();</div><div class='add'>+ return rl_enter ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* TTY interface --- ANSI */</div><div class='add'>+</div><div class='add'>+static void ansi_goto_column (int n)</div><div class='add'>+{</div><div class='add'>+ putc('\r', stdout);</div><div class='add'>+ if (n) fprintf(stdout, "\033[%dC", n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void rl_select_line (SLang_Read_Line_Type *p)</div><div class='add'>+{</div><div class='add'>+ This_RLI->last = p;</div><div class='add'>+ strcpy ((char *) This_RLI->buf, (char *) p->buf);</div><div class='add'>+ This_RLI->point = This_RLI->len = strlen((char *) p->buf);</div><div class='add'>+}</div><div class='add'>+static int rl_next_line (void);</div><div class='add'>+static int rl_prev_line (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Read_Line_Type *prev;</div><div class='add'>+</div><div class='add'>+ if (((This_RLI->last_fun != (FVOID_STAR) rl_prev_line)</div><div class='add'>+ && (This_RLI->last_fun != (FVOID_STAR) rl_next_line))</div><div class='add'>+ || (This_RLI->last == NULL))</div><div class='add'>+ {</div><div class='add'>+ prev = This_RLI->tail;</div><div class='add'>+ }</div><div class='add'>+ else prev = This_RLI->last->prev;</div><div class='add'>+</div><div class='add'>+ if (prev == NULL)</div><div class='add'>+ {</div><div class='add'>+ rl_beep ();</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ rl_select_line (prev);</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+static int rl_redraw (void)</div><div class='add'>+{</div><div class='add'>+ SLrline_redraw (This_RLI);</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_next_line (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Read_Line_Type *next;</div><div class='add'>+</div><div class='add'>+ if (((This_RLI->last_fun != (FVOID_STAR) rl_prev_line)</div><div class='add'>+ && (This_RLI->last_fun != (FVOID_STAR) rl_next_line))</div><div class='add'>+ || (This_RLI->last == NULL))</div><div class='add'>+ {</div><div class='add'>+ rl_beep ();</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ next = This_RLI->last->next;</div><div class='add'>+</div><div class='add'>+ if (next == NULL)</div><div class='add'>+ {</div><div class='add'>+ This_RLI->len = This_RLI->point = 0;</div><div class='add'>+ *This_RLI->buf = 0;</div><div class='add'>+ This_RLI->last = NULL;</div><div class='add'>+ }</div><div class='add'>+ else rl_select_line (next);</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLKeymap_Function_Type SLReadLine_Functions[] =</div><div class='add'>+{</div><div class='add'>+ {"up", rl_prev_line},</div><div class='add'>+ {"down", rl_next_line},</div><div class='add'>+ {"bol", rl_bol},</div><div class='add'>+ {"eol", rl_eol},</div><div class='add'>+ {"right", rl_right},</div><div class='add'>+ {"left", rl_left},</div><div class='add'>+ {"self_insert", rl_self_insert},</div><div class='add'>+ {"bdel", rl_bdel},</div><div class='add'>+ {"del", rl_del},</div><div class='add'>+ {"deleol", rl_deleol},</div><div class='add'>+ {"enter", rl_enter},</div><div class='add'>+ {"trim", rl_trim},</div><div class='add'>+ {"quoted_insert", rl_quote_insert},</div><div class='add'>+ {(char *) NULL, NULL}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLang_init_readline (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+ int ch;</div><div class='add'>+ char simple[2];</div><div class='add'>+</div><div class='add'>+ if (RL_Keymap == NULL)</div><div class='add'>+ {</div><div class='add'>+ simple[1] = 0;</div><div class='add'>+ if (NULL == (RL_Keymap = SLang_create_keymap ("ReadLine", NULL)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ RL_Keymap->functions = SLReadLine_Functions;</div><div class='add'>+</div><div class='add'>+ /* This breaks under some DEC ALPHA compilers (scary!) */</div><div class='add'>+#ifndef __DECC</div><div class='add'>+ for (ch = ' '; ch < 256; ch++)</div><div class='add'>+ {</div><div class='add'>+ simple[0] = (char) ch;</div><div class='add'>+ SLkm_define_key (simple, (FVOID_STAR) rl_self_insert, RL_Keymap);</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ ch = ' ';</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ simple[0] = (char) ch;</div><div class='add'>+ SLkm_define_key (simple, (FVOID_STAR) rl_self_insert, RL_Keymap);</div><div class='add'>+ ch = ch + 1;</div><div class='add'>+ if (ch == 256) break;</div><div class='add'>+ }</div><div class='add'>+#endif /* NOT __DECC */</div><div class='add'>+</div><div class='add'>+ simple[0] = SLang_Abort_Char;</div><div class='add'>+ SLkm_define_key (simple, (FVOID_STAR) rl_abort, RL_Keymap);</div><div class='add'>+ simple[0] = SLang_RL_EOF_Char;</div><div class='add'>+ SLkm_define_key (simple, (FVOID_STAR) rl_eof_insert, RL_Keymap);</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ SLkm_define_key ("^[[A", (FVOID_STAR) rl_prev_line, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^[[B", (FVOID_STAR) rl_next_line, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^[[C", (FVOID_STAR) rl_right, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^[[D", (FVOID_STAR) rl_left, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^[OA", (FVOID_STAR) rl_prev_line, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^[OB", (FVOID_STAR) rl_next_line, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^[OC", (FVOID_STAR) rl_right, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^[OD", (FVOID_STAR) rl_left, RL_Keymap);</div><div class='add'>+#else</div><div class='add'>+ SLkm_define_key ("^@H", (FVOID_STAR) rl_prev_line, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^@P", (FVOID_STAR) rl_next_line, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^@M", (FVOID_STAR) rl_right, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^@K", (FVOID_STAR) rl_left, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^@S", (FVOID_STAR) rl_del, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^@O", (FVOID_STAR) rl_eol, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^@G", (FVOID_STAR) rl_bol, RL_Keymap);</div><div class='add'>+</div><div class='add'>+ SLkm_define_key ("\xE0H", (FVOID_STAR) rl_prev_line, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("\xE0P", (FVOID_STAR) rl_next_line, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("\xE0M", (FVOID_STAR) rl_right, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("\xE0K", (FVOID_STAR) rl_left, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("\xE0S", (FVOID_STAR) rl_del, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("\xE0O", (FVOID_STAR) rl_eol, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("\xE0G", (FVOID_STAR) rl_bol, RL_Keymap);</div><div class='add'>+#endif</div><div class='add'>+ SLkm_define_key ("^C", (FVOID_STAR) rl_abort, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^E", (FVOID_STAR) rl_eol, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^G", (FVOID_STAR) rl_abort, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^I", (FVOID_STAR) rl_self_insert, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^A", (FVOID_STAR) rl_bol, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("\r", (FVOID_STAR) rl_enter, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("\n", (FVOID_STAR) rl_enter, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^K", (FVOID_STAR) rl_deleol, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^L", (FVOID_STAR) rl_deleol, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^V", (FVOID_STAR) rl_del, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^D", (FVOID_STAR) rl_del, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^F", (FVOID_STAR) rl_right, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^B", (FVOID_STAR) rl_left, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^?", (FVOID_STAR) rl_bdel, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^H", (FVOID_STAR) rl_bdel, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^P", (FVOID_STAR) rl_prev_line, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^N", (FVOID_STAR) rl_next_line, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("^R", (FVOID_STAR) rl_redraw, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("`", (FVOID_STAR) rl_quote_insert, RL_Keymap);</div><div class='add'>+ SLkm_define_key ("\033\\", (FVOID_STAR) rl_trim, RL_Keymap);</div><div class='add'>+ if (SLang_Error) return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (rli->prompt == NULL) rli->prompt = "";</div><div class='add'>+ if (rli->keymap == NULL) rli->keymap = RL_Keymap;</div><div class='add'>+ rli->old_upd = rli->upd_buf1;</div><div class='add'>+ rli->new_upd = rli->upd_buf2;</div><div class='add'>+ *rli->buf = 0;</div><div class='add'>+ rli->point = 0;</div><div class='add'>+</div><div class='add'>+ if (rli->flags & SL_RLINE_USE_ANSI)</div><div class='add'>+ {</div><div class='add'>+ if (rli->tt_goto_column == NULL) rli->tt_goto_column = ansi_goto_column;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (Char_Widths[0] == 2) return 0;</div><div class='add'>+</div><div class='add'>+ for (ch = 0; ch < 32; ch++) Char_Widths[ch] = 2;</div><div class='add'>+ for (ch = 32; ch < 256; ch++) Char_Widths[ch] = 1;</div><div class='add'>+ Char_Widths[127] = 2;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ for (ch = 128; ch < 160; ch++) Char_Widths[ch] = 3;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Read_Line_Type *SLang_rline_save_line (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+ SLang_Read_Line_Type *rl = NULL;</div><div class='add'>+ unsigned char *buf;</div><div class='add'>+</div><div class='add'>+ if ((rli == NULL) || (rli->buf == NULL))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ if (NULL == (rl = (SLang_Read_Line_Type *) SLmalloc (sizeof (SLang_Read_Line_Type)))</div><div class='add'>+ || (NULL == (buf = (unsigned char *) SLmake_string ((char *)rli->buf))))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *)rl);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ rl->buf = buf;</div><div class='add'>+ rl->buf_len = strlen ((char *)buf);</div><div class='add'>+ rl->num = rl->misc = 0;</div><div class='add'>+ rl->next = rl->prev = NULL;</div><div class='add'>+</div><div class='add'>+ if (rli->tail != NULL)</div><div class='add'>+ {</div><div class='add'>+ rli->tail->next = rl;</div><div class='add'>+ rl->prev = rli->tail;</div><div class='add'>+ }</div><div class='add'>+ rli->tail = rl;</div><div class='add'>+</div><div class='add'>+ return rl;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slscanf.c b/mdk-stage1/slang/slscanf.c<br/>new file mode 100644<br/>index 000000000..5bd93ff41<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slscanf.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slscanf.c</a></div><div class='hunk'>@@ -0,0 +1,718 @@</div><div class='add'>+/* sscanf function for S-Lang */</div><div class='add'>+/* Copyright (c) 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+#include <ctype.h></div><div class='add'>+#include <math.h></div><div class='add'>+#include <errno.h></div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static char *skip_whitespace (char *s)</div><div class='add'>+{</div><div class='add'>+ while (isspace (*s))</div><div class='add'>+ s++;</div><div class='add'>+ </div><div class='add'>+ return s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void init_map (unsigned char map[256], int base)</div><div class='add'>+{</div><div class='add'>+ memset ((char *) map, 0xFF, 256);</div><div class='add'>+ </div><div class='add'>+ map['0'] = 0; map['1'] = 1; map['2'] = 2; map['3'] = 3;</div><div class='add'>+ map['4'] = 4; map['5'] = 5; map['6'] = 6; map['7'] = 7;</div><div class='add'>+ if (base == 8)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ map['8'] = 8; map['9'] = 9;</div><div class='add'>+ if (base == 10)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ map['A'] = 10; map['B'] = 11; map['C'] = 12; map['D'] = 13;</div><div class='add'>+ map['E'] = 14; map['F'] = 15; map['a'] = 10; map['b'] = 11;</div><div class='add'>+ map['c'] = 12; map['d'] = 13; map['e'] = 14; map['f'] = 15;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *get_sign (char *s, char *smax, int *sign)</div><div class='add'>+{</div><div class='add'>+ *sign = 1;</div><div class='add'>+ if (s + 1 < smax)</div><div class='add'>+ {</div><div class='add'>+ if (*s == '+') s++;</div><div class='add'>+ else if (*s == '-')</div><div class='add'>+ {</div><div class='add'>+ s++;</div><div class='add'>+ *sign = -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ return s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int parse_long (char **sp, char *smax, long *np,</div><div class='add'>+ long base, unsigned char map[256])</div><div class='add'>+{</div><div class='add'>+ char *s, *s0;</div><div class='add'>+ long n;</div><div class='add'>+ int sign;</div><div class='add'>+</div><div class='add'>+ s = s0 = get_sign (*sp, smax, &sign);</div><div class='add'>+</div><div class='add'>+ n = 0;</div><div class='add'>+ while (s < smax)</div><div class='add'>+ {</div><div class='add'>+ unsigned char value;</div><div class='add'>+</div><div class='add'>+ value = map [(unsigned char) *s];</div><div class='add'>+ if (value == 0xFF)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ n = base * n + value;</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *sp = s;</div><div class='add'>+ if (s == s0)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ *np = n * sign;</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int parse_int (char **sp, char *smax, int *np,</div><div class='add'>+ long base, unsigned char map[256])</div><div class='add'>+{</div><div class='add'>+ long n;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ if (1 == (status = parse_long (sp, smax, &n, base, map)))</div><div class='add'>+ *np = (int) n;</div><div class='add'>+ return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_short (char **sp, char *smax, short *np,</div><div class='add'>+ long base, unsigned char map[256])</div><div class='add'>+{</div><div class='add'>+ long n;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ if (1 == (status = parse_long (sp, smax, &n, base, map)))</div><div class='add'>+ *np = (short) n;</div><div class='add'>+ return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_ulong (char **sp, char *smax, unsigned long *np,</div><div class='add'>+ long base, unsigned char map[256])</div><div class='add'>+{</div><div class='add'>+ return parse_long (sp, smax, (long *) np, base, map);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_uint (char **sp, char *smax, unsigned int *np,</div><div class='add'>+ long base, unsigned char map[256])</div><div class='add'>+{</div><div class='add'>+ return parse_int (sp, smax, (int *) np, base, map);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_ushort (char **sp, char *smax, unsigned short *np,</div><div class='add'>+ long base, unsigned char map[256])</div><div class='add'>+{</div><div class='add'>+ return parse_short (sp, smax, (short *) np, base, map);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+/* </div><div class='add'>+ * In an ideal world, strtod would be the correct function to use. However,</div><div class='add'>+ * there may be problems relying on this function because some systems do</div><div class='add'>+ * not support and some that do get it wrong. So, I will handle the parsing</div><div class='add'>+ * of the string and let atof or strtod handle the arithmetic.</div><div class='add'>+ */</div><div class='add'>+static int parse_double (char **sp, char *smax, double *d)</div><div class='add'>+{</div><div class='add'>+ char *s, *s0;</div><div class='add'>+ int sign;</div><div class='add'>+ int expon;</div><div class='add'>+ unsigned char map[256];</div><div class='add'>+ char buf[128];</div><div class='add'>+ int has_leading_zeros;</div><div class='add'>+ char *start_pos, *sign_pos;</div><div class='add'>+ char *b, *bmax;</div><div class='add'>+</div><div class='add'>+ start_pos = *sp;</div><div class='add'>+ s = get_sign (start_pos, smax, &sign);</div><div class='add'>+ if (s >= smax)</div><div class='add'>+ {</div><div class='add'>+ errno = _SLerrno_errno = EINVAL;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Prepare the buffer that will be passed to strtod */</div><div class='add'>+ /* Allow the exponent to be 5 significant digits: E+xxxxx\0 */</div><div class='add'>+ bmax = buf + (sizeof (buf) - 8);</div><div class='add'>+ buf[0] = '0'; buf[1] = '.';</div><div class='add'>+ b = buf + 2;</div><div class='add'>+</div><div class='add'>+ init_map (map, 10);</div><div class='add'>+</div><div class='add'>+ /* Skip leading 0s */</div><div class='add'>+ s0 = s;</div><div class='add'>+ while ((s < smax) && (*s == '0'))</div><div class='add'>+ s++;</div><div class='add'>+ has_leading_zeros = (s != s0);</div><div class='add'>+</div><div class='add'>+ expon = 0;</div><div class='add'>+ while (s < smax)</div><div class='add'>+ {</div><div class='add'>+ unsigned char value = map [(unsigned char) *s];</div><div class='add'>+</div><div class='add'>+ if (value == 0xFF)</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ if (b < bmax)</div><div class='add'>+ *b++ = *s;</div><div class='add'>+ </div><div class='add'>+ expon++;</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if ((s < smax) && (*s == '.'))</div><div class='add'>+ {</div><div class='add'>+ s++;</div><div class='add'>+ if (b == buf + 2) /* nothing added yet */</div><div class='add'>+ {</div><div class='add'>+ while ((s < smax) && (*s == '0'))</div><div class='add'>+ {</div><div class='add'>+ expon--;</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (s < smax)</div><div class='add'>+ {</div><div class='add'>+ unsigned char value = map [(unsigned char) *s];</div><div class='add'>+</div><div class='add'>+ if (value == 0xFF)</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ if (b < bmax)</div><div class='add'>+ *b++ = *s;</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((b == buf + 2)</div><div class='add'>+ && (has_leading_zeros == 0))</div><div class='add'>+ {</div><div class='add'>+ *sp = start_pos;</div><div class='add'>+ errno = EINVAL;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((s + 1 < smax) && ((*s == 'E') || (*s == 'e')))</div><div class='add'>+ {</div><div class='add'>+ int e;</div><div class='add'>+ int esign;</div><div class='add'>+</div><div class='add'>+ s0 = s;</div><div class='add'>+ s = get_sign (s + 1, smax, &esign);</div><div class='add'>+ sign_pos = s;</div><div class='add'>+ e = 0;</div><div class='add'>+ while (s < smax)</div><div class='add'>+ {</div><div class='add'>+ unsigned char value = map [(unsigned char) *s];</div><div class='add'>+ if (value == 0xFF)</div><div class='add'>+ break;</div><div class='add'>+ if (e < 25000) /* avoid overflow if 16 bit */</div><div class='add'>+ e = 10 * e + value;</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+#ifdef ERANGE</div><div class='add'>+ if (e >= 25000)</div><div class='add'>+ errno = ERANGE;</div><div class='add'>+#endif</div><div class='add'>+ if (s == sign_pos)</div><div class='add'>+ s = s0; /* ...E-X */</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ e = esign * e;</div><div class='add'>+ expon += e;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (expon != 0)</div><div class='add'>+ sprintf (b, "e%d", expon);</div><div class='add'>+ else</div><div class='add'>+ *b = 0;</div><div class='add'>+ </div><div class='add'>+ *sp = s;</div><div class='add'>+#if HAVE_STRTOD</div><div class='add'>+ *d = sign * strtod (buf, NULL);</div><div class='add'>+#else</div><div class='add'>+ *d = sign * atof (buf);</div><div class='add'>+#endif</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_float (char **sp, char *smax, float *d)</div><div class='add'>+{</div><div class='add'>+ double x;</div><div class='add'>+ if (1 == parse_double (sp, smax, &x))</div><div class='add'>+ {</div><div class='add'>+ *d = (float) x;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+#endif /* SLANG_HAS_FLOAT */</div><div class='add'>+</div><div class='add'>+static int parse_string (char **sp, char *smax, char **str)</div><div class='add'>+{</div><div class='add'>+ char *s, *s0;</div><div class='add'>+ </div><div class='add'>+ s0 = s = *sp;</div><div class='add'>+ while (s < smax)</div><div class='add'>+ {</div><div class='add'>+ if (isspace (*s))</div><div class='add'>+ break;</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+ if (NULL == (*str = SLang_create_nslstring (s0, (unsigned int) (s - s0))))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ *sp = s;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_bstring (char **sp, char *smax, char **str)</div><div class='add'>+{</div><div class='add'>+ char *s;</div><div class='add'>+ </div><div class='add'>+ s = *sp;</div><div class='add'>+ if (NULL == (*str = SLang_create_nslstring (s, (unsigned int) (smax - s))))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ *sp = smax;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_range (char **sp, char *smax, char **fp, char **str)</div><div class='add'>+{</div><div class='add'>+ char *s, *s0;</div><div class='add'>+ char *range;</div><div class='add'>+ char *f;</div><div class='add'>+ unsigned char map[256];</div><div class='add'>+ unsigned char reverse;</div><div class='add'>+</div><div class='add'>+ /* How can one represent a range with just '^'? The naive answer is</div><div class='add'>+ * is [^]. However, this may be interpreted as meaning any character</div><div class='add'>+ * but ']' and others. Let's assume that the user will not use a range</div><div class='add'>+ * to match '^'.</div><div class='add'>+ */</div><div class='add'>+ f = *fp;</div><div class='add'>+ /* f is a pointer to (one char after) [...]. */</div><div class='add'>+ if (*f == '^')</div><div class='add'>+ {</div><div class='add'>+ f++;</div><div class='add'>+ reverse = 1;</div><div class='add'>+ }</div><div class='add'>+ else reverse = 0;</div><div class='add'>+</div><div class='add'>+ s0 = f;</div><div class='add'>+ if (*f == ']')</div><div class='add'>+ f++;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ char ch = *f;</div><div class='add'>+</div><div class='add'>+ if (ch == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Unexpected end of range in format");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ if (ch == ']')</div><div class='add'>+ break;</div><div class='add'>+ f++;</div><div class='add'>+ }</div><div class='add'>+ if (NULL == (range = SLmake_nstring (s0, (unsigned int) (f - s0))))</div><div class='add'>+ return -1;</div><div class='add'>+ *fp = f + 1; /* skip ] */</div><div class='add'>+ </div><div class='add'>+ SLmake_lut (map, (unsigned char *) range, reverse);</div><div class='add'>+ SLfree (range);</div><div class='add'>+</div><div class='add'>+ s0 = s = *sp;</div><div class='add'>+ while ((s < smax) && map [(unsigned char) *s])</div><div class='add'>+ s++;</div><div class='add'>+ </div><div class='add'>+ if (NULL == (*str = SLang_create_nslstring (s0, (unsigned int) (s - s0))))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ *sp = s;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+int _SLang_sscanf (void)</div><div class='add'>+{</div><div class='add'>+ int num;</div><div class='add'>+ unsigned int num_refs;</div><div class='add'>+ char *format;</div><div class='add'>+ char *input_string, *input_string_max;</div><div class='add'>+ char *f, *s;</div><div class='add'>+ unsigned char map8[256], map10[256], map16[256];</div><div class='add'>+</div><div class='add'>+ if (SLang_Num_Function_Args < 2)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Int_Type sscanf (str, format, ...)");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ num_refs = (unsigned int) SLang_Num_Function_Args;</div><div class='add'>+ if (-1 == SLreverse_stack (num_refs))</div><div class='add'>+ return -1;</div><div class='add'>+ num_refs -= 2;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_slstring (&input_string))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_slstring (&format))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (input_string);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ f = format;</div><div class='add'>+ s = input_string;</div><div class='add'>+ input_string_max = input_string + strlen (input_string);</div><div class='add'>+</div><div class='add'>+ init_map (map8, 8);</div><div class='add'>+ init_map (map10, 10);</div><div class='add'>+ init_map (map16, 16);</div><div class='add'>+</div><div class='add'>+ num = 0;</div><div class='add'>+</div><div class='add'>+ while (num_refs != 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ SLang_Ref_Type *ref;</div><div class='add'>+ char *smax;</div><div class='add'>+ unsigned char *map;</div><div class='add'>+ int base;</div><div class='add'>+ int no_assign;</div><div class='add'>+ int is_short;</div><div class='add'>+ int is_long;</div><div class='add'>+ int status;</div><div class='add'>+ char chf;</div><div class='add'>+ unsigned int width;</div><div class='add'>+ int has_width;</div><div class='add'>+</div><div class='add'>+ chf = *f++;</div><div class='add'>+</div><div class='add'>+ if (chf == 0)</div><div class='add'>+ {</div><div class='add'>+ /* Hmmm.... what is the most useful thing to do?? */</div><div class='add'>+#if 1</div><div class='add'>+ break;</div><div class='add'>+#else</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "sscanf: format not big enough for output list");</div><div class='add'>+ goto return_error;</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (isspace (chf))</div><div class='add'>+ {</div><div class='add'>+ s = skip_whitespace (s);</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if ((chf != '%')</div><div class='add'>+ || ((chf = *f++) == '%'))</div><div class='add'>+ {</div><div class='add'>+ if (*s != chf)</div><div class='add'>+ break;</div><div class='add'>+ s++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ no_assign = 0;</div><div class='add'>+ is_short = 0;</div><div class='add'>+ is_long = 0;</div><div class='add'>+ width = 0;</div><div class='add'>+ smax = input_string_max;</div><div class='add'>+</div><div class='add'>+ /* Look for the flag character */</div><div class='add'>+ if (chf == '*')</div><div class='add'>+ {</div><div class='add'>+ no_assign = 1;</div><div class='add'>+ chf = *f++;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ /* Width */</div><div class='add'>+ has_width = isdigit (chf);</div><div class='add'>+ if (has_width)</div><div class='add'>+ {</div><div class='add'>+ f--;</div><div class='add'>+ (void) parse_uint (&f, f + strlen(f), &width, 10, map10);</div><div class='add'>+ chf = *f++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Now the type modifier */</div><div class='add'>+ switch (chf)</div><div class='add'>+ {</div><div class='add'>+ case 'h':</div><div class='add'>+ is_short = 1;</div><div class='add'>+ chf = *f++;</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case 'L': /* not implemented */</div><div class='add'>+ case 'l':</div><div class='add'>+ is_long = 1;</div><div class='add'>+ chf = *f++;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ status = -1;</div><div class='add'>+</div><div class='add'>+ if ((chf != 'c') && (chf != '['))</div><div class='add'>+ s = skip_whitespace (s);</div><div class='add'>+</div><div class='add'>+ if (has_width)</div><div class='add'>+ {</div><div class='add'>+ if (width > (unsigned int) (input_string_max - s))</div><div class='add'>+ width = (unsigned int) (input_string_max - s);</div><div class='add'>+ smax = s + width;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ /* Now the format descriptor */</div><div class='add'>+</div><div class='add'>+ map = map10;</div><div class='add'>+ base = 10;</div><div class='add'>+</div><div class='add'>+ try_again: /* used by i, x, and o, conversions */</div><div class='add'>+ switch (chf)</div><div class='add'>+ {</div><div class='add'>+ case 0:</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "sscanf: Unexpected end of format");</div><div class='add'>+ goto return_error;</div><div class='add'>+ case 'D':</div><div class='add'>+ is_long = 1;</div><div class='add'>+ case 'd':</div><div class='add'>+ if (is_short)</div><div class='add'>+ {</div><div class='add'>+ obj.data_type = SLANG_SHORT_TYPE;</div><div class='add'>+ status = parse_short (&s, smax, &obj.v.short_val, base, map);</div><div class='add'>+ }</div><div class='add'>+ else if (is_long)</div><div class='add'>+ {</div><div class='add'>+ obj.data_type = SLANG_LONG_TYPE;</div><div class='add'>+ status = parse_long (&s, smax, &obj.v.long_val, base, map);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ obj.data_type = SLANG_INT_TYPE;</div><div class='add'>+ status = parse_int (&s, smax, &obj.v.int_val, base, map);</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+</div><div class='add'>+ case 'U':</div><div class='add'>+ is_long = 1;</div><div class='add'>+ case 'u':</div><div class='add'>+ if (is_short)</div><div class='add'>+ {</div><div class='add'>+ obj.data_type = SLANG_USHORT_TYPE;</div><div class='add'>+ status = parse_ushort (&s, smax, &obj.v.ushort_val, base, map);</div><div class='add'>+ }</div><div class='add'>+ else if (is_long)</div><div class='add'>+ {</div><div class='add'>+ obj.data_type = SLANG_ULONG_TYPE;</div><div class='add'>+ status = parse_ulong (&s, smax, &obj.v.ulong_val, base, map);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ obj.data_type = SLANG_INT_TYPE;</div><div class='add'>+ status = parse_uint (&s, smax, &obj.v.uint_val, base, map);</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'I':</div><div class='add'>+ is_long = 1;</div><div class='add'>+ case 'i':</div><div class='add'>+ if ((s + 1 >= smax)</div><div class='add'>+ || (*s != 0))</div><div class='add'>+ chf = 'd';</div><div class='add'>+ else if (((s[1] == 'x') || (s[1] == 'X'))</div><div class='add'>+ && (s + 2 < smax))</div><div class='add'>+ {</div><div class='add'>+ s += 2;</div><div class='add'>+ chf = 'x';</div><div class='add'>+ }</div><div class='add'>+ else chf = 'o';</div><div class='add'>+ goto try_again;</div><div class='add'>+ </div><div class='add'>+ case 'O':</div><div class='add'>+ is_long = 1;</div><div class='add'>+ case 'o':</div><div class='add'>+ map = map8;</div><div class='add'>+ base = 8;</div><div class='add'>+ chf = 'd';</div><div class='add'>+ goto try_again;</div><div class='add'>+ </div><div class='add'>+ case 'X':</div><div class='add'>+ is_long = 1;</div><div class='add'>+ case 'x':</div><div class='add'>+ base = 16;</div><div class='add'>+ map = map16;</div><div class='add'>+ chf = 'd';</div><div class='add'>+ goto try_again;</div><div class='add'>+</div><div class='add'>+ case 'E':</div><div class='add'>+ case 'F':</div><div class='add'>+ is_long = 1;</div><div class='add'>+ case 'e':</div><div class='add'>+ case 'f':</div><div class='add'>+ case 'g':</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ if (is_long)</div><div class='add'>+ {</div><div class='add'>+ obj.data_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+ status = parse_double (&s, smax, &obj.v.double_val);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ obj.data_type = SLANG_FLOAT_TYPE;</div><div class='add'>+ status = parse_float (&s, smax, &obj.v.float_val);</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "This version of the S-Lang does not support floating point");</div><div class='add'>+ status = -1;</div><div class='add'>+#endif</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case 's':</div><div class='add'>+ obj.data_type = SLANG_STRING_TYPE;</div><div class='add'>+ status = parse_string (&s, smax, &obj.v.s_val);</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case 'c':</div><div class='add'>+ if (has_width == 0)</div><div class='add'>+ {</div><div class='add'>+ obj.data_type = SLANG_UCHAR_TYPE;</div><div class='add'>+ obj.v.uchar_val = *s++;</div><div class='add'>+ status = 1;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ obj.data_type = SLANG_STRING_TYPE;</div><div class='add'>+ status = parse_bstring (&s, smax, &obj.v.s_val);</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case '[':</div><div class='add'>+ obj.data_type = SLANG_STRING_TYPE;</div><div class='add'>+ status = parse_range (&s, smax, &f, &obj.v.s_val);</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case 'n':</div><div class='add'>+ obj.data_type = SLANG_UINT_TYPE;</div><div class='add'>+ obj.v.uint_val = (unsigned int) (s - input_string);</div><div class='add'>+ status = 1;</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ default:</div><div class='add'>+ status = -1;</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "format specifier '%c' is not supported", chf);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (status == 0)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ if (status == -1)</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (no_assign)</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_ref (&ref))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (-1 == SLang_push (&obj))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ SLang_free_ref (ref);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (-1 == _SLang_deref_assign (ref))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_ref (ref);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+ SLang_free_ref (ref);</div><div class='add'>+</div><div class='add'>+ num++;</div><div class='add'>+ num_refs--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLdo_pop_n (num_refs))</div><div class='add'>+ goto return_error;</div><div class='add'>+ </div><div class='add'>+ SLang_free_slstring (format);</div><div class='add'>+ SLang_free_slstring (input_string);</div><div class='add'>+ return num;</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ /* NULLS ok */</div><div class='add'>+ SLang_free_slstring (format);</div><div class='add'>+ SLang_free_slstring (input_string);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+# if SLANG_HAS_FLOAT</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_STDLIB_H</div><div class='add'>+/* Oh dear. Where is the prototype for atof? If not in stdlib, then</div><div class='add'>+ * I do not know where. Not in math.h on some systems either.</div><div class='add'>+ */</div><div class='add'>+extern double atof ();</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+double _SLang_atof (char *s)</div><div class='add'>+{</div><div class='add'>+ double x;</div><div class='add'>+</div><div class='add'>+ s = skip_whitespace (s);</div><div class='add'>+ errno = 0;</div><div class='add'>+</div><div class='add'>+ if (1 != parse_double (&s, s + strlen (s), &x))</div><div class='add'>+ {</div><div class='add'>+ if ((0 == strcmp ("NaN", s))</div><div class='add'>+ || (0 == strcmp ("-Inf", s))</div><div class='add'>+ || (0 == strcmp ("Inf", s)))</div><div class='add'>+ return atof (s); /* let this deal with it */</div><div class='add'>+#ifdef EINVAL</div><div class='add'>+ errno = _SLerrno_errno = EINVAL;</div><div class='add'>+#endif</div><div class='add'>+ return 0.0;</div><div class='add'>+ }</div><div class='add'>+ if (errno) </div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return x;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slscroll.c b/mdk-stage1/slang/slscroll.c<br/>new file mode 100644<br/>index 000000000..358296116<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slscroll.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slscroll.c</a></div><div class='hunk'>@@ -0,0 +1,450 @@</div><div class='add'>+/* SLang Scrolling Window Routines */</div><div class='add'>+/* Copyright (c) 1996, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static void find_window_bottom (SLscroll_Window_Type *win)</div><div class='add'>+{</div><div class='add'>+ unsigned int nrows;</div><div class='add'>+ unsigned int hidden_mask;</div><div class='add'>+ SLscroll_Type *bot, *cline, *last_bot;</div><div class='add'>+ unsigned int row;</div><div class='add'>+</div><div class='add'>+ nrows = win->nrows;</div><div class='add'>+ hidden_mask = win->hidden_mask;</div><div class='add'>+ cline = win->current_line;</div><div class='add'>+</div><div class='add'>+ win->window_row = row = 0;</div><div class='add'>+ last_bot = bot = win->top_window_line;</div><div class='add'>+</div><div class='add'>+ while (row < nrows)</div><div class='add'>+ {</div><div class='add'>+ if (bot == cline)</div><div class='add'>+ win->window_row = row;</div><div class='add'>+</div><div class='add'>+ last_bot = bot;</div><div class='add'>+</div><div class='add'>+ if (bot == NULL)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ bot = bot->next;</div><div class='add'>+</div><div class='add'>+ if (hidden_mask)</div><div class='add'>+ {</div><div class='add'>+ while ((bot != NULL) && (bot->flags & hidden_mask))</div><div class='add'>+ bot = bot->next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ row++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ win->bot_window_line = last_bot;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int find_top_to_recenter (SLscroll_Window_Type *win)</div><div class='add'>+{</div><div class='add'>+ unsigned int nrows;</div><div class='add'>+ unsigned int hidden_mask;</div><div class='add'>+ SLscroll_Type *prev, *last_prev, *cline;</div><div class='add'>+</div><div class='add'>+ nrows = win->nrows;</div><div class='add'>+ cline = win->current_line;</div><div class='add'>+ hidden_mask = win->hidden_mask;</div><div class='add'>+</div><div class='add'>+ nrows = nrows / 2;</div><div class='add'>+</div><div class='add'>+ last_prev = prev = cline;</div><div class='add'>+</div><div class='add'>+ while (nrows && (prev != NULL))</div><div class='add'>+ {</div><div class='add'>+ nrows--;</div><div class='add'>+ last_prev = prev;</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ prev = prev->prev;</div><div class='add'>+ }</div><div class='add'>+ while (hidden_mask</div><div class='add'>+ && (prev != NULL)</div><div class='add'>+ && (prev->flags & hidden_mask));</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (prev == NULL) prev = last_prev;</div><div class='add'>+</div><div class='add'>+ win->top_window_line = prev;</div><div class='add'>+ find_window_bottom (win);</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define HAS_BORDER_CODE 1</div><div class='add'>+int SLscroll_find_top (SLscroll_Window_Type *win)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+ SLscroll_Type *cline, *prev, *next;</div><div class='add'>+ SLscroll_Type *top_window_line;</div><div class='add'>+ unsigned int nrows;</div><div class='add'>+ unsigned int hidden_mask;</div><div class='add'>+ int scroll_mode;</div><div class='add'>+ unsigned int border;</div><div class='add'>+</div><div class='add'>+ cline = win->current_line;</div><div class='add'>+ nrows = win->nrows;</div><div class='add'>+ scroll_mode = win->cannot_scroll;</div><div class='add'>+ border = win->border;</div><div class='add'>+ if (scroll_mode == 2)</div><div class='add'>+ border = 0;</div><div class='add'>+</div><div class='add'>+ if ((cline == NULL) || (nrows <= 1))</div><div class='add'>+ {</div><div class='add'>+ win->top_window_line = cline;</div><div class='add'>+ find_window_bottom (win);</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ hidden_mask = win->hidden_mask;</div><div class='add'>+</div><div class='add'>+ /* Note: top_window_line might be a bogus pointer. This means that I cannot</div><div class='add'>+ * access it unless it really corresponds to a pointer in the buffer.</div><div class='add'>+ */</div><div class='add'>+ top_window_line = win->top_window_line;</div><div class='add'>+</div><div class='add'>+ if (top_window_line == NULL)</div><div class='add'>+ return find_top_to_recenter (win);</div><div class='add'>+</div><div class='add'>+ /* Chances are that the current line is visible in the window. This means</div><div class='add'>+ * that the top window line should be above it.</div><div class='add'>+ */</div><div class='add'>+ prev = cline;</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+</div><div class='add'>+ while ((i < nrows) && (prev != NULL))</div><div class='add'>+ {</div><div class='add'>+ if (prev == top_window_line)</div><div class='add'>+ {</div><div class='add'>+ SLscroll_Type *twl = top_window_line;</div><div class='add'>+ int dir = 0;</div><div class='add'>+</div><div class='add'>+ if (i < border) dir = -1; else if (i + border >= nrows) dir = 1;</div><div class='add'>+</div><div class='add'>+ if (dir) while (border)</div><div class='add'>+ {</div><div class='add'>+ if (dir < 0) twl = twl->prev;</div><div class='add'>+ else twl = twl->next;</div><div class='add'>+</div><div class='add'>+ if (twl == NULL)</div><div class='add'>+ {</div><div class='add'>+ twl = top_window_line;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ if ((hidden_mask == 0)</div><div class='add'>+ || (0 == (twl->flags & hidden_mask)))</div><div class='add'>+ border--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ win->top_window_line = twl;</div><div class='add'>+ find_window_bottom (win);</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ prev = prev->prev;</div><div class='add'>+ }</div><div class='add'>+ while (hidden_mask</div><div class='add'>+ && (prev != NULL)</div><div class='add'>+ && (prev->flags & hidden_mask));</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Now check the borders of the window. Perhaps the current line lies</div><div class='add'>+ * outsider the border by a line. Only do this if terminal can scroll.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ if (scroll_mode == 1)</div><div class='add'>+ return find_top_to_recenter (win);</div><div class='add'>+ else if (scroll_mode == -1)</div><div class='add'>+ scroll_mode = 0;</div><div class='add'>+</div><div class='add'>+ next = cline->next;</div><div class='add'>+ while (hidden_mask</div><div class='add'>+ && (next != NULL)</div><div class='add'>+ && (next->flags & hidden_mask))</div><div class='add'>+ next = next->next;</div><div class='add'>+</div><div class='add'>+ if ((next != NULL)</div><div class='add'>+ && (next == top_window_line))</div><div class='add'>+ {</div><div class='add'>+ /* The current line is one line above the window. This means user</div><div class='add'>+ * has moved up past the top of the window. If scroll_mode is set</div><div class='add'>+ * to scroll by pages, we need to do a page up.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ win->top_window_line = cline;</div><div class='add'>+ find_window_bottom (win);</div><div class='add'>+</div><div class='add'>+ if (scroll_mode) return SLscroll_pageup (win);</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ prev = cline->prev;</div><div class='add'>+</div><div class='add'>+ while (hidden_mask</div><div class='add'>+ && (prev != NULL)</div><div class='add'>+ && (prev->flags & hidden_mask))</div><div class='add'>+ prev = prev->prev;</div><div class='add'>+</div><div class='add'>+ if ((prev == NULL)</div><div class='add'>+ || (prev != win->bot_window_line))</div><div class='add'>+ return find_top_to_recenter (win);</div><div class='add'>+</div><div class='add'>+ /* It looks like cline is below window by one line. See what line should</div><div class='add'>+ * be at top to scroll it into view. Only do this unless we are scrolling</div><div class='add'>+ * by pages.</div><div class='add'>+ */</div><div class='add'>+ if (scroll_mode)</div><div class='add'>+ {</div><div class='add'>+ win->top_window_line = cline;</div><div class='add'>+ find_window_bottom (win);</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ i = 2;</div><div class='add'>+ while ((i < nrows) && (prev != NULL))</div><div class='add'>+ {</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ prev = prev->prev;</div><div class='add'>+ }</div><div class='add'>+ while (hidden_mask</div><div class='add'>+ && (prev != NULL)</div><div class='add'>+ && (prev->flags & hidden_mask));</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (prev != NULL)</div><div class='add'>+ {</div><div class='add'>+ win->top_window_line = prev;</div><div class='add'>+ find_window_bottom (win);</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return find_top_to_recenter (win);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLscroll_find_line_num (SLscroll_Window_Type *win)</div><div class='add'>+{</div><div class='add'>+ SLscroll_Type *cline, *l;</div><div class='add'>+ unsigned int n;</div><div class='add'>+ unsigned int hidden_mask;</div><div class='add'>+</div><div class='add'>+ if (win == NULL) return -1;</div><div class='add'>+</div><div class='add'>+ hidden_mask = win->hidden_mask;</div><div class='add'>+ cline = win->current_line;</div><div class='add'>+</div><div class='add'>+ n = 1;</div><div class='add'>+</div><div class='add'>+ l = win->lines;</div><div class='add'>+ while (l != cline)</div><div class='add'>+ {</div><div class='add'>+ if ((hidden_mask == 0)</div><div class='add'>+ || (0 == (l->flags & hidden_mask)))</div><div class='add'>+ n++;</div><div class='add'>+</div><div class='add'>+ l = l->next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ win->line_num = n;</div><div class='add'>+ n--;</div><div class='add'>+</div><div class='add'>+ while (l != NULL)</div><div class='add'>+ {</div><div class='add'>+ if ((hidden_mask == 0)</div><div class='add'>+ || (0 == (l->flags & hidden_mask)))</div><div class='add'>+ n++;</div><div class='add'>+ l = l->next;</div><div class='add'>+ }</div><div class='add'>+ win->num_lines = n;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int SLscroll_next_n (SLscroll_Window_Type *win, unsigned int n)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+ unsigned int hidden_mask;</div><div class='add'>+ SLscroll_Type *l, *cline;</div><div class='add'>+</div><div class='add'>+ if ((win == NULL)</div><div class='add'>+ || (NULL == (cline = win->current_line)))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ hidden_mask = win->hidden_mask;</div><div class='add'>+ l = cline;</div><div class='add'>+ i = 0;</div><div class='add'>+ while (i < n)</div><div class='add'>+ {</div><div class='add'>+ l = l->next;</div><div class='add'>+ while (hidden_mask</div><div class='add'>+ && (l != NULL) && (l->flags & hidden_mask))</div><div class='add'>+ l = l->next;</div><div class='add'>+</div><div class='add'>+ if (l == NULL)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ i++;</div><div class='add'>+ cline = l;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ win->current_line = cline;</div><div class='add'>+ win->line_num += i;</div><div class='add'>+ return i;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int SLscroll_prev_n (SLscroll_Window_Type *win, unsigned int n)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+ unsigned int hidden_mask;</div><div class='add'>+ SLscroll_Type *l, *cline;</div><div class='add'>+</div><div class='add'>+ if ((win == NULL)</div><div class='add'>+ || (NULL == (cline = win->current_line)))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ hidden_mask = win->hidden_mask;</div><div class='add'>+ l = cline;</div><div class='add'>+ i = 0;</div><div class='add'>+ while (i < n)</div><div class='add'>+ {</div><div class='add'>+ l = l->prev;</div><div class='add'>+ while (hidden_mask</div><div class='add'>+ && (l != NULL) && (l->flags & hidden_mask))</div><div class='add'>+ l = l->prev;</div><div class='add'>+</div><div class='add'>+ if (l == NULL)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ i++;</div><div class='add'>+ cline = l;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ win->current_line = cline;</div><div class='add'>+ win->line_num -= i;</div><div class='add'>+ return i;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLscroll_pageup (SLscroll_Window_Type *win)</div><div class='add'>+{</div><div class='add'>+ SLscroll_Type *l, *top;</div><div class='add'>+ unsigned int nrows, hidden_mask;</div><div class='add'>+ unsigned int n;</div><div class='add'>+</div><div class='add'>+ if (win == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ (void) SLscroll_find_top (win);</div><div class='add'>+</div><div class='add'>+ nrows = win->nrows;</div><div class='add'>+</div><div class='add'>+ if ((NULL != (top = win->top_window_line))</div><div class='add'>+ && (nrows > 2))</div><div class='add'>+ {</div><div class='add'>+ n = 0;</div><div class='add'>+ hidden_mask = win->hidden_mask;</div><div class='add'>+ l = win->current_line;</div><div class='add'>+ while ((l != NULL) && (l != top))</div><div class='add'>+ {</div><div class='add'>+ l = l->prev;</div><div class='add'>+ if ((hidden_mask == 0)</div><div class='add'>+ || ((l != NULL) && (0 == (l->flags & hidden_mask))))</div><div class='add'>+ n++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (l != NULL)</div><div class='add'>+ {</div><div class='add'>+ unsigned int save_line_num;</div><div class='add'>+ int ret = 0;</div><div class='add'>+</div><div class='add'>+ win->current_line = l;</div><div class='add'>+ win->line_num -= n;</div><div class='add'>+</div><div class='add'>+ /* Compute a new top/bottom header */</div><div class='add'>+ save_line_num = win->line_num;</div><div class='add'>+</div><div class='add'>+ if ((0 == SLscroll_prev_n (win, nrows - 1))</div><div class='add'>+ && (n == 0))</div><div class='add'>+ ret = -1;</div><div class='add'>+</div><div class='add'>+ win->top_window_line = win->current_line;</div><div class='add'>+ win->current_line = l;</div><div class='add'>+ win->line_num = save_line_num;</div><div class='add'>+</div><div class='add'>+ find_window_bottom (win);</div><div class='add'>+ return ret;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (nrows < 2) nrows++;</div><div class='add'>+ if (0 == SLscroll_prev_n (win, nrows - 1))</div><div class='add'>+ return -1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLscroll_pagedown (SLscroll_Window_Type *win)</div><div class='add'>+{</div><div class='add'>+ SLscroll_Type *l, *bot;</div><div class='add'>+ unsigned int nrows, hidden_mask;</div><div class='add'>+ unsigned int n;</div><div class='add'>+</div><div class='add'>+ if (win == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ (void) SLscroll_find_top (win);</div><div class='add'>+</div><div class='add'>+ nrows = win->nrows;</div><div class='add'>+</div><div class='add'>+ if ((NULL != (bot = win->bot_window_line))</div><div class='add'>+ && (nrows > 2))</div><div class='add'>+ {</div><div class='add'>+ n = 0;</div><div class='add'>+ hidden_mask = win->hidden_mask;</div><div class='add'>+ l = win->current_line;</div><div class='add'>+ while ((l != NULL) && (l != bot))</div><div class='add'>+ {</div><div class='add'>+ l = l->next;</div><div class='add'>+ if ((hidden_mask == 0)</div><div class='add'>+ || ((l != NULL) && (0 == (l->flags & hidden_mask))))</div><div class='add'>+ n++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (l != NULL)</div><div class='add'>+ {</div><div class='add'>+ win->current_line = l;</div><div class='add'>+ win->top_window_line = l;</div><div class='add'>+ win->line_num += n;</div><div class='add'>+</div><div class='add'>+ find_window_bottom (win);</div><div class='add'>+</div><div class='add'>+ if (n || (bot != win->bot_window_line))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (nrows < 2) nrows++;</div><div class='add'>+ if (0 == SLscroll_next_n (win, nrows - 1))</div><div class='add'>+ return -1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slsearch.c b/mdk-stage1/slang/slsearch.c<br/>new file mode 100644<br/>index 000000000..a9a427a7d<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slsearch.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slsearch.c</a></div><div class='hunk'>@@ -0,0 +1,239 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifdef upcase</div><div class='add'>+# undef upcase</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define upcase(ch) (cs ? ch : UPPER_CASE(ch))</div><div class='add'>+</div><div class='add'>+static unsigned char *search_forward (register unsigned char *beg,</div><div class='add'>+ unsigned char *end,</div><div class='add'>+ unsigned char *key,</div><div class='add'>+ register int key_len, int cs, int *ind)</div><div class='add'>+{</div><div class='add'>+ register unsigned char char1;</div><div class='add'>+ unsigned char *pos;</div><div class='add'>+ int j, str_len;</div><div class='add'>+ register unsigned char ch;</div><div class='add'>+ register int db;</div><div class='add'>+</div><div class='add'>+ str_len = (int) (end - beg);</div><div class='add'>+ if (str_len < key_len) return (NULL);</div><div class='add'>+ </div><div class='add'>+ if (key_len == 0)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ char1 = key[key_len - 1];</div><div class='add'>+ beg += (key_len - 1);</div><div class='add'>+</div><div class='add'>+ while(1)</div><div class='add'>+ {</div><div class='add'>+ if (cs) while (beg < end)</div><div class='add'>+ {</div><div class='add'>+ ch = *beg;</div><div class='add'>+ db = ind[(unsigned char) ch];</div><div class='add'>+ if ((db < key_len) && (ch == char1)) break;</div><div class='add'>+ beg += db; /* ind[(unsigned char) ch]; */</div><div class='add'>+ }</div><div class='add'>+ else while (beg < end)</div><div class='add'>+ {</div><div class='add'>+ ch = *beg;</div><div class='add'>+ db = ind[(unsigned char) ch];</div><div class='add'>+ if ((db < key_len) &&</div><div class='add'>+ (UPPER_CASE(ch) == char1)) break;</div><div class='add'>+ beg += db; /* ind[(unsigned char) ch]; */</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (beg >= end) return(NULL);</div><div class='add'>+</div><div class='add'>+ pos = beg - (key_len - 1);</div><div class='add'>+ for (j = 0; j < key_len; j++)</div><div class='add'>+ {</div><div class='add'>+ ch = upcase(pos[j]);</div><div class='add'>+ if (ch != (unsigned char) key[j]) break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (j == key_len) return(pos);</div><div class='add'>+ beg += 1;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char *search_backward (unsigned char *beg,unsigned char *end,</div><div class='add'>+ unsigned char *key, int key_len,</div><div class='add'>+ int cs, int *ind)</div><div class='add'>+{</div><div class='add'>+ unsigned char ch, char1;</div><div class='add'>+ int j, str_len, ofs;</div><div class='add'>+</div><div class='add'>+ str_len = (int) (end - beg);</div><div class='add'>+ if (str_len < key_len) return (NULL);</div><div class='add'>+ </div><div class='add'>+ if (key_len == 0)</div><div class='add'>+ return NULL;</div><div class='add'>+ </div><div class='add'>+ /* end -= (key_len - 1); */</div><div class='add'>+ end -= key_len;</div><div class='add'>+</div><div class='add'>+ char1 = key[0];</div><div class='add'>+</div><div class='add'>+ while(1)</div><div class='add'>+ {</div><div class='add'>+ while ((beg <= end) && (ch = *end, ch = upcase(ch), ch != char1))</div><div class='add'>+ {</div><div class='add'>+ ofs = ind[(unsigned char) ch];</div><div class='add'>+#ifdef __MSDOS__</div><div class='add'>+ /* This is needed for msdos segment wrapping problems */</div><div class='add'>+ if (beg + ofs > end) return(NULL);</div><div class='add'>+#endif</div><div class='add'>+ end -= ofs;</div><div class='add'>+ }</div><div class='add'>+ if (beg > end) return(NULL);</div><div class='add'>+ for (j = 1; j < key_len; j++)</div><div class='add'>+ {</div><div class='add'>+ ch = upcase(end[j]);</div><div class='add'>+ if (ch != key[j]) break;</div><div class='add'>+ }</div><div class='add'>+ if (j == key_len) return(end);</div><div class='add'>+ end--;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned char *SLsearch (unsigned char *pmin, unsigned char *pmax,</div><div class='add'>+ SLsearch_Type *st)</div><div class='add'>+{</div><div class='add'>+ if (st->dir > 0) return search_forward (pmin, pmax, st->key,</div><div class='add'>+ st->key_len, st->cs, st->ind);</div><div class='add'>+ else return search_backward (pmin, pmax, st->key,</div><div class='add'>+ st->key_len, st->cs, st->ind);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int Case_Tables_Ok;</div><div class='add'>+</div><div class='add'>+int SLsearch_init (char *str, int dir, int cs, SLsearch_Type *st)</div><div class='add'>+{</div><div class='add'>+ int i, maxi;</div><div class='add'>+ register int max = strlen(str);</div><div class='add'>+ unsigned char *w, *work = st->key;</div><div class='add'>+ register int *indp, *indpm;</div><div class='add'>+ int *ind = st->ind;</div><div class='add'>+</div><div class='add'>+ if (max >= (int) sizeof (st->key))</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror ("Search string too long.");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ st->dir = dir; st->cs = cs;</div><div class='add'>+</div><div class='add'>+ if (!Case_Tables_Ok) SLang_init_case_tables ();</div><div class='add'>+</div><div class='add'>+ if (dir > 0)</div><div class='add'>+ {</div><div class='add'>+ w = work;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ maxi = max - 1;</div><div class='add'>+ str = str + maxi;</div><div class='add'>+ w = work + maxi;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* for (i = 0; i < 256; i++) ind[i] = max; */</div><div class='add'>+ indp = ind; indpm = ind + 256;</div><div class='add'>+ while (indp < indpm)</div><div class='add'>+ {</div><div class='add'>+ *indp++ = max;</div><div class='add'>+ *indp++ = max;</div><div class='add'>+ *indp++ = max;</div><div class='add'>+ *indp++ = max;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ if (cs) while (i < max)</div><div class='add'>+ {</div><div class='add'>+ i++;</div><div class='add'>+ maxi = max - i;</div><div class='add'>+ *w = *str;</div><div class='add'>+ ind[(unsigned char) *str] = maxi;</div><div class='add'>+ str += dir; w += dir;</div><div class='add'>+ }</div><div class='add'>+ else while (i < max)</div><div class='add'>+ {</div><div class='add'>+ i++;</div><div class='add'>+ maxi = max - i;</div><div class='add'>+ *w = UPPER_CASE(*str);</div><div class='add'>+ ind[(unsigned char) *w] = maxi;</div><div class='add'>+ ind[(unsigned char) LOWER_CASE(*str)] = maxi;</div><div class='add'>+ str += dir; w += dir;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ work[max] = 0;</div><div class='add'>+ st->key_len = max;</div><div class='add'>+ return max;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* 8bit clean upper and lowercase macros */</div><div class='add'>+unsigned char _SLChg_LCase_Lut[256];</div><div class='add'>+unsigned char _SLChg_UCase_Lut[256];</div><div class='add'>+</div><div class='add'>+void SLang_define_case (int *u, int *l)</div><div class='add'>+{</div><div class='add'>+ unsigned char up = (unsigned char) *u, dn = (unsigned char) *l;</div><div class='add'>+</div><div class='add'>+ _SLChg_LCase_Lut[up] = dn;</div><div class='add'>+ _SLChg_LCase_Lut[dn] = dn;</div><div class='add'>+ _SLChg_UCase_Lut[dn] = up;</div><div class='add'>+ _SLChg_UCase_Lut[up] = up;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_init_case_tables (void)</div><div class='add'>+{</div><div class='add'>+ int i, j;</div><div class='add'>+ if (Case_Tables_Ok) return;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 256; i++)</div><div class='add'>+ {</div><div class='add'>+ _SLChg_UCase_Lut[i] = i;</div><div class='add'>+ _SLChg_LCase_Lut[i] = i;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (i = 'A'; i <= 'Z'; i++)</div><div class='add'>+ {</div><div class='add'>+ j = i + 32;</div><div class='add'>+ _SLChg_UCase_Lut[j] = i;</div><div class='add'>+ _SLChg_LCase_Lut[i] = j;</div><div class='add'>+ }</div><div class='add'>+#ifdef PC_SYSTEM</div><div class='add'>+ /* Initialize for DOS code page 437. */</div><div class='add'>+ _SLChg_UCase_Lut[135] = 128; _SLChg_LCase_Lut[128] = 135;</div><div class='add'>+ _SLChg_UCase_Lut[132] = 142; _SLChg_LCase_Lut[142] = 132;</div><div class='add'>+ _SLChg_UCase_Lut[134] = 143; _SLChg_LCase_Lut[143] = 134;</div><div class='add'>+ _SLChg_UCase_Lut[130] = 144; _SLChg_LCase_Lut[144] = 130;</div><div class='add'>+ _SLChg_UCase_Lut[145] = 146; _SLChg_LCase_Lut[146] = 145;</div><div class='add'>+ _SLChg_UCase_Lut[148] = 153; _SLChg_LCase_Lut[153] = 148;</div><div class='add'>+ _SLChg_UCase_Lut[129] = 154; _SLChg_LCase_Lut[154] = 129;</div><div class='add'>+ _SLChg_UCase_Lut[164] = 165; _SLChg_LCase_Lut[165] = 164;</div><div class='add'>+#else</div><div class='add'>+ /* ISO Latin */</div><div class='add'>+ for (i = 192; i <= 221; i++)</div><div class='add'>+ {</div><div class='add'>+ j = i + 32;</div><div class='add'>+ _SLChg_UCase_Lut[j] = i;</div><div class='add'>+ _SLChg_LCase_Lut[i] = j;</div><div class='add'>+ }</div><div class='add'>+ _SLChg_UCase_Lut[215] = 215; _SLChg_LCase_Lut[215] = 215;</div><div class='add'>+ _SLChg_UCase_Lut[223] = 223; _SLChg_LCase_Lut[223] = 223;</div><div class='add'>+ _SLChg_UCase_Lut[247] = 247; _SLChg_LCase_Lut[247] = 247;</div><div class='add'>+ _SLChg_UCase_Lut[255] = 255; _SLChg_LCase_Lut[255] = 255;</div><div class='add'>+#endif</div><div class='add'>+ Case_Tables_Ok = 1;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slsignal.c b/mdk-stage1/slang/slsignal.c<br/>new file mode 100644<br/>index 000000000..30707dea5<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slsignal.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slsignal.c</a></div><div class='hunk'>@@ -0,0 +1,336 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include <signal.h></div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SYS_TYPES_H</div><div class='add'>+# include <sys/types.h></div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SYS_WAIT_H</div><div class='add'>+# include <sys/wait.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include <errno.h></div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* Do not trust these environments */</div><div class='add'>+#if defined(__CYGWIN32__) || defined(__MINGW32__) || defined(AMIGA)</div><div class='add'>+# ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+# undef SLANG_POSIX_SIGNALS</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* This function will cause system calls to be restarted after signal if possible */</div><div class='add'>+SLSig_Fun_Type *SLsignal (int sig, SLSig_Fun_Type *f)</div><div class='add'>+{</div><div class='add'>+#if defined(SLANG_POSIX_SIGNALS)</div><div class='add'>+ struct sigaction old_sa, new_sa;</div><div class='add'>+</div><div class='add'>+# ifdef SIGALRM</div><div class='add'>+ /* We want system calls to be interrupted by SIGALRM. */</div><div class='add'>+ if (sig == SIGALRM) return SLsignal_intr (sig, f);</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+ sigemptyset (&new_sa.sa_mask);</div><div class='add'>+ new_sa.sa_handler = f;</div><div class='add'>+</div><div class='add'>+ new_sa.sa_flags = 0;</div><div class='add'>+# ifdef SA_RESTART</div><div class='add'>+ new_sa.sa_flags |= SA_RESTART;</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+ if (-1 == sigaction (sig, &new_sa, &old_sa))</div><div class='add'>+ return (SLSig_Fun_Type *) SIG_ERR;</div><div class='add'>+</div><div class='add'>+ return old_sa.sa_handler;</div><div class='add'>+#else</div><div class='add'>+ /* Not POSIX. */</div><div class='add'>+ return signal (sig, f);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will NOT cause system calls to be restarted after</div><div class='add'>+ * signal if possible</div><div class='add'>+ */</div><div class='add'>+SLSig_Fun_Type *SLsignal_intr (int sig, SLSig_Fun_Type *f)</div><div class='add'>+{</div><div class='add'>+#ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+ struct sigaction old_sa, new_sa;</div><div class='add'>+</div><div class='add'>+ sigemptyset (&new_sa.sa_mask);</div><div class='add'>+ new_sa.sa_handler = f;</div><div class='add'>+</div><div class='add'>+ new_sa.sa_flags = 0;</div><div class='add'>+# ifdef SA_INTERRUPT</div><div class='add'>+ new_sa.sa_flags |= SA_INTERRUPT;</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+ if (-1 == sigaction (sig, &new_sa, &old_sa))</div><div class='add'>+ return (SLSig_Fun_Type *) SIG_ERR;</div><div class='add'>+</div><div class='add'>+ return old_sa.sa_handler;</div><div class='add'>+#else</div><div class='add'>+ /* Not POSIX. */</div><div class='add'>+ return signal (sig, f);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* We are primarily interested in blocking signals that would cause the</div><div class='add'>+ * application to reset the tty. These include suspend signals and</div><div class='add'>+ * possibly interrupt signals.</div><div class='add'>+ */</div><div class='add'>+#ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+static sigset_t Old_Signal_Mask;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static volatile unsigned int Blocked_Depth;</div><div class='add'>+</div><div class='add'>+int SLsig_block_signals (void)</div><div class='add'>+{</div><div class='add'>+#ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+ sigset_t new_mask;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ Blocked_Depth++;</div><div class='add'>+ if (Blocked_Depth != 1)</div><div class='add'>+ {</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+ sigemptyset (&new_mask);</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+ sigaddset (&new_mask, SIGQUIT);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGTSTP</div><div class='add'>+ sigaddset (&new_mask, SIGTSTP);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+ sigaddset (&new_mask, SIGINT);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGTTIN</div><div class='add'>+ sigaddset (&new_mask, SIGTTIN);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGTTOU</div><div class='add'>+ sigaddset (&new_mask, SIGTTOU);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGWINCH</div><div class='add'>+ sigaddset (&new_mask, SIGWINCH);</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+ (void) sigprocmask (SIG_BLOCK, &new_mask, &Old_Signal_Mask);</div><div class='add'>+ return 0;</div><div class='add'>+#else</div><div class='add'>+ /* Not implemented. */</div><div class='add'>+ return -1;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLsig_unblock_signals (void)</div><div class='add'>+{</div><div class='add'>+ if (Blocked_Depth == 0)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ Blocked_Depth--;</div><div class='add'>+</div><div class='add'>+ if (Blocked_Depth != 0)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+#ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+ (void) sigprocmask (SIG_SETMASK, &Old_Signal_Mask, NULL);</div><div class='add'>+ return 0;</div><div class='add'>+#else</div><div class='add'>+ return -1;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef MSWINDOWS</div><div class='add'>+int SLsystem (char *cmd)</div><div class='add'>+{</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "system not implemented");</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#else</div><div class='add'>+int SLsystem (char *cmd)</div><div class='add'>+{</div><div class='add'>+#ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+ pid_t pid;</div><div class='add'>+ int status;</div><div class='add'>+ struct sigaction ignore;</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+ struct sigaction save_intr;</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+ struct sigaction save_quit;</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGCHLD</div><div class='add'>+ sigset_t child_mask, save_mask;</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+ if (cmd == NULL) return 1;</div><div class='add'>+</div><div class='add'>+ ignore.sa_handler = SIG_IGN;</div><div class='add'>+ sigemptyset (&ignore.sa_mask);</div><div class='add'>+ ignore.sa_flags = 0;</div><div class='add'>+</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+ if (-1 == sigaction (SIGINT, &ignore, &save_intr))</div><div class='add'>+ return -1;</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+ if (-1 == sigaction (SIGQUIT, &ignore, &save_quit))</div><div class='add'>+ {</div><div class='add'>+ (void) sigaction (SIGINT, &save_intr, NULL);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+# ifdef SIGCHLD</div><div class='add'>+ sigemptyset (&child_mask);</div><div class='add'>+ sigaddset (&child_mask, SIGCHLD);</div><div class='add'>+ if (-1 == sigprocmask (SIG_BLOCK, &child_mask, &save_mask))</div><div class='add'>+ {</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+ (void) sigaction (SIGINT, &save_intr, NULL);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+ (void) sigaction (SIGQUIT, &save_quit, NULL);</div><div class='add'>+# endif</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+ pid = fork();</div><div class='add'>+</div><div class='add'>+ if (pid == -1)</div><div class='add'>+ status = -1;</div><div class='add'>+ else if (pid == 0)</div><div class='add'>+ {</div><div class='add'>+ /* Child */</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+ (void) sigaction (SIGINT, &save_intr, NULL);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+ (void) sigaction (SIGQUIT, &save_quit, NULL);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGCHLD</div><div class='add'>+ (void) sigprocmask (SIG_SETMASK, &save_mask, NULL);</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+ execl ("/bin/sh", "sh", "-c", cmd, NULL);</div><div class='add'>+ _exit (127);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ /* parent */</div><div class='add'>+ while (-1 == waitpid (pid, &status, 0))</div><div class='add'>+ {</div><div class='add'>+# ifdef EINTR</div><div class='add'>+ if (errno == EINTR)</div><div class='add'>+ continue;</div><div class='add'>+# endif</div><div class='add'>+# ifdef ERESTARTSYS</div><div class='add'>+ if (errno == ERESTARTSYS)</div><div class='add'>+ continue;</div><div class='add'>+# endif</div><div class='add'>+ status = -1;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+ if (-1 == sigaction (SIGINT, &save_intr, NULL))</div><div class='add'>+ status = -1;</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+ if (-1 == sigaction (SIGQUIT, &save_quit, NULL))</div><div class='add'>+ status = -1;</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGCHLD</div><div class='add'>+ if (-1 == sigprocmask (SIG_SETMASK, &save_mask, NULL))</div><div class='add'>+ status = -1;</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+ return status;</div><div class='add'>+</div><div class='add'>+#else /* No POSIX Signals */</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+ void (*sint)(int);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+ void (*squit)(int);</div><div class='add'>+# endif</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+ squit = SLsignal (SIGQUIT, SIG_IGN);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+ sint = SLsignal (SIGINT, SIG_IGN);</div><div class='add'>+# endif</div><div class='add'>+ status = system (cmd);</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+ SLsignal (SIGINT, sint);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+ SLsignal (SIGQUIT, squit);</div><div class='add'>+# endif</div><div class='add'>+ return status;</div><div class='add'>+#endif /* POSIX_SIGNALS */</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+#include <windows.h></div><div class='add'>+static int msw_system (char *cmd)</div><div class='add'>+{</div><div class='add'>+ STARTUPINFO startup_info;</div><div class='add'>+ PROCESS_INFORMATION process_info;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ if (cmd == NULL) return -1;</div><div class='add'>+</div><div class='add'>+ memset ((char *) &startup_info, 0, sizeof (STARTUPINFO));</div><div class='add'>+ startup_info.cb = sizeof(STARTUPINFO);</div><div class='add'>+ startup_info.dwFlags = STARTF_USESHOWWINDOW;</div><div class='add'>+ startup_info.wShowWindow = SW_SHOWDEFAULT;</div><div class='add'>+</div><div class='add'>+ if (FALSE == CreateProcess (NULL,</div><div class='add'>+ cmd,</div><div class='add'>+ NULL,</div><div class='add'>+ NULL,</div><div class='add'>+ FALSE,</div><div class='add'>+ NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,</div><div class='add'>+ NULL,</div><div class='add'>+ NULL,</div><div class='add'>+ &startup_info,</div><div class='add'>+ &process_info))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (0, "%s: CreateProcess failed.", cmd);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ status = -1;</div><div class='add'>+</div><div class='add'>+ if (0xFFFFFFFFUL != WaitForSingleObject (process_info.hProcess, INFINITE))</div><div class='add'>+ {</div><div class='add'>+ DWORD exit_code;</div><div class='add'>+</div><div class='add'>+ if (TRUE == GetExitCodeProcess (process_info.hProcess, &exit_code))</div><div class='add'>+ status = (int) exit_code;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ CloseHandle (process_info.hThread);</div><div class='add'>+ CloseHandle (process_info.hProcess);</div><div class='add'>+</div><div class='add'>+ return status;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slsmg.c b/mdk-stage1/slang/slsmg.c<br/>new file mode 100644<br/>index 000000000..088557f27<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slsmg.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slsmg.c</a></div><div class='hunk'>@@ -0,0 +1,1584 @@</div><div class='add'>+/* SLang Screen management routines */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+typedef struct Screen_Type</div><div class='add'>+ {</div><div class='add'>+ int n; /* number of chars written last time */</div><div class='add'>+ int flags; /* line untouched, etc... */</div><div class='add'>+ SLsmg_Char_Type *old, *neew;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ unsigned long old_hash, new_hash;</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+Screen_Type;</div><div class='add'>+</div><div class='add'>+#define TOUCHED 0x1</div><div class='add'>+#define TRASHED 0x2</div><div class='add'>+static int Screen_Trashed;</div><div class='add'>+</div><div class='add'>+#if !defined(__MSDOS_16BIT__)</div><div class='add'>+# define MAX_SCREEN_SIZE 256</div><div class='add'>+#else</div><div class='add'>+# define MAX_SCREEN_SIZE 75</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+Screen_Type SL_Screen[MAX_SCREEN_SIZE];</div><div class='add'>+static int Start_Col, Start_Row;</div><div class='add'>+static int Screen_Cols, Screen_Rows;</div><div class='add'>+static int This_Row, This_Col;</div><div class='add'>+static int This_Color; /* only the first 8 bits of this</div><div class='add'>+ * are used. The highest bit is used</div><div class='add'>+ * to indicate an alternate character</div><div class='add'>+ * set. This leaves 127 userdefineable</div><div class='add'>+ * color combination.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+#define ALT_CHAR_FLAG 0x80</div><div class='add'>+#else</div><div class='add'>+#define ALT_CHAR_FLAG 0x00</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT && !defined(IBMPC_SYSTEM)</div><div class='add'>+#define REQUIRES_NON_BCE_SUPPORT 1</div><div class='add'>+static int Bce_Color_Offset;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLsmg_Newline_Behavior = 0;</div><div class='add'>+int SLsmg_Backspace_Moves = 0;</div><div class='add'>+/* Backward compatibility. Not used. */</div><div class='add'>+/* int SLsmg_Newline_Moves; */</div><div class='add'>+</div><div class='add'>+static void (*tt_normal_video)(void) = SLtt_normal_video;</div><div class='add'>+static void (*tt_goto_rc)(int, int) = SLtt_goto_rc;</div><div class='add'>+static void (*tt_cls) (void) = SLtt_cls;</div><div class='add'>+static void (*tt_del_eol) (void) = SLtt_del_eol;</div><div class='add'>+static void (*tt_smart_puts) (SLsmg_Char_Type *, SLsmg_Char_Type *, int, int) = SLtt_smart_puts;</div><div class='add'>+static int (*tt_flush_output) (void) = SLtt_flush_output;</div><div class='add'>+static int (*tt_reset_video) (void) = SLtt_reset_video;</div><div class='add'>+static int (*tt_init_video) (void) = SLtt_init_video;</div><div class='add'>+static int *tt_Screen_Rows = &SLtt_Screen_Rows;</div><div class='add'>+static int *tt_Screen_Cols = &SLtt_Screen_Cols;</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+static void (*tt_set_scroll_region)(int, int) = SLtt_set_scroll_region;</div><div class='add'>+static void (*tt_reverse_index)(int) = SLtt_reverse_index;</div><div class='add'>+static void (*tt_reset_scroll_region)(void) = SLtt_reset_scroll_region;</div><div class='add'>+static void (*tt_delete_nlines)(int) = SLtt_delete_nlines;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+static int *tt_Term_Cannot_Scroll = &SLtt_Term_Cannot_Scroll;</div><div class='add'>+static int *tt_Has_Alt_Charset = &SLtt_Has_Alt_Charset;</div><div class='add'>+static char **tt_Graphics_Char_Pairs = &SLtt_Graphics_Char_Pairs;</div><div class='add'>+static int *tt_Use_Blink_For_ACS = &SLtt_Use_Blink_For_ACS;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int Smg_Inited;</div><div class='add'>+</div><div class='add'>+static void blank_line (SLsmg_Char_Type *p, int n, unsigned char ch)</div><div class='add'>+{</div><div class='add'>+ register SLsmg_Char_Type *pmax = p + n;</div><div class='add'>+ register SLsmg_Char_Type color_ch;</div><div class='add'>+</div><div class='add'>+ color_ch = SLSMG_BUILD_CHAR(ch,This_Color);</div><div class='add'>+</div><div class='add'>+ while (p < pmax)</div><div class='add'>+ {</div><div class='add'>+ *p++ = color_ch;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void clear_region (int row, int n)</div><div class='add'>+{</div><div class='add'>+ int i;</div><div class='add'>+ int imax = row + n;</div><div class='add'>+</div><div class='add'>+ if (imax > Screen_Rows) imax = Screen_Rows;</div><div class='add'>+ for (i = row; i < imax; i++)</div><div class='add'>+ {</div><div class='add'>+ if (i >= 0)</div><div class='add'>+ {</div><div class='add'>+ blank_line (SL_Screen[i].neew, Screen_Cols, ' ');</div><div class='add'>+ SL_Screen[i].flags |= TOUCHED;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_erase_eol (void)</div><div class='add'>+{</div><div class='add'>+ int r, c;</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ c = This_Col - Start_Col;</div><div class='add'>+ r = This_Row - Start_Row;</div><div class='add'>+</div><div class='add'>+ if ((r < 0) || (r >= Screen_Rows)) return;</div><div class='add'>+ if (c < 0) c = 0; else if (c >= Screen_Cols) return;</div><div class='add'>+ blank_line (SL_Screen[This_Row].neew + c , Screen_Cols - c, ' ');</div><div class='add'>+ SL_Screen[This_Row].flags |= TOUCHED;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void scroll_up (void)</div><div class='add'>+{</div><div class='add'>+ unsigned int i, imax;</div><div class='add'>+ SLsmg_Char_Type *neew;</div><div class='add'>+</div><div class='add'>+ neew = SL_Screen[0].neew;</div><div class='add'>+ imax = Screen_Rows - 1;</div><div class='add'>+ for (i = 0; i < imax; i++)</div><div class='add'>+ {</div><div class='add'>+ SL_Screen[i].neew = SL_Screen[i + 1].neew;</div><div class='add'>+ SL_Screen[i].flags |= TOUCHED;</div><div class='add'>+ }</div><div class='add'>+ SL_Screen[i].neew = neew;</div><div class='add'>+ SL_Screen[i].flags |= TOUCHED;</div><div class='add'>+ blank_line (neew, Screen_Cols, ' ');</div><div class='add'>+ This_Row--;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_gotorc (int r, int c)</div><div class='add'>+{</div><div class='add'>+ This_Row = r;</div><div class='add'>+ This_Col = c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLsmg_get_row (void)</div><div class='add'>+{</div><div class='add'>+ return This_Row;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLsmg_get_column (void)</div><div class='add'>+{</div><div class='add'>+ return This_Col;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_erase_eos (void)</div><div class='add'>+{</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ SLsmg_erase_eol ();</div><div class='add'>+ clear_region (This_Row + 1, Screen_Rows);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int This_Alt_Char;</div><div class='add'>+</div><div class='add'>+void SLsmg_set_char_set (int i)</div><div class='add'>+{</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+ (void) i;</div><div class='add'>+#else</div><div class='add'>+ if ((tt_Use_Blink_For_ACS != NULL)</div><div class='add'>+ && (*tt_Use_Blink_For_ACS != 0))</div><div class='add'>+ return;/* alt chars not used and the alt bit</div><div class='add'>+ * is used to indicate a blink.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ if (i) This_Alt_Char = ALT_CHAR_FLAG;</div><div class='add'>+ else This_Alt_Char = 0;</div><div class='add'>+</div><div class='add'>+ This_Color &= 0x7F;</div><div class='add'>+ This_Color |= This_Alt_Char;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_set_color (int color)</div><div class='add'>+{</div><div class='add'>+ if (color < 0) return;</div><div class='add'>+#ifdef REQUIRES_NON_BCE_SUPPORT</div><div class='add'>+ color += Bce_Color_Offset;</div><div class='add'>+#endif</div><div class='add'>+ This_Color = color | This_Alt_Char;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_reverse_video (void)</div><div class='add'>+{</div><div class='add'>+ SLsmg_set_color (1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_normal_video (void)</div><div class='add'>+{</div><div class='add'>+ SLsmg_set_color (0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int point_visible (int col_too)</div><div class='add'>+{</div><div class='add'>+ return ((This_Row >= Start_Row) && (This_Row < Start_Row + Screen_Rows)</div><div class='add'>+ && ((col_too == 0)</div><div class='add'>+ || ((This_Col >= Start_Col)</div><div class='add'>+ && (This_Col < Start_Col + Screen_Cols))));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_write_string (char *str)</div><div class='add'>+{</div><div class='add'>+ SLsmg_write_nchars (str, strlen (str));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_write_nstring (char *str, unsigned int n)</div><div class='add'>+{</div><div class='add'>+ unsigned int width;</div><div class='add'>+ char blank = ' ';</div><div class='add'>+</div><div class='add'>+ /* Avoid a problem if a user accidently passes a negative value */</div><div class='add'>+ if ((int) n < 0)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (str == NULL) width = 0;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ width = strlen (str);</div><div class='add'>+ if (width > n) width = n;</div><div class='add'>+ SLsmg_write_nchars (str, width);</div><div class='add'>+ }</div><div class='add'>+ while (width++ < n) SLsmg_write_nchars (&blank, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_write_wrapped_string (char *s, int r, int c,</div><div class='add'>+ unsigned int dr, unsigned int dc,</div><div class='add'>+ int fill)</div><div class='add'>+{</div><div class='add'>+ register char ch, *p;</div><div class='add'>+ int maxc = (int) dc;</div><div class='add'>+</div><div class='add'>+ if ((dr == 0) || (dc == 0)) return;</div><div class='add'>+ p = s;</div><div class='add'>+ dc = 0;</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ ch = *p++;</div><div class='add'>+ if ((ch == 0) || (ch == '\n'))</div><div class='add'>+ {</div><div class='add'>+ int diff;</div><div class='add'>+</div><div class='add'>+ diff = maxc - (int) dc;</div><div class='add'>+</div><div class='add'>+ SLsmg_gotorc (r, c);</div><div class='add'>+ SLsmg_write_nchars (s, dc);</div><div class='add'>+ if (fill && (diff > 0))</div><div class='add'>+ {</div><div class='add'>+ while (diff--) SLsmg_write_char (' ');</div><div class='add'>+ }</div><div class='add'>+ if ((ch == 0) || (dr == 1)) break;</div><div class='add'>+</div><div class='add'>+ r++;</div><div class='add'>+ dc = 0;</div><div class='add'>+ dr--;</div><div class='add'>+ s = p;</div><div class='add'>+ }</div><div class='add'>+ else if ((int) dc == maxc)</div><div class='add'>+ {</div><div class='add'>+ SLsmg_gotorc (r, c);</div><div class='add'>+ SLsmg_write_nchars (s, dc + 1);</div><div class='add'>+ if (dr == 1) break;</div><div class='add'>+</div><div class='add'>+ r++;</div><div class='add'>+ dc = 0;</div><div class='add'>+ dr--;</div><div class='add'>+ s = p;</div><div class='add'>+ }</div><div class='add'>+ else dc++;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLsmg_Tab_Width = 8;</div><div class='add'>+</div><div class='add'>+/* Minimum value for which eight bit char is displayed as is. */</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+int SLsmg_Display_Eight_Bit = 160;</div><div class='add'>+static unsigned char Alt_Char_Set[129];/* 129th is used as a flag */</div><div class='add'>+#else</div><div class='add'>+int SLsmg_Display_Eight_Bit = 128;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+void SLsmg_write_nchars (char *str, unsigned int n)</div><div class='add'>+{</div><div class='add'>+ register SLsmg_Char_Type *p, old, neew, color;</div><div class='add'>+ unsigned char ch;</div><div class='add'>+ unsigned int flags;</div><div class='add'>+ int len, start_len, max_len;</div><div class='add'>+ char *str_max;</div><div class='add'>+ int newline_flag;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ int alt_char_set_flag;</div><div class='add'>+</div><div class='add'>+ alt_char_set_flag = ((This_Color & ALT_CHAR_FLAG)</div><div class='add'>+ && ((tt_Use_Blink_For_ACS == NULL)</div><div class='add'>+ || (*tt_Use_Blink_For_ACS == 0)));</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ str_max = str + n;</div><div class='add'>+ color = This_Color;</div><div class='add'>+</div><div class='add'>+ top: /* get here only on newline */</div><div class='add'>+</div><div class='add'>+ newline_flag = 0;</div><div class='add'>+ start_len = Start_Col;</div><div class='add'>+</div><div class='add'>+ if (point_visible (0) == 0) return;</div><div class='add'>+</div><div class='add'>+ len = This_Col;</div><div class='add'>+ max_len = start_len + Screen_Cols;</div><div class='add'>+</div><div class='add'>+ p = SL_Screen[This_Row - Start_Row].neew;</div><div class='add'>+ if (len > start_len) p += (len - start_len);</div><div class='add'>+</div><div class='add'>+ flags = SL_Screen[This_Row - Start_Row].flags;</div><div class='add'>+ while ((len < max_len) && (str < str_max))</div><div class='add'>+ {</div><div class='add'>+ ch = (unsigned char) *str++;</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ if (alt_char_set_flag)</div><div class='add'>+ ch = Alt_Char_Set [ch & 0x7F];</div><div class='add'>+#endif</div><div class='add'>+ if (((ch >= ' ') && (ch < 127))</div><div class='add'>+ || (ch >= (unsigned char) SLsmg_Display_Eight_Bit)</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ || alt_char_set_flag</div><div class='add'>+#endif</div><div class='add'>+ )</div><div class='add'>+ {</div><div class='add'>+ len += 1;</div><div class='add'>+ if (len > start_len)</div><div class='add'>+ {</div><div class='add'>+ old = *p;</div><div class='add'>+ neew = SLSMG_BUILD_CHAR(ch,color);</div><div class='add'>+ if (old != neew)</div><div class='add'>+ {</div><div class='add'>+ flags |= TOUCHED;</div><div class='add'>+ *p = neew;</div><div class='add'>+ }</div><div class='add'>+ p++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ else if ((ch == '\t') && (SLsmg_Tab_Width > 0))</div><div class='add'>+ {</div><div class='add'>+ n = len;</div><div class='add'>+ n += SLsmg_Tab_Width;</div><div class='add'>+ n = SLsmg_Tab_Width - (n % SLsmg_Tab_Width);</div><div class='add'>+ if ((unsigned int) len + n > (unsigned int) max_len)</div><div class='add'>+ n = (unsigned int) (max_len - len);</div><div class='add'>+ neew = SLSMG_BUILD_CHAR(' ',color);</div><div class='add'>+ while (n--)</div><div class='add'>+ {</div><div class='add'>+ len += 1;</div><div class='add'>+ if (len > start_len)</div><div class='add'>+ {</div><div class='add'>+ if (*p != neew)</div><div class='add'>+ {</div><div class='add'>+ flags |= TOUCHED;</div><div class='add'>+ *p = neew;</div><div class='add'>+ }</div><div class='add'>+ p++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else if ((ch == '\n')</div><div class='add'>+ && (SLsmg_Newline_Behavior != SLSMG_NEWLINE_PRINTABLE))</div><div class='add'>+ {</div><div class='add'>+ newline_flag = 1;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ else if ((ch == 0x8) && SLsmg_Backspace_Moves)</div><div class='add'>+ {</div><div class='add'>+ if (len != 0) len--;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if (ch & 0x80)</div><div class='add'>+ {</div><div class='add'>+ neew = SLSMG_BUILD_CHAR('~',color);</div><div class='add'>+ len += 1;</div><div class='add'>+ if (len > start_len)</div><div class='add'>+ {</div><div class='add'>+ if (*p != neew)</div><div class='add'>+ {</div><div class='add'>+ *p = neew;</div><div class='add'>+ flags |= TOUCHED;</div><div class='add'>+ }</div><div class='add'>+ p++;</div><div class='add'>+ if (len == max_len) break;</div><div class='add'>+ ch &= 0x7F;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ len += 1;</div><div class='add'>+ if (len > start_len)</div><div class='add'>+ {</div><div class='add'>+ neew = SLSMG_BUILD_CHAR('^',color);</div><div class='add'>+ if (*p != neew)</div><div class='add'>+ {</div><div class='add'>+ *p = neew;</div><div class='add'>+ flags |= TOUCHED;</div><div class='add'>+ }</div><div class='add'>+ p++;</div><div class='add'>+ if (len == max_len) break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ch == 127) ch = '?'; else ch = ch + '@';</div><div class='add'>+ len++;</div><div class='add'>+ if (len > start_len)</div><div class='add'>+ {</div><div class='add'>+ neew = SLSMG_BUILD_CHAR(ch,color);</div><div class='add'>+ if (*p != neew)</div><div class='add'>+ {</div><div class='add'>+ *p = neew;</div><div class='add'>+ flags |= TOUCHED;</div><div class='add'>+ }</div><div class='add'>+ p++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SL_Screen[This_Row - Start_Row].flags = flags;</div><div class='add'>+ This_Col = len;</div><div class='add'>+</div><div class='add'>+ if (SLsmg_Newline_Behavior == 0)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (newline_flag == 0)</div><div class='add'>+ {</div><div class='add'>+ while (str < str_max)</div><div class='add'>+ {</div><div class='add'>+ if (*str == '\n') break;</div><div class='add'>+ str++;</div><div class='add'>+ }</div><div class='add'>+ if (str == str_max) return;</div><div class='add'>+ str++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ This_Row++;</div><div class='add'>+ This_Col = 0;</div><div class='add'>+ if (This_Row == Start_Row + Screen_Rows)</div><div class='add'>+ {</div><div class='add'>+ if (SLsmg_Newline_Behavior == SLSMG_NEWLINE_SCROLLS) scroll_up ();</div><div class='add'>+ }</div><div class='add'>+ goto top;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_write_char (char ch)</div><div class='add'>+{</div><div class='add'>+ SLsmg_write_nchars (&ch, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int Cls_Flag;</div><div class='add'>+</div><div class='add'>+void SLsmg_cls (void)</div><div class='add'>+{</div><div class='add'>+ int tac;</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ tac = This_Alt_Char; This_Alt_Char = 0;</div><div class='add'>+ SLsmg_set_color (0);</div><div class='add'>+ clear_region (0, Screen_Rows);</div><div class='add'>+ This_Alt_Char = tac;</div><div class='add'>+ SLsmg_set_color (0);</div><div class='add'>+ Cls_Flag = 1;</div><div class='add'>+}</div><div class='add'>+#if 0</div><div class='add'>+static void do_copy (SLsmg_Char_Type *a, SLsmg_Char_Type *b)</div><div class='add'>+{</div><div class='add'>+ SLsmg_Char_Type *amax = a + Screen_Cols;</div><div class='add'>+</div><div class='add'>+ while (a < amax) *a++ = *b++;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+int SLsmg_Scroll_Hash_Border = 0;</div><div class='add'>+static unsigned long compute_hash (SLsmg_Char_Type *s, int n)</div><div class='add'>+{</div><div class='add'>+ register unsigned long h = 0, g;</div><div class='add'>+ register unsigned long sum = 0;</div><div class='add'>+ register SLsmg_Char_Type *smax, ch;</div><div class='add'>+ int is_blank = 2;</div><div class='add'>+</div><div class='add'>+ s += SLsmg_Scroll_Hash_Border;</div><div class='add'>+ smax = s + (n - SLsmg_Scroll_Hash_Border);</div><div class='add'>+ while (s < smax)</div><div class='add'>+ {</div><div class='add'>+ ch = *s++;</div><div class='add'>+ if (is_blank && (SLSMG_EXTRACT_CHAR(ch) != 32)) is_blank--;</div><div class='add'>+</div><div class='add'>+ sum += ch;</div><div class='add'>+</div><div class='add'>+ h = sum + (h << 3);</div><div class='add'>+ if ((g = h & 0xE0000000UL) != 0)</div><div class='add'>+ {</div><div class='add'>+ h = h ^ (g >> 24);</div><div class='add'>+ h = h ^ g;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ if (is_blank) return 0;</div><div class='add'>+ return h;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned long Blank_Hash;</div><div class='add'>+</div><div class='add'>+static int try_scroll_down (int rmin, int rmax)</div><div class='add'>+{</div><div class='add'>+ int i, r1, r2, di, j;</div><div class='add'>+ unsigned long hash;</div><div class='add'>+ int did_scroll;</div><div class='add'>+ int color;</div><div class='add'>+ SLsmg_Char_Type *tmp;</div><div class='add'>+ int ignore;</div><div class='add'>+</div><div class='add'>+ did_scroll = 0;</div><div class='add'>+ for (i = rmax; i > rmin; i--)</div><div class='add'>+ {</div><div class='add'>+ hash = SL_Screen[i].new_hash;</div><div class='add'>+ if (hash == Blank_Hash) continue;</div><div class='add'>+</div><div class='add'>+ if ((hash == SL_Screen[i].old_hash)</div><div class='add'>+#if 0</div><div class='add'>+ || ((i + 1 < Screen_Rows) && (hash == SL_Screen[i + 1].old_hash))</div><div class='add'>+ || ((i - 1 > rmin) && (SL_Screen[i].old_hash == SL_Screen[i - 1].new_hash))</div><div class='add'>+#endif</div><div class='add'>+ )</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ for (j = i - 1; j >= rmin; j--)</div><div class='add'>+ {</div><div class='add'>+ if (hash == SL_Screen[j].old_hash) break;</div><div class='add'>+ }</div><div class='add'>+ if (j < rmin) continue;</div><div class='add'>+</div><div class='add'>+ r2 = i; /* end scroll region */</div><div class='add'>+</div><div class='add'>+ di = i - j;</div><div class='add'>+ j--;</div><div class='add'>+ ignore = 0;</div><div class='add'>+ while ((j >= rmin) && (SL_Screen[j].old_hash == SL_Screen[j + di].new_hash))</div><div class='add'>+ {</div><div class='add'>+ if (SL_Screen[j].old_hash == Blank_Hash) ignore++;</div><div class='add'>+ j--;</div><div class='add'>+ }</div><div class='add'>+ r1 = j + 1;</div><div class='add'>+</div><div class='add'>+ /* If this scroll only scrolls this line into place, don't do it.</div><div class='add'>+ */</div><div class='add'>+ if ((di > 1) && (r1 + di + ignore == r2)) continue;</div><div class='add'>+</div><div class='add'>+ /* If there is anything in the scrolling region that is ok, abort the</div><div class='add'>+ * scroll.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ for (j = r1; j <= r2; j++)</div><div class='add'>+ {</div><div class='add'>+ if ((SL_Screen[j].old_hash != Blank_Hash)</div><div class='add'>+ && (SL_Screen[j].old_hash == SL_Screen[j].new_hash))</div><div class='add'>+ {</div><div class='add'>+ /* See if the scroll is happens to scroll this one into place. */</div><div class='add'>+ if ((j + di > r2) || (SL_Screen[j].old_hash != SL_Screen[j + di].new_hash))</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ if (j <= r2) continue;</div><div class='add'>+</div><div class='add'>+ color = This_Color; This_Color = 0;</div><div class='add'>+ did_scroll = 1;</div><div class='add'>+ (*tt_normal_video) ();</div><div class='add'>+ (*tt_set_scroll_region) (r1, r2);</div><div class='add'>+ (*tt_goto_rc) (0, 0);</div><div class='add'>+ (*tt_reverse_index) (di);</div><div class='add'>+ (*tt_reset_scroll_region) ();</div><div class='add'>+ /* Now we have a hole in the screen.</div><div class='add'>+ * Make the virtual screen look like it.</div><div class='add'>+ * </div><div class='add'>+ * Note that if the terminal does not support BCE, then we have</div><div class='add'>+ * no idea what color the hole is. So, for this case, we do not</div><div class='add'>+ * want to add Bce_Color_Offset to This_Color since if Bce_Color_Offset</div><div class='add'>+ * is non-zero, then This_Color = 0 does not match any valid color</div><div class='add'>+ * obtained by adding Bce_Color_Offset.</div><div class='add'>+ */</div><div class='add'>+ for (j = r1; j <= r2; j++) SL_Screen[j].flags = TOUCHED;</div><div class='add'>+</div><div class='add'>+ while (di--)</div><div class='add'>+ {</div><div class='add'>+ tmp = SL_Screen[r2].old;</div><div class='add'>+ for (j = r2; j > r1; j--)</div><div class='add'>+ {</div><div class='add'>+ SL_Screen[j].old = SL_Screen[j - 1].old;</div><div class='add'>+ SL_Screen[j].old_hash = SL_Screen[j - 1].old_hash;</div><div class='add'>+ }</div><div class='add'>+ SL_Screen[r1].old = tmp;</div><div class='add'>+ blank_line (SL_Screen[r1].old, Screen_Cols, ' ');</div><div class='add'>+ SL_Screen[r1].old_hash = Blank_Hash;</div><div class='add'>+ r1++;</div><div class='add'>+ }</div><div class='add'>+ This_Color = color;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return did_scroll;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int try_scroll_up (int rmin, int rmax)</div><div class='add'>+{</div><div class='add'>+ int i, r1, r2, di, j;</div><div class='add'>+ unsigned long hash;</div><div class='add'>+ int did_scroll;</div><div class='add'>+ int color;</div><div class='add'>+ SLsmg_Char_Type *tmp;</div><div class='add'>+ int ignore;</div><div class='add'>+</div><div class='add'>+ did_scroll = 0;</div><div class='add'>+ for (i = rmin; i < rmax; i++)</div><div class='add'>+ {</div><div class='add'>+ hash = SL_Screen[i].new_hash;</div><div class='add'>+ if (hash == Blank_Hash) continue;</div><div class='add'>+ if (hash == SL_Screen[i].old_hash)</div><div class='add'>+ continue;</div><div class='add'>+ /* find a match further down screen */</div><div class='add'>+ for (j = i + 1; j <= rmax; j++)</div><div class='add'>+ {</div><div class='add'>+ if (hash == SL_Screen[j].old_hash) break;</div><div class='add'>+ }</div><div class='add'>+ if (j > rmax) continue;</div><div class='add'>+</div><div class='add'>+ r1 = i; /* beg scroll region */</div><div class='add'>+ di = j - i; /* number of lines to scroll */</div><div class='add'>+ j++; /* since we know this is a match */</div><div class='add'>+</div><div class='add'>+ /* find end of scroll region */</div><div class='add'>+ ignore = 0;</div><div class='add'>+ while ((j <= rmax) && (SL_Screen[j].old_hash == SL_Screen[j - di].new_hash))</div><div class='add'>+ {</div><div class='add'>+ if (SL_Screen[j].old_hash == Blank_Hash) ignore++;</div><div class='add'>+ j++;</div><div class='add'>+ }</div><div class='add'>+ r2 = j - 1; /* end of scroll region */</div><div class='add'>+</div><div class='add'>+ /* If this scroll only scrolls this line into place, don't do it.</div><div class='add'>+ */</div><div class='add'>+ if ((di > 1) && (r1 + di + ignore == r2)) continue;</div><div class='add'>+</div><div class='add'>+ /* If there is anything in the scrolling region that is ok, abort the</div><div class='add'>+ * scroll.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ for (j = r1; j <= r2; j++)</div><div class='add'>+ {</div><div class='add'>+ if ((SL_Screen[j].old_hash != Blank_Hash)</div><div class='add'>+ && (SL_Screen[j].old_hash == SL_Screen[j].new_hash))</div><div class='add'>+ {</div><div class='add'>+ if ((j - di < r1) || (SL_Screen[j].old_hash != SL_Screen[j - di].new_hash))</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ }</div><div class='add'>+ if (j <= r2) continue;</div><div class='add'>+</div><div class='add'>+ did_scroll = 1;</div><div class='add'>+</div><div class='add'>+ /* See the above comments about BCE */</div><div class='add'>+ color = This_Color; This_Color = 0;</div><div class='add'>+ (*tt_normal_video) ();</div><div class='add'>+ (*tt_set_scroll_region) (r1, r2);</div><div class='add'>+ (*tt_goto_rc) (0, 0); /* relative to scroll region */</div><div class='add'>+ (*tt_delete_nlines) (di);</div><div class='add'>+ (*tt_reset_scroll_region) ();</div><div class='add'>+ /* Now we have a hole in the screen. Make the virtual screen look</div><div class='add'>+ * like it.</div><div class='add'>+ */</div><div class='add'>+ for (j = r1; j <= r2; j++) SL_Screen[j].flags = TOUCHED;</div><div class='add'>+</div><div class='add'>+ while (di--)</div><div class='add'>+ {</div><div class='add'>+ tmp = SL_Screen[r1].old;</div><div class='add'>+ for (j = r1; j < r2; j++)</div><div class='add'>+ {</div><div class='add'>+ SL_Screen[j].old = SL_Screen[j + 1].old;</div><div class='add'>+ SL_Screen[j].old_hash = SL_Screen[j + 1].old_hash;</div><div class='add'>+ }</div><div class='add'>+ SL_Screen[r2].old = tmp;</div><div class='add'>+ blank_line (SL_Screen[r2].old, Screen_Cols, ' ');</div><div class='add'>+ SL_Screen[r2].old_hash = Blank_Hash;</div><div class='add'>+ r2--;</div><div class='add'>+ }</div><div class='add'>+ This_Color = color;</div><div class='add'>+ }</div><div class='add'>+ return did_scroll;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void try_scroll (void)</div><div class='add'>+{</div><div class='add'>+ int r1, rmin, rmax;</div><div class='add'>+ int num_up, num_down;</div><div class='add'>+ /* find region limits. */</div><div class='add'>+</div><div class='add'>+ for (rmax = Screen_Rows - 1; rmax > 0; rmax--)</div><div class='add'>+ {</div><div class='add'>+ if (SL_Screen[rmax].new_hash != SL_Screen[rmax].old_hash)</div><div class='add'>+ {</div><div class='add'>+ r1 = rmax - 1;</div><div class='add'>+ if ((r1 == 0)</div><div class='add'>+ || (SL_Screen[r1].new_hash != SL_Screen[r1].old_hash))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ rmax = r1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ for (rmin = 0; rmin < rmax; rmin++)</div><div class='add'>+ {</div><div class='add'>+ if (SL_Screen[rmin].new_hash != SL_Screen[rmin].old_hash)</div><div class='add'>+ {</div><div class='add'>+ r1 = rmin + 1;</div><div class='add'>+ if ((r1 == rmax)</div><div class='add'>+ || (SL_Screen[r1].new_hash != SL_Screen[r1].old_hash))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ rmin = r1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Below, we have two scrolling algorithms. The first has the effect of</div><div class='add'>+ * scrolling lines down. This is usually appropriate when one moves</div><div class='add'>+ * up the display, e.g., with the UP arrow. The second algorithm is</div><div class='add'>+ * appropriate for going the other way. It is important to choose the</div><div class='add'>+ * correct one.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ num_up = 0;</div><div class='add'>+ for (r1 = rmin; r1 < rmax; r1++)</div><div class='add'>+ {</div><div class='add'>+ if (SL_Screen[r1].new_hash == SL_Screen[r1 + 1].old_hash)</div><div class='add'>+ num_up++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ num_down = 0;</div><div class='add'>+ for (r1 = rmax; r1 > rmin; r1--)</div><div class='add'>+ {</div><div class='add'>+ if (SL_Screen[r1 - 1].old_hash == SL_Screen[r1].new_hash)</div><div class='add'>+ num_down++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (num_up > num_down)</div><div class='add'>+ {</div><div class='add'>+ if (try_scroll_up (rmin, rmax))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ (void) try_scroll_down (rmin, rmax);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if (try_scroll_down (rmin, rmax))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ (void) try_scroll_up (rmin, rmax);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+#endif /* NOT IBMPC_SYSTEM */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#ifdef REQUIRES_NON_BCE_SUPPORT</div><div class='add'>+static void adjust_colors (void)</div><div class='add'>+{</div><div class='add'>+ int bce;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ bce = Bce_Color_Offset;</div><div class='add'>+ Bce_Color_Offset = _SLtt_get_bce_color_offset ();</div><div class='add'>+ if (bce == Bce_Color_Offset)</div><div class='add'>+ return;</div><div class='add'>+ </div><div class='add'>+ if ((tt_Use_Blink_For_ACS != NULL)</div><div class='add'>+ && (*tt_Use_Blink_For_ACS != 0))</div><div class='add'>+ return; /* this mode does not support non-BCE</div><div class='add'>+ * terminals.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < Screen_Rows; i++)</div><div class='add'>+ {</div><div class='add'>+ SLsmg_Char_Type *s, *smax;</div><div class='add'>+</div><div class='add'>+ SL_Screen[i].flags |= TRASHED;</div><div class='add'>+ s = SL_Screen[i].neew;</div><div class='add'>+ smax = s + Screen_Cols;</div><div class='add'>+ </div><div class='add'>+ while (s < smax)</div><div class='add'>+ {</div><div class='add'>+ int color = (int) SLSMG_EXTRACT_COLOR(*s);</div><div class='add'>+ int acs;</div><div class='add'>+</div><div class='add'>+ if (color < 0)</div><div class='add'>+ {</div><div class='add'>+ s++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ acs = color & 0x80;</div><div class='add'>+ color = (color & 0x7F) - bce;</div><div class='add'>+ color += Bce_Color_Offset;</div><div class='add'>+ if (color >= 0)</div><div class='add'>+ {</div><div class='add'>+ unsigned char ch = SLSMG_EXTRACT_CHAR(*s);</div><div class='add'>+ *s = SLSMG_BUILD_CHAR(ch, ((color&0x7F)|acs));</div><div class='add'>+ }</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+void SLsmg_refresh (void)</div><div class='add'>+{</div><div class='add'>+ int i;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ int trashed = 0;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+ </div><div class='add'>+ if (Screen_Trashed)</div><div class='add'>+ {</div><div class='add'>+ Cls_Flag = 1;</div><div class='add'>+ for (i = 0; i < Screen_Rows; i++)</div><div class='add'>+ SL_Screen[i].flags |= TRASHED;</div><div class='add'>+#ifdef REQUIRES_NON_BCE_SUPPORT</div><div class='add'>+ adjust_colors ();</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ for (i = 0; i < Screen_Rows; i++)</div><div class='add'>+ {</div><div class='add'>+ if (SL_Screen[i].flags == 0) continue;</div><div class='add'>+ SL_Screen[i].new_hash = compute_hash (SL_Screen[i].neew, Screen_Cols);</div><div class='add'>+ trashed = 1;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (Cls_Flag)</div><div class='add'>+ {</div><div class='add'>+ (*tt_normal_video) (); (*tt_cls) ();</div><div class='add'>+ }</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ else if (trashed && (*tt_Term_Cannot_Scroll == 0)) try_scroll ();</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < Screen_Rows; i++)</div><div class='add'>+ {</div><div class='add'>+ if (SL_Screen[i].flags == 0) continue;</div><div class='add'>+</div><div class='add'>+ if (Cls_Flag || SL_Screen[i].flags & TRASHED)</div><div class='add'>+ {</div><div class='add'>+ int color = This_Color;</div><div class='add'>+</div><div class='add'>+ if (Cls_Flag == 0) </div><div class='add'>+ {</div><div class='add'>+ (*tt_goto_rc) (i, 0);</div><div class='add'>+ (*tt_del_eol) ();</div><div class='add'>+ }</div><div class='add'>+ This_Color = 0;</div><div class='add'>+ blank_line (SL_Screen[i].old, Screen_Cols, ' ');</div><div class='add'>+ This_Color = color;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SL_Screen[i].old[Screen_Cols] = 0;</div><div class='add'>+ SL_Screen[i].neew[Screen_Cols] = 0;</div><div class='add'>+</div><div class='add'>+ (*tt_smart_puts) (SL_Screen[i].neew, SL_Screen[i].old, Screen_Cols, i);</div><div class='add'>+</div><div class='add'>+ SLMEMCPY ((char *) SL_Screen[i].old, (char *) SL_Screen[i].neew,</div><div class='add'>+ Screen_Cols * sizeof (SLsmg_Char_Type));</div><div class='add'>+</div><div class='add'>+ SL_Screen[i].flags = 0;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ SL_Screen[i].old_hash = SL_Screen[i].new_hash;</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (point_visible (1)) (*tt_goto_rc) (This_Row - Start_Row, This_Col - Start_Col);</div><div class='add'>+ (*tt_flush_output) ();</div><div class='add'>+ Cls_Flag = 0;</div><div class='add'>+ Screen_Trashed = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int compute_clip (int row, int n, int box_start, int box_end,</div><div class='add'>+ int *rmin, int *rmax)</div><div class='add'>+{</div><div class='add'>+ int row_max;</div><div class='add'>+</div><div class='add'>+ if (n < 0) return 0;</div><div class='add'>+ if (row >= box_end) return 0;</div><div class='add'>+ row_max = row + n;</div><div class='add'>+ if (row_max <= box_start) return 0;</div><div class='add'>+</div><div class='add'>+ if (row < box_start) row = box_start;</div><div class='add'>+ if (row_max >= box_end) row_max = box_end;</div><div class='add'>+ *rmin = row;</div><div class='add'>+ *rmax = row_max;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_touch_lines (int row, unsigned int n)</div><div class='add'>+{</div><div class='add'>+ int i;</div><div class='add'>+ int r1, r2;</div><div class='add'>+</div><div class='add'>+ /* Allow this function to be called even when we are not initialied.</div><div class='add'>+ * Calling this function is useful after calling SLtt_set_color</div><div class='add'>+ * to force the display to be redrawn</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (0 == compute_clip (row, (int) n, Start_Row, Start_Row + Screen_Rows, &r1, &r2))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ r1 -= Start_Row;</div><div class='add'>+ r2 -= Start_Row;</div><div class='add'>+ for (i = r1; i < r2; i++)</div><div class='add'>+ {</div><div class='add'>+ SL_Screen[i].flags |= TRASHED;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_touch_screen (void)</div><div class='add'>+{</div><div class='add'>+ Screen_Trashed = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+static char Fake_Alt_Char_Pairs [] = "a:j+k+l+m+q-t+u+v+w+x|n+`+f\\g#~o,<+>.v-^h#0#";</div><div class='add'>+</div><div class='add'>+static void init_alt_char_set (void)</div><div class='add'>+{</div><div class='add'>+ int i;</div><div class='add'>+ unsigned char *p, *pmax, ch;</div><div class='add'>+</div><div class='add'>+ if (Alt_Char_Set[128] == 128) return;</div><div class='add'>+</div><div class='add'>+ i = 32;</div><div class='add'>+ memset ((char *)Alt_Char_Set, ' ', i);</div><div class='add'>+ while (i <= 128)</div><div class='add'>+ {</div><div class='add'>+ Alt_Char_Set [i] = i;</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Map to VT100 */</div><div class='add'>+ if (*tt_Has_Alt_Charset)</div><div class='add'>+ {</div><div class='add'>+ if (tt_Graphics_Char_Pairs == NULL) p = NULL;</div><div class='add'>+ else p = (unsigned char *) *tt_Graphics_Char_Pairs;</div><div class='add'>+ if (p == NULL) return;</div><div class='add'>+ }</div><div class='add'>+ else p = (unsigned char *) Fake_Alt_Char_Pairs;</div><div class='add'>+ pmax = p + strlen ((char *) p);</div><div class='add'>+</div><div class='add'>+ /* Some systems have messed up entries for this */</div><div class='add'>+ while (p < pmax)</div><div class='add'>+ {</div><div class='add'>+ ch = *p++;</div><div class='add'>+ ch &= 0x7F; /* should be unnecessary */</div><div class='add'>+ Alt_Char_Set [ch] = *p;</div><div class='add'>+ p++;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+# define BLOCK_SIGNALS SLsig_block_signals ()</div><div class='add'>+# define UNBLOCK_SIGNALS SLsig_unblock_signals ()</div><div class='add'>+#else</div><div class='add'>+# define BLOCK_SIGNALS (void)0</div><div class='add'>+# define UNBLOCK_SIGNALS (void)0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int Smg_Suspended;</div><div class='add'>+int SLsmg_suspend_smg (void)</div><div class='add'>+{</div><div class='add'>+ BLOCK_SIGNALS;</div><div class='add'>+</div><div class='add'>+ if (Smg_Suspended == 0)</div><div class='add'>+ {</div><div class='add'>+ (*tt_reset_video) ();</div><div class='add'>+ Smg_Suspended = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ UNBLOCK_SIGNALS;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLsmg_resume_smg (void)</div><div class='add'>+{</div><div class='add'>+ BLOCK_SIGNALS;</div><div class='add'>+</div><div class='add'>+ if (Smg_Suspended == 0)</div><div class='add'>+ {</div><div class='add'>+ UNBLOCK_SIGNALS;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Smg_Suspended = 0;</div><div class='add'>+</div><div class='add'>+ if (-1 == (*tt_init_video) ())</div><div class='add'>+ {</div><div class='add'>+ UNBLOCK_SIGNALS;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Cls_Flag = 1;</div><div class='add'>+ SLsmg_touch_screen ();</div><div class='add'>+ SLsmg_refresh ();</div><div class='add'>+</div><div class='add'>+ UNBLOCK_SIGNALS;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+static void reset_smg (void)</div><div class='add'>+{</div><div class='add'>+ int i;</div><div class='add'>+ if (Smg_Inited == 0)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < Screen_Rows; i++)</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *)SL_Screen[i].old);</div><div class='add'>+ SLfree ((char *)SL_Screen[i].neew);</div><div class='add'>+ SL_Screen[i].old = SL_Screen[i].neew = NULL;</div><div class='add'>+ }</div><div class='add'>+ This_Alt_Char = This_Color = 0;</div><div class='add'>+ Smg_Inited = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int init_smg (void)</div><div class='add'>+{</div><div class='add'>+ int i, len;</div><div class='add'>+ SLsmg_Char_Type *old, *neew;</div><div class='add'>+</div><div class='add'>+ Smg_Inited = 0;</div><div class='add'>+</div><div class='add'>+#ifdef REQUIRES_NON_BCE_SUPPORT</div><div class='add'>+ Bce_Color_Offset = _SLtt_get_bce_color_offset ();</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ Screen_Rows = *tt_Screen_Rows;</div><div class='add'>+ if (Screen_Rows > MAX_SCREEN_SIZE)</div><div class='add'>+ Screen_Rows = MAX_SCREEN_SIZE;</div><div class='add'>+</div><div class='add'>+ Screen_Cols = *tt_Screen_Cols;</div><div class='add'>+</div><div class='add'>+ This_Col = This_Row = Start_Col = Start_Row = 0;</div><div class='add'>+</div><div class='add'>+ This_Alt_Char = 0;</div><div class='add'>+ SLsmg_set_color (0);</div><div class='add'>+ Cls_Flag = 1;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ init_alt_char_set ();</div><div class='add'>+#endif</div><div class='add'>+ len = Screen_Cols + 3;</div><div class='add'>+ for (i = 0; i < Screen_Rows; i++)</div><div class='add'>+ {</div><div class='add'>+ if ((NULL == (old = (SLsmg_Char_Type *) SLmalloc (sizeof(SLsmg_Char_Type) * len)))</div><div class='add'>+ || ((NULL == (neew = (SLsmg_Char_Type *) SLmalloc (sizeof(SLsmg_Char_Type) * len)))))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) old);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ blank_line (old, len, ' ');</div><div class='add'>+ blank_line (neew, len, ' ');</div><div class='add'>+ SL_Screen[i].old = old;</div><div class='add'>+ SL_Screen[i].neew = neew;</div><div class='add'>+ SL_Screen[i].flags = 0;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ Blank_Hash = compute_hash (old, Screen_Cols);</div><div class='add'>+ SL_Screen[i].new_hash = SL_Screen[i].old_hash = Blank_Hash;</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ _SLtt_color_changed_hook = SLsmg_touch_screen;</div><div class='add'>+ Screen_Trashed = 1;</div><div class='add'>+ Smg_Inited = 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+int SLsmg_init_smg (void)</div><div class='add'>+{</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ BLOCK_SIGNALS;</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited)</div><div class='add'>+ SLsmg_reset_smg ();</div><div class='add'>+</div><div class='add'>+ if (-1 == (*tt_init_video) ())</div><div class='add'>+ {</div><div class='add'>+ UNBLOCK_SIGNALS;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (-1 == (ret = init_smg ()))</div><div class='add'>+ (void) (*tt_reset_video)();</div><div class='add'>+</div><div class='add'>+ UNBLOCK_SIGNALS;</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLsmg_reinit_smg (void)</div><div class='add'>+{</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0)</div><div class='add'>+ return SLsmg_init_smg ();</div><div class='add'>+</div><div class='add'>+ BLOCK_SIGNALS;</div><div class='add'>+ reset_smg ();</div><div class='add'>+ ret = init_smg ();</div><div class='add'>+ UNBLOCK_SIGNALS;</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_reset_smg (void)</div><div class='add'>+{ </div><div class='add'>+ if (Smg_Inited == 0)</div><div class='add'>+ return;</div><div class='add'>+ </div><div class='add'>+ BLOCK_SIGNALS;</div><div class='add'>+</div><div class='add'>+ reset_smg ();</div><div class='add'>+ (*tt_reset_video)();</div><div class='add'>+</div><div class='add'>+ UNBLOCK_SIGNALS;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLsmg_Char_Type SLsmg_char_at (void)</div><div class='add'>+{</div><div class='add'>+ if (Smg_Inited == 0) return 0;</div><div class='add'>+</div><div class='add'>+ if (point_visible (1))</div><div class='add'>+ {</div><div class='add'>+ return SL_Screen[This_Row - Start_Row].neew[This_Col - Start_Col];</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_vprintf (char *fmt, va_list ap)</div><div class='add'>+{</div><div class='add'>+ char buf[1024];</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ (void) _SLvsnprintf (buf, sizeof (buf), fmt, ap);</div><div class='add'>+ SLsmg_write_string (buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_printf (char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+ va_list ap;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char *f;</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ va_start(ap, fmt);</div><div class='add'>+</div><div class='add'>+ f = fmt;</div><div class='add'>+ while (*f && (*f != '%'))</div><div class='add'>+ f++;</div><div class='add'>+ len = (unsigned int) (f - fmt);</div><div class='add'>+ if (len) SLsmg_write_nchars (fmt, len);</div><div class='add'>+</div><div class='add'>+ if (*f != 0)</div><div class='add'>+ SLsmg_vprintf (f, ap);</div><div class='add'>+</div><div class='add'>+ va_end (ap);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_set_screen_start (int *r, int *c)</div><div class='add'>+{</div><div class='add'>+ int orow = Start_Row, oc = Start_Col;</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ if (c == NULL) Start_Col = 0;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ Start_Col = *c;</div><div class='add'>+ *c = oc;</div><div class='add'>+ }</div><div class='add'>+ if (r == NULL) Start_Row = 0;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ Start_Row = *r;</div><div class='add'>+ *r = orow;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_draw_object (int r, int c, unsigned char object)</div><div class='add'>+{</div><div class='add'>+ This_Row = r; This_Col = c;</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ if (point_visible (1))</div><div class='add'>+ {</div><div class='add'>+ int color = This_Color;</div><div class='add'>+ This_Color |= ALT_CHAR_FLAG;</div><div class='add'>+ SLsmg_write_char (object);</div><div class='add'>+ This_Color = color;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ This_Col = c + 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_draw_hline (unsigned int n)</div><div class='add'>+{</div><div class='add'>+ static unsigned char hbuf[16];</div><div class='add'>+ int count;</div><div class='add'>+ int cmin, cmax;</div><div class='add'>+ int final_col = This_Col + (int) n;</div><div class='add'>+ int save_color;</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ if ((This_Row < Start_Row) || (This_Row >= Start_Row + Screen_Rows)</div><div class='add'>+ || (0 == compute_clip (This_Col, n, Start_Col, Start_Col + Screen_Cols,</div><div class='add'>+ &cmin, &cmax)))</div><div class='add'>+ {</div><div class='add'>+ This_Col = final_col;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (hbuf[0] == 0)</div><div class='add'>+ {</div><div class='add'>+ SLMEMSET ((char *) hbuf, SLSMG_HLINE_CHAR, 16);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ n = (unsigned int)(cmax - cmin);</div><div class='add'>+ count = n / 16;</div><div class='add'>+</div><div class='add'>+ save_color = This_Color;</div><div class='add'>+ This_Color |= ALT_CHAR_FLAG;</div><div class='add'>+ This_Col = cmin;</div><div class='add'>+</div><div class='add'>+ SLsmg_write_nchars ((char *) hbuf, n % 16);</div><div class='add'>+ while (count-- > 0)</div><div class='add'>+ {</div><div class='add'>+ SLsmg_write_nchars ((char *) hbuf, 16);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ This_Color = save_color;</div><div class='add'>+ This_Col = final_col;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_draw_vline (int n)</div><div class='add'>+{</div><div class='add'>+ unsigned char ch = SLSMG_VLINE_CHAR;</div><div class='add'>+ int c = This_Col, rmin, rmax;</div><div class='add'>+ int final_row = This_Row + n;</div><div class='add'>+ int save_color;</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ if (((c < Start_Col) || (c >= Start_Col + Screen_Cols)) ||</div><div class='add'>+ (0 == compute_clip (This_Row, n, Start_Row, Start_Row + Screen_Rows,</div><div class='add'>+ &rmin, &rmax)))</div><div class='add'>+ {</div><div class='add'>+ This_Row = final_row;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ save_color = This_Color;</div><div class='add'>+ This_Color |= ALT_CHAR_FLAG;</div><div class='add'>+</div><div class='add'>+ for (This_Row = rmin; This_Row < rmax; This_Row++)</div><div class='add'>+ {</div><div class='add'>+ This_Col = c;</div><div class='add'>+ SLsmg_write_nchars ((char *) &ch, 1);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ This_Col = c; This_Row = final_row;</div><div class='add'>+ This_Color = save_color;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_draw_box (int r, int c, unsigned int dr, unsigned int dc)</div><div class='add'>+{</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ if (!dr || !dc) return;</div><div class='add'>+ This_Row = r; This_Col = c;</div><div class='add'>+ dr--; dc--;</div><div class='add'>+ SLsmg_draw_hline (dc);</div><div class='add'>+ SLsmg_draw_vline (dr);</div><div class='add'>+ This_Row = r; This_Col = c;</div><div class='add'>+ SLsmg_draw_vline (dr);</div><div class='add'>+ SLsmg_draw_hline (dc);</div><div class='add'>+ SLsmg_draw_object (r, c, SLSMG_ULCORN_CHAR);</div><div class='add'>+ SLsmg_draw_object (r, c + (int) dc, SLSMG_URCORN_CHAR);</div><div class='add'>+ SLsmg_draw_object (r + (int) dr, c, SLSMG_LLCORN_CHAR);</div><div class='add'>+ SLsmg_draw_object (r + (int) dr, c + (int) dc, SLSMG_LRCORN_CHAR);</div><div class='add'>+ This_Row = r; This_Col = c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_fill_region (int r, int c, unsigned int dr, unsigned int dc, unsigned char ch)</div><div class='add'>+{</div><div class='add'>+ static unsigned char hbuf[16];</div><div class='add'>+ int count;</div><div class='add'>+ int dcmax, rmax;</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ SLsmg_gotorc (r, c);</div><div class='add'>+ r = This_Row; c = This_Col;</div><div class='add'>+</div><div class='add'>+ dcmax = Screen_Cols - This_Col;</div><div class='add'>+ if (dcmax < 0)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (dc > (unsigned int) dcmax) dc = (unsigned int) dcmax;</div><div class='add'>+</div><div class='add'>+ rmax = This_Row + dr;</div><div class='add'>+ if (rmax > Screen_Rows) rmax = Screen_Rows;</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+ ch = Alt_Char_Set[ch];</div><div class='add'>+#endif</div><div class='add'>+ if (ch != hbuf[0]) SLMEMSET ((char *) hbuf, (char) ch, 16);</div><div class='add'>+</div><div class='add'>+ for (This_Row = r; This_Row < rmax; This_Row++)</div><div class='add'>+ {</div><div class='add'>+ This_Col = c;</div><div class='add'>+ count = dc / 16;</div><div class='add'>+ SLsmg_write_nchars ((char *) hbuf, dc % 16);</div><div class='add'>+ while (count-- > 0)</div><div class='add'>+ {</div><div class='add'>+ SLsmg_write_nchars ((char *) hbuf, 16);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ This_Row = r;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_forward (int n)</div><div class='add'>+{</div><div class='add'>+ This_Col += n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_write_color_chars (SLsmg_Char_Type *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ SLsmg_Char_Type *smax, sh;</div><div class='add'>+ char buf[32], *b, *bmax;</div><div class='add'>+ int color, save_color;</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ smax = s + len;</div><div class='add'>+ b = buf;</div><div class='add'>+ bmax = b + sizeof (buf);</div><div class='add'>+</div><div class='add'>+ save_color = This_Color;</div><div class='add'>+</div><div class='add'>+ while (s < smax)</div><div class='add'>+ {</div><div class='add'>+ sh = *s++;</div><div class='add'>+</div><div class='add'>+ color = SLSMG_EXTRACT_COLOR(sh);</div><div class='add'>+</div><div class='add'>+#if REQUIRES_NON_BCE_SUPPORT</div><div class='add'>+ if (Bce_Color_Offset)</div><div class='add'>+ {</div><div class='add'>+ if (color & 0x80)</div><div class='add'>+ color = ((color & 0x7F) + Bce_Color_Offset) | 0x80;</div><div class='add'>+ else</div><div class='add'>+ color = ((color & 0x7F) + Bce_Color_Offset) & 0x7F;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if ((color != This_Color) || (b == bmax))</div><div class='add'>+ {</div><div class='add'>+ if (b != buf)</div><div class='add'>+ {</div><div class='add'>+ SLsmg_write_nchars (buf, (int) (b - buf));</div><div class='add'>+ b = buf;</div><div class='add'>+ }</div><div class='add'>+ This_Color = color;</div><div class='add'>+ }</div><div class='add'>+ *b++ = (char) SLSMG_EXTRACT_CHAR(sh);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (b != buf)</div><div class='add'>+ SLsmg_write_nchars (buf, (unsigned int) (b - buf));</div><div class='add'>+</div><div class='add'>+ This_Color = save_color;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int SLsmg_read_raw (SLsmg_Char_Type *buf, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ unsigned int r, c;</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return 0;</div><div class='add'>+</div><div class='add'>+ if (0 == point_visible (1)) return 0;</div><div class='add'>+</div><div class='add'>+ r = (unsigned int) (This_Row - Start_Row);</div><div class='add'>+ c = (unsigned int) (This_Col - Start_Col);</div><div class='add'>+</div><div class='add'>+ if (c + len > (unsigned int) Screen_Cols)</div><div class='add'>+ len = (unsigned int) Screen_Cols - c;</div><div class='add'>+</div><div class='add'>+ memcpy ((char *) buf, (char *) (SL_Screen[r].neew + c), len * sizeof (SLsmg_Char_Type));</div><div class='add'>+ return len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int SLsmg_write_raw (SLsmg_Char_Type *buf, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ unsigned int r, c;</div><div class='add'>+ SLsmg_Char_Type *dest;</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return 0;</div><div class='add'>+</div><div class='add'>+ if (0 == point_visible (1)) return 0;</div><div class='add'>+</div><div class='add'>+ r = (unsigned int) (This_Row - Start_Row);</div><div class='add'>+ c = (unsigned int) (This_Col - Start_Col);</div><div class='add'>+</div><div class='add'>+ if (c + len > (unsigned int) Screen_Cols)</div><div class='add'>+ len = (unsigned int) Screen_Cols - c;</div><div class='add'>+</div><div class='add'>+ dest = SL_Screen[r].neew + c;</div><div class='add'>+</div><div class='add'>+ if (0 != memcmp ((char *) dest, (char *) buf, len * sizeof (SLsmg_Char_Type)))</div><div class='add'>+ {</div><div class='add'>+ memcpy ((char *) dest, (char *) buf, len * sizeof (SLsmg_Char_Type));</div><div class='add'>+ SL_Screen[r].flags |= TOUCHED;</div><div class='add'>+ }</div><div class='add'>+ return len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+SLsmg_set_color_in_region (int color, int r, int c, unsigned int dr, unsigned int dc)</div><div class='add'>+{</div><div class='add'>+ int cmax, rmax;</div><div class='add'>+ SLsmg_Char_Type char_mask;</div><div class='add'>+</div><div class='add'>+ if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+ c -= Start_Col;</div><div class='add'>+ r -= Start_Row;</div><div class='add'>+</div><div class='add'>+ cmax = c + (int) dc;</div><div class='add'>+ rmax = r + (int) dr;</div><div class='add'>+</div><div class='add'>+ if (cmax > Screen_Cols) cmax = Screen_Cols;</div><div class='add'>+ if (rmax > Screen_Rows) rmax = Screen_Rows;</div><div class='add'>+</div><div class='add'>+ if (c < 0) c = 0;</div><div class='add'>+ if (r < 0) r = 0;</div><div class='add'>+</div><div class='add'>+#if REQUIRES_NON_BCE_SUPPORT</div><div class='add'>+ if (Bce_Color_Offset)</div><div class='add'>+ {</div><div class='add'>+ if (color & 0x80)</div><div class='add'>+ color = ((color & 0x7F) + Bce_Color_Offset) | 0x80;</div><div class='add'>+ else</div><div class='add'>+ color = ((color & 0x7F) + Bce_Color_Offset) & 0x7F;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ color = color << 8;</div><div class='add'>+</div><div class='add'>+ char_mask = 0xFF;</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ if ((tt_Use_Blink_For_ACS == NULL)</div><div class='add'>+ || (0 == *tt_Use_Blink_For_ACS))</div><div class='add'>+ char_mask = 0x80FF;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ while (r < rmax)</div><div class='add'>+ {</div><div class='add'>+ SLsmg_Char_Type *s, *smax;</div><div class='add'>+</div><div class='add'>+ SL_Screen[r].flags |= TOUCHED;</div><div class='add'>+ s = SL_Screen[r].neew;</div><div class='add'>+ smax = s + cmax;</div><div class='add'>+ s += c;</div><div class='add'>+</div><div class='add'>+ while (s < smax)</div><div class='add'>+ {</div><div class='add'>+ *s = (*s & char_mask) | color;</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+ r++;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_set_terminal_info (SLsmg_Term_Type *tt)</div><div class='add'>+{</div><div class='add'>+ if (tt == NULL) /* use default */</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if ((tt->tt_normal_video == NULL)</div><div class='add'>+ || (tt->tt_goto_rc == NULL)</div><div class='add'>+ || (tt->tt_cls == NULL)</div><div class='add'>+ || (tt->tt_del_eol == NULL)</div><div class='add'>+ || (tt->tt_smart_puts == NULL)</div><div class='add'>+ || (tt->tt_flush_output == NULL)</div><div class='add'>+ || (tt->tt_reset_video == NULL)</div><div class='add'>+ || (tt->tt_init_video == NULL)</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ || (tt->tt_set_scroll_region == NULL)</div><div class='add'>+ || (tt->tt_reverse_index == NULL)</div><div class='add'>+ || (tt->tt_reset_scroll_region == NULL)</div><div class='add'>+ || (tt->tt_delete_nlines == NULL)</div><div class='add'>+ /* Variables */</div><div class='add'>+ || (tt->tt_term_cannot_scroll == NULL)</div><div class='add'>+ || (tt->tt_has_alt_charset == NULL)</div><div class='add'>+#if 0 /* These can be NULL */</div><div class='add'>+ || (tt->tt_use_blink_for_acs == NULL)</div><div class='add'>+ || (tt->tt_graphic_char_pairs == NULL)</div><div class='add'>+#endif</div><div class='add'>+ || (tt->tt_screen_cols == NULL)</div><div class='add'>+ || (tt->tt_screen_rows == NULL)</div><div class='add'>+#endif</div><div class='add'>+ )</div><div class='add'>+ SLang_exit_error ("Terminal not powerful enough for SLsmg");</div><div class='add'>+</div><div class='add'>+ tt_normal_video = tt->tt_normal_video;</div><div class='add'>+ tt_goto_rc = tt->tt_goto_rc;</div><div class='add'>+ tt_cls = tt->tt_cls;</div><div class='add'>+ tt_del_eol = tt->tt_del_eol;</div><div class='add'>+ tt_smart_puts = tt->tt_smart_puts;</div><div class='add'>+ tt_flush_output = tt->tt_flush_output;</div><div class='add'>+ tt_reset_video = tt->tt_reset_video;</div><div class='add'>+ tt_init_video = tt->tt_init_video;</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+ tt_set_scroll_region = tt->tt_set_scroll_region;</div><div class='add'>+ tt_reverse_index = tt->tt_reverse_index;</div><div class='add'>+ tt_reset_scroll_region = tt->tt_reset_scroll_region;</div><div class='add'>+ tt_delete_nlines = tt->tt_delete_nlines;</div><div class='add'>+</div><div class='add'>+ tt_Term_Cannot_Scroll = tt->tt_term_cannot_scroll;</div><div class='add'>+ tt_Has_Alt_Charset = tt->tt_has_alt_charset;</div><div class='add'>+ tt_Use_Blink_For_ACS = tt->tt_use_blink_for_acs;</div><div class='add'>+ tt_Graphics_Char_Pairs = tt->tt_graphic_char_pairs;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ tt_Screen_Cols = tt->tt_screen_cols;</div><div class='add'>+ tt_Screen_Rows = tt->tt_screen_rows;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slstd.c b/mdk-stage1/slang/slstd.c<br/>new file mode 100644<br/>index 000000000..b05dfcddb<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slstd.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstd.c</a></div><div class='hunk'>@@ -0,0 +1,724 @@</div><div class='add'>+/* -*- mode: C; mode: fold; -*- */</div><div class='add'>+/* Standard intrinsic functions for S-Lang. Included here are string</div><div class='add'>+ and array operations */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+/*{{{ Include Files */</div><div class='add'>+</div><div class='add'>+#include <time.h></div><div class='add'>+</div><div class='add'>+#ifndef __QNX__</div><div class='add'>+# if defined(__GO32__) || defined(__WATCOMC__)</div><div class='add'>+# include <dos.h></div><div class='add'>+# include <bios.h></div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+# include <math.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* builtin stack manipulation functions */</div><div class='add'>+int SLdo_pop(void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ return SLdo_pop_n (1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int SLdo_pop_n (unsigned int n)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type x;</div><div class='add'>+</div><div class='add'>+ while (n--)</div><div class='add'>+ {</div><div class='add'>+ if (SLang_pop(&x)) return -1;</div><div class='add'>+ SLang_free_object (&x);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_dup(void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ (void) SLdup_n (1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int length_cmd (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ VOID_STAR p;</div><div class='add'>+ unsigned int length;</div><div class='add'>+ int len;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&obj))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (obj.data_type);</div><div class='add'>+ p = _SLclass_get_ptr_to_value (cl, &obj);</div><div class='add'>+</div><div class='add'>+ len = 1;</div><div class='add'>+ if (cl->cl_length != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (0 == (*cl->cl_length)(obj.data_type, p, &length))</div><div class='add'>+ len = (int) length;</div><div class='add'>+ else</div><div class='add'>+ len = -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* convert integer to a string of length 1 */</div><div class='add'>+static void char_cmd (int *x) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char ch, buf[2];</div><div class='add'>+</div><div class='add'>+ ch = (char) *x;</div><div class='add'>+ buf[0] = ch;</div><div class='add'>+ buf[1] = 0;</div><div class='add'>+ SLang_push_string (buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* format object into a string and returns slstring */</div><div class='add'>+char *_SLstringize_object (SLang_Object_Type *obj) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ unsigned char stype;</div><div class='add'>+ VOID_STAR p;</div><div class='add'>+ char *s, *s1;</div><div class='add'>+</div><div class='add'>+ stype = obj->data_type;</div><div class='add'>+ p = (VOID_STAR) &obj->v.ptr_val;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (stype);</div><div class='add'>+</div><div class='add'>+ s = (*cl->cl_string) (stype, p);</div><div class='add'>+ if (s != NULL)</div><div class='add'>+ {</div><div class='add'>+ s1 = SLang_create_slstring (s);</div><div class='add'>+ SLfree (s);</div><div class='add'>+ s = s1;</div><div class='add'>+ }</div><div class='add'>+ return s;</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int SLang_run_hooks(char *hook, unsigned int num_args, ...)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+ va_list ap;</div><div class='add'>+</div><div class='add'>+ if (SLang_Error) return -1;</div><div class='add'>+</div><div class='add'>+ if (0 == SLang_is_defined (hook))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ (void) SLang_start_arg_list ();</div><div class='add'>+ va_start (ap, num_args);</div><div class='add'>+ for (i = 0; i < num_args; i++)</div><div class='add'>+ {</div><div class='add'>+ char *arg;</div><div class='add'>+</div><div class='add'>+ arg = va_arg (ap, char *);</div><div class='add'>+ if (-1 == SLang_push_string (arg))</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ va_end (ap);</div><div class='add'>+ (void) SLang_end_arg_list ();</div><div class='add'>+</div><div class='add'>+ if (SLang_Error) return -1;</div><div class='add'>+ return SLang_execute_function (hook);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_getenv_cmd (char *s)</div><div class='add'>+{</div><div class='add'>+ SLang_push_string (getenv (s));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_PUTENV</div><div class='add'>+static void intrin_putenv (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char *s;</div><div class='add'>+</div><div class='add'>+ /* Some putenv implementations required malloced strings. */</div><div class='add'>+ if (SLpop_string(&s)) return;</div><div class='add'>+</div><div class='add'>+ if (putenv (s))</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_INTRINSIC_ERROR;</div><div class='add'>+ SLfree (s);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Note that s is NOT freed */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void lang_print_stack (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char buf[32];</div><div class='add'>+ unsigned int n;</div><div class='add'>+</div><div class='add'>+ n = (unsigned int) (_SLStack_Pointer - _SLRun_Stack);</div><div class='add'>+ while (n)</div><div class='add'>+ {</div><div class='add'>+ n--;</div><div class='add'>+ sprintf (buf, "(%u)", n);</div><div class='add'>+ _SLdump_objects (buf, _SLRun_Stack + n, 1, 1);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void byte_compile_file (char *f, int *m)</div><div class='add'>+{</div><div class='add'>+ SLang_byte_compile_file (f, *m);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_type_info1 (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ unsigned int type;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&obj))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ type = obj.data_type;</div><div class='add'>+ if (type == SLANG_ARRAY_TYPE)</div><div class='add'>+ type = obj.v.array_val->data_type;</div><div class='add'>+</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+</div><div class='add'>+ _SLang_push_datatype (type);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_type_info (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&obj))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ _SLang_push_datatype (obj.data_type);</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLstring_intrinsic (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type x;</div><div class='add'>+ char *s;</div><div class='add'>+</div><div class='add'>+ if (SLang_pop (&x)) return;</div><div class='add'>+ if (NULL != (s = _SLstringize_object (&x)))</div><div class='add'>+ _SLang_push_slstring (s);</div><div class='add'>+</div><div class='add'>+ SLang_free_object (&x);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void intrin_typecast (void)</div><div class='add'>+{</div><div class='add'>+ unsigned char to_type;</div><div class='add'>+ if (0 == _SLang_pop_datatype (&to_type))</div><div class='add'>+ (void) SLclass_typecast (to_type, 0, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+static void intrin_double (void)</div><div class='add'>+{</div><div class='add'>+ (void) SLclass_typecast (SLANG_DOUBLE_TYPE, 0, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void intrin_int (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ (void) SLclass_typecast (SLANG_INT_TYPE, 0, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+intrin_function_name (void)</div><div class='add'>+{</div><div class='add'>+ if (NULL == _SLang_Current_Function_Name)</div><div class='add'>+ return "";</div><div class='add'>+ return _SLang_Current_Function_Name;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_message (char *s)</div><div class='add'>+{</div><div class='add'>+ SLang_vmessage ("%s", s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_error (char *s)</div><div class='add'>+{</div><div class='add'>+ SLang_verror (SL_USER_ERROR, "%s", s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_pop_n (int *n)</div><div class='add'>+{</div><div class='add'>+ SLdo_pop_n ((unsigned int) *n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_reverse_stack (int *n)</div><div class='add'>+{</div><div class='add'>+ SLreverse_stack (*n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_roll_stack (int *n)</div><div class='add'>+{</div><div class='add'>+ SLroll_stack (*n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void usage (void)</div><div class='add'>+{</div><div class='add'>+ char *msg;</div><div class='add'>+</div><div class='add'>+ _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 1); /* do not include format */</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_slstring (&msg))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_USAGE_ERROR, "Usage: %s", msg);</div><div class='add'>+ SLang_free_slstring (msg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Convert string to integer */</div><div class='add'>+static int intrin_integer (char *s)</div><div class='add'>+{</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ i = SLatoi ((unsigned char *) s);</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH, "Unable to convert string to integer");</div><div class='add'>+ return i;</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void guess_type (char *s)</div><div class='add'>+{</div><div class='add'>+ _SLang_push_datatype (SLang_guess_type(s));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int load_file (char *s)</div><div class='add'>+{</div><div class='add'>+ if (-1 == SLang_load_file (s))</div><div class='add'>+ return 0;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void get_doc_string (char *file, char *topic)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+ char line[1024];</div><div class='add'>+ unsigned int topic_len, str_len;</div><div class='add'>+ char *str;</div><div class='add'>+ char ch;</div><div class='add'>+</div><div class='add'>+ if (NULL == (fp = fopen (file, "r")))</div><div class='add'>+ {</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ topic_len = strlen (topic);</div><div class='add'>+ ch = *topic;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ if (NULL == fgets (line, sizeof(line), fp))</div><div class='add'>+ {</div><div class='add'>+ fclose (fp);</div><div class='add'>+ (void) SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((ch == *line)</div><div class='add'>+ && (0 == strncmp (line, topic, topic_len))</div><div class='add'>+ && ((line[topic_len] == '\n') || (line [topic_len] == 0)</div><div class='add'>+ || (line[topic_len] == ' ') || (line[topic_len] == '\t')))</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (str = SLmake_string (line)))</div><div class='add'>+ {</div><div class='add'>+ fclose (fp);</div><div class='add'>+ (void) SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ str_len = strlen (str);</div><div class='add'>+</div><div class='add'>+ while (NULL != fgets (line, sizeof (line), fp))</div><div class='add'>+ {</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char *new_str;</div><div class='add'>+</div><div class='add'>+ ch = *line;</div><div class='add'>+ if (ch == '#') continue;</div><div class='add'>+ if (ch == '-') break;</div><div class='add'>+</div><div class='add'>+ len = strlen (line);</div><div class='add'>+ if (NULL == (new_str = SLrealloc (str, str_len + len + 1)))</div><div class='add'>+ {</div><div class='add'>+ SLfree (str);</div><div class='add'>+ str = NULL;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ str = new_str;</div><div class='add'>+ strcpy (str + str_len, line);</div><div class='add'>+ str_len += len;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ fclose (fp);</div><div class='add'>+</div><div class='add'>+ (void) SLang_push_malloced_string (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_string_array_elements (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+ char **strs;</div><div class='add'>+ unsigned int num;</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ if (at == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ strs = (char **)at->data;</div><div class='add'>+ num = at->num_elements;</div><div class='add'>+ for (i = 0; i < num; i++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLang_push_string (strs[i]))</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop_n (i);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ SLang_push_integer ((int) num);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+static void intrin_apropos (void)</div><div class='add'>+{</div><div class='add'>+ int num_args;</div><div class='add'>+ char *pat;</div><div class='add'>+ char *namespace_name;</div><div class='add'>+ unsigned int flags;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ num_args = SLang_Num_Function_Args;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_uinteger (&flags))</div><div class='add'>+ return;</div><div class='add'>+ if (-1 == SLang_pop_slstring (&pat))</div><div class='add'>+ return;</div><div class='add'>+ </div><div class='add'>+ namespace_name = NULL;</div><div class='add'>+ at = NULL;</div><div class='add'>+ if (num_args == 3)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLang_pop_slstring (&namespace_name))</div><div class='add'>+ goto free_and_return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ at = _SLang_apropos (namespace_name, pat, flags);</div><div class='add'>+ if (num_args == 3)</div><div class='add'>+ {</div><div class='add'>+ (void) SLang_push_array (at, 0);</div><div class='add'>+ goto free_and_return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Maintain compatibility with old version of the function. That version</div><div class='add'>+ * did not take three arguments and returned everything to the stack.</div><div class='add'>+ * Yuk.</div><div class='add'>+ */</div><div class='add'>+ (void) push_string_array_elements (at);</div><div class='add'>+</div><div class='add'>+ free_and_return:</div><div class='add'>+ /* NULLs ok */</div><div class='add'>+ SLang_free_slstring (namespace_name);</div><div class='add'>+ SLang_free_slstring (pat);</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int intrin_get_defines (void)</div><div class='add'>+{</div><div class='add'>+ int n = 0;</div><div class='add'>+ char **s = _SLdefines;</div><div class='add'>+</div><div class='add'>+ while (*s != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLang_push_string (*s))</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop_n ((unsigned int) n);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ s++;</div><div class='add'>+ n++;</div><div class='add'>+ }</div><div class='add'>+ return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_get_reference (char *name)</div><div class='add'>+{</div><div class='add'>+ _SLang_push_ref (1, (VOID_STAR) _SLlocate_name (name));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SYS_UTSNAME_H</div><div class='add'>+# include <sys/utsname.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void uname_cmd (void)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_UNAME</div><div class='add'>+ struct utsname u;</div><div class='add'>+ char *field_names [6];</div><div class='add'>+ unsigned char field_types[6];</div><div class='add'>+ VOID_STAR field_values [6];</div><div class='add'>+ char *ptrs[6];</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if (-1 == uname (&u))</div><div class='add'>+ (void) SLang_push_null ();</div><div class='add'>+</div><div class='add'>+ field_names[0] = "sysname"; ptrs[0] = u.sysname;</div><div class='add'>+ field_names[1] = "nodename"; ptrs[1] = u.nodename;</div><div class='add'>+ field_names[2] = "release"; ptrs[2] = u.release;</div><div class='add'>+ field_names[3] = "version"; ptrs[3] = u.version;</div><div class='add'>+ field_names[4] = "machine"; ptrs[4] = u.machine;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 5; i++)</div><div class='add'>+ {</div><div class='add'>+ field_types[i] = SLANG_STRING_TYPE;</div><div class='add'>+ field_values[i] = (VOID_STAR) &ptrs[i];</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (0 == SLstruct_create_struct (5, field_names, field_types, field_values))</div><div class='add'>+ return;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void uninitialize_ref_intrin (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+ (void) _SLang_uninitialize_ref (ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type SLang_Basic_Table [] = /*{{{*/</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_1("__is_initialized", _SLang_is_ref_initialized, SLANG_INT_TYPE, SLANG_REF_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("__get_reference", intrin_get_reference, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_1("__uninitialize", uninitialize_ref_intrin, SLANG_VOID_TYPE, SLANG_REF_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SS("get_doc_string_from_file", get_doc_string, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SS("autoload", SLang_autoload, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("is_defined", SLang_is_defined, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("string", _SLstring_intrinsic, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("uname", uname_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("getenv", intrin_getenv_cmd, SLANG_VOID_TYPE),</div><div class='add'>+#ifdef HAVE_PUTENV</div><div class='add'>+ MAKE_INTRINSIC_0("putenv", intrin_putenv, SLANG_VOID_TYPE),</div><div class='add'>+#endif</div><div class='add'>+ MAKE_INTRINSIC_S("evalfile", load_file, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_I("char", char_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("eval", SLang_load_string, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("dup", do_dup, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("integer", intrin_integer, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("system", SLsystem, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("_apropos", intrin_apropos, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("_trace_function", _SLang_trace_fun, SLANG_VOID_TYPE),</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ MAKE_INTRINSIC_S("atof", _SLang_atof, SLANG_DOUBLE_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("double", intrin_double, SLANG_VOID_TYPE),</div><div class='add'>+#endif</div><div class='add'>+ MAKE_INTRINSIC_0("int", intrin_int, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("typecast", intrin_typecast, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("_stkdepth", _SLstack_depth, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_I("_stk_reverse", intrin_reverse_stack, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("typeof", intrin_type_info, VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("_typeof", intrin_type_info1, VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_I("_pop_n", intrin_pop_n, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("_print_stack", lang_print_stack, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_I("_stk_roll", intrin_roll_stack, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SI("byte_compile_file", byte_compile_file, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("_clear_error", _SLang_clear_error, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("_function_name", intrin_function_name, SLANG_STRING_TYPE),</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ MAKE_INTRINSIC_S("set_float_format", _SLset_double_format, SLANG_VOID_TYPE),</div><div class='add'>+#endif</div><div class='add'>+ MAKE_INTRINSIC_S("_slang_guess_type", guess_type, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("error", intrin_error, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("message", intrin_message, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("__get_defined_symbols", intrin_get_defines, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_I("__pop_args", _SLstruct_pop_args, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_1("__push_args", _SLstruct_push_args, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("usage", usage, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("implements", _SLang_implements_intrinsic, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("use_namespace", _SLang_use_namespace_intrinsic, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("current_namespace", _SLang_cur_namespace_intrinsic, SLANG_STRING_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("length", length_cmd, SLANG_INT_TYPE),</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+#ifdef SLANG_DOC_DIR</div><div class='add'>+char *SLang_Doc_Dir = SLANG_DOC_DIR;</div><div class='add'>+#else</div><div class='add'>+char *SLang_Doc_Dir = "";</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Var_Type Intrin_Vars[] =</div><div class='add'>+{</div><div class='add'>+ MAKE_VARIABLE("_debug_info", &_SLang_Compile_Line_Num_Info, SLANG_INT_TYPE, 0),</div><div class='add'>+ MAKE_VARIABLE("_auto_declare", &_SLang_Auto_Declare_Globals, SLANG_INT_TYPE, 0),</div><div class='add'>+ MAKE_VARIABLE("_traceback", &SLang_Traceback, SLANG_INT_TYPE, 0),</div><div class='add'>+ MAKE_VARIABLE("_slangtrace", &_SLang_Trace, SLANG_INT_TYPE, 0),</div><div class='add'>+ MAKE_VARIABLE("_slang_version", &SLang_Version, SLANG_INT_TYPE, 1),</div><div class='add'>+ MAKE_VARIABLE("_slang_version_string", &SLang_Version_String, SLANG_STRING_TYPE, 1),</div><div class='add'>+ MAKE_VARIABLE("_NARGS", &SLang_Num_Function_Args, SLANG_INT_TYPE, 1),</div><div class='add'>+ MAKE_VARIABLE("_slang_doc_dir", &SLang_Doc_Dir, SLANG_STRING_TYPE, 1),</div><div class='add'>+ MAKE_VARIABLE("NULL", NULL, SLANG_NULL_TYPE, 1),</div><div class='add'>+ SLANG_END_INTRIN_VAR_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLang_init_slang (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char name[3];</div><div class='add'>+ unsigned int i;</div><div class='add'>+ char **s;</div><div class='add'>+ static char *sys_defines [] =</div><div class='add'>+ {</div><div class='add'>+#if defined(__os2__)</div><div class='add'>+ "OS2",</div><div class='add'>+#endif</div><div class='add'>+#if defined(__MSDOS__)</div><div class='add'>+ "MSDOS",</div><div class='add'>+#endif</div><div class='add'>+#if defined(__WIN16__)</div><div class='add'>+ "WIN16",</div><div class='add'>+#endif</div><div class='add'>+#if defined (__WIN32__)</div><div class='add'>+ "WIN32",</div><div class='add'>+#endif</div><div class='add'>+#if defined(__NT__)</div><div class='add'>+ "NT",</div><div class='add'>+#endif</div><div class='add'>+#if defined (VMS)</div><div class='add'>+ "VMS",</div><div class='add'>+#endif</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+ "UNIX",</div><div class='add'>+#endif</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ "SLANG_DOUBLE_TYPE",</div><div class='add'>+#endif</div><div class='add'>+ NULL</div><div class='add'>+ };</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLregister_types ()) return -1;</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLadd_intrin_fun_table(SLang_Basic_Table, NULL))</div><div class='add'>+ || (-1 == SLadd_intrin_var_table (Intrin_Vars, NULL))</div><div class='add'>+ || (-1 == _SLang_init_slstrops ())</div><div class='add'>+ || (-1 == _SLang_init_sltime ())</div><div class='add'>+ || (-1 == _SLstruct_init ())</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ || (-1 == _SLinit_slcomplex ())</div><div class='add'>+#endif</div><div class='add'>+#if SLANG_HAS_ASSOC_ARRAYS</div><div class='add'>+ || (-1 == SLang_init_slassoc ())</div><div class='add'>+#endif</div><div class='add'>+ )</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ SLadd_global_variable (SLANG_SYSTEM_NAME);</div><div class='add'>+</div><div class='add'>+ s = sys_defines;</div><div class='add'>+ while (*s != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLdefine_for_ifdef (*s)) return -1;</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* give temp global variables $0 --> $9 */</div><div class='add'>+ name[2] = 0; name[0] = '$';</div><div class='add'>+ for (i = 0; i < 10; i++)</div><div class='add'>+ {</div><div class='add'>+ name[1] = (char) (i + '0');</div><div class='add'>+ SLadd_global_variable (name);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_init_case_tables ();</div><div class='add'>+</div><div class='add'>+ /* Now add a couple of macros */</div><div class='add'>+ SLang_load_string (".(_NARGS 1 - Sprintf error)verror");</div><div class='add'>+ SLang_load_string (".(_NARGS 1 - Sprintf message)vmessage");</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int SLang_set_argc_argv (int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+ static int this_argc;</div><div class='add'>+ static char **this_argv;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if (argc < 0) argc = 0;</div><div class='add'>+ this_argc = argc;</div><div class='add'>+</div><div class='add'>+ if (NULL == (this_argv = (char **) SLmalloc ((argc + 1) * sizeof (char *))))</div><div class='add'>+ return -1;</div><div class='add'>+ memset ((char *) this_argv, 0, sizeof (char *) * (argc + 1));</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < argc; i++)</div><div class='add'>+ {</div><div class='add'>+ if (NULL == (this_argv[i] = SLang_create_slstring (argv[i])))</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLadd_intrinsic_variable ("__argc", (VOID_STAR)&this_argc,</div><div class='add'>+ SLANG_INT_TYPE, 1))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_add_intrinsic_array ("__argv", SLANG_STRING_TYPE, 1,</div><div class='add'>+ (VOID_STAR) this_argv, 1, argc))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ for (i = 0; i < argc; i++)</div><div class='add'>+ SLang_free_slstring (this_argv[i]); /* NULL ok */</div><div class='add'>+ SLfree ((char *) this_argv);</div><div class='add'>+</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slstdio.c b/mdk-stage1/slang/slstdio.c<br/>new file mode 100644<br/>index 000000000..05db1af77<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slstdio.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstdio.c</a></div><div class='hunk'>@@ -0,0 +1,1050 @@</div><div class='add'>+/* file stdio intrinsics for S-Lang */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#if defined(__unix__) || (defined (__os2__) && defined (__EMX__))</div><div class='add'>+# include <sys/types.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_FCNTL_H</div><div class='add'>+# include <fcntl.h></div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SYS_FCNTL_H</div><div class='add'>+# include <sys/fcntl.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __unix__</div><div class='add'>+# include <sys/file.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include <io.h></div><div class='add'>+# include <dir.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__DECC) && defined(VMS)</div><div class='add'>+# include <unixio.h></div><div class='add'>+# include <unixlib.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+# include <stat.h></div><div class='add'>+#else</div><div class='add'>+# include <sys/stat.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include <errno.h></div><div class='add'>+</div><div class='add'>+#define SL_APP_WANTS_FOREACH</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ FILE *fp; /* kind of obvious */</div><div class='add'>+ char *file; /* file name associated with pointer */</div><div class='add'>+</div><div class='add'>+ unsigned int flags; /* modes, etc... */</div><div class='add'>+#define SL_READ 0x0001</div><div class='add'>+#define SL_WRITE 0x0002</div><div class='add'>+#define SL_BINARY 0x0004</div><div class='add'>+#define SL_FDOPEN 0x2000</div><div class='add'>+#define SL_PIPE 0x4000</div><div class='add'>+#define SL_INUSE 0x8000</div><div class='add'>+}</div><div class='add'>+SL_File_Table_Type;</div><div class='add'>+</div><div class='add'>+static SL_File_Table_Type *SL_File_Table;</div><div class='add'>+</div><div class='add'>+static SL_File_Table_Type *get_free_file_table_entry (void)</div><div class='add'>+{</div><div class='add'>+ SL_File_Table_Type *t = SL_File_Table, *tmax;</div><div class='add'>+</div><div class='add'>+ tmax = t + SL_MAX_FILES;</div><div class='add'>+ while (t < tmax)</div><div class='add'>+ {</div><div class='add'>+ if (t->flags == 0)</div><div class='add'>+ {</div><div class='add'>+ memset ((char *) t, 0, sizeof (SL_File_Table_Type));</div><div class='add'>+ return t;</div><div class='add'>+ }</div><div class='add'>+ t++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned int file_process_flags (char *mode)</div><div class='add'>+{</div><div class='add'>+ char ch;</div><div class='add'>+ unsigned int flags = 0;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ ch = *mode++;</div><div class='add'>+ switch (ch)</div><div class='add'>+ {</div><div class='add'>+ case 'r': flags |= SL_READ;</div><div class='add'>+ break;</div><div class='add'>+ case 'w':</div><div class='add'>+ case 'a':</div><div class='add'>+ case 'A':</div><div class='add'>+ flags |= SL_WRITE;</div><div class='add'>+ break;</div><div class='add'>+ case '+': flags |= SL_WRITE | SL_READ;</div><div class='add'>+ break;</div><div class='add'>+ case 'b': flags |= SL_BINARY;</div><div class='add'>+ break;</div><div class='add'>+ case 0:</div><div class='add'>+ return flags;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "File flag %c is not supported", ch);</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int open_file_type (char *file, int fd, char *mode,</div><div class='add'>+ FILE *(*open_fun)(char *, char *),</div><div class='add'>+ int (*close_fun)(FILE *),</div><div class='add'>+ unsigned int xflags)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+ SL_File_Table_Type *t;</div><div class='add'>+ unsigned int flags;</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+</div><div class='add'>+ fp = NULL;</div><div class='add'>+ t = NULL;</div><div class='add'>+ mmt = NULL;</div><div class='add'>+</div><div class='add'>+ if ((NULL == (t = get_free_file_table_entry ()))</div><div class='add'>+ || (0 == (flags = file_process_flags(mode))))</div><div class='add'>+ goto return_error;</div><div class='add'>+ </div><div class='add'>+ if (fd != -1)</div><div class='add'>+ fp = fdopen (fd, mode);</div><div class='add'>+ else</div><div class='add'>+ fp = open_fun (file, mode);</div><div class='add'>+</div><div class='add'>+ if (fp == NULL)</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (mmt = SLang_create_mmt (SLANG_FILE_PTR_TYPE, (VOID_STAR) t)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ t->fp = fp;</div><div class='add'>+ t->flags = flags | xflags;</div><div class='add'>+ fp = NULL; /* allow free_mmt to close fp */</div><div class='add'>+</div><div class='add'>+ if ((NULL != (t->file = SLang_create_slstring (file)))</div><div class='add'>+ && (0 == SLang_push_mmt (mmt)))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ /* drop */</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ if (fp != NULL) (*close_fun) (fp);</div><div class='add'>+ if (mmt != NULL) SLang_free_mmt (mmt);</div><div class='add'>+ (void) SLang_push_null ();</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Since some compilers do not have popen/pclose prototyped and in scope,</div><div class='add'>+ * and pc compilers sometimes have silly prototypes involving PASCAL, etc.</div><div class='add'>+ * use wrappers around the function to avoid compilation errors.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static FILE *fopen_fun (char *f, char *m)</div><div class='add'>+{</div><div class='add'>+ return fopen (f, m);</div><div class='add'>+}</div><div class='add'>+static int fclose_fun (FILE *fp)</div><div class='add'>+{</div><div class='add'>+ return fclose (fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void stdio_fopen (char *file, char *mode)</div><div class='add'>+{</div><div class='add'>+ (void) open_file_type (file, -1, mode, fopen_fun, fclose_fun, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLstdio_fdopen (char *file, int fd, char *mode)</div><div class='add'>+{</div><div class='add'>+ if (fd == -1)</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = EBADF;</div><div class='add'>+ (void) SLang_push_null ();</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return open_file_type (file, fd, mode, NULL, fclose_fun, SL_FDOPEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_POPEN</div><div class='add'>+static int pclose_fun (FILE *fp)</div><div class='add'>+{</div><div class='add'>+ return pclose (fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static FILE *popen_fun (char *file, char *mode)</div><div class='add'>+{</div><div class='add'>+ return popen (file, mode);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void stdio_popen (char *file, char *mode)</div><div class='add'>+{</div><div class='add'>+ (void) open_file_type (file, -1, mode, popen_fun, pclose_fun, SL_PIPE);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* returns pointer to file entry if it is open and consistent with</div><div class='add'>+ flags. Returns NULL otherwise */</div><div class='add'>+static SLang_MMT_Type *pop_fp (unsigned int flags, FILE **fp_ptr)</div><div class='add'>+{</div><div class='add'>+ SL_File_Table_Type *t;</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+</div><div class='add'>+ *fp_ptr = NULL;</div><div class='add'>+</div><div class='add'>+ if (NULL == (mmt = SLang_pop_mmt (SLANG_FILE_PTR_TYPE)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ t = (SL_File_Table_Type *) SLang_object_from_mmt (mmt);</div><div class='add'>+ if ((t->flags & flags)</div><div class='add'>+ && (NULL != (*fp_ptr = t->fp)))</div><div class='add'>+ return mmt;</div><div class='add'>+</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static FILE *check_fp (SL_File_Table_Type *t, unsigned flags)</div><div class='add'>+{</div><div class='add'>+ if ((t != NULL) && (t->flags & flags))</div><div class='add'>+ return t->fp;</div><div class='add'>+</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLang_get_name_from_fileptr (SLang_MMT_Type *mmt)</div><div class='add'>+{</div><div class='add'>+ SL_File_Table_Type *ft;</div><div class='add'>+</div><div class='add'>+ ft = (SL_File_Table_Type *) SLang_object_from_mmt (mmt);</div><div class='add'>+ if (ft == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+ return ft->file;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_fileptr (SLang_MMT_Type **mmt, FILE **fp)</div><div class='add'>+{</div><div class='add'>+ if (NULL == (*mmt = pop_fp (0xFFFF, fp)))</div><div class='add'>+ {</div><div class='add'>+#ifdef EBADF</div><div class='add'>+ _SLerrno_errno = EBADF;</div><div class='add'>+#endif</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int close_file_type (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+ int ret = 0;</div><div class='add'>+ FILE *fp;</div><div class='add'>+</div><div class='add'>+ if (t == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ fp = t->fp;</div><div class='add'>+</div><div class='add'>+ if (NULL == fp) ret = -1;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if (0 == (t->flags & SL_PIPE))</div><div class='add'>+ {</div><div class='add'>+ if (EOF == (ret = fclose (fp)))</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ }</div><div class='add'>+#ifdef HAVE_POPEN</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (ret = pclose (fp)))</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (t->file != NULL) SLang_free_slstring (t->file);</div><div class='add'>+ memset ((char *) t, 0, sizeof (SL_File_Table_Type));</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_fclose (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (NULL == check_fp (t, 0xFFFF))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ ret = close_file_type (t);</div><div class='add'>+</div><div class='add'>+ t->flags = SL_INUSE;</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int read_one_line (FILE *fp, char **strp, unsigned int *lenp)</div><div class='add'>+{</div><div class='add'>+ char buf[512];</div><div class='add'>+ char *str;</div><div class='add'>+ unsigned int len;</div><div class='add'>+</div><div class='add'>+ *strp = NULL;</div><div class='add'>+ len = 0;</div><div class='add'>+ str = NULL;</div><div class='add'>+</div><div class='add'>+ while (NULL != fgets (buf, sizeof (buf), fp))</div><div class='add'>+ {</div><div class='add'>+ unsigned int dlen;</div><div class='add'>+ char *new_str;</div><div class='add'>+ int done_flag;</div><div class='add'>+</div><div class='add'>+ dlen = strlen (buf);</div><div class='add'>+ /* Note: If the file contains embedded \0 characters, then this</div><div class='add'>+ * fails to work properly since dlen will not be correct.</div><div class='add'>+ */</div><div class='add'>+ done_flag = ((dlen + 1 < sizeof (buf))</div><div class='add'>+ || (buf[dlen - 1] == '\n'));</div><div class='add'>+</div><div class='add'>+ if (done_flag && (str == NULL))</div><div class='add'>+ {</div><div class='add'>+ /* Avoid the malloc */</div><div class='add'>+ str = buf;</div><div class='add'>+ len = dlen;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (new_str = SLrealloc (str, len + dlen + 1)))</div><div class='add'>+ {</div><div class='add'>+ SLfree (str);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ str = new_str;</div><div class='add'>+ strcpy (str + len, buf);</div><div class='add'>+ len += dlen;</div><div class='add'>+</div><div class='add'>+ if (done_flag) break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (str == NULL)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ *strp = SLang_create_nslstring (str, len);</div><div class='add'>+ if (str != buf) SLfree (str);</div><div class='add'>+</div><div class='add'>+ if (*strp == NULL) return -1;</div><div class='add'>+</div><div class='add'>+ *lenp = len;</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* returns number of characters read and pushes the string to the stack.</div><div class='add'>+ If it fails, it returns -1 */</div><div class='add'>+static int stdio_fgets (SLang_Ref_Type *ref, SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+ char *s;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ FILE *fp;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ if (NULL == (fp = check_fp (t, SL_READ)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ status = read_one_line (fp, &s, &len);</div><div class='add'>+ if (status <= 0)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ status = SLang_assign_to_ref (ref, SLANG_STRING_TYPE, (VOID_STAR)&s);</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+</div><div class='add'>+ if (status == -1)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return (int) len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void stdio_fgetslines_internal (FILE *fp, unsigned int n)</div><div class='add'>+{</div><div class='add'>+ unsigned int num_lines, max_num_lines;</div><div class='add'>+ char **list;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int inum_lines;</div><div class='add'>+</div><div class='add'>+ if (n > 1024)</div><div class='add'>+ max_num_lines = 1024;</div><div class='add'>+ else </div><div class='add'>+ {</div><div class='add'>+ max_num_lines = n;</div><div class='add'>+ if (max_num_lines == 0)</div><div class='add'>+ max_num_lines++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ list = (char **) SLmalloc (sizeof (char *) * max_num_lines);</div><div class='add'>+ if (list == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ num_lines = 0;</div><div class='add'>+ while (num_lines < n)</div><div class='add'>+ {</div><div class='add'>+ int status;</div><div class='add'>+ char *line;</div><div class='add'>+ unsigned int len;</div><div class='add'>+</div><div class='add'>+ status = read_one_line (fp, &line, &len);</div><div class='add'>+ if (status == -1)</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (status == 0)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ if (max_num_lines == num_lines)</div><div class='add'>+ {</div><div class='add'>+ char **new_list;</div><div class='add'>+</div><div class='add'>+ if (max_num_lines + 4096 > n)</div><div class='add'>+ max_num_lines = n;</div><div class='add'>+ else</div><div class='add'>+ max_num_lines += 4096;</div><div class='add'>+</div><div class='add'>+ new_list = (char **) SLrealloc ((char *)list, sizeof (char *) * max_num_lines);</div><div class='add'>+ if (new_list == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (line);</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+ list = new_list;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ list[num_lines] = line;</div><div class='add'>+ num_lines++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (num_lines != max_num_lines)</div><div class='add'>+ {</div><div class='add'>+ char **new_list;</div><div class='add'>+</div><div class='add'>+ new_list = (char **)SLrealloc ((char *)list, sizeof (char *) * (num_lines + 1));</div><div class='add'>+ if (new_list == NULL)</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ list = new_list;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ inum_lines = (int) num_lines;</div><div class='add'>+ if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, (VOID_STAR) list, &inum_lines, 1)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_push_array (at, 1))</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ while (num_lines > 0)</div><div class='add'>+ {</div><div class='add'>+ num_lines--;</div><div class='add'>+ SLfree (list[num_lines]);</div><div class='add'>+ }</div><div class='add'>+ SLfree ((char *)list);</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void stdio_fgetslines (void)</div><div class='add'>+{</div><div class='add'>+ unsigned int n;</div><div class='add'>+ FILE *fp;</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+</div><div class='add'>+ n = (unsigned int)-1;</div><div class='add'>+</div><div class='add'>+ if (SLang_Num_Function_Args == 2)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLang_pop_uinteger (&n))</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (NULL == (mmt = pop_fp (SL_READ, &fp)))</div><div class='add'>+ {</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ stdio_fgetslines_internal (fp, n);</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int stdio_fputs (char *s, SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+</div><div class='add'>+ if (NULL == (fp = check_fp (t, SL_WRITE)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (EOF == fputs(s, fp)) return -1;</div><div class='add'>+ return (int) strlen (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_fflush (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+</div><div class='add'>+ if (NULL == (fp = check_fp (t, SL_WRITE)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (EOF == fflush (fp))</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Usage: n = fread (&str, data-type, nelems, fp); */</div><div class='add'>+static void stdio_fread (SLang_Ref_Type *ref, int *data_typep, unsigned int *num_elemns, SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+ char *s;</div><div class='add'>+ FILE *fp;</div><div class='add'>+ int ret;</div><div class='add'>+ unsigned int num_read, num_to_read;</div><div class='add'>+ unsigned int nbytes;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+ int data_type;</div><div class='add'>+</div><div class='add'>+ ret = -1;</div><div class='add'>+ s = NULL;</div><div class='add'>+ cl = NULL;</div><div class='add'>+</div><div class='add'>+ if (NULL == (fp = check_fp (t, SL_READ)))</div><div class='add'>+ goto the_return;</div><div class='add'>+</div><div class='add'>+ /* FIXME: priority = low : I should add some mechanism to support</div><div class='add'>+ * other types.</div><div class='add'>+ */</div><div class='add'>+ data_type = *data_typep;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class ((unsigned char) data_type);</div><div class='add'>+</div><div class='add'>+ if (cl->cl_fread == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "fread does not support %s objects",</div><div class='add'>+ cl->cl_name);</div><div class='add'>+ goto the_return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ sizeof_type = cl->cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+ num_to_read = *num_elemns;</div><div class='add'>+ nbytes = (unsigned int) num_to_read * sizeof_type;</div><div class='add'>+</div><div class='add'>+ s = SLmalloc (nbytes + 1);</div><div class='add'>+ if (s == NULL)</div><div class='add'>+ goto the_return;</div><div class='add'>+</div><div class='add'>+ ret = cl->cl_fread (data_type, fp, (VOID_STAR)s, num_to_read, &num_read);</div><div class='add'>+</div><div class='add'>+ if ((num_read == 0)</div><div class='add'>+ && (num_read != num_to_read))</div><div class='add'>+ ret = -1;</div><div class='add'>+</div><div class='add'>+ if ((ret == -1) && ferror (fp))</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+</div><div class='add'>+ if ((ret == 0)</div><div class='add'>+ && (num_read != num_to_read))</div><div class='add'>+ {</div><div class='add'>+ char *new_s;</div><div class='add'>+</div><div class='add'>+ nbytes = num_read * sizeof_type;</div><div class='add'>+ new_s = SLrealloc (s, nbytes + 1);</div><div class='add'>+ if (new_s == NULL)</div><div class='add'>+ ret = -1;</div><div class='add'>+ else</div><div class='add'>+ s = new_s;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ret == 0)</div><div class='add'>+ {</div><div class='add'>+ if (num_read == 1)</div><div class='add'>+ {</div><div class='add'>+ ret = SLang_assign_to_ref (ref, data_type, (VOID_STAR)s);</div><div class='add'>+ SLfree (s);</div><div class='add'>+ }</div><div class='add'>+ else if ((data_type == SLANG_CHAR_TYPE)</div><div class='add'>+ || (data_type == SLANG_UCHAR_TYPE))</div><div class='add'>+ {</div><div class='add'>+ SLang_BString_Type *bs;</div><div class='add'>+</div><div class='add'>+ bs = SLbstring_create_malloced ((unsigned char *)s, num_read, 1);</div><div class='add'>+ ret = SLang_assign_to_ref (ref, SLANG_BSTRING_TYPE, (VOID_STAR)&bs);</div><div class='add'>+ SLbstring_free (bs);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int inum_read = (int) num_read;</div><div class='add'>+ at = SLang_create_array (data_type, 0, (VOID_STAR)s, &inum_read, 1);</div><div class='add'>+ ret = SLang_assign_to_ref (ref, SLANG_ARRAY_TYPE, (VOID_STAR)&at);</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ }</div><div class='add'>+ s = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ the_return:</div><div class='add'>+</div><div class='add'>+ if (s != NULL)</div><div class='add'>+ SLfree (s);</div><div class='add'>+ </div><div class='add'>+ if (ret == -1)</div><div class='add'>+ SLang_push_integer (ret);</div><div class='add'>+ else</div><div class='add'>+ SLang_push_uinteger (num_read);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Usage: n = fwrite (str, fp); */</div><div class='add'>+static void stdio_fwrite (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+ unsigned char *s;</div><div class='add'>+ unsigned int num_to_write, num_write;</div><div class='add'>+ int ret;</div><div class='add'>+ SLang_BString_Type *b;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ ret = -1;</div><div class='add'>+ b = NULL;</div><div class='add'>+ at = NULL;</div><div class='add'>+</div><div class='add'>+ switch (SLang_peek_at_stack ())</div><div class='add'>+ {</div><div class='add'>+ case SLANG_BSTRING_TYPE:</div><div class='add'>+ case SLANG_STRING_TYPE:</div><div class='add'>+ if (-1 == SLang_pop_bstring (&b))</div><div class='add'>+ goto the_return;</div><div class='add'>+</div><div class='add'>+ if (NULL == (s = SLbstring_get_pointer (b, &num_to_write)))</div><div class='add'>+ goto the_return;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (SLANG_UCHAR_TYPE);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ if (-1 == SLang_pop_array (&at, 1))</div><div class='add'>+ goto the_return;</div><div class='add'>+</div><div class='add'>+ cl = at->cl;</div><div class='add'>+ num_to_write = at->num_elements;</div><div class='add'>+ s = (unsigned char *) at->data;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (fp = check_fp (t, SL_WRITE)))</div><div class='add'>+ goto the_return;</div><div class='add'>+</div><div class='add'>+ if (cl->cl_fwrite == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "fwrite does not support %s objects", cl->cl_name);</div><div class='add'>+ goto the_return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ret = cl->cl_fwrite (cl->cl_data_type, fp, s, num_to_write, &num_write);</div><div class='add'>+</div><div class='add'>+ if ((ret == -1) && ferror (fp))</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+</div><div class='add'>+ /* drop */</div><div class='add'>+ the_return:</div><div class='add'>+ if (b != NULL)</div><div class='add'>+ SLbstring_free (b);</div><div class='add'>+ if (at != NULL)</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+</div><div class='add'>+ if (ret == -1)</div><div class='add'>+ SLang_push_integer (ret);</div><div class='add'>+ else</div><div class='add'>+ SLang_push_uinteger (num_write);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_fseek (SL_File_Table_Type *t, int *ofs, int *whence)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+</div><div class='add'>+ if (NULL == (fp = check_fp (t, 0xFFFF)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == fseek (fp, (long) *ofs, *whence))</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_ftell (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+ long ofs;</div><div class='add'>+</div><div class='add'>+ if (NULL == (fp = check_fp (t, 0xFFFF)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1L == (ofs = ftell (fp)))</div><div class='add'>+ {</div><div class='add'>+ _SLerrno_errno = errno;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return (int) ofs;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_feof (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+</div><div class='add'>+ if (NULL == (fp = check_fp (t, 0xFFFF)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return feof (fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_ferror (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+</div><div class='add'>+ if (NULL == (fp = check_fp (t, 0xFFFF)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return ferror (fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void stdio_clearerr (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+</div><div class='add'>+ if (NULL != (fp = check_fp (t, 0xFFFF)))</div><div class='add'>+ clearerr (fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* () = fprintf (fp, "FORMAT", arg...); */</div><div class='add'>+static int stdio_fprintf (void)</div><div class='add'>+{</div><div class='add'>+ char *s;</div><div class='add'>+ FILE *fp;</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 2))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ if (-1 == SLang_pop_slstring (&s))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ if (NULL == (mmt = pop_fp (SL_WRITE, &fp)))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (EOF == fputs(s, fp))</div><div class='add'>+ status = -1;</div><div class='add'>+ else</div><div class='add'>+ status = (int) strlen (s);</div><div class='add'>+</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+ return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_printf (void)</div><div class='add'>+{</div><div class='add'>+ char *s;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 1))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_slstring (&s))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ if (EOF == fputs(s, stdout))</div><div class='add'>+ status = -1;</div><div class='add'>+ else</div><div class='add'>+ status = (int) strlen (s);</div><div class='add'>+</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+ return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+#define F SLANG_FILE_PTR_TYPE</div><div class='add'>+#define R SLANG_REF_TYPE</div><div class='add'>+#define I SLANG_INT_TYPE</div><div class='add'>+#define V SLANG_VOID_TYPE</div><div class='add'>+#define S SLANG_STRING_TYPE</div><div class='add'>+#define B SLANG_BSTRING_TYPE</div><div class='add'>+#define U SLANG_UINT_TYPE</div><div class='add'>+#define D SLANG_DATATYPE_TYPE</div><div class='add'>+static SLang_Intrin_Fun_Type Stdio_Name_Table[] =</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_0("fgetslines", stdio_fgetslines, V),</div><div class='add'>+ MAKE_INTRINSIC_SS("fopen", stdio_fopen, V),</div><div class='add'>+ MAKE_INTRINSIC_1("feof", stdio_feof, I, F),</div><div class='add'>+ MAKE_INTRINSIC_1("ferror", stdio_ferror, I, F),</div><div class='add'>+ MAKE_INTRINSIC_1("fclose", stdio_fclose, I, F),</div><div class='add'>+ MAKE_INTRINSIC_2("fgets", stdio_fgets, I, R, F),</div><div class='add'>+ MAKE_INTRINSIC_1("fflush", stdio_fflush, I, F),</div><div class='add'>+ MAKE_INTRINSIC_2("fputs", stdio_fputs, I, S, F),</div><div class='add'>+ MAKE_INTRINSIC_0("fprintf", stdio_fprintf, I),</div><div class='add'>+ MAKE_INTRINSIC_0("printf", stdio_printf, I),</div><div class='add'>+ MAKE_INTRINSIC_3("fseek", stdio_fseek, I, F, I, I),</div><div class='add'>+ MAKE_INTRINSIC_1("ftell", stdio_ftell, I, F),</div><div class='add'>+ MAKE_INTRINSIC_1("clearerr", stdio_clearerr, V, F),</div><div class='add'>+ MAKE_INTRINSIC_4("fread", stdio_fread, V, R, D, U, F),</div><div class='add'>+ MAKE_INTRINSIC_1("fwrite", stdio_fwrite, V, F),</div><div class='add'>+#ifdef HAVE_POPEN</div><div class='add'>+ MAKE_INTRINSIC_SS("popen", stdio_popen, V),</div><div class='add'>+ MAKE_INTRINSIC_1("pclose", stdio_fclose, I, F),</div><div class='add'>+#endif</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+#undef F</div><div class='add'>+#undef I</div><div class='add'>+#undef R</div><div class='add'>+#undef V</div><div class='add'>+#undef S</div><div class='add'>+#undef B</div><div class='add'>+#undef U</div><div class='add'>+#undef D</div><div class='add'>+</div><div class='add'>+#ifndef SEEK_SET</div><div class='add'>+# define SEEK_SET 0</div><div class='add'>+#endif</div><div class='add'>+#ifndef SEEK_CUR</div><div class='add'>+# define SEEK_CUR 1</div><div class='add'>+#endif</div><div class='add'>+#ifndef SEEK_END</div><div class='add'>+# define SEEK_END 2</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_IConstant_Type Stdio_Consts [] =</div><div class='add'>+{</div><div class='add'>+ MAKE_ICONSTANT("SEEK_SET", SEEK_SET),</div><div class='add'>+ MAKE_ICONSTANT("SEEK_END", SEEK_END),</div><div class='add'>+ MAKE_ICONSTANT("SEEK_CUR", SEEK_CUR),</div><div class='add'>+ SLANG_END_ICONST_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void destroy_file_type (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ (void) close_file_type ((SL_File_Table_Type *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct _SLang_Foreach_Context_Type</div><div class='add'>+{</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+ FILE *fp;</div><div class='add'>+#define CTX_USE_LINE 1</div><div class='add'>+#define CTX_USE_CHAR 2</div><div class='add'>+ unsigned char type;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static SLang_Foreach_Context_Type *</div><div class='add'>+cl_foreach_open (unsigned char type, unsigned int num)</div><div class='add'>+{</div><div class='add'>+ SLang_Foreach_Context_Type *c;</div><div class='add'>+ SLang_MMT_Type *mmt;</div><div class='add'>+ FILE *fp;</div><div class='add'>+</div><div class='add'>+ if (NULL == (mmt = pop_fp (SL_READ, &fp)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ type = CTX_USE_LINE;</div><div class='add'>+</div><div class='add'>+ switch (num)</div><div class='add'>+ {</div><div class='add'>+ char *s;</div><div class='add'>+</div><div class='add'>+ case 0:</div><div class='add'>+ type = CTX_USE_LINE;</div><div class='add'>+ break;</div><div class='add'>+ </div><div class='add'>+ case 1:</div><div class='add'>+ if (-1 == SLang_pop_slstring (&s))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ if (0 == strcmp (s, "char"))</div><div class='add'>+ type = CTX_USE_CHAR;</div><div class='add'>+ else if (0 == strcmp (s, "line"))</div><div class='add'>+ type = CTX_USE_LINE;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "using '%s' not supported by File_Type",</div><div class='add'>+ s);</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ SLdo_pop_n (num);</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, </div><div class='add'>+ "Usage: foreach (File_Type) using ([line|char])");</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (c = (SLang_Foreach_Context_Type *) SLmalloc (sizeof (SLang_Foreach_Context_Type))))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_mmt (mmt);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+</div><div class='add'>+ c->type = type;</div><div class='add'>+ c->mmt = mmt;</div><div class='add'>+ c->fp = fp;</div><div class='add'>+</div><div class='add'>+ return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void cl_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ if (c == NULL) return;</div><div class='add'>+ SLang_free_mmt (c->mmt);</div><div class='add'>+ SLfree ((char *) c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int cl_foreach (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+ int status;</div><div class='add'>+ int ch;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char *s;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+</div><div class='add'>+ if (c == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ switch (c->type)</div><div class='add'>+ {</div><div class='add'>+ case CTX_USE_CHAR:</div><div class='add'>+ if (EOF == (ch = getc (c->fp)))</div><div class='add'>+ return 0;</div><div class='add'>+ if (-1 == SLang_push_uchar ((unsigned char) ch))</div><div class='add'>+ return -1;</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+ case CTX_USE_LINE:</div><div class='add'>+ status = read_one_line (c->fp, &s, &len);</div><div class='add'>+ if (status <= 0)</div><div class='add'>+ return status;</div><div class='add'>+ if (0 == _SLang_push_slstring (s))</div><div class='add'>+ return 1;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int Stdio_Initialized;</div><div class='add'>+static SLang_MMT_Type *Stdio_Mmts[3];</div><div class='add'>+</div><div class='add'>+int SLang_init_stdio (void)</div><div class='add'>+{</div><div class='add'>+ unsigned int i;</div><div class='add'>+ SL_File_Table_Type *s;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ char *names[3];</div><div class='add'>+</div><div class='add'>+ if (Stdio_Initialized)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ SL_File_Table = (SL_File_Table_Type *)SLcalloc(sizeof (SL_File_Table_Type), SL_MAX_FILES);</div><div class='add'>+ if (SL_File_Table == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("File_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+ cl->cl_destroy = destroy_file_type;</div><div class='add'>+ cl->cl_foreach_open = cl_foreach_open;</div><div class='add'>+ cl->cl_foreach_close = cl_foreach_close;</div><div class='add'>+ cl->cl_foreach = cl_foreach;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_FILE_PTR_TYPE, sizeof (SL_File_Table_Type), SLANG_CLASS_TYPE_MMT))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLadd_intrin_fun_table(Stdio_Name_Table, "__STDIO__"))</div><div class='add'>+ || (-1 == SLadd_iconstant_table (Stdio_Consts, NULL))</div><div class='add'>+ || (-1 == _SLerrno_init ()))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ names[0] = "stdin";</div><div class='add'>+ names[1] = "stdout";</div><div class='add'>+ names[2] = "stderr";</div><div class='add'>+</div><div class='add'>+ s = SL_File_Table;</div><div class='add'>+ s->fp = stdin; s->flags = SL_READ;</div><div class='add'>+</div><div class='add'>+ s++;</div><div class='add'>+ s->fp = stdout; s->flags = SL_WRITE;</div><div class='add'>+</div><div class='add'>+ s++;</div><div class='add'>+ s->fp = stderr; s->flags = SL_WRITE|SL_READ;</div><div class='add'>+</div><div class='add'>+ s = SL_File_Table;</div><div class='add'>+ for (i = 0; i < 3; i++)</div><div class='add'>+ {</div><div class='add'>+ if (NULL == (s->file = SLang_create_slstring (names[i])))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (NULL == (Stdio_Mmts[i] = SLang_create_mmt (SLANG_FILE_PTR_TYPE, (VOID_STAR) s)))</div><div class='add'>+ return -1;</div><div class='add'>+ SLang_inc_mmt (Stdio_Mmts[i]);</div><div class='add'>+</div><div class='add'>+ if (-1 == SLadd_intrinsic_variable (s->file, (VOID_STAR)&Stdio_Mmts[i], SLANG_FILE_PTR_TYPE, 1))</div><div class='add'>+ return -1;</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Stdio_Initialized = 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slstring.c b/mdk-stage1/slang/slstring.c<br/>new file mode 100644<br/>index 000000000..529c41827<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slstring.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstring.c</a></div><div class='hunk'>@@ -0,0 +1,546 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+typedef struct _SLstring_Type</div><div class='add'>+{</div><div class='add'>+ struct _SLstring_Type *next;</div><div class='add'>+ unsigned int ref_count;</div><div class='add'>+ char bytes [1];</div><div class='add'>+}</div><div class='add'>+SLstring_Type;</div><div class='add'>+</div><div class='add'>+static SLstring_Type *String_Hash_Table [SLSTRING_HASH_TABLE_SIZE];</div><div class='add'>+static char Single_Char_Strings [256 * 2];</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+#define MAX_FREE_STORE_LEN 32</div><div class='add'>+static SLstring_Type *SLS_Free_Store [MAX_FREE_STORE_LEN];</div><div class='add'>+</div><div class='add'>+# define NUM_CACHED_STRINGS 601</div><div class='add'>+typedef struct </div><div class='add'>+{</div><div class='add'>+ unsigned long hash;</div><div class='add'>+ SLstring_Type *sls;</div><div class='add'>+ unsigned int len;</div><div class='add'>+}</div><div class='add'>+Cached_String_Type;</div><div class='add'>+static Cached_String_Type Cached_Strings [NUM_CACHED_STRINGS];</div><div class='add'>+</div><div class='add'>+#define GET_CACHED_STRING(s) \</div><div class='add'>+ (Cached_Strings + (unsigned int)(((unsigned long) (s)) % NUM_CACHED_STRINGS))</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static void cache_string (SLstring_Type *sls, unsigned int len, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ Cached_String_Type *cs;</div><div class='add'>+ </div><div class='add'>+ cs = GET_CACHED_STRING(sls->bytes);</div><div class='add'>+ cs->sls = sls;</div><div class='add'>+ cs->hash = hash;</div><div class='add'>+ cs->len = len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static void uncache_string (char *s)</div><div class='add'>+{</div><div class='add'>+ Cached_String_Type *cs;</div><div class='add'>+ </div><div class='add'>+ cs = GET_CACHED_STRING(s);</div><div class='add'>+ if ((cs->sls != NULL)</div><div class='add'>+ && (cs->sls->bytes == s))</div><div class='add'>+ cs->sls = NULL;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+unsigned long _SLstring_hash (unsigned char *s, unsigned char *smax)</div><div class='add'>+{</div><div class='add'>+ register unsigned long h = 0;</div><div class='add'>+ register unsigned long sum = 0;</div><div class='add'>+ unsigned char *smax4;</div><div class='add'>+</div><div class='add'>+ smax4 = smax - 4;</div><div class='add'>+</div><div class='add'>+ while (s < smax4)</div><div class='add'>+ {</div><div class='add'>+ sum += s[0];</div><div class='add'>+ h = sum + (h << 1);</div><div class='add'>+ sum += s[1];</div><div class='add'>+ h = sum + (h << 1);</div><div class='add'>+ sum += s[2];</div><div class='add'>+ h = sum + (h << 1);</div><div class='add'>+ sum += s[3];</div><div class='add'>+ h = sum + (h << 1);</div><div class='add'>+ </div><div class='add'>+ s += 4;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (s < smax)</div><div class='add'>+ {</div><div class='add'>+ sum += *s++;</div><div class='add'>+ h ^= sum + (h << 3); /* slightly different */</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return h;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned long _SLcompute_string_hash (char *s)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ Cached_String_Type *cs;</div><div class='add'>+ SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+ cs = GET_CACHED_STRING(s);</div><div class='add'>+ if (((sls = cs->sls) != NULL)</div><div class='add'>+ && (sls->bytes == s))</div><div class='add'>+ return cs->hash;</div><div class='add'>+#endif</div><div class='add'>+ return _SLstring_hash ((unsigned char *) s, (unsigned char *) s + strlen (s));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+/* This routine works with any (long) string */</div><div class='add'>+static SLstring_Type *find_string (char *s, unsigned int len, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ SLstring_Type *sls;</div><div class='add'>+ char ch;</div><div class='add'>+</div><div class='add'>+ sls = String_Hash_Table [(unsigned int)(hash % SLSTRING_HASH_TABLE_SIZE)];</div><div class='add'>+</div><div class='add'>+ if (sls == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ ch = s[0];</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ char *bytes = sls->bytes;</div><div class='add'>+</div><div class='add'>+ /* Note that we need to actually make sure that bytes[len] == 0. </div><div class='add'>+ * In this case, it is not enough to just compare pointers. In fact,</div><div class='add'>+ * this is called from create_nstring, etc... It is unlikely that the</div><div class='add'>+ * pointer is a slstring</div><div class='add'>+ */</div><div class='add'>+ if ((/* (s == bytes) || */ ((ch == bytes[0])</div><div class='add'>+ && (0 == strncmp (s, bytes, len))))</div><div class='add'>+ && (bytes [len] == 0))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ sls = sls->next;</div><div class='add'>+ }</div><div class='add'>+ while (sls != NULL);</div><div class='add'>+</div><div class='add'>+ return sls;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static SLstring_Type *find_slstring (char *s, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+ sls = String_Hash_Table [(unsigned int)(hash % SLSTRING_HASH_TABLE_SIZE)];</div><div class='add'>+ while (sls != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (s == sls->bytes)</div><div class='add'>+ return sls;</div><div class='add'>+</div><div class='add'>+ sls = sls->next;</div><div class='add'>+ }</div><div class='add'>+ return sls;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static SLstring_Type *allocate_sls (unsigned int len)</div><div class='add'>+{</div><div class='add'>+ SLstring_Type *sls;</div><div class='add'>+ </div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if ((len < MAX_FREE_STORE_LEN)</div><div class='add'>+ && (NULL != (sls = SLS_Free_Store [len])))</div><div class='add'>+ {</div><div class='add'>+ SLS_Free_Store[len] = NULL;</div><div class='add'>+ return sls;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ /* FIXME: use structure padding */</div><div class='add'>+ return (SLstring_Type *) SLmalloc (len + sizeof (SLstring_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static void free_sls (SLstring_Type *sls, unsigned int len)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if ((len < MAX_FREE_STORE_LEN)</div><div class='add'>+ && (SLS_Free_Store[len] == NULL))</div><div class='add'>+ {</div><div class='add'>+ SLS_Free_Store [len] = sls;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ (void) len;</div><div class='add'>+#endif</div><div class='add'>+ SLfree ((char *)sls);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static char *create_long_string (char *s, unsigned int len, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+ sls = find_string (s, len, hash);</div><div class='add'>+</div><div class='add'>+ if (sls != NULL)</div><div class='add'>+ {</div><div class='add'>+ sls->ref_count++;</div><div class='add'>+ s = sls->bytes;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ cache_string (sls, len, hash); </div><div class='add'>+#endif</div><div class='add'>+ return s;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ sls = allocate_sls (len);</div><div class='add'>+ if (sls == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ strncpy (sls->bytes, s, len);</div><div class='add'>+ sls->bytes[len] = 0;</div><div class='add'>+ sls->ref_count = 1;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ cache_string (sls, len, hash);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ hash = hash % SLSTRING_HASH_TABLE_SIZE;</div><div class='add'>+ sls->next = String_Hash_Table [(unsigned int)hash];</div><div class='add'>+ String_Hash_Table [(unsigned int)hash] = sls;</div><div class='add'>+</div><div class='add'>+ return sls->bytes;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static char *create_short_string (char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ char ch;</div><div class='add'>+</div><div class='add'>+ /* Note: if len is 0, then it does not matter what *s is. This is</div><div class='add'>+ * important for SLang_create_nslstring.</div><div class='add'>+ */</div><div class='add'>+ if (len) ch = *s; else ch = 0;</div><div class='add'>+</div><div class='add'>+ len = 2 * (unsigned int) ((unsigned char) ch);</div><div class='add'>+ Single_Char_Strings [len] = ch;</div><div class='add'>+ Single_Char_Strings [len + 1] = 0;</div><div class='add'>+ return Single_Char_Strings + len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* s cannot be NULL */</div><div class='add'>+_INLINE_</div><div class='add'>+static char *create_nstring (char *s, unsigned int len, unsigned long *hash_ptr)</div><div class='add'>+{</div><div class='add'>+ unsigned long hash;</div><div class='add'>+</div><div class='add'>+ if (len < 2)</div><div class='add'>+ return create_short_string (s, len);</div><div class='add'>+</div><div class='add'>+ hash = _SLstring_hash ((unsigned char *) s, (unsigned char *) (s + len));</div><div class='add'>+ *hash_ptr = hash;</div><div class='add'>+</div><div class='add'>+ return create_long_string (s, len, hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLang_create_nslstring (char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ unsigned long hash;</div><div class='add'>+ return create_nstring (s, len, &hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *_SLstring_make_hashed_string (char *s, unsigned int len, unsigned long *hashptr)</div><div class='add'>+{</div><div class='add'>+ unsigned long hash;</div><div class='add'>+</div><div class='add'>+ if (s == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+ hash = _SLstring_hash ((unsigned char *) s, (unsigned char *) s + len);</div><div class='add'>+ *hashptr = hash;</div><div class='add'>+</div><div class='add'>+ if (len < 2)</div><div class='add'>+ return create_short_string (s, len);</div><div class='add'>+</div><div class='add'>+ return create_long_string (s, len, hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *_SLstring_dup_hashed_string (char *s, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ unsigned int len;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ Cached_String_Type *cs;</div><div class='add'>+ SLstring_Type *sls;</div><div class='add'>+ </div><div class='add'>+ if (s == NULL) return NULL;</div><div class='add'>+ if (s[0] == 0)</div><div class='add'>+ return create_short_string (s, 0);</div><div class='add'>+ if (s[1] == 0)</div><div class='add'>+ return create_short_string (s, 1);</div><div class='add'>+ </div><div class='add'>+ cs = GET_CACHED_STRING(s);</div><div class='add'>+ if (((sls = cs->sls) != NULL)</div><div class='add'>+ && (sls->bytes == s))</div><div class='add'>+ {</div><div class='add'>+ sls->ref_count += 1;</div><div class='add'>+ return s;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (s == NULL) return NULL;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ len = strlen (s);</div><div class='add'>+#if !_SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ if (len < 2) return create_short_string (s, len);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ return create_long_string (s, len, hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *_SLstring_dup_slstring (char *s)</div><div class='add'>+{</div><div class='add'>+ SLstring_Type *sls;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ unsigned long hash;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ Cached_String_Type *cs;</div><div class='add'>+ </div><div class='add'>+ cs = GET_CACHED_STRING(s);</div><div class='add'>+ if (((sls = cs->sls) != NULL)</div><div class='add'>+ && (sls->bytes == s))</div><div class='add'>+ {</div><div class='add'>+ sls->ref_count += 1;</div><div class='add'>+ return s;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ </div><div class='add'>+ if ((s == NULL) || ((len = strlen (s)) < 2))</div><div class='add'>+ return s;</div><div class='add'>+</div><div class='add'>+ hash = _SLstring_hash ((unsigned char *)s, (unsigned char *)(s + len));</div><div class='add'>+</div><div class='add'>+ sls = find_slstring (s, hash);</div><div class='add'>+ if (sls == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ sls->ref_count++;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ cache_string (sls, len, hash);</div><div class='add'>+#endif</div><div class='add'>+ return s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void free_sls_string (SLstring_Type *sls, char *s, unsigned int len, </div><div class='add'>+ unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ SLstring_Type *sls1, *prev;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ uncache_string (s);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ hash = hash % SLSTRING_HASH_TABLE_SIZE;</div><div class='add'>+</div><div class='add'>+ sls1 = String_Hash_Table [(unsigned int) hash];</div><div class='add'>+</div><div class='add'>+ prev = NULL;</div><div class='add'>+</div><div class='add'>+ /* This should not fail. */</div><div class='add'>+ while (sls1 != sls)</div><div class='add'>+ {</div><div class='add'>+ prev = sls1;</div><div class='add'>+ sls1 = sls1->next;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (prev != NULL)</div><div class='add'>+ prev->next = sls->next;</div><div class='add'>+ else</div><div class='add'>+ String_Hash_Table [(unsigned int) hash] = sls->next;</div><div class='add'>+</div><div class='add'>+ free_sls (sls, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static void free_long_string (char *s, unsigned int len, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+ if (NULL == (sls = find_slstring (s, hash)))</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror ("Application internal error: invalid attempt to free string");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ sls->ref_count--;</div><div class='add'>+ if (sls->ref_count != 0)</div><div class='add'>+ {</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ /* cache_string (sls, len, hash); */</div><div class='add'>+#endif</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+</div><div class='add'>+ free_sls_string (sls, s, len, hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This routine may be passed NULL-- it is not an error. */</div><div class='add'>+void SLang_free_slstring (char *s)</div><div class='add'>+{</div><div class='add'>+ unsigned long hash;</div><div class='add'>+ unsigned int len;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ Cached_String_Type *cs;</div><div class='add'>+ SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+ cs = GET_CACHED_STRING(s);</div><div class='add'>+ if (((sls = cs->sls) != NULL)</div><div class='add'>+ && (sls->bytes == s))</div><div class='add'>+ {</div><div class='add'>+ if (sls->ref_count <= 1)</div><div class='add'>+ free_sls_string (sls, s, cs->len, cs->hash);</div><div class='add'>+ else</div><div class='add'>+ sls->ref_count -= 1;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (s == NULL) return;</div><div class='add'>+</div><div class='add'>+ if ((len = strlen (s)) < 2)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ hash = _SLstring_hash ((unsigned char *)s, (unsigned char *) s + len);</div><div class='add'>+ free_long_string (s, len, hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLang_create_slstring (char *s)</div><div class='add'>+{</div><div class='add'>+ unsigned long hash;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ Cached_String_Type *cs;</div><div class='add'>+ SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+ cs = GET_CACHED_STRING(s);</div><div class='add'>+ if (((sls = cs->sls) != NULL)</div><div class='add'>+ && (sls->bytes == s))</div><div class='add'>+ {</div><div class='add'>+ sls->ref_count += 1;</div><div class='add'>+ return s;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (s == NULL) return NULL;</div><div class='add'>+ return create_nstring (s, strlen (s), &hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLfree_hashed_string (char *s, unsigned int len, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+ if ((s == NULL) || (len < 2)) return;</div><div class='add'>+ free_long_string (s, len, hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+char *_SLallocate_slstring (unsigned int len)</div><div class='add'>+{</div><div class='add'>+ SLstring_Type *sls = allocate_sls (len);</div><div class='add'>+ if (sls == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ return sls->bytes;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLunallocate_slstring (char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ SLstring_Type *sls;</div><div class='add'>+ </div><div class='add'>+ if (s == NULL)</div><div class='add'>+ return;</div><div class='add'>+ </div><div class='add'>+ sls = (SLstring_Type *) (s - offsetof(SLstring_Type,bytes[0]));</div><div class='add'>+ free_sls (sls, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *_SLcreate_via_alloced_slstring (char *s, unsigned int len)</div><div class='add'>+{ </div><div class='add'>+ unsigned long hash;</div><div class='add'>+ SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+ if (s == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+ </div><div class='add'>+ if (len < 2)</div><div class='add'>+ {</div><div class='add'>+ char *s1 = create_short_string (s, len);</div><div class='add'>+ _SLunallocate_slstring (s, len);</div><div class='add'>+ return s1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* s is not going to be in the cache because when it was malloced, its</div><div class='add'>+ * value was unknown. This simplifies the coding.</div><div class='add'>+ */</div><div class='add'>+ hash = _SLstring_hash ((unsigned char *)s, (unsigned char *)s + len);</div><div class='add'>+ sls = find_string (s, len, hash);</div><div class='add'>+ if (sls != NULL)</div><div class='add'>+ {</div><div class='add'>+ sls->ref_count++;</div><div class='add'>+ _SLunallocate_slstring (s, len);</div><div class='add'>+ s = sls->bytes;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ cache_string (sls, len, hash); </div><div class='add'>+#endif</div><div class='add'>+ return s;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ sls = (SLstring_Type *) (s - offsetof(SLstring_Type,bytes[0]));</div><div class='add'>+ sls->ref_count = 1;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+ cache_string (sls, len, hash);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ hash = hash % SLSTRING_HASH_TABLE_SIZE;</div><div class='add'>+ sls->next = String_Hash_Table [(unsigned int)hash];</div><div class='add'>+ String_Hash_Table [(unsigned int)hash] = sls;</div><div class='add'>+</div><div class='add'>+ return s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note, a and b may be ordinary strings. The result is an slstring */</div><div class='add'>+char *SLang_concat_slstrings (char *a, char *b)</div><div class='add'>+{</div><div class='add'>+ unsigned int lena, len;</div><div class='add'>+ char *c;</div><div class='add'>+</div><div class='add'>+ lena = strlen (a);</div><div class='add'>+ len = lena + strlen (b);</div><div class='add'>+</div><div class='add'>+ c = _SLallocate_slstring (len);</div><div class='add'>+ if (c == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ strcpy (c, a);</div><div class='add'>+ strcpy (c + lena, b);</div><div class='add'>+</div><div class='add'>+ return _SLcreate_via_alloced_slstring (c, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slstrops.c b/mdk-stage1/slang/slstrops.c<br/>new file mode 100644<br/>index 000000000..a57ef6389<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slstrops.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstrops.c</a></div><div class='hunk'>@@ -0,0 +1,1686 @@</div><div class='add'>+/* -*- mode: C; mode: fold; -*- */</div><div class='add'>+/* string manipulation functions for S-Lang. */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+/*{{{ Include Files */</div><div class='add'>+</div><div class='add'>+#include <time.h></div><div class='add'>+</div><div class='add'>+#ifndef __QNX__</div><div class='add'>+# if defined(__GO32__) || defined(__WATCOMC__)</div><div class='add'>+# include <dos.h></div><div class='add'>+# include <bios.h></div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+#include <math.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include <string.h></div><div class='add'>+#include <stdarg.h></div><div class='add'>+#include <ctype.h></div><div class='add'>+</div><div class='add'>+#ifndef isdigit</div><div class='add'>+# define isdigit(x) (((x) >= '0') && ((x) <= '9'))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+#define USE_ALLOC_STSTRING 1</div><div class='add'>+</div><div class='add'>+/*{{{ Utility Functions */</div><div class='add'>+</div><div class='add'>+static char Utility_Char_Table [256];</div><div class='add'>+static unsigned char WhiteSpace_Lut[256];</div><div class='add'>+</div><div class='add'>+static void set_utility_char_table (char *pos) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ register char *t = Utility_Char_Table, *tmax;</div><div class='add'>+ register unsigned char ch;</div><div class='add'>+</div><div class='add'>+ tmax = t + 256;</div><div class='add'>+ while (t < tmax) *t++ = 0;</div><div class='add'>+</div><div class='add'>+ t = Utility_Char_Table;</div><div class='add'>+ while ((ch = (unsigned char) *pos++) != 0) t[ch] = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static unsigned char *make_whitespace_lut (void)</div><div class='add'>+{</div><div class='add'>+ if (WhiteSpace_Lut[' '] != 1)</div><div class='add'>+ {</div><div class='add'>+ WhiteSpace_Lut[' '] = WhiteSpace_Lut['\r'] </div><div class='add'>+ = WhiteSpace_Lut ['\n'] = WhiteSpace_Lut['\t']</div><div class='add'>+ = WhiteSpace_Lut ['\f'] = 1;</div><div class='add'>+ }</div><div class='add'>+ return WhiteSpace_Lut;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char *make_lut (unsigned char *s, unsigned char *lut)</div><div class='add'>+{</div><div class='add'>+ int reverse = 0;</div><div class='add'>+ </div><div class='add'>+ if (*s == '^')</div><div class='add'>+ {</div><div class='add'>+ reverse = 1;</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+ SLmake_lut (lut, s, reverse);</div><div class='add'>+ return lut;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned int do_trim (char **beg, int do_beg, </div><div class='add'>+ char **end, int do_end, </div><div class='add'>+ char *white) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char *a, *b;</div><div class='add'>+</div><div class='add'>+ set_utility_char_table (white);</div><div class='add'>+</div><div class='add'>+ a = *beg;</div><div class='add'>+ len = strlen (a);</div><div class='add'>+ b = a + len;</div><div class='add'>+</div><div class='add'>+ if (do_beg)</div><div class='add'>+ while (Utility_Char_Table[(unsigned char) *a]) a++;</div><div class='add'>+</div><div class='add'>+ if (do_end)</div><div class='add'>+ {</div><div class='add'>+ b--;</div><div class='add'>+ while ((b >= a) && (Utility_Char_Table[(unsigned char) *b])) b--;</div><div class='add'>+ b++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ len = (unsigned int) (b - a);</div><div class='add'>+ *beg = a;</div><div class='add'>+ *end = b;</div><div class='add'>+ return len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int pop_3_strings (char **a, char **b, char **c)</div><div class='add'>+{</div><div class='add'>+ *a = *b = *c = NULL;</div><div class='add'>+ if (-1 == SLpop_string (c))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ if (-1 == SLpop_string (b))</div><div class='add'>+ {</div><div class='add'>+ SLfree (*c);</div><div class='add'>+ *c = NULL;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLpop_string (a))</div><div class='add'>+ {</div><div class='add'>+ SLfree (*b);</div><div class='add'>+ SLfree (*c);</div><div class='add'>+ *b = *c = NULL;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void free_3_strings (char *a, char *b, char *c)</div><div class='add'>+{</div><div class='add'>+ SLfree (a);</div><div class='add'>+ SLfree (b);</div><div class='add'>+ SLfree (c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strcat_cmd (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char *c, *c1;</div><div class='add'>+ int nargs;</div><div class='add'>+ int i;</div><div class='add'>+ char **ptrs;</div><div class='add'>+ unsigned int len;</div><div class='add'>+#if !USE_ALLOC_STSTRING</div><div class='add'>+ char buf[256];</div><div class='add'>+#endif</div><div class='add'>+ nargs = SLang_Num_Function_Args;</div><div class='add'>+ if (nargs <= 0) nargs = 2;</div><div class='add'>+</div><div class='add'>+ if (NULL == (ptrs = (char **)SLmalloc (nargs * sizeof (char *))))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ memset ((char *) ptrs, 0, sizeof (char *) * nargs);</div><div class='add'>+</div><div class='add'>+ c = NULL;</div><div class='add'>+ i = nargs;</div><div class='add'>+ len = 0;</div><div class='add'>+ while (i != 0)</div><div class='add'>+ {</div><div class='add'>+ char *s;</div><div class='add'>+</div><div class='add'>+ i--;</div><div class='add'>+ if (-1 == SLang_pop_slstring (&s))</div><div class='add'>+ goto free_and_return;</div><div class='add'>+ ptrs[i] = s;</div><div class='add'>+ len += strlen (s);</div><div class='add'>+ }</div><div class='add'>+#if USE_ALLOC_STSTRING</div><div class='add'>+ if (NULL == (c = _SLallocate_slstring (len)))</div><div class='add'>+ goto free_and_return;</div><div class='add'>+#else</div><div class='add'>+ len++; /* \0 char */</div><div class='add'>+ if (len <= sizeof (buf))</div><div class='add'>+ c = buf;</div><div class='add'>+ else if (NULL == (c = SLmalloc (len)))</div><div class='add'>+ goto free_and_return;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ c1 = c;</div><div class='add'>+ for (i = 0; i < nargs; i++)</div><div class='add'>+ {</div><div class='add'>+ strcpy (c1, ptrs[i]);</div><div class='add'>+ c1 += strlen (c1);</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ free_and_return:</div><div class='add'>+ for (i = 0; i < nargs; i++)</div><div class='add'>+ SLang_free_slstring (ptrs[i]);</div><div class='add'>+ SLfree ((char *) ptrs);</div><div class='add'>+</div><div class='add'>+#if USE_ALLOC_STSTRING</div><div class='add'>+ (void) _SLpush_alloced_slstring (c, len);</div><div class='add'>+#else</div><div class='add'>+ if (c != buf)</div><div class='add'>+ (void) SLang_push_malloced_string (c); /* NULL ok */</div><div class='add'>+ else</div><div class='add'>+ (void) SLang_push_string (c);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int _SLang_push_nstring (char *a, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ a = SLang_create_nslstring (a, len);</div><div class='add'>+ if (a == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ return _SLang_push_slstring (a);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static void strtrim_cmd_internal (char *str, int do_beg, int do_end)</div><div class='add'>+{</div><div class='add'>+ char *beg, *end, *white;</div><div class='add'>+ int free_str;</div><div class='add'>+ unsigned int len;</div><div class='add'>+</div><div class='add'>+ /* Go through SLpop_string to get a private copy since it will be</div><div class='add'>+ * modified.</div><div class='add'>+ */</div><div class='add'>+ </div><div class='add'>+ free_str = 0;</div><div class='add'>+ if (SLang_Num_Function_Args == 2)</div><div class='add'>+ {</div><div class='add'>+ white = str;</div><div class='add'>+ if (-1 == SLang_pop_slstring (&str))</div><div class='add'>+ return;</div><div class='add'>+ free_str = 1;</div><div class='add'>+ }</div><div class='add'>+ else white = " \t\f\r\n";</div><div class='add'>+</div><div class='add'>+ beg = str;</div><div class='add'>+ len = do_trim (&beg, do_beg, &end, do_end, white);</div><div class='add'>+ </div><div class='add'>+ (void) _SLang_push_nstring (beg, len);</div><div class='add'>+ if (free_str)</div><div class='add'>+ SLang_free_slstring (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+static void strtrim_cmd (char *str)</div><div class='add'>+{</div><div class='add'>+ strtrim_cmd_internal (str, 1, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strtrim_beg_cmd (char *str)</div><div class='add'>+{</div><div class='add'>+ strtrim_cmd_internal (str, 1, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strtrim_end_cmd (char *str)</div><div class='add'>+{</div><div class='add'>+ strtrim_cmd_internal (str, 0, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static void strcompress_cmd (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char *str, *white, *c;</div><div class='add'>+ unsigned char *s, *beg, *end;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char pref_char;</div><div class='add'>+</div><div class='add'>+ if (SLpop_string (&white)) return;</div><div class='add'>+ if (SLpop_string (&str))</div><div class='add'>+ {</div><div class='add'>+ SLfree (white);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* The first character of white is the preferred whitespace character */</div><div class='add'>+ pref_char = *white;</div><div class='add'>+</div><div class='add'>+ beg = (unsigned char *) str;</div><div class='add'>+ (void) do_trim ((char **) &beg, 1, (char **) &end, 1, white);</div><div class='add'>+ SLfree (white);</div><div class='add'>+</div><div class='add'>+ /* Determine the effective length */</div><div class='add'>+ len = 0;</div><div class='add'>+ s = (unsigned char *) beg;</div><div class='add'>+ while (s < end)</div><div class='add'>+ {</div><div class='add'>+ len++;</div><div class='add'>+ if (Utility_Char_Table[*s++])</div><div class='add'>+ {</div><div class='add'>+ while ((s < end) && Utility_Char_Table[*s]) s++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#if USE_ALLOC_STSTRING</div><div class='add'>+ c = _SLallocate_slstring (len);</div><div class='add'>+#else</div><div class='add'>+ c = SLmalloc (len + 1);</div><div class='add'>+#endif</div><div class='add'>+ if (c == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLfree (str);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ s = (unsigned char *) c;</div><div class='add'>+</div><div class='add'>+ while (beg < end)</div><div class='add'>+ {</div><div class='add'>+ unsigned char ch = *beg++;</div><div class='add'>+ </div><div class='add'>+ if (0 == Utility_Char_Table[ch])</div><div class='add'>+ {</div><div class='add'>+ *s++ = ch;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ *s++ = (unsigned char) pref_char;</div><div class='add'>+ </div><div class='add'>+ while ((beg < end) && Utility_Char_Table[*beg]) </div><div class='add'>+ beg++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *s = 0;</div><div class='add'>+ </div><div class='add'>+#if USE_ALLOC_STSTRING</div><div class='add'>+ (void) _SLpush_alloced_slstring (c, len);</div><div class='add'>+#else</div><div class='add'>+ SLang_push_malloced_string(c);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ SLfree(str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int str_replace_cmd_1 (char *orig, char *match, char *rep, unsigned int max_num_replaces,</div><div class='add'>+ char **new_strp) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char *s, *t, *new_str;</div><div class='add'>+ unsigned int rep_len, match_len, new_len;</div><div class='add'>+ unsigned int num_replaces;</div><div class='add'>+</div><div class='add'>+ *new_strp = NULL;</div><div class='add'>+</div><div class='add'>+ match_len = strlen (match);</div><div class='add'>+</div><div class='add'>+ if (match_len == 0)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ num_replaces = 0;</div><div class='add'>+ s = orig;</div><div class='add'>+ while (num_replaces < max_num_replaces)</div><div class='add'>+ {</div><div class='add'>+ s = strstr (s, match);</div><div class='add'>+ if (s == NULL)</div><div class='add'>+ break;</div><div class='add'>+ s += match_len;</div><div class='add'>+ num_replaces++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (num_replaces == 0)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ max_num_replaces = num_replaces;</div><div class='add'>+</div><div class='add'>+ rep_len = strlen (rep);</div><div class='add'>+</div><div class='add'>+ new_len = (strlen (orig) - num_replaces * match_len) + num_replaces * rep_len;</div><div class='add'>+ new_str = SLmalloc (new_len + 1);</div><div class='add'>+ if (new_str == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ s = orig;</div><div class='add'>+ t = new_str;</div><div class='add'>+ </div><div class='add'>+ for (num_replaces = 0; num_replaces < max_num_replaces; num_replaces++)</div><div class='add'>+ {</div><div class='add'>+ char *next_s;</div><div class='add'>+ unsigned int len;</div><div class='add'>+</div><div class='add'>+ next_s = strstr (s, match); /* cannot be NULL */</div><div class='add'>+ len = (unsigned int) (next_s - s);</div><div class='add'>+ strncpy (t, s, len);</div><div class='add'>+ t += len;</div><div class='add'>+ strcpy (t, rep);</div><div class='add'>+ t += rep_len;</div><div class='add'>+ </div><div class='add'>+ s = next_s + match_len;</div><div class='add'>+ }</div><div class='add'>+ strcpy (t, s);</div><div class='add'>+ *new_strp = new_str;</div><div class='add'>+</div><div class='add'>+ return (int) num_replaces;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void reverse_string (char *a)</div><div class='add'>+{</div><div class='add'>+ char *b;</div><div class='add'>+ </div><div class='add'>+ b = a + strlen (a);</div><div class='add'>+ while (b > a)</div><div class='add'>+ {</div><div class='add'>+ char ch;</div><div class='add'>+</div><div class='add'>+ b--;</div><div class='add'>+ ch = *a;</div><div class='add'>+ *a++ = *b;</div><div class='add'>+ *b = ch;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int strreplace_cmd (int *np)</div><div class='add'>+{ </div><div class='add'>+ char *orig, *match, *rep;</div><div class='add'>+ char *new_str;</div><div class='add'>+ int max_num_replaces;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ max_num_replaces = *np;</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_3_strings (&orig, &match, &rep))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (max_num_replaces < 0)</div><div class='add'>+ {</div><div class='add'>+ reverse_string (orig);</div><div class='add'>+ reverse_string (match);</div><div class='add'>+ reverse_string (rep);</div><div class='add'>+ ret = str_replace_cmd_1 (orig, match, rep, -max_num_replaces, &new_str);</div><div class='add'>+ if (ret > 0) reverse_string (new_str);</div><div class='add'>+ else if (ret == 0)</div><div class='add'>+ reverse_string (orig);</div><div class='add'>+ }</div><div class='add'>+ else ret = str_replace_cmd_1 (orig, match, rep, max_num_replaces, &new_str);</div><div class='add'>+ </div><div class='add'>+ if (ret == 0)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLang_push_malloced_string (orig))</div><div class='add'>+ ret = -1;</div><div class='add'>+ orig = NULL;</div><div class='add'>+ }</div><div class='add'>+ else if (ret > 0)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLang_push_malloced_string (new_str))</div><div class='add'>+ ret = -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ free_3_strings (orig, match, rep);</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int str_replace_cmd (char *orig, char *match, char *rep)</div><div class='add'>+{</div><div class='add'>+ char *s;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ ret = str_replace_cmd_1 (orig, match, rep, 1, &s);</div><div class='add'>+ if (ret == 1)</div><div class='add'>+ (void) SLang_push_malloced_string (s);</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+ </div><div class='add'>+static void strtok_cmd (char *str)</div><div class='add'>+{</div><div class='add'>+ _SLString_List_Type sl;</div><div class='add'>+ unsigned char white_buf[256];</div><div class='add'>+ char *s;</div><div class='add'>+ unsigned char *white;</div><div class='add'>+ </div><div class='add'>+ if (SLang_Num_Function_Args == 1)</div><div class='add'>+ white = make_whitespace_lut ();</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ white = white_buf;</div><div class='add'>+ make_lut ((unsigned char *)str, white);</div><div class='add'>+ if (-1 == SLang_pop_slstring (&str))</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLstring_list_init (&sl, 256, 1024))</div><div class='add'>+ goto the_return;</div><div class='add'>+</div><div class='add'>+ s = str;</div><div class='add'>+ while (*s != 0)</div><div class='add'>+ {</div><div class='add'>+ char *s0;</div><div class='add'>+</div><div class='add'>+ s0 = s;</div><div class='add'>+ /* Skip whitespace */</div><div class='add'>+ while ((*s0 != 0) && (0 != white[(unsigned char)*s0]))</div><div class='add'>+ s0++;</div><div class='add'>+</div><div class='add'>+ if (*s0 == 0)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ s = s0;</div><div class='add'>+ while ((*s != 0) && (0 == white[(unsigned char) *s]))</div><div class='add'>+ s++;</div><div class='add'>+</div><div class='add'>+ /* sl deleted upon failure */</div><div class='add'>+ if (-1 == _SLstring_list_append (&sl, SLang_create_nslstring (s0, (unsigned int) (s - s0))))</div><div class='add'>+ goto the_return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Deletes sl */</div><div class='add'>+ (void) _SLstring_list_push (&sl);</div><div class='add'>+</div><div class='add'>+ the_return:</div><div class='add'>+ if (white == white_buf)</div><div class='add'>+ SLang_free_slstring (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This routine returns the string with text removed between single character</div><div class='add'>+ comment delimiters from the set b and e. */</div><div class='add'>+</div><div class='add'>+static void str_uncomment_string_cmd (char *str, char *b, char *e) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ unsigned char chb, che;</div><div class='add'>+ unsigned char *s, *cbeg, *mark;</div><div class='add'>+</div><div class='add'>+ if (strlen(b) != strlen(e))</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror ("Comment delimiter length mismatch.");</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ set_utility_char_table (b);</div><div class='add'>+</div><div class='add'>+ if (NULL == (str = (char *) SLmake_string(str))) return;</div><div class='add'>+</div><div class='add'>+ s = (unsigned char *) str;</div><div class='add'>+</div><div class='add'>+ while ((chb = *s++) != 0)</div><div class='add'>+ {</div><div class='add'>+ if (Utility_Char_Table [chb] == 0) continue;</div><div class='add'>+</div><div class='add'>+ mark = s - 1;</div><div class='add'>+</div><div class='add'>+ cbeg = (unsigned char *) b;</div><div class='add'>+ while (*cbeg != chb) cbeg++;</div><div class='add'>+</div><div class='add'>+ che = (unsigned char) *(e + (int) (cbeg - (unsigned char *) b));</div><div class='add'>+</div><div class='add'>+ while (((chb = *s++) != 0) && (chb != che));</div><div class='add'>+</div><div class='add'>+ if (chb == 0)</div><div class='add'>+ {</div><div class='add'>+ /* end of string and end not found. Just truncate it a return; */</div><div class='add'>+ *mark = 0;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ strcpy ((char *) mark, (char *)s);</div><div class='add'>+ s = mark;</div><div class='add'>+ }</div><div class='add'>+ SLang_push_malloced_string (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void str_quote_string_cmd (char *str, char *quotes, int *slash_ptr) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char *q;</div><div class='add'>+ int slash;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ register char *t, *s, *q1;</div><div class='add'>+ register unsigned char ch;</div><div class='add'>+</div><div class='add'>+ slash = *slash_ptr;</div><div class='add'>+</div><div class='add'>+ if ((slash > 255) || (slash < 0))</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_INVALID_PARM;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* setup the utility table to have 1s at quote char postitions. */</div><div class='add'>+ set_utility_char_table (quotes);</div><div class='add'>+</div><div class='add'>+ t = Utility_Char_Table;</div><div class='add'>+ t[(unsigned int) slash] = 1;</div><div class='add'>+</div><div class='add'>+ /* calculate length */</div><div class='add'>+ s = str;</div><div class='add'>+ len = 0;</div><div class='add'>+ while ((ch = (unsigned char) *s++) != 0) if (t[ch]) len++;</div><div class='add'>+ len += (unsigned int) (s - str);</div><div class='add'>+</div><div class='add'>+ if (NULL != (q = SLmalloc(len)))</div><div class='add'>+ {</div><div class='add'>+ s = str; q1 = q;</div><div class='add'>+ while ((ch = (unsigned char) *s++) != 0)</div><div class='add'>+ {</div><div class='add'>+ if (t[ch]) *q1++ = slash;</div><div class='add'>+ *q1++ = (char) ch;</div><div class='add'>+ }</div><div class='add'>+ *q1 = 0;</div><div class='add'>+ SLang_push_malloced_string(q);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* returns the position of substrin in a string or null */</div><div class='add'>+static int issubstr_cmd (char *a, char *b) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char *c;</div><div class='add'>+</div><div class='add'>+ if (NULL == (c = (char *) strstr(a, b)))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ return 1 + (int) (c - a);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* returns to stack string at pos n to n + m of a */</div><div class='add'>+static void substr_cmd (char *a, int *n_ptr, int *m_ptr) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ int n, m;</div><div class='add'>+ int lena;</div><div class='add'>+</div><div class='add'>+ n = *n_ptr;</div><div class='add'>+ m = *m_ptr;</div><div class='add'>+</div><div class='add'>+ lena = strlen (a);</div><div class='add'>+ if (n > lena) n = lena + 1;</div><div class='add'>+ if (n < 1)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_INVALID_PARM;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ n--;</div><div class='add'>+ if (m < 0) m = lena;</div><div class='add'>+ if (n + m > lena) m = lena - n;</div><div class='add'>+ </div><div class='add'>+ (void) _SLang_push_nstring (a + n, (unsigned int) m);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* substitute char m at positin string n in string*/</div><div class='add'>+static void strsub_cmd (int *nptr, int *mptr) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char *a;</div><div class='add'>+ int n, m;</div><div class='add'>+ unsigned int lena;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLpop_string (&a))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ n = *nptr;</div><div class='add'>+ m = *mptr;</div><div class='add'>+</div><div class='add'>+ lena = strlen (a);</div><div class='add'>+</div><div class='add'>+ if ((n <= 0) || (lena < (unsigned int) n))</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_INVALID_PARM;</div><div class='add'>+ SLfree(a);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ a[n - 1] = (char) m;</div><div class='add'>+</div><div class='add'>+ SLang_push_malloced_string (a);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void strup_cmd(void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ unsigned char c, *a;</div><div class='add'>+ char *str;</div><div class='add'>+</div><div class='add'>+ if (SLpop_string (&str))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ a = (unsigned char *) str;</div><div class='add'>+ while ((c = *a) != 0)</div><div class='add'>+ {</div><div class='add'>+ /* if ((*a >= 'a') && (*a <= 'z')) *a -= 32; */</div><div class='add'>+ *a = UPPER_CASE(c);</div><div class='add'>+ a++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_push_malloced_string (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int isdigit_cmd (char *what) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ return isdigit((unsigned char)*what);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+static int toupper_cmd (int *ch) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ return UPPER_CASE(*ch);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int tolower_cmd (int *ch) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ return LOWER_CASE(*ch);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void strlow_cmd (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ unsigned char c, *a;</div><div class='add'>+ char *str;</div><div class='add'>+</div><div class='add'>+ if (SLpop_string(&str)) return;</div><div class='add'>+ a = (unsigned char *) str;</div><div class='add'>+ while ((c = *a) != 0)</div><div class='add'>+ {</div><div class='add'>+ /* if ((*a >= 'a') && (*a <= 'z')) *a -= 32; */</div><div class='add'>+ *a = LOWER_CASE(c);</div><div class='add'>+ a++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_push_malloced_string ((char *) str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static SLang_Array_Type *do_strchop (char *str, int delim, int quote)</div><div class='add'>+{</div><div class='add'>+ int count;</div><div class='add'>+ char *s0, *elm;</div><div class='add'>+ register char *s1;</div><div class='add'>+ register unsigned char ch;</div><div class='add'>+ int quoted;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ char **data;</div><div class='add'>+</div><div class='add'>+ if ((quote < 0) || (quote > 255)</div><div class='add'>+ || (delim <= 0) || (delim > 255))</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_INVALID_PARM;</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ s1 = s0 = str;</div><div class='add'>+</div><div class='add'>+ quoted = 0;</div><div class='add'>+ count = 1; /* at least 1 */</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ ch = (unsigned char) *s1++;</div><div class='add'>+ if ((ch == quote) && quote)</div><div class='add'>+ {</div><div class='add'>+ if (*s1 == 0)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ s1++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ch == delim)</div><div class='add'>+ {</div><div class='add'>+ count++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ch == 0)</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, NULL, &count, 1)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ data = (char **)at->data;</div><div class='add'>+</div><div class='add'>+ count = 0;</div><div class='add'>+ s1 = s0;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ ch = (unsigned char) *s1;</div><div class='add'>+</div><div class='add'>+ if ((ch == quote) && quote)</div><div class='add'>+ {</div><div class='add'>+ s1++;</div><div class='add'>+ if (*s1 != 0) s1++;</div><div class='add'>+ quoted = 1;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((ch == delim) || (ch == 0))</div><div class='add'>+ {</div><div class='add'>+ if (quoted == 0)</div><div class='add'>+ elm = SLang_create_nslstring (s0, (unsigned int) (s1 - s0));</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ register char ch1, *p, *p1;</div><div class='add'>+ char *tmp;</div><div class='add'>+</div><div class='add'>+ tmp = SLmake_nstring (s0, (unsigned int)(s1 - s0));</div><div class='add'>+ if (tmp == NULL)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* Now unquote it */</div><div class='add'>+ p = p1 = tmp;</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ ch1 = *p1++;</div><div class='add'>+ if (ch1 == '\\') ch1 = *p1++;</div><div class='add'>+ *p++ = ch1;</div><div class='add'>+ }</div><div class='add'>+ while (ch1 != 0);</div><div class='add'>+ quoted = 0;</div><div class='add'>+</div><div class='add'>+ elm = SLang_create_slstring (tmp);</div><div class='add'>+ SLfree (tmp);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (elm == NULL)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ data[count] = elm;</div><div class='add'>+ count++;</div><div class='add'>+</div><div class='add'>+ if (ch == 0)</div><div class='add'>+ return at;</div><div class='add'>+</div><div class='add'>+ s1++; /* skip past delim */</div><div class='add'>+ s0 = s1; /* and reset */</div><div class='add'>+ }</div><div class='add'>+ else s1++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strchop_cmd (char *str, int *q, int *d)</div><div class='add'>+{</div><div class='add'>+ (void) SLang_push_array (do_strchop (str, *q, *d), 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strchopr_cmd (char *str, int *q, int *d)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+ if (NULL != (at = do_strchop (str, *q, *d)))</div><div class='add'>+ {</div><div class='add'>+ char **d0, **d1;</div><div class='add'>+</div><div class='add'>+ d0 = (char **) at->data;</div><div class='add'>+ d1 = d0 + (at->num_elements - 1);</div><div class='add'>+</div><div class='add'>+ while (d0 < d1)</div><div class='add'>+ {</div><div class='add'>+ char *tmp;</div><div class='add'>+</div><div class='add'>+ tmp = *d0;</div><div class='add'>+ *d0 = *d1;</div><div class='add'>+ *d1 = tmp;</div><div class='add'>+ d0++;</div><div class='add'>+ d1--;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int strcmp_cmd (char *a, char *b) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ return strcmp(a, b);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int strncmp_cmd (char *a, char *b, int *n) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ return strncmp(a, b, (unsigned int) *n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int strlen_cmd (char *s) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ return (int) strlen (s);</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void extract_element_cmd (char *list, int *nth_ptr, int *delim_ptr)</div><div class='add'>+{</div><div class='add'>+ char buf[1024], *b;</div><div class='add'>+</div><div class='add'>+ b = buf;</div><div class='add'>+ if (-1 == SLextract_list_element (list, *nth_ptr, *delim_ptr, buf, sizeof(buf)))</div><div class='add'>+ b = NULL;</div><div class='add'>+</div><div class='add'>+ SLang_push_string (b);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* sprintf functionality for S-Lang */</div><div class='add'>+</div><div class='add'>+static char *SLdo_sprintf (char *fmt) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ register char *p = fmt, ch;</div><div class='add'>+ char *out = NULL, *outp = NULL;</div><div class='add'>+ char dfmt[1024]; /* used to hold part of format */</div><div class='add'>+ char *f;</div><div class='add'>+ VOID_STAR varp;</div><div class='add'>+ int want_width, width, precis, use_varp, int_var;</div><div class='add'>+ long long_var;</div><div class='add'>+ unsigned int len = 0, malloc_len = 0, dlen;</div><div class='add'>+ int do_free, guess_size;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ int tmp1, tmp2, use_double;</div><div class='add'>+ double x;</div><div class='add'>+#endif</div><div class='add'>+ int use_long = 0;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ while ((ch = *p) != 0)</div><div class='add'>+ {</div><div class='add'>+ if (ch == '%')</div><div class='add'>+ break;</div><div class='add'>+ p++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* p points at '%' or 0 */</div><div class='add'>+</div><div class='add'>+ dlen = (unsigned int) (p - fmt);</div><div class='add'>+</div><div class='add'>+ if (len + dlen >= malloc_len)</div><div class='add'>+ {</div><div class='add'>+ malloc_len = len + dlen;</div><div class='add'>+ if (out == NULL) outp = SLmalloc(malloc_len + 1);</div><div class='add'>+ else outp = SLrealloc(out, malloc_len + 1);</div><div class='add'>+ if (NULL == outp)</div><div class='add'>+ return out;</div><div class='add'>+ out = outp;</div><div class='add'>+ outp = out + len;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ strncpy(outp, fmt, dlen);</div><div class='add'>+ len += dlen;</div><div class='add'>+ outp = out + len;</div><div class='add'>+ *outp = 0;</div><div class='add'>+ if (ch == 0) break;</div><div class='add'>+</div><div class='add'>+ /* bump it beyond '%' */</div><div class='add'>+ ++p;</div><div class='add'>+ fmt = p;</div><div class='add'>+</div><div class='add'>+ f = dfmt;</div><div class='add'>+ *f++ = ch;</div><div class='add'>+ /* handle flag char */</div><div class='add'>+ ch = *p++;</div><div class='add'>+</div><div class='add'>+ /* Make sure cases such as "% #g" can be handled. */</div><div class='add'>+ if ((ch == '-') || (ch == '+') || (ch == ' ') || (ch == '#'))</div><div class='add'>+ {</div><div class='add'>+ *f++ = ch;</div><div class='add'>+ ch = *p++;</div><div class='add'>+ if ((ch == '-') || (ch == '+') || (ch == ' ') || (ch == '#'))</div><div class='add'>+ {</div><div class='add'>+ *f++ = ch;</div><div class='add'>+ ch = *p++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ /* width */</div><div class='add'>+ /* I have got to parse it myself so that I can see how big it needs</div><div class='add'>+ * to be.</div><div class='add'>+ */</div><div class='add'>+ want_width = width = 0;</div><div class='add'>+ if (ch == '*')</div><div class='add'>+ {</div><div class='add'>+ if (SLang_pop_integer(&width)) return (out);</div><div class='add'>+ want_width = 1;</div><div class='add'>+ ch = *p++;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ if (ch == '0')</div><div class='add'>+ {</div><div class='add'>+ *f++ = '0';</div><div class='add'>+ ch = *p++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while ((ch <= '9') && (ch >= '0'))</div><div class='add'>+ {</div><div class='add'>+ width = width * 10 + (ch - '0');</div><div class='add'>+ ch = *p++;</div><div class='add'>+ want_width = 1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (want_width)</div><div class='add'>+ {</div><div class='add'>+ sprintf(f, "%d", width);</div><div class='add'>+ f += strlen (f);</div><div class='add'>+ }</div><div class='add'>+ precis = 0;</div><div class='add'>+ /* precision -- also indicates max number of chars from string */</div><div class='add'>+ if (ch == '.')</div><div class='add'>+ {</div><div class='add'>+ *f++ = ch;</div><div class='add'>+ ch = *p++;</div><div class='add'>+ want_width = 0;</div><div class='add'>+ if (ch == '*')</div><div class='add'>+ {</div><div class='add'>+ if (SLang_pop_integer(&precis)) return (out);</div><div class='add'>+ ch = *p++;</div><div class='add'>+ want_width = 1;</div><div class='add'>+ }</div><div class='add'>+ else while ((ch <= '9') && (ch >= '0'))</div><div class='add'>+ {</div><div class='add'>+ precis = precis * 10 + (ch - '0');</div><div class='add'>+ ch = *p++;</div><div class='add'>+ want_width = 1;</div><div class='add'>+ }</div><div class='add'>+ if (want_width)</div><div class='add'>+ {</div><div class='add'>+ sprintf(f, "%d", precis);</div><div class='add'>+ f += strlen (f);</div><div class='add'>+ }</div><div class='add'>+ else precis = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ long_var = 0;</div><div class='add'>+ int_var = 0;</div><div class='add'>+ varp = NULL;</div><div class='add'>+ guess_size = 32;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ use_double = 0;</div><div class='add'>+#endif</div><div class='add'>+ use_long = 0;</div><div class='add'>+ use_varp = 0;</div><div class='add'>+ do_free = 0;</div><div class='add'>+</div><div class='add'>+ if (ch == 'l')</div><div class='add'>+ {</div><div class='add'>+ use_long = 1;</div><div class='add'>+ ch = *p++;</div><div class='add'>+ }</div><div class='add'>+ else if (ch == 'h') ch = *p++; /* not supported */</div><div class='add'>+</div><div class='add'>+ /* Now the actual format specifier */</div><div class='add'>+ switch (ch)</div><div class='add'>+ {</div><div class='add'>+ case 'S':</div><div class='add'>+ _SLstring_intrinsic ();</div><div class='add'>+ ch = 's';</div><div class='add'>+ /* drop */</div><div class='add'>+ case 's':</div><div class='add'>+ if (SLang_pop_slstring((char **) &varp)) return (out);</div><div class='add'>+ do_free = 1;</div><div class='add'>+ guess_size = strlen((char *) varp);</div><div class='add'>+ use_varp = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '%':</div><div class='add'>+ guess_size = 1;</div><div class='add'>+ do_free = 0;</div><div class='add'>+ use_varp = 1;</div><div class='add'>+ varp = (VOID_STAR) "%";</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'c': guess_size = 1;</div><div class='add'>+ use_long = 0;</div><div class='add'>+ /* drop */</div><div class='add'>+ case 'd':</div><div class='add'>+ case 'i':</div><div class='add'>+ case 'o':</div><div class='add'>+ case 'u':</div><div class='add'>+ case 'X':</div><div class='add'>+ case 'x':</div><div class='add'>+ if (SLang_pop_long (&long_var)) return(out);</div><div class='add'>+ if (use_long == 0)</div><div class='add'>+ int_var = (int) long_var;</div><div class='add'>+ else</div><div class='add'>+ *f++ = 'l';</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'f':</div><div class='add'>+ case 'e':</div><div class='add'>+ case 'g':</div><div class='add'>+ case 'E':</div><div class='add'>+ case 'G':</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ if (SLang_pop_double(&x, &tmp1, &tmp2)) return (out);</div><div class='add'>+ use_double = 1;</div><div class='add'>+ guess_size = 256;</div><div class='add'>+ (void) tmp1; (void) tmp2;</div><div class='add'>+ use_long = 0;</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ case 'p':</div><div class='add'>+ guess_size = 32;</div><div class='add'>+ /* Pointer type?? Why?? */</div><div class='add'>+ if (-1 == SLdo_pop ())</div><div class='add'>+ return out;</div><div class='add'>+ varp = (VOID_STAR) _SLStack_Pointer;</div><div class='add'>+ use_varp = 1;</div><div class='add'>+ use_long = 0;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ SLang_doerror("Invalid Format.");</div><div class='add'>+ return(out);</div><div class='add'>+ }</div><div class='add'>+ *f++ = ch; *f = 0;</div><div class='add'>+</div><div class='add'>+ width = width + precis;</div><div class='add'>+ if (width > guess_size) guess_size = width;</div><div class='add'>+</div><div class='add'>+ if (len + guess_size > malloc_len)</div><div class='add'>+ {</div><div class='add'>+ outp = (char *) SLrealloc(out, len + guess_size + 1);</div><div class='add'>+ if (outp == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_MALLOC_ERROR;</div><div class='add'>+ return (out);</div><div class='add'>+ }</div><div class='add'>+ out = outp;</div><div class='add'>+ outp = out + len;</div><div class='add'>+ malloc_len = len + guess_size;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (use_varp)</div><div class='add'>+ {</div><div class='add'>+ sprintf(outp, dfmt, varp);</div><div class='add'>+ if (do_free) SLang_free_slstring ((char *)varp);</div><div class='add'>+ }</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ else if (use_double) sprintf(outp, dfmt, x);</div><div class='add'>+#endif</div><div class='add'>+ else if (use_long) sprintf (outp, dfmt, long_var);</div><div class='add'>+ else sprintf(outp, dfmt, int_var);</div><div class='add'>+</div><div class='add'>+ len += strlen(outp);</div><div class='add'>+ outp = out + len;</div><div class='add'>+ fmt = p;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (out != NULL)</div><div class='add'>+ {</div><div class='add'>+ outp = SLrealloc (out, (unsigned int) (outp - out) + 1);</div><div class='add'>+ if (outp != NULL) out = outp;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return (out);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int _SLstrops_do_sprintf_n (int n) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char *p;</div><div class='add'>+ char *fmt;</div><div class='add'>+ SLang_Object_Type *ptr;</div><div class='add'>+ int ofs;</div><div class='add'>+</div><div class='add'>+ if (-1 == (ofs = SLreverse_stack (n + 1)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ ptr = _SLRun_Stack + ofs;</div><div class='add'>+</div><div class='add'>+ if (SLang_pop_slstring(&fmt))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ p = SLdo_sprintf (fmt);</div><div class='add'>+ SLang_free_slstring (fmt);</div><div class='add'>+</div><div class='add'>+ while (_SLStack_Pointer > ptr)</div><div class='add'>+ SLdo_pop ();</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ {</div><div class='add'>+ SLfree (p);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ return SLang_push_malloced_string (p);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void sprintf_n_cmd (int *n)</div><div class='add'>+{</div><div class='add'>+ _SLstrops_do_sprintf_n (*n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sprintf_cmd (void)</div><div class='add'>+{</div><div class='add'>+ _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 1); /* do not include format */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* converts string s to a form that can be used in an eval */</div><div class='add'>+static void make_printable_string(char *s) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ unsigned int len;</div><div class='add'>+ register char *s1 = s, ch, *ss1;</div><div class='add'>+ char *ss;</div><div class='add'>+</div><div class='add'>+ /* compute length */</div><div class='add'>+ len = 3;</div><div class='add'>+ while ((ch = *s1++) != 0)</div><div class='add'>+ {</div><div class='add'>+ if ((ch == '\n') || (ch == '\\') || (ch == '"')) len++;</div><div class='add'>+ len++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (ss = SLmalloc(len)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ s1 = s;</div><div class='add'>+ ss1 = ss;</div><div class='add'>+ *ss1++ = '"';</div><div class='add'>+ while ((ch = *s1++) != 0)</div><div class='add'>+ {</div><div class='add'>+ if (ch == '\n')</div><div class='add'>+ {</div><div class='add'>+ ch = 'n';</div><div class='add'>+ *ss1++ = '\\';</div><div class='add'>+ }</div><div class='add'>+ else if ((ch == '\\') || (ch == '"'))</div><div class='add'>+ {</div><div class='add'>+ *ss1++ = '\\';</div><div class='add'>+ }</div><div class='add'>+ *ss1++ = ch;</div><div class='add'>+ }</div><div class='add'>+ *ss1++ = '"';</div><div class='add'>+ *ss1 = 0;</div><div class='add'>+ if (-1 == SLang_push_string (ss))</div><div class='add'>+ SLfree (ss);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int is_list_element_cmd (char *list, char *elem, int *d_ptr)</div><div class='add'>+{</div><div class='add'>+ char ch;</div><div class='add'>+ int d, n;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char *lbeg, *lend;</div><div class='add'>+</div><div class='add'>+ d = *d_ptr;</div><div class='add'>+</div><div class='add'>+ len = strlen (elem);</div><div class='add'>+</div><div class='add'>+ n = 1;</div><div class='add'>+ lend = list;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ lbeg = lend;</div><div class='add'>+ while ((0 != (ch = *lend)) && (ch != (char) d)) lend++;</div><div class='add'>+</div><div class='add'>+ if ((lbeg + len == lend)</div><div class='add'>+ && (0 == strncmp (elem, lbeg, len)))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ if (ch == 0)</div><div class='add'>+ {</div><div class='add'>+ n = 0;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ lend++; /* skip delim */</div><div class='add'>+ n++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* Regular expression routines for strings */</div><div class='add'>+static SLRegexp_Type regexp_reg;</div><div class='add'>+</div><div class='add'>+static int string_match_cmd (char *str, char *pat, int *nptr) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ int n;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ unsigned char rbuf[512], *match;</div><div class='add'>+</div><div class='add'>+ n = *nptr;</div><div class='add'>+</div><div class='add'>+ regexp_reg.case_sensitive = 1;</div><div class='add'>+ regexp_reg.buf = rbuf;</div><div class='add'>+ regexp_reg.pat = (unsigned char *) pat;</div><div class='add'>+ regexp_reg.buf_len = sizeof (rbuf);</div><div class='add'>+</div><div class='add'>+ if (SLang_regexp_compile (&regexp_reg))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Unable to compile pattern");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ n--;</div><div class='add'>+ len = strlen(str);</div><div class='add'>+ if ((n < 0) || ((unsigned int) n >= len))</div><div class='add'>+ {</div><div class='add'>+ /* SLang_Error = SL_INVALID_PARM; */</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ str += n;</div><div class='add'>+ len -= n;</div><div class='add'>+</div><div class='add'>+ if (NULL == (match = SLang_regexp_match((unsigned char *) str, len, &regexp_reg)))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ /* adjust offsets */</div><div class='add'>+ regexp_reg.offset = n;</div><div class='add'>+</div><div class='add'>+ return (1 + (int) ((char *) match - str));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int string_match_nth_cmd (int *nptr) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ int n, beg;</div><div class='add'>+</div><div class='add'>+ n = *nptr;</div><div class='add'>+</div><div class='add'>+ if ((n < 0) || (n > 9) || (regexp_reg.pat == NULL)</div><div class='add'>+ || ((beg = regexp_reg.beg_matches[n]) == -1))</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_INVALID_PARM;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ SLang_push_integer(beg + regexp_reg.offset);</div><div class='add'>+ return regexp_reg.end_matches[n];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static char *create_delimited_string (char **list, unsigned int n, </div><div class='add'>+ char *delim)</div><div class='add'>+{</div><div class='add'>+ unsigned int len, dlen;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ unsigned int num;</div><div class='add'>+ char *str, *s;</div><div class='add'>+</div><div class='add'>+ len = 1; /* allow room for \0 char */</div><div class='add'>+ num = 0;</div><div class='add'>+ for (i = 0; i < n; i++)</div><div class='add'>+ {</div><div class='add'>+ if (list[i] == NULL) continue;</div><div class='add'>+ len += strlen (list[i]);</div><div class='add'>+ num++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ dlen = strlen (delim);</div><div class='add'>+ if (num > 1)</div><div class='add'>+ len += (num - 1) * dlen;</div><div class='add'>+</div><div class='add'>+ if (NULL == (str = SLmalloc (len)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ *str = 0;</div><div class='add'>+ s = str;</div><div class='add'>+ i = 0;</div><div class='add'>+ </div><div class='add'>+ while (num > 1)</div><div class='add'>+ {</div><div class='add'>+ while (list[i] == NULL)</div><div class='add'>+ i++;</div><div class='add'>+ </div><div class='add'>+ strcpy (s, list[i]);</div><div class='add'>+ s += strlen (list[i]);</div><div class='add'>+ strcpy (s, delim);</div><div class='add'>+ s += dlen;</div><div class='add'>+ i++;</div><div class='add'>+ num--;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (num)</div><div class='add'>+ {</div><div class='add'>+ while (list[i] == NULL)</div><div class='add'>+ i++;</div><div class='add'>+ </div><div class='add'>+ strcpy (s, list[i]);</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ return str;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void create_delimited_string_cmd (int *nptr)</div><div class='add'>+{</div><div class='add'>+ unsigned int n, i;</div><div class='add'>+ char **strings;</div><div class='add'>+ char *str;</div><div class='add'>+</div><div class='add'>+ str = NULL;</div><div class='add'>+</div><div class='add'>+ n = 1 + (unsigned int) *nptr; /* n includes delimiter */</div><div class='add'>+</div><div class='add'>+ if (NULL == (strings = (char **)SLmalloc (n * sizeof (char *))))</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop_n (n);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ memset((char *)strings, 0, n * sizeof (char *));</div><div class='add'>+</div><div class='add'>+ i = n;</div><div class='add'>+ while (i != 0)</div><div class='add'>+ {</div><div class='add'>+ i--;</div><div class='add'>+ if (-1 == SLang_pop_slstring (strings + i))</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ str = create_delimited_string (strings + 1, (n - 1), strings[0]);</div><div class='add'>+ /* drop */</div><div class='add'>+ return_error:</div><div class='add'>+ for (i = 0; i < n; i++) SLang_free_slstring (strings[i]);</div><div class='add'>+ SLfree ((char *)strings);</div><div class='add'>+</div><div class='add'>+ (void) SLang_push_malloced_string (str); /* NULL Ok */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strjoin_cmd (char *delim)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ char *str;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_array_of_type (&at, SLANG_STRING_TYPE))</div><div class='add'>+ return;</div><div class='add'>+ </div><div class='add'>+ str = create_delimited_string ((char **)at->data, at->num_elements, delim);</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ (void) SLang_push_malloced_string (str); /* NULL Ok */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void str_delete_chars_cmd (char *s, char *d)</div><div class='add'>+{</div><div class='add'>+ unsigned char lut[256];</div><div class='add'>+ unsigned char *s1, *s2;</div><div class='add'>+ unsigned char ch;</div><div class='add'>+</div><div class='add'>+ make_lut ((unsigned char *)d, lut);</div><div class='add'>+ if (NULL == (s = SLmake_string (s)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ s1 = s2 = (unsigned char *) s;</div><div class='add'>+ while ((ch = *s2++) != 0)</div><div class='add'>+ {</div><div class='add'>+ if (0 == lut[ch])</div><div class='add'>+ *s1++ = ch;</div><div class='add'>+ }</div><div class='add'>+ *s1 = 0;</div><div class='add'>+ </div><div class='add'>+ (void) SLang_push_malloced_string (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char *make_lut_string (unsigned char *s)</div><div class='add'>+{</div><div class='add'>+ unsigned char lut[256];</div><div class='add'>+ unsigned char *l;</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ /* Complement-- a natural order is imposed */</div><div class='add'>+ make_lut (s, lut);</div><div class='add'>+ l = lut;</div><div class='add'>+ for (i = 1; i < 256; i++)</div><div class='add'>+ {</div><div class='add'>+ if (lut[i])</div><div class='add'>+ *l++ = (unsigned char) i;</div><div class='add'>+ }</div><div class='add'>+ *l = 0;</div><div class='add'>+ return (unsigned char *) SLmake_string ((char *)lut);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char *make_str_range (unsigned char *s)</div><div class='add'>+{</div><div class='add'>+ unsigned char *s1, *range;</div><div class='add'>+ unsigned int num;</div><div class='add'>+ unsigned char ch;</div><div class='add'>+ int len;</div><div class='add'>+</div><div class='add'>+ if (*s == '^')</div><div class='add'>+ return make_lut_string (s);</div><div class='add'>+</div><div class='add'>+ num = 0;</div><div class='add'>+ s1 = s;</div><div class='add'>+ while ((ch = *s1++) != 0)</div><div class='add'>+ {</div><div class='add'>+ unsigned char ch1;</div><div class='add'>+</div><div class='add'>+ ch1 = *s1;</div><div class='add'>+ if (ch1 == '-')</div><div class='add'>+ {</div><div class='add'>+ s1++;</div><div class='add'>+ ch1 = *s1;</div><div class='add'>+ len = (int)ch1 - (int)ch;</div><div class='add'>+ if (len < 0)</div><div class='add'>+ len = -len;</div><div class='add'>+ </div><div class='add'>+ num += (unsigned int) len;</div><div class='add'>+ if (ch1 != 0)</div><div class='add'>+ s1++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ num++;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ range = (unsigned char *)SLmalloc (num + 1);</div><div class='add'>+ if (range == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+ </div><div class='add'>+ s1 = s;</div><div class='add'>+ s = range;</div><div class='add'>+ while ((ch = *s1++) != 0)</div><div class='add'>+ {</div><div class='add'>+ unsigned char ch1;</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ ch1 = *s1;</div><div class='add'>+ if (ch1 != '-')</div><div class='add'>+ {</div><div class='add'>+ *s++ = ch;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ s1++;</div><div class='add'>+ ch1 = *s1;</div><div class='add'>+ </div><div class='add'>+ if (ch > ch1)</div><div class='add'>+ {</div><div class='add'>+ if (ch1 == 0)</div><div class='add'>+ ch1 = 1;</div><div class='add'>+</div><div class='add'>+ for (i = (unsigned int) ch; i >= (unsigned int) ch1; i--)</div><div class='add'>+ *s++ = (unsigned char) i;</div><div class='add'>+ </div><div class='add'>+ if (*s1 == 0)</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ for (i = (unsigned int) ch; i <= (unsigned int) ch1; i++)</div><div class='add'>+ *s++ = (unsigned char) i;</div><div class='add'>+ }</div><div class='add'>+ s1++;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+#if 0</div><div class='add'>+ if (range + num != s)</div><div class='add'>+ SLang_verror (SL_INTERNAL_ERROR, "make_str_range: num wrong");</div><div class='add'>+#endif</div><div class='add'>+ *s = 0;</div><div class='add'>+</div><div class='add'>+ return range;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strtrans_cmd (char *s, unsigned char *from, unsigned char *to)</div><div class='add'>+{</div><div class='add'>+ unsigned char map[256];</div><div class='add'>+ char *s1;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ unsigned char ch;</div><div class='add'>+ unsigned char last_to;</div><div class='add'>+ unsigned char *from_range, *to_range;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 256; i++) map[i] = (unsigned char) i;</div><div class='add'>+</div><div class='add'>+ if (*to == 0)</div><div class='add'>+ {</div><div class='add'>+ str_delete_chars_cmd (s, (char *)from);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ from_range = make_str_range (from);</div><div class='add'>+ if (from_range == NULL)</div><div class='add'>+ return;</div><div class='add'>+ to_range = make_str_range (to);</div><div class='add'>+ if (to_range == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *)from_range);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ from = from_range;</div><div class='add'>+ to = to_range;</div><div class='add'>+</div><div class='add'>+ last_to = 0;</div><div class='add'>+ while ((ch = *from++) != 0)</div><div class='add'>+ {</div><div class='add'>+ unsigned char to_ch;</div><div class='add'>+</div><div class='add'>+ if (0 == (to_ch = *to++))</div><div class='add'>+ {</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ map[ch] = last_to;</div><div class='add'>+ }</div><div class='add'>+ while (0 != (ch = *from++));</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ last_to = map[ch] = to_ch;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLfree ((char *)from_range);</div><div class='add'>+ SLfree ((char *)to_range);</div><div class='add'>+</div><div class='add'>+ s = SLmake_string (s);</div><div class='add'>+ if (s == NULL)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ s1 = s;</div><div class='add'>+ while ((ch = (unsigned char) *s1) != 0)</div><div class='add'>+ *s1++ = (char) map[ch];</div><div class='add'>+ </div><div class='add'>+ (void) SLang_push_malloced_string (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Strops_Table [] = /*{{{*/</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_I("create_delimited_string", create_delimited_string_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SS("strcmp", strcmp_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SSI("strncmp", strncmp_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("strcat", strcat_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("strlen", strlen_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SII("strchop", strchop_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SII("strchopr", strchopr_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_I("strreplace", strreplace_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SSS("str_replace", str_replace_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SII("substr", substr_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SS("is_substr", issubstr_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_II("strsub", strsub_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SII("extract_element", extract_element_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SSI("is_list_element", is_list_element_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SSI("string_match", string_match_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_I("string_match_nth", string_match_nth_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("strlow", strlow_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_I("tolower", tolower_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_I("toupper", toupper_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("strup", strup_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("isdigit", isdigit_cmd, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("strtrim", strtrim_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("strtrim_end", strtrim_end_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("strtrim_beg", strtrim_beg_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("strcompress", strcompress_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_I("Sprintf", sprintf_n_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("sprintf", sprintf_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("sscanf", _SLang_sscanf, SLANG_INT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("make_printable_string", make_printable_string, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SSI("str_quote_string", str_quote_string_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SSS("str_uncomment_string", str_uncomment_string_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_II("define_case", SLang_define_case, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("strtok", strtok_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_S("strjoin", strjoin_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SSS("strtrans", strtrans_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_SS("str_delete_chars", str_delete_chars_cmd, SLANG_VOID_TYPE),</div><div class='add'>+</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int _SLang_init_slstrops (void)</div><div class='add'>+{</div><div class='add'>+ return SLadd_intrin_fun_table (Strops_Table, NULL);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slstruct.c b/mdk-stage1/slang/slstruct.c<br/>new file mode 100644<br/>index 000000000..33d182373<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slstruct.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstruct.c</a></div><div class='hunk'>@@ -0,0 +1,932 @@</div><div class='add'>+/* Structure type implementation */</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#define SL_APP_WANTS_FOREACH</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+void _SLstruct_delete_struct (_SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+ _SLstruct_Field_Type *field, *field_max;</div><div class='add'>+</div><div class='add'>+ if (s == NULL) return;</div><div class='add'>+</div><div class='add'>+ if (s->num_refs > 1)</div><div class='add'>+ {</div><div class='add'>+ s->num_refs -= 1;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ field = s->fields;</div><div class='add'>+ if (field != NULL)</div><div class='add'>+ {</div><div class='add'>+ field_max = field + s->nfields;</div><div class='add'>+</div><div class='add'>+ while (field < field_max)</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&field->obj);</div><div class='add'>+ SLang_free_slstring (field->name); /* could be NULL */</div><div class='add'>+ field++;</div><div class='add'>+ }</div><div class='add'>+ SLfree ((char *) s->fields);</div><div class='add'>+ }</div><div class='add'>+ SLfree ((char *) s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static _SLang_Struct_Type *allocate_struct (unsigned int nfields)</div><div class='add'>+{</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+ _SLstruct_Field_Type *f;</div><div class='add'>+ unsigned int i, size;</div><div class='add'>+</div><div class='add'>+ s = (_SLang_Struct_Type *) SLmalloc (sizeof (_SLang_Struct_Type));</div><div class='add'>+ if (s == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+ SLMEMSET((char *) s, 0, sizeof (_SLang_Struct_Type));</div><div class='add'>+</div><div class='add'>+ size = nfields * sizeof(_SLstruct_Field_Type);</div><div class='add'>+ if (NULL == (f = (_SLstruct_Field_Type *) SLmalloc (size)))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) s);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ SLMEMSET ((char *) f, 0, size);</div><div class='add'>+ s->nfields = nfields;</div><div class='add'>+ s->fields = f;</div><div class='add'>+</div><div class='add'>+ /* By default, all structs will be created with elements set to NULL. I</div><div class='add'>+ * do not know whether or not it is better to use SLANG_UNDEFINED_TYPE.</div><div class='add'>+ */</div><div class='add'>+ for (i = 0; i < nfields; i++)</div><div class='add'>+ f[i].obj.data_type = SLANG_NULL_TYPE;</div><div class='add'>+</div><div class='add'>+ return s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_struct_of_type (unsigned char type, _SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+ obj.data_type = type;</div><div class='add'>+ obj.v.struct_val = s;</div><div class='add'>+ s->num_refs += 1;</div><div class='add'>+</div><div class='add'>+ if (0 == SLang_push (&obj))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ s->num_refs -= 1;</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_push_struct (_SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+ return push_struct_of_type (SLANG_STRUCT_TYPE, s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_pop_struct (_SLang_Struct_Type **sp)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ unsigned char type;</div><div class='add'>+</div><div class='add'>+ if (0 != SLang_pop (&obj))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ type = obj.data_type;</div><div class='add'>+ if (type != SLANG_STRUCT_TYPE)</div><div class='add'>+ {</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ if (cl->cl_struct_def == NULL)</div><div class='add'>+ {</div><div class='add'>+ *sp = NULL;</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ SLang_verror (SL_TYPE_MISMATCH,</div><div class='add'>+ "Expecting struct type object. Found %s",</div><div class='add'>+ cl->cl_name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ *sp = obj.v.struct_val;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void struct_destroy (unsigned char type, VOID_STAR vs)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ _SLstruct_delete_struct (*(_SLang_Struct_Type **) vs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int struct_push (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ return push_struct_of_type (type, *(_SLang_Struct_Type **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static _SLstruct_Field_Type *find_field (_SLang_Struct_Type *s, char *name)</div><div class='add'>+{</div><div class='add'>+ _SLstruct_Field_Type *f, *fmax;</div><div class='add'>+</div><div class='add'>+ f = s->fields;</div><div class='add'>+ fmax = f + s->nfields;</div><div class='add'>+</div><div class='add'>+ while (f < fmax)</div><div class='add'>+ {</div><div class='add'>+ /* Since both these are slstrings, only compare pointer */</div><div class='add'>+ if (name == f->name)</div><div class='add'>+ return f;</div><div class='add'>+</div><div class='add'>+ f++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static _SLstruct_Field_Type *pop_field (_SLang_Struct_Type *s, char *name)</div><div class='add'>+{</div><div class='add'>+ _SLstruct_Field_Type *f;</div><div class='add'>+</div><div class='add'>+ f = find_field (s, name);</div><div class='add'>+ if (f == NULL)</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "struct has no field named %s", name);</div><div class='add'>+ return f;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLstruct_create_struct (unsigned int nfields,</div><div class='add'>+ char **field_names,</div><div class='add'>+ unsigned char *field_types,</div><div class='add'>+ VOID_STAR *field_values)</div><div class='add'>+{</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+ _SLstruct_Field_Type *f;</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ if (NULL == (s = allocate_struct (nfields)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ f = s->fields;</div><div class='add'>+ for (i = 0; i < nfields; i++)</div><div class='add'>+ {</div><div class='add'>+ unsigned char type;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ VOID_STAR value;</div><div class='add'>+ char *name = field_names [i];</div><div class='add'>+</div><div class='add'>+ if (name == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "A struct field name cannot be NULL");</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (f->name = SLang_create_slstring (name)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if ((field_values == NULL)</div><div class='add'>+ || (NULL == (value = field_values [i])))</div><div class='add'>+ {</div><div class='add'>+ f++;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ type = field_types[i];</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+ if ((-1 == (cl->cl_push (type, value)))</div><div class='add'>+ || (-1 == SLang_pop (&f->obj)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ f++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (0 == _SLang_push_struct (s))</div><div class='add'>+ return 0;</div><div class='add'>+ /* drop */</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Interpreter interface */</div><div class='add'>+</div><div class='add'>+int _SLstruct_define_struct (void)</div><div class='add'>+{</div><div class='add'>+ int nfields;</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+ _SLstruct_Field_Type *f;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_integer (&nfields))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (nfields <= 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Number of struct fields must be > 0");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (s = allocate_struct (nfields)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ f = s->fields;</div><div class='add'>+ while (nfields)</div><div class='add'>+ {</div><div class='add'>+ char *name;</div><div class='add'>+</div><div class='add'>+ nfields--;</div><div class='add'>+ if (-1 == SLang_pop_slstring (&name))</div><div class='add'>+ {</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ f[nfields].name = name;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_push_struct (s))</div><div class='add'>+ {</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Simply make a struct that contains the same fields as struct s. Do not</div><div class='add'>+ * duplicate the field values.</div><div class='add'>+ */</div><div class='add'>+static _SLang_Struct_Type *make_struct_shell (_SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+ _SLang_Struct_Type *new_s;</div><div class='add'>+ _SLstruct_Field_Type *new_f, *old_f;</div><div class='add'>+ unsigned int i, nfields;</div><div class='add'>+</div><div class='add'>+ nfields = s->nfields;</div><div class='add'>+ if (NULL == (new_s = allocate_struct (nfields)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ new_f = new_s->fields;</div><div class='add'>+ old_f = s->fields;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < nfields; i++)</div><div class='add'>+ {</div><div class='add'>+ if (NULL == (new_f[i].name = SLang_create_slstring (old_f[i].name)))</div><div class='add'>+ {</div><div class='add'>+ _SLstruct_delete_struct (new_s);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ return new_s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int struct_init_array_object (unsigned char type, VOID_STAR addr)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ if (NULL == (s = make_struct_shell (cl->cl_struct_def)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ s->num_refs = 1;</div><div class='add'>+ *(_SLang_Struct_Type **) addr = s;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+typedefed_struct_datatype_deref (unsigned char type)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ if (NULL == (s = make_struct_shell (cl->cl_struct_def)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == push_struct_of_type (type, s))</div><div class='add'>+ {</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static _SLang_Struct_Type *duplicate_struct (_SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+ _SLang_Struct_Type *new_s;</div><div class='add'>+ _SLstruct_Field_Type *new_f, *f, *fmax;</div><div class='add'>+</div><div class='add'>+ new_s = make_struct_shell (s);</div><div class='add'>+</div><div class='add'>+ if (new_s == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ f = s->fields;</div><div class='add'>+ fmax = f + s->nfields;</div><div class='add'>+ new_f = new_s->fields;</div><div class='add'>+</div><div class='add'>+ while (f < fmax)</div><div class='add'>+ {</div><div class='add'>+ SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+ obj = &f->obj;</div><div class='add'>+ if (obj->data_type != SLANG_UNDEFINED_TYPE)</div><div class='add'>+ {</div><div class='add'>+ if ((-1 == _SLpush_slang_obj (obj))</div><div class='add'>+ || (-1 == SLang_pop (&new_f->obj)))</div><div class='add'>+ {</div><div class='add'>+ _SLstruct_delete_struct (new_s);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ new_f++;</div><div class='add'>+ f++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return new_s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int struct_dereference (unsigned char type, VOID_STAR addr)</div><div class='add'>+{</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+</div><div class='add'>+ if (NULL == (s = duplicate_struct (*(_SLang_Struct_Type **) addr)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == push_struct_of_type (type, s))</div><div class='add'>+ {</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*{{{ foreach */</div><div class='add'>+</div><div class='add'>+struct _SLang_Foreach_Context_Type</div><div class='add'>+{</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+ char *next_field_name;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static SLang_Foreach_Context_Type *</div><div class='add'>+struct_foreach_open (unsigned char type, unsigned int num)</div><div class='add'>+{</div><div class='add'>+ SLang_Foreach_Context_Type *c;</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+ char *next_name;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_struct (&s))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ switch (num)</div><div class='add'>+ {</div><div class='add'>+ case 0:</div><div class='add'>+ next_name = SLang_create_slstring ("next");</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 1:</div><div class='add'>+ if (-1 == SLang_pop_slstring (&next_name))</div><div class='add'>+ next_name = NULL;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ next_name = NULL;</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "'foreach (Struct_Type) using' requires single control value");</div><div class='add'>+ SLdo_pop_n (num);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (next_name == NULL)</div><div class='add'>+ {</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ c = (SLang_Foreach_Context_Type *)SLmalloc (sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+ if (c == NULL)</div><div class='add'>+ {</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ SLang_free_slstring (next_name);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+</div><div class='add'>+ c->next_field_name = next_name;</div><div class='add'>+ c->s = s;</div><div class='add'>+</div><div class='add'>+ return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void struct_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ if (c == NULL) return;</div><div class='add'>+</div><div class='add'>+ SLang_free_slstring (c->next_field_name);</div><div class='add'>+ if (c->s != NULL) _SLstruct_delete_struct (c->s);</div><div class='add'>+ SLfree ((char *) c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int struct_foreach (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+ _SLstruct_Field_Type *f;</div><div class='add'>+ _SLang_Struct_Type *next_s;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+</div><div class='add'>+ if (c == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (c->s == NULL)</div><div class='add'>+ return 0; /* done */</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_push_struct (c->s))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* Now get the next one ready for the next foreach loop */</div><div class='add'>+</div><div class='add'>+ next_s = NULL;</div><div class='add'>+ if (NULL != (f = find_field (c->s, c->next_field_name)))</div><div class='add'>+ {</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (f->obj.data_type);</div><div class='add'>+ /* Note that I cannot simply look for SLANG_STRUCT_TYPE since the</div><div class='add'>+ * user may have typedefed another struct type. So, look at the</div><div class='add'>+ * class methods.</div><div class='add'>+ */</div><div class='add'>+ if (cl->cl_foreach_open == struct_foreach_open)</div><div class='add'>+ {</div><div class='add'>+ next_s = f->obj.v.struct_val;</div><div class='add'>+ next_s->num_refs += 1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ _SLstruct_delete_struct (c->s);</div><div class='add'>+ c->s = next_s;</div><div class='add'>+</div><div class='add'>+ /* keep going */</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int struct_sput (unsigned char type, char *name)</div><div class='add'>+{</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+ _SLstruct_Field_Type *f;</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_struct (&s))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((NULL == (f = pop_field (s, name)))</div><div class='add'>+ || (-1 == SLang_pop (&obj)))</div><div class='add'>+ {</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_free_object (&f->obj);</div><div class='add'>+ f->obj = obj;</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int struct_sget (unsigned char type, char *name)</div><div class='add'>+{</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+ _SLstruct_Field_Type *f;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_struct (&s))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (NULL == (f = pop_field (s, name)))</div><div class='add'>+ {</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ret = _SLpush_slang_obj (&f->obj);</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int struct_typecast</div><div class='add'>+ (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ _SLang_Struct_Type **a, **b;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ </div><div class='add'>+ (void) a_type;</div><div class='add'>+ (void) b_type;</div><div class='add'>+</div><div class='add'>+ a = (_SLang_Struct_Type **) ap;</div><div class='add'>+ b = (_SLang_Struct_Type **) bp;</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ {</div><div class='add'>+ b[i] = a[i];</div><div class='add'>+ if (a[i] != NULL)</div><div class='add'>+ a[i]->num_refs += 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLstruct_define_typedef (void)</div><div class='add'>+{</div><div class='add'>+ char *type_name;</div><div class='add'>+ _SLang_Struct_Type *s, *s1;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_slstring (&type_name))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_struct (&s))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (type_name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (s1 = make_struct_shell (s)))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (type_name);</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class (type_name)))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (type_name);</div><div class='add'>+ _SLstruct_delete_struct (s1);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ SLang_free_slstring (type_name);</div><div class='add'>+</div><div class='add'>+ cl->cl_struct_def = s1;</div><div class='add'>+ cl->cl_init_array_object = struct_init_array_object;</div><div class='add'>+ cl->cl_datatype_deref = typedefed_struct_datatype_deref;</div><div class='add'>+ cl->cl_destroy = struct_destroy;</div><div class='add'>+ cl->cl_push = struct_push;</div><div class='add'>+ cl->cl_dereference = struct_dereference;</div><div class='add'>+ cl->cl_foreach_open = struct_foreach_open;</div><div class='add'>+ cl->cl_foreach_close = struct_foreach_close;</div><div class='add'>+ cl->cl_foreach = struct_foreach;</div><div class='add'>+</div><div class='add'>+ cl->cl_sget = struct_sget;</div><div class='add'>+ cl->cl_sput = struct_sput;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_register_class (cl,</div><div class='add'>+ SLANG_VOID_TYPE, /* any open slot */</div><div class='add'>+ sizeof (_SLang_Struct_Type),</div><div class='add'>+ SLANG_CLASS_TYPE_PTR))</div><div class='add'>+ {</div><div class='add'>+ /* FIXME: Priority=low */</div><div class='add'>+ /* There is a memory leak here if this fails... */</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ /* Note: typecast from a user type struct type allowed but not the other</div><div class='add'>+ * way.</div><div class='add'>+ */</div><div class='add'>+ if (-1 == SLclass_add_typecast (cl->cl_data_type, SLANG_STRUCT_TYPE, struct_typecast, 1))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+struct_datatype_deref (unsigned char stype)</div><div class='add'>+{</div><div class='add'>+ (void) stype;</div><div class='add'>+ </div><div class='add'>+ if (SLang_peek_at_stack () == SLANG_ARRAY_TYPE)</div><div class='add'>+ {</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_array_of_type (&at, SLANG_STRING_TYPE))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ status = SLstruct_create_struct (at->num_elements,</div><div class='add'>+ (char **) at->data, NULL, NULL);</div><div class='add'>+</div><div class='add'>+ SLang_free_array (at);</div><div class='add'>+ return status;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_push_integer (SLang_Num_Function_Args);</div><div class='add'>+ return _SLstruct_define_struct ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int register_struct (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("Struct_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ (void) SLclass_set_destroy_function (cl, struct_destroy);</div><div class='add'>+ (void) SLclass_set_push_function (cl, struct_push);</div><div class='add'>+ cl->cl_dereference = struct_dereference;</div><div class='add'>+ cl->cl_datatype_deref = struct_datatype_deref;</div><div class='add'>+</div><div class='add'>+ cl->cl_foreach_open = struct_foreach_open;</div><div class='add'>+ cl->cl_foreach_close = struct_foreach_close;</div><div class='add'>+ cl->cl_foreach = struct_foreach;</div><div class='add'>+</div><div class='add'>+ cl->cl_sget = struct_sget;</div><div class='add'>+ cl->cl_sput = struct_sput;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_STRUCT_TYPE, sizeof (_SLang_Struct_Type),</div><div class='add'>+ SLANG_CLASS_TYPE_PTR))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void get_struct_field_names (_SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *a;</div><div class='add'>+ char **data;</div><div class='add'>+ int i, nfields;</div><div class='add'>+ _SLstruct_Field_Type *f;</div><div class='add'>+</div><div class='add'>+ nfields = (int) s->nfields;</div><div class='add'>+</div><div class='add'>+ if (NULL == (a = SLang_create_array (SLANG_STRING_TYPE, 0, NULL, &nfields, 1)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ f = s->fields;</div><div class='add'>+ data = (char **) a->data;</div><div class='add'>+ for (i = 0; i < nfields; i++)</div><div class='add'>+ {</div><div class='add'>+ /* Since we are dealing with hashed strings, the next call should not</div><div class='add'>+ * fail. If it does, the interpreter will handle it at some other</div><div class='add'>+ * level.</div><div class='add'>+ */</div><div class='add'>+ data [i] = SLang_create_slstring (f[i].name);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_push_array (a, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_struct_fields (_SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+ _SLstruct_Field_Type *f, *fmax;</div><div class='add'>+ int num;</div><div class='add'>+</div><div class='add'>+ f = s->fields;</div><div class='add'>+ fmax = f + s->nfields;</div><div class='add'>+</div><div class='add'>+ num = 0;</div><div class='add'>+ while (fmax > f)</div><div class='add'>+ {</div><div class='add'>+ fmax--;</div><div class='add'>+ if (-1 == _SLpush_slang_obj (&fmax->obj))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ num++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return num;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Syntax: set_struct_field (s, name, value); */</div><div class='add'>+static void struct_set_field (void)</div><div class='add'>+{</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+ _SLstruct_Field_Type *f;</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ char *name;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&obj))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_slstring (&name))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_struct (&s))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (name);</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (f = pop_field (s, name)))</div><div class='add'>+ {</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ SLang_free_slstring (name);</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_free_object (&f->obj);</div><div class='add'>+ f->obj = obj;</div><div class='add'>+</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ SLang_free_slstring (name);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Syntax: set_struct_fields (s, values....); */</div><div class='add'>+static void set_struct_fields (void)</div><div class='add'>+{</div><div class='add'>+ unsigned int n;</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+ _SLstruct_Field_Type *f;</div><div class='add'>+</div><div class='add'>+ n = (unsigned int) SLang_Num_Function_Args;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLreverse_stack (n))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ n--;</div><div class='add'>+ if (-1 == _SLang_pop_struct (&s))</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop_n (n);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (n > s->nfields)</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop_n (n);</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Too many values for structure");</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ f = s->fields;</div><div class='add'>+ while (n > 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&obj))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ SLang_free_object (&f->obj);</div><div class='add'>+ f->obj = obj;</div><div class='add'>+</div><div class='add'>+ f++;</div><div class='add'>+ n--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void get_struct_field (char *name)</div><div class='add'>+{</div><div class='add'>+ (void) struct_sget (0, name);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int is_struct_type (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ unsigned char type;</div><div class='add'>+ int status;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&obj))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ type = obj.data_type;</div><div class='add'>+ if (type == SLANG_STRUCT_TYPE)</div><div class='add'>+ status = 1;</div><div class='add'>+ else</div><div class='add'>+ status = (NULL != _SLclass_get_class (type)->cl_struct_def);</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ return status;</div><div class='add'>+} </div><div class='add'>+ </div><div class='add'>+ </div><div class='add'>+static SLang_Intrin_Fun_Type Struct_Table [] =</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_1("get_struct_field_names", get_struct_field_names, SLANG_VOID_TYPE, SLANG_STRUCT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_1("get_struct_field", get_struct_field, SLANG_VOID_TYPE, SLANG_STRING_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_1("_push_struct_field_values", push_struct_fields, SLANG_INT_TYPE, SLANG_STRUCT_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("set_struct_field", struct_set_field, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("set_struct_fields", set_struct_fields, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("is_struct_type", is_struct_type, SLANG_INT_TYPE),</div><div class='add'>+ /* MAKE_INTRINSIC_I("_create_struct", create_struct, SLANG_VOID_TYPE), */</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLstruct_init (void)</div><div class='add'>+{</div><div class='add'>+ if ((-1 == SLadd_intrin_fun_table (Struct_Table, NULL))</div><div class='add'>+ || (-1 == register_struct ()))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLstruct_pop_args (int *np)</div><div class='add'>+{</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ int i, n;</div><div class='add'>+ _SLang_Struct_Type **data;</div><div class='add'>+</div><div class='add'>+ n = *np;</div><div class='add'>+</div><div class='add'>+ if (n < 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_INVALID_PARM;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ data = (_SLang_Struct_Type **) SLmalloc ((n + 1) * sizeof (_SLang_Struct_Type *));</div><div class='add'>+ if (data == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLdo_pop_n (n);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ memset ((char *)data, 0, n * sizeof (_SLang_Struct_Type *));</div><div class='add'>+</div><div class='add'>+ i = n;</div><div class='add'>+ while (i > 0)</div><div class='add'>+ {</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+ _SLstruct_Field_Type *f;</div><div class='add'>+</div><div class='add'>+ i--;</div><div class='add'>+</div><div class='add'>+ if (NULL == (s = allocate_struct (1)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ data[i] = s;</div><div class='add'>+ s->num_refs += 1; /* keeping a copy */</div><div class='add'>+</div><div class='add'>+ f = s->fields;</div><div class='add'>+ if (NULL == (f->name = SLang_create_slstring ("value")))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (&f->obj))</div><div class='add'>+ goto return_error;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (NULL == (at = SLang_create_array (SLANG_STRUCT_TYPE, 0,</div><div class='add'>+ (VOID_STAR) data, &n, 1)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ (void) SLang_push_array (at, 1);</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ for (i = 0; i < n; i++)</div><div class='add'>+ {</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+</div><div class='add'>+ s = data[i];</div><div class='add'>+ if (s != NULL)</div><div class='add'>+ _SLstruct_delete_struct (s);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLfree ((char *) data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLstruct_push_args (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+ _SLang_Struct_Type **sp;</div><div class='add'>+ unsigned int num;</div><div class='add'>+</div><div class='add'>+ if (at->data_type != SLANG_STRUCT_TYPE)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_TYPE_MISMATCH;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ sp = (_SLang_Struct_Type **) at->data;</div><div class='add'>+ num = at->num_elements;</div><div class='add'>+</div><div class='add'>+ while ((SLang_Error == 0) && (num > 0))</div><div class='add'>+ {</div><div class='add'>+ _SLang_Struct_Type *s;</div><div class='add'>+</div><div class='add'>+ num--;</div><div class='add'>+ if (NULL == (s = *sp++))</div><div class='add'>+ {</div><div class='add'>+ SLang_push_null ();</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* I should check to see if the value field is present, but... */</div><div class='add'>+ (void) _SLpush_slang_obj (&s->fields->obj);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/sltermin.c b/mdk-stage1/slang/sltermin.c<br/>new file mode 100644<br/>index 000000000..f9c64f0b2<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sltermin.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltermin.c</a></div><div class='hunk'>@@ -0,0 +1,1155 @@</div><div class='add'>+/* This file contains enough terminfo reading capabilities sufficient for</div><div class='add'>+ * the slang SLtt interface.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * The majority of the comments found in the file were taken from the</div><div class='add'>+ * term(4) man page on an SGI.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Short integers are stored in two 8-bit bytes. The first byte contains</div><div class='add'>+ * the least significant 8 bits of the value, and the second byte contains</div><div class='add'>+ * the most significant 8 bits. (Thus, the value represented is</div><div class='add'>+ * 256*second+first.) The value -1 is represented by 0377,0377, and the</div><div class='add'>+ * value -2 is represented by 0376,0377; other negative values are illegal.</div><div class='add'>+ * The -1 generally means that a capability is missing from this terminal.</div><div class='add'>+ * The -2 means that the capability has been cancelled in the terminfo</div><div class='add'>+ * source and also is to be considered missing.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static int make_integer (unsigned char *buf)</div><div class='add'>+{</div><div class='add'>+ register int lo, hi;</div><div class='add'>+ lo = (int) *buf++; hi = (int) *buf;</div><div class='add'>+ if (hi == 0377)</div><div class='add'>+ {</div><div class='add'>+ if (lo == 0377) return -1;</div><div class='add'>+ if (lo == 0376) return -2;</div><div class='add'>+ }</div><div class='add'>+ return lo + 256 * hi;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * The compiled file is created from the source file descriptions of the</div><div class='add'>+ * terminals (see the -I option of infocmp) by using the terminfo compiler,</div><div class='add'>+ * tic, and read by the routine setupterm [see curses(3X).] The file is</div><div class='add'>+ * divided into six parts in the following order: the header, terminal</div><div class='add'>+ * names, boolean flags, numbers, strings, and string table.</div><div class='add'>+ *</div><div class='add'>+ * The header section begins the file. This section contains six short</div><div class='add'>+ * integers in the format described below. These integers are (1) the magic</div><div class='add'>+ * number (octal 0432); (2) the size, in bytes, of the names section; (3)</div><div class='add'>+ * the number of bytes in the boolean section; (4) the number of short</div><div class='add'>+ * integers in the numbers section; (5) the number of offsets (short</div><div class='add'>+ * integers) in the strings section; (6) the size, in bytes, of the string</div><div class='add'>+ * table.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define MAGIC 0432</div><div class='add'>+</div><div class='add'>+/* In this structure, all char * fields are malloced EXCEPT if the</div><div class='add'>+ * structure is SLTERMCAP. In that case, only terminal_names is malloced</div><div class='add'>+ * and the other fields are pointers into it.</div><div class='add'>+ */</div><div class='add'>+struct _SLterminfo_Type</div><div class='add'>+{</div><div class='add'>+#define SLTERMINFO 1</div><div class='add'>+#define SLTERMCAP 2</div><div class='add'>+ unsigned int flags;</div><div class='add'>+</div><div class='add'>+ unsigned int name_section_size;</div><div class='add'>+ char *terminal_names;</div><div class='add'>+</div><div class='add'>+ unsigned int boolean_section_size;</div><div class='add'>+ unsigned char *boolean_flags;</div><div class='add'>+</div><div class='add'>+ unsigned int num_numbers;</div><div class='add'>+ unsigned char *numbers;</div><div class='add'>+</div><div class='add'>+ unsigned int num_string_offsets;</div><div class='add'>+ unsigned char *string_offsets;</div><div class='add'>+</div><div class='add'>+ unsigned int string_table_size;</div><div class='add'>+ char *string_table;</div><div class='add'>+</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static char *tcap_getstr (char *, SLterminfo_Type *);</div><div class='add'>+static int tcap_getnum (char *, SLterminfo_Type *);</div><div class='add'>+static int tcap_getflag (char *, SLterminfo_Type *);</div><div class='add'>+static int tcap_getent (char *, SLterminfo_Type *);</div><div class='add'>+</div><div class='add'>+static FILE *open_terminfo (char *file, SLterminfo_Type *h)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+ unsigned char buf[12];</div><div class='add'>+</div><div class='add'>+ /* Alan Cox reported a security problem here if the application using the</div><div class='add'>+ * library is setuid. So, I need to make sure open the file as a normal</div><div class='add'>+ * user. Unfortunately, there does not appear to be a portable way of</div><div class='add'>+ * doing this, so I am going to use 'setfsgid' and 'setfsuid', which</div><div class='add'>+ * are not portable.</div><div class='add'>+ *</div><div class='add'>+ * I will also look into the use of setreuid, seteuid and setregid, setegid.</div><div class='add'>+ * FIXME: Priority=medium</div><div class='add'>+ */</div><div class='add'>+ fp = fopen (file, "rb");</div><div class='add'>+ if (fp == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+ if ((12 == fread ((char *) buf, 1, 12, fp) && (MAGIC == make_integer (buf))))</div><div class='add'>+ {</div><div class='add'>+ h->name_section_size = make_integer (buf + 2);</div><div class='add'>+ h->boolean_section_size = make_integer (buf + 4);</div><div class='add'>+ h->num_numbers = make_integer (buf + 6);</div><div class='add'>+ h->num_string_offsets = make_integer (buf + 8);</div><div class='add'>+ h->string_table_size = make_integer (buf + 10);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ fclose (fp);</div><div class='add'>+ fp = NULL;</div><div class='add'>+ }</div><div class='add'>+ return fp;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * The terminal names section comes next. It contains the first line of the</div><div class='add'>+ * terminfo description, listing the various names for the terminal,</div><div class='add'>+ * separated by the bar ( | ) character (see term(5)). The section is</div><div class='add'>+ * terminated with an ASCII NUL character.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* returns pointer to malloced space */</div><div class='add'>+static unsigned char *read_terminfo_section (FILE *fp, unsigned int size)</div><div class='add'>+{</div><div class='add'>+ char *s;</div><div class='add'>+</div><div class='add'>+ if (NULL == (s = (char *) SLmalloc (size))) return NULL;</div><div class='add'>+ if (size != fread (s, 1, size, fp))</div><div class='add'>+ {</div><div class='add'>+ SLfree (s);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ return (unsigned char *) s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *read_terminal_names (FILE *fp, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+ return t->terminal_names = (char *) read_terminfo_section (fp, t->name_section_size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * The boolean flags have one byte for each flag. This byte is either 0 or</div><div class='add'>+ * 1 as the flag is present or absent. The value of 2 means that the flag</div><div class='add'>+ * has been cancelled. The capabilities are in the same order as the file</div><div class='add'>+ * <term.h>.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static unsigned char *read_boolean_flags (FILE *fp, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+ /* Between the boolean section and the number section, a null byte is</div><div class='add'>+ * inserted, if necessary, to ensure that the number section begins on an</div><div class='add'>+ * even byte offset. All short integers are aligned on a short word</div><div class='add'>+ * boundary.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ unsigned int size = (t->name_section_size + t->boolean_section_size) % 2;</div><div class='add'>+ size += t->boolean_section_size;</div><div class='add'>+</div><div class='add'>+ return t->boolean_flags = read_terminfo_section (fp, size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * The numbers section is similar to the boolean flags section. Each</div><div class='add'>+ * capability takes up two bytes, and is stored as a short integer. If the</div><div class='add'>+ * value represented is -1 or -2, the capability is taken to be missing.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static unsigned char *read_numbers (FILE *fp, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+ return t->numbers = read_terminfo_section (fp, 2 * t->num_numbers);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* The strings section is also similar. Each capability is stored as a</div><div class='add'>+ * short integer, in the format above. A value of -1 or -2 means the</div><div class='add'>+ * capability is missing. Otherwise, the value is taken as an offset from</div><div class='add'>+ * the beginning of the string table. Special characters in ^X or \c</div><div class='add'>+ * notation are stored in their interpreted form, not the printing</div><div class='add'>+ * representation. Padding information ($<nn>) and parameter information</div><div class='add'>+ * (%x) are stored intact in uninterpreted form.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static unsigned char *read_string_offsets (FILE *fp, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+ return t->string_offsets = (unsigned char *) read_terminfo_section (fp, 2 * t->num_string_offsets);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* The final section is the string table. It contains all the values of</div><div class='add'>+ * string capabilities referenced in the string section. Each string is</div><div class='add'>+ * null terminated.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static char *read_string_table (FILE *fp, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+ return t->string_table = (char *) read_terminfo_section (fp, t->string_table_size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Compiled terminfo(4) descriptions are placed under the directory</div><div class='add'>+ * /usr/share/lib/terminfo. In order to avoid a linear search of a huge</div><div class='add'>+ * UNIX system directory, a two-level scheme is used:</div><div class='add'>+ * /usr/share/lib/terminfo/c/name where name is the name of the terminal,</div><div class='add'>+ * and c is the first character of name. Thus, att4425 can be found in the</div><div class='add'>+ * file /usr/share/lib/terminfo/a/att4425. Synonyms for the same terminal</div><div class='add'>+ * are implemented by multiple links to the same compiled file.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define MAX_TI_DIRS 7</div><div class='add'>+static char *Terminfo_Dirs [MAX_TI_DIRS] =</div><div class='add'>+{</div><div class='add'>+ NULL, /* $HOME/.terminfo */</div><div class='add'>+ NULL, /* $TERMINFO */</div><div class='add'>+ "/usr/share/terminfo",</div><div class='add'>+ "/usr/lib/terminfo",</div><div class='add'>+ "/usr/share/lib/terminfo",</div><div class='add'>+ "/etc/terminfo",</div><div class='add'>+ "/usr/local/lib/terminfo"</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+SLterminfo_Type *_SLtt_tigetent (char *term)</div><div class='add'>+{</div><div class='add'>+ char *tidir;</div><div class='add'>+ int i;</div><div class='add'>+ FILE *fp = NULL;</div><div class='add'>+ char file[1024];</div><div class='add'>+ static char home_ti [1024];</div><div class='add'>+ char *home;</div><div class='add'>+ SLterminfo_Type *ti;</div><div class='add'>+</div><div class='add'>+ if (</div><div class='add'>+ (term == NULL)</div><div class='add'>+#ifdef SLANG_UNTIC</div><div class='add'>+ && (SLang_Untic_Terminfo_File == NULL)</div><div class='add'>+#endif</div><div class='add'>+ )</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ if (NULL == (ti = (SLterminfo_Type *) SLmalloc (sizeof (SLterminfo_Type))))</div><div class='add'>+ {</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#ifdef SLANG_UNTIC</div><div class='add'>+ if (SLang_Untic_Terminfo_File != NULL)</div><div class='add'>+ {</div><div class='add'>+ fp = open_terminfo (SLang_Untic_Terminfo_File, ti);</div><div class='add'>+ goto fp_open_label;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+#endif</div><div class='add'>+ /* If we are on a termcap based system, use termcap */</div><div class='add'>+ if (0 == tcap_getent (term, ti)) return ti;</div><div class='add'>+</div><div class='add'>+ if (NULL != (home = getenv ("HOME")))</div><div class='add'>+ {</div><div class='add'>+ strncpy (home_ti, home, sizeof (home_ti) - 11);</div><div class='add'>+ home_ti [sizeof(home_ti) - 11] = 0;</div><div class='add'>+ strcat (home_ti, "/.terminfo");</div><div class='add'>+ Terminfo_Dirs [0] = home_ti;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Terminfo_Dirs[1] = getenv ("TERMINFO");</div><div class='add'>+ i = 0;</div><div class='add'>+ while (i < MAX_TI_DIRS)</div><div class='add'>+ {</div><div class='add'>+ tidir = Terminfo_Dirs[i];</div><div class='add'>+ if ((tidir != NULL)</div><div class='add'>+ && (sizeof (file) > strlen (tidir) + 2 + strlen (term)))</div><div class='add'>+ {</div><div class='add'>+ sprintf (file, "%s/%c/%s", tidir, *term, term);</div><div class='add'>+ if (NULL != (fp = open_terminfo (file, ti)))</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+#ifdef SLANG_UNTIC</div><div class='add'>+ fp_open_label:</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (fp != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (NULL != read_terminal_names (fp, ti))</div><div class='add'>+ {</div><div class='add'>+ if (NULL != read_boolean_flags (fp, ti))</div><div class='add'>+ {</div><div class='add'>+ if (NULL != read_numbers (fp, ti))</div><div class='add'>+ {</div><div class='add'>+ if (NULL != read_string_offsets (fp, ti))</div><div class='add'>+ {</div><div class='add'>+ if (NULL != read_string_table (fp, ti))</div><div class='add'>+ {</div><div class='add'>+ /* success */</div><div class='add'>+ fclose (fp);</div><div class='add'>+ ti->flags = SLTERMINFO;</div><div class='add'>+ return ti;</div><div class='add'>+ }</div><div class='add'>+ SLfree ((char *)ti->string_offsets);</div><div class='add'>+ }</div><div class='add'>+ SLfree ((char *)ti->numbers);</div><div class='add'>+ }</div><div class='add'>+ SLfree ((char *)ti->boolean_flags);</div><div class='add'>+ }</div><div class='add'>+ SLfree ((char *)ti->terminal_names);</div><div class='add'>+ }</div><div class='add'>+ fclose (fp);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLfree ((char *)ti);</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef SLANG_UNTIC</div><div class='add'>+# define UNTIC_COMMENT(x) ,x</div><div class='add'>+#else</div><div class='add'>+# define UNTIC_COMMENT(x)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char name[3];</div><div class='add'>+ int offset;</div><div class='add'>+#ifdef SLANG_UNTIC</div><div class='add'>+ char *comment;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+Tgetstr_Map_Type;</div><div class='add'>+</div><div class='add'>+/* I need to add: K1-5, %0-5(not important), @8, &8... */</div><div class='add'>+static Tgetstr_Map_Type Tgetstr_Map [] =</div><div class='add'>+{</div><div class='add'>+ {"!1", 212 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"!2", 213 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"!3", 214 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"#1", 198 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"#2", 199 UNTIC_COMMENT("Key S-Home")},</div><div class='add'>+ {"#3", 200 UNTIC_COMMENT("Key S-Insert")},</div><div class='add'>+ {"#4", 201 UNTIC_COMMENT("Key S-Left")},</div><div class='add'>+ {"%0", 177 UNTIC_COMMENT("redo key")},</div><div class='add'>+ {"%1", 168 UNTIC_COMMENT("help key")},</div><div class='add'>+ {"%2", 169 UNTIC_COMMENT("mark key")},</div><div class='add'>+ {"%3", 170 UNTIC_COMMENT("message key")},</div><div class='add'>+ {"%4", 171 UNTIC_COMMENT("move key")},</div><div class='add'>+ {"%5", 172 UNTIC_COMMENT("next key")},</div><div class='add'>+ {"%6", 173 UNTIC_COMMENT("open key")},</div><div class='add'>+ {"%7", 174 UNTIC_COMMENT("options key")},</div><div class='add'>+ {"%8", 175 UNTIC_COMMENT("previous key")},</div><div class='add'>+ {"%9", 176 UNTIC_COMMENT("print key")},</div><div class='add'>+ {"%a", 202 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"%b", 203 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"%c", 204 UNTIC_COMMENT("Key S-Next")},</div><div class='add'>+ {"%d", 205 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"%e", 206 UNTIC_COMMENT("Key S-Previous")},</div><div class='add'>+ {"%f", 207 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"%g", 208 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"%h", 209 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"%i", 210 UNTIC_COMMENT("Key S-Right")},</div><div class='add'>+ {"%j", 211 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"&0", 187 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"&1", 178 UNTIC_COMMENT("reference key")},</div><div class='add'>+ {"&2", 179 UNTIC_COMMENT("refresh key")},</div><div class='add'>+ {"&3", 180 UNTIC_COMMENT("replace key")},</div><div class='add'>+ {"&4", 181 UNTIC_COMMENT("restart key")},</div><div class='add'>+ {"&5", 182 UNTIC_COMMENT("resume key")},</div><div class='add'>+ {"&6", 183 UNTIC_COMMENT("save key")},</div><div class='add'>+ {"&7", 184 UNTIC_COMMENT("suspend key")},</div><div class='add'>+ {"&8", 185 UNTIC_COMMENT("undo key")},</div><div class='add'>+ {"&9", 186 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"*0", 197 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"*1", 188 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"*2", 189 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"*3", 190 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"*4", 191 UNTIC_COMMENT("Key S-Delete")},</div><div class='add'>+ {"*5", 192 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"*6", 193 UNTIC_COMMENT("select key")},</div><div class='add'>+ {"*7", 194 UNTIC_COMMENT("Key S-End")},</div><div class='add'>+ {"*8", 195 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"*9", 196 UNTIC_COMMENT("shifted key")},</div><div class='add'>+ {"@0", 167 UNTIC_COMMENT("find key")},</div><div class='add'>+ {"@1", 158 UNTIC_COMMENT("begin key")},</div><div class='add'>+ {"@2", 159 UNTIC_COMMENT("cancel key")},</div><div class='add'>+ {"@3", 160 UNTIC_COMMENT("close key")},</div><div class='add'>+ {"@4", 161 UNTIC_COMMENT("command key")},</div><div class='add'>+ {"@5", 162 UNTIC_COMMENT("copy key")},</div><div class='add'>+ {"@6", 163 UNTIC_COMMENT("create key")},</div><div class='add'>+ {"@7", 164 UNTIC_COMMENT("Key End")},</div><div class='add'>+ {"@8", 165 UNTIC_COMMENT("enter/send key")},</div><div class='add'>+ {"@9", 166 UNTIC_COMMENT("exit key")},</div><div class='add'>+ {"AB", 360 UNTIC_COMMENT("set ANSI color background")},</div><div class='add'>+ {"AF", 359 UNTIC_COMMENT("set ANSI color foreground")},</div><div class='add'>+ {"AL", 110 UNTIC_COMMENT("parm_insert_line")},</div><div class='add'>+ {"CC", 9 UNTIC_COMMENT("terminal settable cmd character in prototype !?")},</div><div class='add'>+ {"CM", 15 UNTIC_COMMENT("memory relative cursor addressing")},</div><div class='add'>+ {"CW", 277 UNTIC_COMMENT("define a window #1 from #2, #3 to #4, #5")},</div><div class='add'>+ {"DC", 105 UNTIC_COMMENT("delete #1 chars")},</div><div class='add'>+ {"DI", 280 UNTIC_COMMENT("dial number #1")},</div><div class='add'>+ {"DK", 275 UNTIC_COMMENT("display clock at (#1,#2)")},</div><div class='add'>+ {"DL", 106 UNTIC_COMMENT("parm_delete_line")},</div><div class='add'>+ {"DO", 107 UNTIC_COMMENT("down #1 lines")},</div><div class='add'>+ {"F1", 216 UNTIC_COMMENT("key_f11")},</div><div class='add'>+ {"F2", 217 UNTIC_COMMENT("key_f12")},</div><div class='add'>+ {"F3", 218 UNTIC_COMMENT("key_f13")},</div><div class='add'>+ {"F4", 219 UNTIC_COMMENT("key_f14")},</div><div class='add'>+ {"F5", 220 UNTIC_COMMENT("key_f15")},</div><div class='add'>+ {"F6", 221 UNTIC_COMMENT("key_f16")},</div><div class='add'>+ {"F7", 222 UNTIC_COMMENT("key_f17")},</div><div class='add'>+ {"F8", 223 UNTIC_COMMENT("key_f18")},</div><div class='add'>+ {"F9", 224 UNTIC_COMMENT("key_f19")},</div><div class='add'>+ {"FA", 225 UNTIC_COMMENT("key_f20")},</div><div class='add'>+ {"FB", 226 UNTIC_COMMENT("F21 function key")},</div><div class='add'>+ {"FC", 227 UNTIC_COMMENT("F22 function key")},</div><div class='add'>+ {"FD", 228 UNTIC_COMMENT("F23 function key")},</div><div class='add'>+ {"FE", 229 UNTIC_COMMENT("F24 function key")},</div><div class='add'>+ {"FF", 230 UNTIC_COMMENT("F25 function key")},</div><div class='add'>+ {"FG", 231 UNTIC_COMMENT("F26 function key")},</div><div class='add'>+ {"FH", 232 UNTIC_COMMENT("F27 function key")},</div><div class='add'>+ {"FI", 233 UNTIC_COMMENT("F28 function key")},</div><div class='add'>+ {"FJ", 234 UNTIC_COMMENT("F29 function key")},</div><div class='add'>+ {"FK", 235 UNTIC_COMMENT("F30 function key")},</div><div class='add'>+ {"FL", 236 UNTIC_COMMENT("F31 function key")},</div><div class='add'>+ {"FM", 237 UNTIC_COMMENT("F32 function key")},</div><div class='add'>+ {"FN", 238 UNTIC_COMMENT("F33 function key")},</div><div class='add'>+ {"FO", 239 UNTIC_COMMENT("F34 function key")},</div><div class='add'>+ {"FP", 240 UNTIC_COMMENT("F35 function key")},</div><div class='add'>+ {"FQ", 241 UNTIC_COMMENT("F36 function key")},</div><div class='add'>+ {"FR", 242 UNTIC_COMMENT("F37 function key")},</div><div class='add'>+ {"FS", 243 UNTIC_COMMENT("F38 function key")},</div><div class='add'>+ {"FT", 244 UNTIC_COMMENT("F39 function key")},</div><div class='add'>+ {"FU", 245 UNTIC_COMMENT("F40 function key")},</div><div class='add'>+ {"FV", 246 UNTIC_COMMENT("F41 function key")},</div><div class='add'>+ {"FW", 247 UNTIC_COMMENT("F42 function key")},</div><div class='add'>+ {"FX", 248 UNTIC_COMMENT("F43 function key")},</div><div class='add'>+ {"FY", 249 UNTIC_COMMENT("F44 function key")},</div><div class='add'>+ {"FZ", 250 UNTIC_COMMENT("F45 function key")},</div><div class='add'>+ {"Fa", 251 UNTIC_COMMENT("F46 function key")},</div><div class='add'>+ {"Fb", 252 UNTIC_COMMENT("F47 function key")},</div><div class='add'>+ {"Fc", 253 UNTIC_COMMENT("F48 function key")},</div><div class='add'>+ {"Fd", 254 UNTIC_COMMENT("F49 function key")},</div><div class='add'>+ {"Fe", 255 UNTIC_COMMENT("F50 function key")},</div><div class='add'>+ {"Ff", 256 UNTIC_COMMENT("F51 function key")},</div><div class='add'>+ {"Fg", 257 UNTIC_COMMENT("F52 function key")},</div><div class='add'>+ {"Fh", 258 UNTIC_COMMENT("F53 function key")},</div><div class='add'>+ {"Fi", 259 UNTIC_COMMENT("F54 function key")},</div><div class='add'>+ {"Fj", 260 UNTIC_COMMENT("F55 function key")},</div><div class='add'>+ {"Fk", 261 UNTIC_COMMENT("F56 function key")},</div><div class='add'>+ {"Fl", 262 UNTIC_COMMENT("F57 function key")},</div><div class='add'>+ {"Fm", 263 UNTIC_COMMENT("F58 function key")},</div><div class='add'>+ {"Fn", 264 UNTIC_COMMENT("F59 function key")},</div><div class='add'>+ {"Fo", 265 UNTIC_COMMENT("F60 function key")},</div><div class='add'>+ {"Fp", 266 UNTIC_COMMENT("F61 function key")},</div><div class='add'>+ {"Fq", 267 UNTIC_COMMENT("F62 function key")},</div><div class='add'>+ {"Fr", 268 UNTIC_COMMENT("F63 function key")},</div><div class='add'>+ {"G1", 400 UNTIC_COMMENT("single upper right")},</div><div class='add'>+ {"G2", 398 UNTIC_COMMENT("single upper left")},</div><div class='add'>+ {"G3", 399 UNTIC_COMMENT("single lower left")},</div><div class='add'>+ {"G4", 401 UNTIC_COMMENT("single lower right")},</div><div class='add'>+ {"GC", 408 UNTIC_COMMENT("single intersection")},</div><div class='add'>+ {"GD", 405 UNTIC_COMMENT("tee pointing down")},</div><div class='add'>+ {"GH", 406 UNTIC_COMMENT("single horizontal line")},</div><div class='add'>+ {"GL", 403 UNTIC_COMMENT("tee pointing left")},</div><div class='add'>+ {"GR", 402 UNTIC_COMMENT("tee pointing right")},</div><div class='add'>+ {"GU", 404 UNTIC_COMMENT("tee pointing up")},</div><div class='add'>+ {"GV", 407 UNTIC_COMMENT("single vertical line")},</div><div class='add'>+ {"Gm", 358 UNTIC_COMMENT("Curses should get button events")},</div><div class='add'>+ {"HU", 279 UNTIC_COMMENT("hang-up phone")},</div><div class='add'>+ {"IC", 108 UNTIC_COMMENT("insert #1 chars")},</div><div class='add'>+ {"Ic", 299 UNTIC_COMMENT("initialize color #1 to (#2,#3,#4)")},</div><div class='add'>+ {"Ip", 300 UNTIC_COMMENT("Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7)")},</div><div class='add'>+ {"K1", 139 UNTIC_COMMENT("upper left of keypad")},</div><div class='add'>+ {"K2", 141 UNTIC_COMMENT("center of keypad")},</div><div class='add'>+ {"K3", 140 UNTIC_COMMENT("upper right of keypad")},</div><div class='add'>+ {"K4", 142 UNTIC_COMMENT("lower left of keypad")},</div><div class='add'>+ {"K5", 143 UNTIC_COMMENT("lower right of keypad")},</div><div class='add'>+ {"Km", 355 UNTIC_COMMENT("Mouse event has occurred")},</div><div class='add'>+ {"LE", 111 UNTIC_COMMENT("move #1 chars to the left")},</div><div class='add'>+ {"LF", 157 UNTIC_COMMENT("turn off soft labels")},</div><div class='add'>+ {"LO", 156 UNTIC_COMMENT("turn on soft labels")},</div><div class='add'>+ {"Lf", 273 UNTIC_COMMENT("label format")},</div><div class='add'>+ {"MC", 270 UNTIC_COMMENT("clear right and left soft margins")},</div><div class='add'>+ {"ML", 271 UNTIC_COMMENT("set left soft margin")},</div><div class='add'>+ {"ML", 368 UNTIC_COMMENT("Set both left and right margins to #1, #2")},</div><div class='add'>+ {"MR", 272 UNTIC_COMMENT("set right soft margin")},</div><div class='add'>+ {"MT", 369 UNTIC_COMMENT("Sets both top and bottom margins to #1, #2")},</div><div class='add'>+ {"Mi", 356 UNTIC_COMMENT("Mouse status information")},</div><div class='add'>+ {"PA", 285 UNTIC_COMMENT("pause for 2-3 seconds")},</div><div class='add'>+ {"PU", 283 UNTIC_COMMENT("select pulse dialling")},</div><div class='add'>+ {"QD", 281 UNTIC_COMMENT("dial number #1 without checking")},</div><div class='add'>+ {"RA", 152 UNTIC_COMMENT("turn off automatic margins")},</div><div class='add'>+ {"RC", 276 UNTIC_COMMENT("remove clock")},</div><div class='add'>+ {"RF", 215 UNTIC_COMMENT("send next input char (for ptys)")},</div><div class='add'>+ {"RI", 112 UNTIC_COMMENT("parm_right_cursor")},</div><div class='add'>+ {"RQ", 357 UNTIC_COMMENT("Request mouse position")},</div><div class='add'>+ {"RX", 150 UNTIC_COMMENT("turn off xon/xoff handshaking")},</div><div class='add'>+ {"S1", 378 UNTIC_COMMENT("Display PC character")},</div><div class='add'>+ {"S2", 379 UNTIC_COMMENT("Enter PC character display mode")},</div><div class='add'>+ {"S3", 380 UNTIC_COMMENT("Exit PC character display mode")},</div><div class='add'>+ {"S4", 381 UNTIC_COMMENT("Enter PC scancode mode")},</div><div class='add'>+ {"S5", 382 UNTIC_COMMENT("Exit PC scancode mode")},</div><div class='add'>+ {"S6", 383 UNTIC_COMMENT("PC terminal options")},</div><div class='add'>+ {"S7", 384 UNTIC_COMMENT("Escape for scancode emulation")},</div><div class='add'>+ {"S8", 385 UNTIC_COMMENT("Alternate escape for scancode emulation")},</div><div class='add'>+ {"SA", 151 UNTIC_COMMENT("turn on automatic margins")},</div><div class='add'>+ {"SC", 274 UNTIC_COMMENT("set clock, #1 hrs #2 mins #3 secs")},</div><div class='add'>+ {"SF", 109 UNTIC_COMMENT("scroll forward #1 lines")},</div><div class='add'>+ {"SR", 113 UNTIC_COMMENT("scroll back #1 lines")},</div><div class='add'>+ {"SX", 149 UNTIC_COMMENT("turn on xon/xoff handshaking")},</div><div class='add'>+ {"Sb", 303 UNTIC_COMMENT("set background (color)")},</div><div class='add'>+ {"Sf", 302 UNTIC_COMMENT("set foreground (color)")},</div><div class='add'>+ {"TO", 282 UNTIC_COMMENT("select touch tone dialing")},</div><div class='add'>+ {"UP", 114 UNTIC_COMMENT("up #1 lines")},</div><div class='add'>+ {"WA", 286 UNTIC_COMMENT("wait for dial-tone")},</div><div class='add'>+ {"WG", 278 UNTIC_COMMENT("go to window #1")},</div><div class='add'>+ {"XF", 154 UNTIC_COMMENT("XOFF character")},</div><div class='add'>+ {"XN", 153 UNTIC_COMMENT("XON character")},</div><div class='add'>+ {"Xh", 386 UNTIC_COMMENT("Enter horizontal highlight mode")},</div><div class='add'>+ {"Xl", 387 UNTIC_COMMENT("Enter left highlight mode")},</div><div class='add'>+ {"Xo", 388 UNTIC_COMMENT("Enter low highlight mode")},</div><div class='add'>+ {"Xr", 389 UNTIC_COMMENT("Enter right highlight mode")},</div><div class='add'>+ {"Xt", 390 UNTIC_COMMENT("Enter top highlight mode")},</div><div class='add'>+ {"Xv", 391 UNTIC_COMMENT("Enter vertical highlight mode")},</div><div class='add'>+ {"Xy", 370 UNTIC_COMMENT("Repeat bit image cell #1 #2 times")},</div><div class='add'>+ {"YZ", 377 UNTIC_COMMENT("Set page length to #1 lines")},</div><div class='add'>+ {"Yv", 372 UNTIC_COMMENT("Move to beginning of same row")},</div><div class='add'>+ {"Yw", 373 UNTIC_COMMENT("Give name for color #1")},</div><div class='add'>+ {"Yx", 374 UNTIC_COMMENT("Define rectangualar bit image region")},</div><div class='add'>+ {"Yy", 375 UNTIC_COMMENT("End a bit-image region")},</div><div class='add'>+ {"Yz", 376 UNTIC_COMMENT("Change to ribbon color #1")},</div><div class='add'>+ {"ZA", 304 UNTIC_COMMENT("Change number of characters per inch")},</div><div class='add'>+ {"ZB", 305 UNTIC_COMMENT("Change number of lines per inch")},</div><div class='add'>+ {"ZC", 306 UNTIC_COMMENT("Change horizontal resolution")},</div><div class='add'>+ {"ZD", 307 UNTIC_COMMENT("Change vertical resolution")},</div><div class='add'>+ {"ZE", 308 UNTIC_COMMENT("Define a character")},</div><div class='add'>+ {"ZF", 309 UNTIC_COMMENT("Enter double-wide mode")},</div><div class='add'>+ {"ZG", 310 UNTIC_COMMENT("Enter draft-quality mode")},</div><div class='add'>+ {"ZH", 311 UNTIC_COMMENT("Enter italic mode")},</div><div class='add'>+ {"ZI", 312 UNTIC_COMMENT("Start leftward carriage motion")},</div><div class='add'>+ {"ZJ", 313 UNTIC_COMMENT("Start micro-motion mode")},</div><div class='add'>+ {"ZK", 314 UNTIC_COMMENT("Enter NLQ mode")},</div><div class='add'>+ {"ZL", 315 UNTIC_COMMENT("Wnter normal-quality mode")},</div><div class='add'>+ {"ZM", 316 UNTIC_COMMENT("Enter shadow-print mode")},</div><div class='add'>+ {"ZN", 317 UNTIC_COMMENT("Enter subscript mode")},</div><div class='add'>+ {"ZO", 318 UNTIC_COMMENT("Enter superscript mode")},</div><div class='add'>+ {"ZP", 319 UNTIC_COMMENT("Start upward carriage motion")},</div><div class='add'>+ {"ZQ", 320 UNTIC_COMMENT("End double-wide mode")},</div><div class='add'>+ {"ZR", 321 UNTIC_COMMENT("End italic mode")},</div><div class='add'>+ {"ZS", 322 UNTIC_COMMENT("End left-motion mode")},</div><div class='add'>+ {"ZT", 323 UNTIC_COMMENT("End micro-motion mode")},</div><div class='add'>+ {"ZU", 324 UNTIC_COMMENT("End shadow-print mode")},</div><div class='add'>+ {"ZV", 325 UNTIC_COMMENT("End subscript mode")},</div><div class='add'>+ {"ZW", 326 UNTIC_COMMENT("End superscript mode")},</div><div class='add'>+ {"ZX", 327 UNTIC_COMMENT("End reverse character motion")},</div><div class='add'>+ {"ZY", 328 UNTIC_COMMENT("Like column_address in micro mode")},</div><div class='add'>+ {"ZZ", 329 UNTIC_COMMENT("Like cursor_down in micro mode")},</div><div class='add'>+ {"Za", 330 UNTIC_COMMENT("Like cursor_left in micro mode")},</div><div class='add'>+ {"Zb", 331 UNTIC_COMMENT("Like cursor_right in micro mode")},</div><div class='add'>+ {"Zc", 332 UNTIC_COMMENT("Like row_address in micro mode")},</div><div class='add'>+ {"Zd", 333 UNTIC_COMMENT("Like cursor_up in micro mode")},</div><div class='add'>+ {"Ze", 334 UNTIC_COMMENT("Match software bits to print-head pins")},</div><div class='add'>+ {"Zf", 335 UNTIC_COMMENT("Like parm_down_cursor in micro mode")},</div><div class='add'>+ {"Zg", 336 UNTIC_COMMENT("Like parm_left_cursor in micro mode")},</div><div class='add'>+ {"Zh", 337 UNTIC_COMMENT("Like parm_right_cursor in micro mode")},</div><div class='add'>+ {"Zi", 338 UNTIC_COMMENT("Like parm_up_cursor in micro mode")},</div><div class='add'>+ {"Zj", 339 UNTIC_COMMENT("Select character set")},</div><div class='add'>+ {"Zk", 340 UNTIC_COMMENT("Set bottom margin at current line")},</div><div class='add'>+ {"Zl", 341 UNTIC_COMMENT("Set bottom margin at line #1 or #2 lines from bottom")},</div><div class='add'>+ {"Zm", 342 UNTIC_COMMENT("Set left (right) margin at column #1 (#2)")},</div><div class='add'>+ {"Zn", 343 UNTIC_COMMENT("Set right margin at column #1")},</div><div class='add'>+ {"Zo", 344 UNTIC_COMMENT("Set top margin at current line")},</div><div class='add'>+ {"Zp", 345 UNTIC_COMMENT("Set top (bottom) margin at row #1 (#2)")},</div><div class='add'>+ {"Zq", 346 UNTIC_COMMENT("Start printing bit image braphics")},</div><div class='add'>+ {"Zr", 347 UNTIC_COMMENT("Start character set definition")},</div><div class='add'>+ {"Zs", 348 UNTIC_COMMENT("Stop printing bit image graphics")},</div><div class='add'>+ {"Zt", 349 UNTIC_COMMENT("End definition of character aet")},</div><div class='add'>+ {"Zu", 350 UNTIC_COMMENT("List of subscriptable characters")},</div><div class='add'>+ {"Zv", 351 UNTIC_COMMENT("List of superscriptable characters")},</div><div class='add'>+ {"Zw", 352 UNTIC_COMMENT("Printing any of these chars causes CR")},</div><div class='add'>+ {"Zx", 353 UNTIC_COMMENT("No motion for subsequent character")},</div><div class='add'>+ {"Zy", 354 UNTIC_COMMENT("List of character set names")},</div><div class='add'>+ {"Zz", 371 UNTIC_COMMENT("Move to next row of the bit image")},</div><div class='add'>+ {"ac", 146 UNTIC_COMMENT("acs_chars")},</div><div class='add'>+ {"ae", 38 UNTIC_COMMENT("exit_alt_charset_mode")},</div><div class='add'>+ {"al", 53 UNTIC_COMMENT("insert line")},</div><div class='add'>+ {"as", 25 UNTIC_COMMENT("enter_alt_charset_mode")},</div><div class='add'>+ {"bc", 395 UNTIC_COMMENT("move left, if not ^H")},</div><div class='add'>+ {"bl", 1 UNTIC_COMMENT("audible signal (bell)")},</div><div class='add'>+ {"bt", 0 UNTIC_COMMENT("back tab")},</div><div class='add'>+ {"bx", 411 UNTIC_COMMENT("box chars primary set")},</div><div class='add'>+ {"cb", 269 UNTIC_COMMENT("Clear to beginning of line")},</div><div class='add'>+ {"cd", 7 UNTIC_COMMENT("clear to end of screen")},</div><div class='add'>+ {"ce", 6 UNTIC_COMMENT("clr_eol")},</div><div class='add'>+ {"ch", 8 UNTIC_COMMENT("horizontal position #1, absolute")},</div><div class='add'>+ {"ci", 363 UNTIC_COMMENT("Init sequence for multiple codesets")},</div><div class='add'>+ {"cl", 5 UNTIC_COMMENT("clear screen and home cursor")},</div><div class='add'>+ {"cm", 10 UNTIC_COMMENT("move to row #1 columns #2")},</div><div class='add'>+ {"cr", 2 UNTIC_COMMENT("carriage return")},</div><div class='add'>+ {"cs", 3 UNTIC_COMMENT("change region to line #1 to line #2")},</div><div class='add'>+ {"ct", 4 UNTIC_COMMENT("clear all tab stops")},</div><div class='add'>+ {"cv", 127 UNTIC_COMMENT("vertical position #1 absolute")},</div><div class='add'>+ {"dc", 21 UNTIC_COMMENT("delete character")},</div><div class='add'>+ {"dl", 22 UNTIC_COMMENT("delete line")},</div><div class='add'>+ {"dm", 29 UNTIC_COMMENT("enter delete mode")},</div><div class='add'>+ {"do", 11 UNTIC_COMMENT("down one line")},</div><div class='add'>+ {"ds", 23 UNTIC_COMMENT("disable status line")},</div><div class='add'>+ {"dv", 362 UNTIC_COMMENT("Indicate language/codeset support")},</div><div class='add'>+ {"eA", 155 UNTIC_COMMENT("enable alternate char set")},</div><div class='add'>+ {"ec", 37 UNTIC_COMMENT("erase #1 characters")},</div><div class='add'>+ {"ed", 41 UNTIC_COMMENT("end delete mode")},</div><div class='add'>+ {"ei", 42 UNTIC_COMMENT("exit insert mode")},</div><div class='add'>+ {"ff", 46 UNTIC_COMMENT("hardcopy terminal page eject")},</div><div class='add'>+ {"fh", 284 UNTIC_COMMENT("flash switch hook")},</div><div class='add'>+ {"fs", 47 UNTIC_COMMENT("return from status line")},</div><div class='add'>+ {"hd", 24 UNTIC_COMMENT("half a line down")},</div><div class='add'>+ {"ho", 12 UNTIC_COMMENT("home cursor (if no cup)")},</div><div class='add'>+ {"hu", 137 UNTIC_COMMENT("half a line up")},</div><div class='add'>+ {"i1", 48 UNTIC_COMMENT("initialization string")},</div><div class='add'>+ {"i2", 392 UNTIC_COMMENT("secondary initialization string")},</div><div class='add'>+ {"i3", 50 UNTIC_COMMENT("initialization string")},</div><div class='add'>+ {"iP", 138 UNTIC_COMMENT("path name of program for initialization")},</div><div class='add'>+ {"ic", 52 UNTIC_COMMENT("insert character")},</div><div class='add'>+ {"if", 51 UNTIC_COMMENT("name of initialization file")},</div><div class='add'>+ {"im", 31 UNTIC_COMMENT("enter insert mode")},</div><div class='add'>+ {"ip", 54 UNTIC_COMMENT("insert padding after inserted character")},</div><div class='add'>+ {"is", 49 UNTIC_COMMENT("initialization string")},</div><div class='add'>+ {"k0", 65 UNTIC_COMMENT("F0 function key")},</div><div class='add'>+ {"k1", 66 UNTIC_COMMENT("F1 function key")},</div><div class='add'>+ {"k2", 68 UNTIC_COMMENT("F2 function key")},</div><div class='add'>+ {"k3", 69 UNTIC_COMMENT("F3 function key")},</div><div class='add'>+ {"k4", 70 UNTIC_COMMENT("F4 function key")},</div><div class='add'>+ {"k5", 71 UNTIC_COMMENT("F5 function key")},</div><div class='add'>+ {"k6", 72 UNTIC_COMMENT("F6 function key")},</div><div class='add'>+ {"k7", 73 UNTIC_COMMENT("F7 function key")},</div><div class='add'>+ {"k8", 74 UNTIC_COMMENT("F8 fucntion key")},</div><div class='add'>+ {"k9", 75 UNTIC_COMMENT("F9 function key")},</div><div class='add'>+ {"k;", 67 UNTIC_COMMENT("F10 function key")},</div><div class='add'>+ {"kA", 78 UNTIC_COMMENT("insert-line key")},</div><div class='add'>+ {"kB", 148 UNTIC_COMMENT("back-tab key")},</div><div class='add'>+ {"kC", 57 UNTIC_COMMENT("clear-screen or erase key")},</div><div class='add'>+ {"kD", 59 UNTIC_COMMENT("delete-character key")},</div><div class='add'>+ {"kE", 63 UNTIC_COMMENT("clear-to-end-of-line key")},</div><div class='add'>+ {"kF", 84 UNTIC_COMMENT("scroll-forward key")},</div><div class='add'>+ {"kH", 80 UNTIC_COMMENT("last-line key")},</div><div class='add'>+ {"kI", 77 UNTIC_COMMENT("insert-character key")},</div><div class='add'>+ {"kL", 60 UNTIC_COMMENT("delete-line key")},</div><div class='add'>+ {"kM", 62 UNTIC_COMMENT("sent by rmir or smir in insert mode")},</div><div class='add'>+ {"kN", 81 UNTIC_COMMENT("next-page key")},</div><div class='add'>+ {"kP", 82 UNTIC_COMMENT("prev-page key")},</div><div class='add'>+ {"kR", 85 UNTIC_COMMENT("scroll-backward key")},</div><div class='add'>+ {"kS", 64 UNTIC_COMMENT("clear-to-end-of-screen key")},</div><div class='add'>+ {"kT", 86 UNTIC_COMMENT("set-tab key")},</div><div class='add'>+ {"ka", 56 UNTIC_COMMENT("clear-all-tabs key")},</div><div class='add'>+ {"kb", 55 UNTIC_COMMENT("backspace key")},</div><div class='add'>+ {"kd", 61 UNTIC_COMMENT("down-arrow key")},</div><div class='add'>+ {"ke", 88 UNTIC_COMMENT("leave 'keyboard_transmit' mode")},</div><div class='add'>+ {"kh", 76 UNTIC_COMMENT("home key")},</div><div class='add'>+ {"kl", 79 UNTIC_COMMENT("left-arrow key")},</div><div class='add'>+ {"ko", 396 UNTIC_COMMENT("list of self-mapped keycaps")},</div><div class='add'>+ {"kr", 83 UNTIC_COMMENT("right-arrow key")},</div><div class='add'>+ {"ks", 89 UNTIC_COMMENT("enter 'keyboard_transmit' mode")},</div><div class='add'>+ {"kt", 58 UNTIC_COMMENT("clear-tab key")},</div><div class='add'>+ {"ku", 87 UNTIC_COMMENT("up-arrow key")},</div><div class='add'>+ {"l0", 90 UNTIC_COMMENT("label on function key f0 if not f0")},</div><div class='add'>+ {"l1", 91 UNTIC_COMMENT("label on function key f1 if not f1")},</div><div class='add'>+ {"l2", 93 UNTIC_COMMENT("label on function key f2 if not f2")},</div><div class='add'>+ {"l3", 94 UNTIC_COMMENT("label on function key f3 if not f3")},</div><div class='add'>+ {"l4", 95 UNTIC_COMMENT("label on function key f4 if not f4")},</div><div class='add'>+ {"l5", 96 UNTIC_COMMENT("lable on function key f5 if not f5")},</div><div class='add'>+ {"l6", 97 UNTIC_COMMENT("label on function key f6 if not f6")},</div><div class='add'>+ {"l7", 98 UNTIC_COMMENT("label on function key f7 if not f7")},</div><div class='add'>+ {"l8", 99 UNTIC_COMMENT("label on function key f8 if not f8")},</div><div class='add'>+ {"l9", 100 UNTIC_COMMENT("label on function key f9 if not f9")},</div><div class='add'>+ {"la", 92 UNTIC_COMMENT("label on function key f10 if not f10")},</div><div class='add'>+ {"le", 14 UNTIC_COMMENT("move left one space")},</div><div class='add'>+ {"ll", 18 UNTIC_COMMENT("last line, first column (if no cup)")},</div><div class='add'>+ {"ma", 397 UNTIC_COMMENT("map arrow keys rogue(1) motion keys")},</div><div class='add'>+ {"mb", 26 UNTIC_COMMENT("turn on blinking")},</div><div class='add'>+ {"md", 27 UNTIC_COMMENT("turn on bold (extra bright) mode")},</div><div class='add'>+ {"me", 39 UNTIC_COMMENT("turn off all attributes")},</div><div class='add'>+ {"mh", 30 UNTIC_COMMENT("turn on half-bright mode")},</div><div class='add'>+ {"mk", 32 UNTIC_COMMENT("turn on blank mode (characters invisible)")},</div><div class='add'>+ {"ml", 409 UNTIC_COMMENT("memory lock above")},</div><div class='add'>+ {"mm", 102 UNTIC_COMMENT("turn on meta mode (8th-bit on)")},</div><div class='add'>+ {"mo", 101 UNTIC_COMMENT("turn off meta mode")},</div><div class='add'>+ {"mp", 33 UNTIC_COMMENT("turn on protected mode")},</div><div class='add'>+ {"mr", 34 UNTIC_COMMENT("turn on reverse video mode")},</div><div class='add'>+ {"mu", 410 UNTIC_COMMENT("memory unlock")},</div><div class='add'>+ {"nd", 17 UNTIC_COMMENT("move right one space")},</div><div class='add'>+ {"nl", 394 UNTIC_COMMENT("use to move down")},</div><div class='add'>+ {"nw", 103 UNTIC_COMMENT("newline (behave like cr followed by lf)")},</div><div class='add'>+ {"oc", 298 UNTIC_COMMENT("Set all color pairs to the original ones")},</div><div class='add'>+ {"op", 297 UNTIC_COMMENT("Set default pair to its original value")},</div><div class='add'>+ {"pO", 144 UNTIC_COMMENT("turn on printer for #1 bytes")},</div><div class='add'>+ {"pc", 104 UNTIC_COMMENT("padding char (instead of null)")},</div><div class='add'>+ {"pf", 119 UNTIC_COMMENT("turn off printer")},</div><div class='add'>+ {"pk", 115 UNTIC_COMMENT("program function key #1 to type string #2")},</div><div class='add'>+ {"pl", 116 UNTIC_COMMENT("program function key #1 to execute string #2")},</div><div class='add'>+ {"pn", 147 UNTIC_COMMENT("program label #1 to show string #2")},</div><div class='add'>+ {"po", 120 UNTIC_COMMENT("turn on printer")},</div><div class='add'>+ {"ps", 118 UNTIC_COMMENT("print contents of screen")},</div><div class='add'>+ {"px", 117 UNTIC_COMMENT("program function key #1 to transmit string #2")},</div><div class='add'>+ {"r1", 122 UNTIC_COMMENT("reset string")},</div><div class='add'>+ {"r2", 123 UNTIC_COMMENT("reset string")},</div><div class='add'>+ {"r3", 124 UNTIC_COMMENT("reset string")},</div><div class='add'>+ {"rP", 145 UNTIC_COMMENT("like ip but when in insert mode")},</div><div class='add'>+ {"rc", 126 UNTIC_COMMENT("restore cursor to last position of sc")},</div><div class='add'>+ {"rf", 125 UNTIC_COMMENT("name of reset file")},</div><div class='add'>+ {"rp", 121 UNTIC_COMMENT("repeat char #1 #2 times")},</div><div class='add'>+ {"rs", 393 UNTIC_COMMENT("terminal reset string")},</div><div class='add'>+ {"s0", 364 UNTIC_COMMENT("Shift to code set 0 (EUC set 0, ASCII)")},</div><div class='add'>+ {"s1", 365 UNTIC_COMMENT("Shift to code set 1")},</div><div class='add'>+ {"s2", 366 UNTIC_COMMENT("Shift to code set 2")},</div><div class='add'>+ {"s3", 367 UNTIC_COMMENT("Shift to code set 3")},</div><div class='add'>+ {"sa", 131 UNTIC_COMMENT("define video attributes #1-#9 (PG9)")},</div><div class='add'>+ {"sc", 128 UNTIC_COMMENT("save current cursor position")},</div><div class='add'>+ {"se", 43 UNTIC_COMMENT("exit standout mode")},</div><div class='add'>+ {"sf", 129 UNTIC_COMMENT("scroll text up")},</div><div class='add'>+ {"so", 35 UNTIC_COMMENT("begin standout mode")},</div><div class='add'>+ {"sp", 301 UNTIC_COMMENT("Set current color pair to #1")},</div><div class='add'>+ {"sr", 130 UNTIC_COMMENT("scroll text down")},</div><div class='add'>+ {"st", 132 UNTIC_COMMENT("set a tab in every row, current columns")},</div><div class='add'>+ {"ta", 134 UNTIC_COMMENT("tab to next 8-space hardware tab stop")},</div><div class='add'>+ {"te", 40 UNTIC_COMMENT("strings to end programs using cup")},</div><div class='add'>+ {"ti", 28 UNTIC_COMMENT("string to start programs using cup")},</div><div class='add'>+ {"ts", 135 UNTIC_COMMENT("move to status line")},</div><div class='add'>+ {"u0", 287 UNTIC_COMMENT("User string #0")},</div><div class='add'>+ {"u1", 288 UNTIC_COMMENT("User string #1")},</div><div class='add'>+ {"u2", 289 UNTIC_COMMENT("User string #2")},</div><div class='add'>+ {"u3", 290 UNTIC_COMMENT("User string #3")},</div><div class='add'>+ {"u4", 291 UNTIC_COMMENT("User string #4")},</div><div class='add'>+ {"u5", 292 UNTIC_COMMENT("User string #5")},</div><div class='add'>+ {"u6", 293 UNTIC_COMMENT("User string #6")},</div><div class='add'>+ {"u7", 294 UNTIC_COMMENT("User string #7")},</div><div class='add'>+ {"u8", 295 UNTIC_COMMENT("User string #8")},</div><div class='add'>+ {"u9", 296 UNTIC_COMMENT("User string #9")},</div><div class='add'>+ {"uc", 136 UNTIC_COMMENT("underline char and move past it")},</div><div class='add'>+ {"ue", 44 UNTIC_COMMENT("exit underline mode")},</div><div class='add'>+ {"up", 19 UNTIC_COMMENT("up one line")},</div><div class='add'>+ {"us", 36 UNTIC_COMMENT("begin underline mode")},</div><div class='add'>+ {"vb", 45 UNTIC_COMMENT("visible bell (may not move cursor)")},</div><div class='add'>+ {"ve", 16 UNTIC_COMMENT("make cursor appear normal (undo civis/cvvis)")},</div><div class='add'>+ {"vi", 13 UNTIC_COMMENT("make cursor invisible")},</div><div class='add'>+ {"vs", 20 UNTIC_COMMENT("make cursor very visible")},</div><div class='add'>+ {"wi", 133 UNTIC_COMMENT("current window is lines #1-#2 cols #3-#4")},</div><div class='add'>+ {"xl", 361 UNTIC_COMMENT("Program function key #1 to type string #2 and show string #3")},</div><div class='add'>+ {"", -1 UNTIC_COMMENT(NULL)}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int compute_cap_offset (char *cap, SLterminfo_Type *t, Tgetstr_Map_Type *map, unsigned int max_ofs)</div><div class='add'>+{</div><div class='add'>+ char cha, chb;</div><div class='add'>+</div><div class='add'>+ (void) t;</div><div class='add'>+ cha = *cap++; chb = *cap;</div><div class='add'>+</div><div class='add'>+ while (*map->name != 0)</div><div class='add'>+ {</div><div class='add'>+ if ((cha == *map->name) && (chb == *(map->name + 1)))</div><div class='add'>+ {</div><div class='add'>+ if (map->offset >= (int) max_ofs) return -1;</div><div class='add'>+ return map->offset;</div><div class='add'>+ }</div><div class='add'>+ map++;</div><div class='add'>+ }</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *_SLtt_tigetstr (SLterminfo_Type *t, char *cap)</div><div class='add'>+{</div><div class='add'>+ int offset;</div><div class='add'>+</div><div class='add'>+ if (t == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ if (t->flags == SLTERMCAP) return tcap_getstr (cap, t);</div><div class='add'>+</div><div class='add'>+ offset = compute_cap_offset (cap, t, Tgetstr_Map, t->num_string_offsets);</div><div class='add'>+ if (offset < 0) return NULL;</div><div class='add'>+ offset = make_integer (t->string_offsets + 2 * offset);</div><div class='add'>+ if (offset < 0) return NULL;</div><div class='add'>+ return t->string_table + offset;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static Tgetstr_Map_Type Tgetnum_Map[] =</div><div class='add'>+{</div><div class='add'>+ {"BT", 30 UNTIC_COMMENT("number of buttons on mouse")},</div><div class='add'>+ {"Co", 13 UNTIC_COMMENT("maximum numbers of colors on screen")},</div><div class='add'>+ {"MW", 12 UNTIC_COMMENT("maxumum number of defineable windows")},</div><div class='add'>+ {"NC", 15 UNTIC_COMMENT("video attributes that can't be used with colors")},</div><div class='add'>+ {"Nl", 8 UNTIC_COMMENT("number of labels on screen")},</div><div class='add'>+ {"Ya", 16 UNTIC_COMMENT("numbers of bytes buffered before printing")},</div><div class='add'>+ {"Yb", 17 UNTIC_COMMENT("spacing of pins vertically in pins per inch")},</div><div class='add'>+ {"Yc", 18 UNTIC_COMMENT("spacing of dots horizontally in dots per inch")},</div><div class='add'>+ {"Yd", 19 UNTIC_COMMENT("maximum value in micro_..._address")},</div><div class='add'>+ {"Ye", 20 UNTIC_COMMENT("maximum value in parm_..._micro")},</div><div class='add'>+ {"Yf", 21 UNTIC_COMMENT("character size when in micro mode")},</div><div class='add'>+ {"Yg", 22 UNTIC_COMMENT("line size when in micro mode")},</div><div class='add'>+ {"Yh", 23 UNTIC_COMMENT("numbers of pins in print-head")},</div><div class='add'>+ {"Yi", 24 UNTIC_COMMENT("horizontal resolution in units per line")},</div><div class='add'>+ {"Yj", 25 UNTIC_COMMENT("vertical resolution in units per line")},</div><div class='add'>+ {"Yk", 26 UNTIC_COMMENT("horizontal resolution in units per inch")},</div><div class='add'>+ {"Yl", 27 UNTIC_COMMENT("vertical resolution in units per inch")},</div><div class='add'>+ {"Ym", 28 UNTIC_COMMENT("print rate in chars per second")},</div><div class='add'>+ {"Yn", 29 UNTIC_COMMENT("character step size when in double wide mode")},</div><div class='add'>+ {"Yo", 31 UNTIC_COMMENT("number of passed for each bit-image row")},</div><div class='add'>+ {"Yp", 32 UNTIC_COMMENT("type of bit-image device")},</div><div class='add'>+ {"co", 0 UNTIC_COMMENT("number of columns in aline")},</div><div class='add'>+ {"dB", 36 UNTIC_COMMENT("padding required for ^H")},</div><div class='add'>+ {"dC", 34 UNTIC_COMMENT("pad needed for CR")},</div><div class='add'>+ {"dN", 35 UNTIC_COMMENT("pad needed for LF")},</div><div class='add'>+ {"dT", 37 UNTIC_COMMENT("padding required for ^I")},</div><div class='add'>+ {"it", 1 UNTIC_COMMENT("tabs initially every # spaces")},</div><div class='add'>+ {"kn", 38 UNTIC_COMMENT("count of function keys")},</div><div class='add'>+ {"lh", 9 UNTIC_COMMENT("rows in each label")},</div><div class='add'>+ {"li", 2 UNTIC_COMMENT("number of lines on screen or page")},</div><div class='add'>+ {"lm", 3 UNTIC_COMMENT("lines of memory if > line. 0 => varies")},</div><div class='add'>+ {"lw", 10 UNTIC_COMMENT("columns in each label")},</div><div class='add'>+ {"ma", 11 UNTIC_COMMENT("maximum combined attributes terminal can handle")},</div><div class='add'>+ {"pa", 14 UNTIC_COMMENT("maximum number of color-pairs on the screen")},</div><div class='add'>+ {"pb", 5 UNTIC_COMMENT("lowest baud rate where padding needed")},</div><div class='add'>+ {"sg", 4 UNTIC_COMMENT("number of blank chars left by smso or rmso")},</div><div class='add'>+ {"ug", 33 UNTIC_COMMENT("number of blanks left by ul")},</div><div class='add'>+ {"vt", 6 UNTIC_COMMENT("virtual terminal number (CB/unix)")},</div><div class='add'>+ {"ws", 7 UNTIC_COMMENT("columns in status line")},</div><div class='add'>+ {"", -1 UNTIC_COMMENT(NULL)}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLtt_tigetnum (SLterminfo_Type *t, char *cap)</div><div class='add'>+{</div><div class='add'>+ int offset;</div><div class='add'>+</div><div class='add'>+ if (t == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (t->flags == SLTERMCAP) return tcap_getnum (cap, t);</div><div class='add'>+</div><div class='add'>+ offset = compute_cap_offset (cap, t, Tgetnum_Map, t->num_numbers);</div><div class='add'>+ if (offset < 0) return -1;</div><div class='add'>+ return make_integer (t->numbers + 2 * offset);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static Tgetstr_Map_Type Tgetflag_Map[] =</div><div class='add'>+{</div><div class='add'>+ {"5i", 22 UNTIC_COMMENT("printer won't echo on screen")},</div><div class='add'>+ {"HC", 23 UNTIC_COMMENT("cursor is hard to see")},</div><div class='add'>+ {"MT", 40 UNTIC_COMMENT("has meta key")},</div><div class='add'>+ {"ND", 26 UNTIC_COMMENT("scrolling region is non-destructive")},</div><div class='add'>+ {"NL", 41 UNTIC_COMMENT("move down with \n")},</div><div class='add'>+ {"NP", 25 UNTIC_COMMENT("pad character does not exist")},</div><div class='add'>+ {"NR", 24 UNTIC_COMMENT("smcup does not reverse rmcup")},</div><div class='add'>+ {"YA", 30 UNTIC_COMMENT("only positive motion for hpa/mhpa caps")},</div><div class='add'>+ {"YB", 31 UNTIC_COMMENT("using cr turns off micro mode")},</div><div class='add'>+ {"YC", 32 UNTIC_COMMENT("printer needs operator to change character set")},</div><div class='add'>+ {"YD", 33 UNTIC_COMMENT("only positive motion for vpa/mvpa caps")},</div><div class='add'>+ {"YE", 34 UNTIC_COMMENT("printing in last column causes cr")},</div><div class='add'>+ {"YF", 35 UNTIC_COMMENT("changing character pitch changes resolution")},</div><div class='add'>+ {"YG", 36 UNTIC_COMMENT("changing line pitch changes resolution")},</div><div class='add'>+ {"am", 1 UNTIC_COMMENT("terminal has automatic margins")},</div><div class='add'>+ {"bs", 37 UNTIC_COMMENT("uses ^H to move left")},</div><div class='add'>+ {"bw", 0 UNTIC_COMMENT("cub1 wraps from column 0 to last column")},</div><div class='add'>+ {"cc", 27 UNTIC_COMMENT("terminal can re-define existing colors")},</div><div class='add'>+ {"da", 11 UNTIC_COMMENT("display may be retained above the screen")},</div><div class='add'>+ {"db", 12 UNTIC_COMMENT("display may be retained below the screen")},</div><div class='add'>+ {"eo", 5 UNTIC_COMMENT("can erase overstrikes with a blank")},</div><div class='add'>+ {"es", 16 UNTIC_COMMENT("escape can be used on the status line")},</div><div class='add'>+ {"gn", 6 UNTIC_COMMENT("generic line type")},</div><div class='add'>+ {"hc", 7 UNTIC_COMMENT("hardcopy terminal")},</div><div class='add'>+ {"hl", 29 UNTIC_COMMENT("terminal uses only HLS color notation (tektronix)")},</div><div class='add'>+ {"hs", 9 UNTIC_COMMENT("has extra status line")},</div><div class='add'>+ {"hz", 18 UNTIC_COMMENT("can't print ~'s (hazeltine)")},</div><div class='add'>+ {"in", 10 UNTIC_COMMENT("insert mode distinguishes nulls")},</div><div class='add'>+ {"km", 8 UNTIC_COMMENT("Has a meta key, sets msb high")},</div><div class='add'>+ {"mi", 13 UNTIC_COMMENT("safe to move while in insert mode")},</div><div class='add'>+ {"ms", 14 UNTIC_COMMENT("safe to move while in standout mode")},</div><div class='add'>+ {"nc", 39 UNTIC_COMMENT("no way to go to start of line")},</div><div class='add'>+ {"ns", 38 UNTIC_COMMENT("crt cannot scroll")},</div><div class='add'>+ {"nx", 21 UNTIC_COMMENT("padding won't work, xon/xoff required")},</div><div class='add'>+ {"os", 15 UNTIC_COMMENT("terminal can overstrike")},</div><div class='add'>+ {"pt", 42 UNTIC_COMMENT("has 8-char tabs invoked with ^I")},</div><div class='add'>+ {"ul", 19 UNTIC_COMMENT("underline character overstrikes")},</div><div class='add'>+ {"ut", 28 UNTIC_COMMENT("screen erased with background color")},</div><div class='add'>+ {"xb", 2 UNTIC_COMMENT("beehive (f1=escape, f2=ctrl C)")},</div><div class='add'>+ {"xn", 4 UNTIC_COMMENT("newline ignored after 80 cols (concept)")},</div><div class='add'>+ {"xo", 20 UNTIC_COMMENT("terminal uses xon/xoff handshaking")},</div><div class='add'>+ {"xr", 43 UNTIC_COMMENT("return clears the line")},</div><div class='add'>+ {"xs", 3 UNTIC_COMMENT("standout not erased by overwriting (hp)")},</div><div class='add'>+ {"xt", 17 UNTIC_COMMENT("tabs destructive, magic so char (t1061)")},</div><div class='add'>+ {"", -1 UNTIC_COMMENT(NULL)}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLtt_tigetflag (SLterminfo_Type *t, char *cap)</div><div class='add'>+{</div><div class='add'>+ int offset;</div><div class='add'>+</div><div class='add'>+ if (t == NULL) return -1;</div><div class='add'>+</div><div class='add'>+ if (t->flags == SLTERMCAP) return tcap_getflag (cap, t);</div><div class='add'>+</div><div class='add'>+ offset = compute_cap_offset (cap, t, Tgetflag_Map, t->boolean_section_size);</div><div class='add'>+</div><div class='add'>+ if (offset < 0) return -1;</div><div class='add'>+ return (int) *(t->boolean_flags + offset);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* These are my termcap routines. They only work with the TERMCAP environment</div><div class='add'>+ * variable. This variable must contain the termcap entry and NOT the file.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static int tcap_getflag (char *cap, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+ char a, b;</div><div class='add'>+ char *f = (char *) t->boolean_flags;</div><div class='add'>+ char *fmax;</div><div class='add'>+</div><div class='add'>+ if (f == NULL) return 0;</div><div class='add'>+ fmax = f + t->boolean_section_size;</div><div class='add'>+</div><div class='add'>+ a = *cap;</div><div class='add'>+ b = *(cap + 1);</div><div class='add'>+ while (f < fmax)</div><div class='add'>+ {</div><div class='add'>+ if ((a == f[0]) && (b == f[1]))</div><div class='add'>+ return 1;</div><div class='add'>+ f += 2;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *tcap_get_cap (unsigned char *cap, unsigned char *caps, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ unsigned char c0, c1;</div><div class='add'>+ unsigned char *caps_max;</div><div class='add'>+</div><div class='add'>+ c0 = cap[0];</div><div class='add'>+ c1 = cap[1];</div><div class='add'>+</div><div class='add'>+ if (caps == NULL) return NULL;</div><div class='add'>+ caps_max = caps + len;</div><div class='add'>+ while (caps < caps_max)</div><div class='add'>+ {</div><div class='add'>+ if ((c0 == caps[0]) && (c1 == caps[1]))</div><div class='add'>+ {</div><div class='add'>+ return (char *) caps + 3;</div><div class='add'>+ }</div><div class='add'>+ caps += (int) caps[2];</div><div class='add'>+ }</div><div class='add'>+ return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int tcap_getnum (char *cap, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+ cap = tcap_get_cap ((unsigned char *) cap, t->numbers, t->num_numbers);</div><div class='add'>+ if (cap == NULL) return -1;</div><div class='add'>+ return atoi (cap);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *tcap_getstr (char *cap, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+ return tcap_get_cap ((unsigned char *) cap, (unsigned char *) t->string_table, t->string_table_size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int tcap_extract_field (unsigned char *t0)</div><div class='add'>+{</div><div class='add'>+ register unsigned char ch, *t = t0;</div><div class='add'>+ while (((ch = *t) != 0) && (ch != ':')) t++;</div><div class='add'>+ if (ch == ':') return (int) (t - t0);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_Try_Termcap = 1;</div><div class='add'>+static int tcap_getent (char *term, SLterminfo_Type *ti)</div><div class='add'>+{</div><div class='add'>+ unsigned char *termcap, ch;</div><div class='add'>+ unsigned char *buf, *b;</div><div class='add'>+ unsigned char *t;</div><div class='add'>+ int len;</div><div class='add'>+</div><div class='add'>+ if (SLtt_Try_Termcap == 0) return -1;</div><div class='add'>+#if 1</div><div class='add'>+ /* XFREE86 xterm sets the TERMCAP environment variable to an invalid</div><div class='add'>+ * value. Specifically, it lacks the tc= string.</div><div class='add'>+ */</div><div class='add'>+ if (!strncmp (term, "xterm", 5))</div><div class='add'>+ return -1;</div><div class='add'>+#endif</div><div class='add'>+ termcap = (unsigned char *) getenv ("TERMCAP");</div><div class='add'>+ if ((termcap == NULL) || (*termcap == '/')) return -1;</div><div class='add'>+</div><div class='add'>+ /* We have a termcap so lets use it provided it does not have a reference</div><div class='add'>+ * to another terminal via tc=. In that case, use terminfo. The alternative</div><div class='add'>+ * would be to parse the termcap file which I do not want to do right now.</div><div class='add'>+ * Besides, this is a terminfo based system and if the termcap were parsed</div><div class='add'>+ * terminfo would almost never get a chance to run. In addition, the tc=</div><div class='add'>+ * thing should not occur if tset is used to set the termcap entry.</div><div class='add'>+ */</div><div class='add'>+ t = termcap;</div><div class='add'>+ while ((len = tcap_extract_field (t)) != -1)</div><div class='add'>+ {</div><div class='add'>+ if ((len > 3) && (t[0] == 't') && (t[1] == 'c') && (t[2] == '='))</div><div class='add'>+ return -1;</div><div class='add'>+ t += (len + 1);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* malloc some extra space just in case it is needed. */</div><div class='add'>+ len = strlen ((char *) termcap) + 256;</div><div class='add'>+ if (NULL == (buf = (unsigned char *) SLmalloc ((unsigned int) len))) return -1;</div><div class='add'>+</div><div class='add'>+ b = buf;</div><div class='add'>+</div><div class='add'>+ /* The beginning of the termcap entry contains the names of the entry.</div><div class='add'>+ * It is terminated by a colon.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ ti->terminal_names = (char *) b;</div><div class='add'>+ t = termcap;</div><div class='add'>+ len = tcap_extract_field (t);</div><div class='add'>+ if (len < 0)</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *)buf);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ strncpy ((char *) b, (char *) t, (unsigned int) len);</div><div class='add'>+ b[len] = 0;</div><div class='add'>+ b += len + 1;</div><div class='add'>+ ti->name_section_size = len;</div><div class='add'>+</div><div class='add'>+ /* Now, we are really at the start of the termcap entries. Point the</div><div class='add'>+ * termcap variable here since we want to refer to this a number of times.</div><div class='add'>+ */</div><div class='add'>+ termcap = t + (len + 1);</div><div class='add'>+</div><div class='add'>+ /* Process strings first. */</div><div class='add'>+ ti->string_table = (char *) b;</div><div class='add'>+ t = termcap;</div><div class='add'>+ while (-1 != (len = tcap_extract_field (t)))</div><div class='add'>+ {</div><div class='add'>+ unsigned char *b1;</div><div class='add'>+ unsigned char *tmax;</div><div class='add'>+</div><div class='add'>+ /* We are looking for: XX=something */</div><div class='add'>+ if ((len < 4) || (t[2] != '=') || (*t == '.'))</div><div class='add'>+ {</div><div class='add'>+ t += len + 1;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ tmax = t + len;</div><div class='add'>+ b1 = b;</div><div class='add'>+</div><div class='add'>+ while (t < tmax)</div><div class='add'>+ {</div><div class='add'>+ ch = *t++;</div><div class='add'>+ if ((ch == '\\') && (t < tmax))</div><div class='add'>+ {</div><div class='add'>+ t = (unsigned char *) _SLexpand_escaped_char ((char *) t, (char *) &ch);</div><div class='add'>+ }</div><div class='add'>+ else if ((ch == '^') && (t < tmax))</div><div class='add'>+ {</div><div class='add'>+ ch = *t++;</div><div class='add'>+ if (ch == '?') ch = 127;</div><div class='add'>+ else ch = (ch | 0x20) - ('a' - 1);</div><div class='add'>+ }</div><div class='add'>+ *b++ = ch;</div><div class='add'>+ }</div><div class='add'>+ /* Null terminate it. */</div><div class='add'>+ *b++ = 0;</div><div class='add'>+ len = (int) (b - b1);</div><div class='add'>+ b1[2] = (unsigned char) len; /* replace the = by the length */</div><div class='add'>+ /* skip colon to next field. */</div><div class='add'>+ t++;</div><div class='add'>+ }</div><div class='add'>+ ti->string_table_size = (int) (b - (unsigned char *) ti->string_table);</div><div class='add'>+</div><div class='add'>+ /* Now process the numbers. */</div><div class='add'>+</div><div class='add'>+ t = termcap;</div><div class='add'>+ ti->numbers = b;</div><div class='add'>+ while (-1 != (len = tcap_extract_field (t)))</div><div class='add'>+ {</div><div class='add'>+ unsigned char *b1;</div><div class='add'>+ unsigned char *tmax;</div><div class='add'>+</div><div class='add'>+ /* We are looking for: XX#NUMBER */</div><div class='add'>+ if ((len < 4) || (t[2] != '#') || (*t == '.'))</div><div class='add'>+ {</div><div class='add'>+ t += len + 1;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ tmax = t + len;</div><div class='add'>+ b1 = b;</div><div class='add'>+</div><div class='add'>+ while (t < tmax)</div><div class='add'>+ {</div><div class='add'>+ *b++ = *t++;</div><div class='add'>+ }</div><div class='add'>+ /* Null terminate it. */</div><div class='add'>+ *b++ = 0;</div><div class='add'>+ len = (int) (b - b1);</div><div class='add'>+ b1[2] = (unsigned char) len; /* replace the # by the length */</div><div class='add'>+ t++;</div><div class='add'>+ }</div><div class='add'>+ ti->num_numbers = (int) (b - ti->numbers);</div><div class='add'>+</div><div class='add'>+ /* Now process the flags. */</div><div class='add'>+ t = termcap;</div><div class='add'>+ ti->boolean_flags = b;</div><div class='add'>+ while (-1 != (len = tcap_extract_field (t)))</div><div class='add'>+ {</div><div class='add'>+ /* We are looking for: XX#NUMBER */</div><div class='add'>+ if ((len != 2) || (*t == '.') || (*t <= ' '))</div><div class='add'>+ {</div><div class='add'>+ t += len + 1;</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+ b[0] = t[0];</div><div class='add'>+ b[1] = t[1];</div><div class='add'>+ t += 3;</div><div class='add'>+ b += 2;</div><div class='add'>+ }</div><div class='add'>+ ti->boolean_section_size = (int) (b - ti->boolean_flags);</div><div class='add'>+ ti->flags = SLTERMCAP;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* These routines are provided only for backward binary compatability.</div><div class='add'>+ * They will vanish in V2.x</div><div class='add'>+ */</div><div class='add'>+char *SLtt_tigetent (char *s)</div><div class='add'>+{</div><div class='add'>+ return (char *) _SLtt_tigetent (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+extern char *SLtt_tigetstr (char *s, char **p)</div><div class='add'>+{</div><div class='add'>+ if (p == NULL)</div><div class='add'>+ return NULL;</div><div class='add'>+ return _SLtt_tigetstr ((SLterminfo_Type *) *p, s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+extern int SLtt_tigetnum (char *s, char **p)</div><div class='add'>+{</div><div class='add'>+ if (p == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+ return _SLtt_tigetnum ((SLterminfo_Type *) *p, s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/sltime.c b/mdk-stage1/slang/sltime.c<br/>new file mode 100644<br/>index 000000000..14fc6ec16<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sltime.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltime.c</a></div><div class='hunk'>@@ -0,0 +1,310 @@</div><div class='add'>+/* time related system calls */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include <sys/types.h></div><div class='add'>+#include <time.h></div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include <dos.h></div><div class='add'>+#endif</div><div class='add'>+#if defined(__GO32__) || defined(__WATCOMC__)</div><div class='add'>+# include <dos.h></div><div class='add'>+# include <bios.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include <errno.h></div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+#include <windows.h></div><div class='add'>+/* Sleep is defined badly in MSVC... */</div><div class='add'>+# ifdef _MSC_VER</div><div class='add'>+# define sleep(n) _sleep((n)*1000)</div><div class='add'>+# else</div><div class='add'>+# ifdef sleep</div><div class='add'>+# undef sleep</div><div class='add'>+# endif</div><div class='add'>+# define sleep(x) if(x)Sleep((x)*1000)</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#if defined(IBMPC_SYSTEM)</div><div class='add'>+/* For other system (Unix and VMS), _SLusleep is in sldisply.c */</div><div class='add'>+int _SLusleep (unsigned long s)</div><div class='add'>+{</div><div class='add'>+ sleep (s/1000000L);</div><div class='add'>+ s = s % 1000000L;</div><div class='add'>+</div><div class='add'>+# if defined(__WIN32__)</div><div class='add'>+ Sleep (s/1000);</div><div class='add'>+#else</div><div class='add'>+# if defined(__IBMC__)</div><div class='add'>+ DosSleep(s/1000);</div><div class='add'>+# else</div><div class='add'>+# if defined(_MSC_VER)</div><div class='add'>+ _sleep (s/1000);</div><div class='add'>+# endif</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__IBMC__) && !defined(_AIX)</div><div class='add'>+/* sleep is not a standard function in VA3. */</div><div class='add'>+unsigned int sleep (unsigned int seconds)</div><div class='add'>+{</div><div class='add'>+ DosSleep(1000L * ((long)seconds));</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static char *ctime_cmd (unsigned long *tt)</div><div class='add'>+{</div><div class='add'>+ char *t;</div><div class='add'>+</div><div class='add'>+ t = ctime ((time_t *) tt);</div><div class='add'>+ t[24] = 0; /* knock off \n */</div><div class='add'>+ return (t);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sleep_cmd (void)</div><div class='add'>+{</div><div class='add'>+ unsigned int secs;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ unsigned long usecs;</div><div class='add'>+ double x;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_double (&x, NULL, NULL))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (x < 0.0) </div><div class='add'>+ x = 0.0;</div><div class='add'>+ secs = (unsigned int) x;</div><div class='add'>+ sleep (secs);</div><div class='add'>+ x -= (double) secs;</div><div class='add'>+ usecs = (unsigned long) (1e6 * x);</div><div class='add'>+ if (usecs > 0) _SLusleep (usecs);</div><div class='add'>+#else</div><div class='add'>+ if (-1 == SLang_pop_uinteger (&secs))</div><div class='add'>+ return;</div><div class='add'>+ if (secs != 0) sleep (secs);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned long _time_cmd (void)</div><div class='add'>+{</div><div class='add'>+ return (unsigned long) time (NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if defined(__GO32__)</div><div class='add'>+static char *djgpp_current_time (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ union REGS rg;</div><div class='add'>+ unsigned int year;</div><div class='add'>+ unsigned char month, day, weekday, hour, minute, sec;</div><div class='add'>+ char days[] = "SunMonTueWedThuFriSat";</div><div class='add'>+ char months[] = "JanFebMarAprMayJunJulAugSepOctNovDec";</div><div class='add'>+ static char the_date[26];</div><div class='add'>+</div><div class='add'>+ rg.h.ah = 0x2A;</div><div class='add'>+#ifndef __WATCOMC__</div><div class='add'>+ int86(0x21, &rg, &rg);</div><div class='add'>+ year = rg.x.cx & 0xFFFF;</div><div class='add'>+#else</div><div class='add'>+ int386(0x21, &rg, &rg);</div><div class='add'>+ year = rg.x.ecx & 0xFFFF;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ month = 3 * (rg.h.dh - 1);</div><div class='add'>+ day = rg.h.dl;</div><div class='add'>+ weekday = 3 * rg.h.al;</div><div class='add'>+</div><div class='add'>+ rg.h.ah = 0x2C;</div><div class='add'>+</div><div class='add'>+#ifndef __WATCOMC__</div><div class='add'>+ int86(0x21, &rg, &rg);</div><div class='add'>+#else</div><div class='add'>+ int386(0x21, &rg, &rg);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ hour = rg.h.ch;</div><div class='add'>+ minute = rg.h.cl;</div><div class='add'>+ sec = rg.h.dh;</div><div class='add'>+</div><div class='add'>+ /* we want this form: Thu Apr 14 15:43:39 1994\n */</div><div class='add'>+ sprintf(the_date, "%.3s %.3s%3d %02d:%02d:%02d %d\n",</div><div class='add'>+ days + weekday, months + month,</div><div class='add'>+ day, hour, minute, sec, year);</div><div class='add'>+ return the_date;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+char *SLcurrent_time_string (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char *the_time;</div><div class='add'>+#ifndef __GO32__</div><div class='add'>+ time_t myclock;</div><div class='add'>+</div><div class='add'>+ myclock = time((time_t *) 0);</div><div class='add'>+ the_time = (char *) ctime(&myclock);</div><div class='add'>+#else</div><div class='add'>+ the_time = djgpp_current_time ();</div><div class='add'>+#endif</div><div class='add'>+ /* returns the form Sun Sep 16 01:03:52 1985\n\0 */</div><div class='add'>+ the_time[24] = '\0';</div><div class='add'>+ return(the_time);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int push_tm_struct (struct tm *tms)</div><div class='add'>+{</div><div class='add'>+ char *field_names [9];</div><div class='add'>+ unsigned char field_types[9];</div><div class='add'>+ VOID_STAR field_values [9];</div><div class='add'>+ int int_values [9];</div><div class='add'>+ unsigned int i;</div><div class='add'>+</div><div class='add'>+ if (tms == NULL)</div><div class='add'>+ return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+ field_names [0] = "tm_sec"; int_values [0] = tms->tm_sec;</div><div class='add'>+ field_names [1] = "tm_min"; int_values [1] = tms->tm_min;</div><div class='add'>+ field_names [2] = "tm_hour"; int_values [2] = tms->tm_hour;</div><div class='add'>+ field_names [3] = "tm_mday"; int_values [3] = tms->tm_mday;</div><div class='add'>+ field_names [4] = "tm_mon"; int_values [4] = tms->tm_mon;</div><div class='add'>+ field_names [5] = "tm_year"; int_values [5] = tms->tm_year;</div><div class='add'>+ field_names [6] = "tm_wday"; int_values [6] = tms->tm_wday;</div><div class='add'>+ field_names [7] = "tm_yday"; int_values [7] = tms->tm_yday;</div><div class='add'>+ field_names [8] = "tm_isdst"; int_values [8] = tms->tm_isdst;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 9; i++)</div><div class='add'>+ {</div><div class='add'>+ field_types [i] = SLANG_INT_TYPE;</div><div class='add'>+ field_values [i] = (VOID_STAR) (int_values + i);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return SLstruct_create_struct (9, field_names, field_types, field_values);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static void localtime_cmd (long *t)</div><div class='add'>+{</div><div class='add'>+ time_t tt = (time_t) *t;</div><div class='add'>+ (void) push_tm_struct (localtime (&tt));</div><div class='add'>+}</div><div class='add'>+ </div><div class='add'>+static void gmtime_cmd (long *t)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_GMTIME</div><div class='add'>+ time_t tt = (time_t) *t;</div><div class='add'>+ (void) push_tm_struct (gmtime (&tt));</div><div class='add'>+#else</div><div class='add'>+ localtime_cmd (t);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TIMES</div><div class='add'>+</div><div class='add'>+# ifdef HAVE_SYS_TIMES_H</div><div class='add'>+# include <sys/times.h></div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+#include <limits.h></div><div class='add'>+</div><div class='add'>+#ifdef CLK_TCK</div><div class='add'>+# define SECS_PER_TICK (1.0/(double)CLK_TCK)</div><div class='add'>+#else </div><div class='add'>+# ifdef CLOCKS_PER_SEC</div><div class='add'>+# define SECS_PER_TICK (1.0/(double)CLOCKS_PER_SEC)</div><div class='add'>+# else</div><div class='add'>+# define SECS_PER_TICK (1.0/60.0)</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void times_cmd (void)</div><div class='add'>+{</div><div class='add'>+ double dvals[4];</div><div class='add'>+ struct tms t;</div><div class='add'>+ VOID_STAR field_values[4];</div><div class='add'>+ char *field_names[4];</div><div class='add'>+ unsigned int i;</div><div class='add'>+ unsigned char field_types[4];</div><div class='add'>+ </div><div class='add'>+ (void) times (&t);</div><div class='add'>+</div><div class='add'>+ field_names[0] = "tms_utime"; dvals[0] = (double)t.tms_utime; </div><div class='add'>+ field_names[1] = "tms_stime"; dvals[1] = (double)t.tms_stime; </div><div class='add'>+ field_names[2] = "tms_cutime"; dvals[2] = (double)t.tms_cutime;</div><div class='add'>+ field_names[3] = "tms_cstime"; dvals[3] = (double)t.tms_cstime;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 4; i++)</div><div class='add'>+ {</div><div class='add'>+ dvals[i] *= SECS_PER_TICK;</div><div class='add'>+ field_values[i] = (VOID_STAR) &dvals[i];</div><div class='add'>+ field_types[i] = SLANG_DOUBLE_TYPE;</div><div class='add'>+ }</div><div class='add'>+ (void) SLstruct_create_struct (4, field_names, field_types, field_values);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct tms Tic_TMS;</div><div class='add'>+</div><div class='add'>+static void tic_cmd (void)</div><div class='add'>+{</div><div class='add'>+ (void) times (&Tic_TMS);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static double toc_cmd (void)</div><div class='add'>+{</div><div class='add'>+ struct tms t;</div><div class='add'>+ double d;</div><div class='add'>+</div><div class='add'>+ (void) times (&t);</div><div class='add'>+ d = ((t.tms_utime - Tic_TMS.tms_utime)</div><div class='add'>+ + (t.tms_stime - Tic_TMS.tms_stime)) * SECS_PER_TICK;</div><div class='add'>+ Tic_TMS = t;</div><div class='add'>+ return d;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* HAVE_TIMES */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Time_Funs_Table [] =</div><div class='add'>+{</div><div class='add'>+ MAKE_INTRINSIC_1("ctime", ctime_cmd, SLANG_STRING_TYPE, SLANG_ULONG_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("sleep", sleep_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("_time", _time_cmd, SLANG_ULONG_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("time", SLcurrent_time_string, SLANG_STRING_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_1("localtime", localtime_cmd, SLANG_VOID_TYPE, SLANG_LONG_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_1("gmtime", gmtime_cmd, SLANG_VOID_TYPE, SLANG_LONG_TYPE),</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TIMES</div><div class='add'>+ MAKE_INTRINSIC_0("times", times_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("tic", tic_cmd, SLANG_VOID_TYPE),</div><div class='add'>+ MAKE_INTRINSIC_0("toc", toc_cmd, SLANG_DOUBLE_TYPE),</div><div class='add'>+#endif</div><div class='add'>+ SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLang_init_sltime (void)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_TIMES</div><div class='add'>+ (void) tic_cmd ();</div><div class='add'>+#endif</div><div class='add'>+ return SLadd_intrin_fun_table (Time_Funs_Table, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/sltoken.c b/mdk-stage1/slang/sltoken.c<br/>new file mode 100644<br/>index 000000000..d08967a24<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sltoken.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltoken.c</a></div><div class='hunk'>@@ -0,0 +1,1702 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#define MAX_TOKEN_LEN 254</div><div class='add'>+#define MAX_FILE_LINE_LEN 256</div><div class='add'>+</div><div class='add'>+static char Empty_Line[1] = {0};</div><div class='add'>+</div><div class='add'>+static int Default_Compile_Line_Num_Info;</div><div class='add'>+static char *Input_Line = Empty_Line;</div><div class='add'>+static char *Input_Line_Pointer;</div><div class='add'>+</div><div class='add'>+static SLPreprocess_Type *This_SLpp;</div><div class='add'>+</div><div class='add'>+static SLang_Load_Type *LLT;</div><div class='add'>+</div><div class='add'>+static char *map_token_to_string (_SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+ char *s;</div><div class='add'>+ static char numbuf [32];</div><div class='add'>+ unsigned char type;</div><div class='add'>+ s = NULL;</div><div class='add'>+</div><div class='add'>+ if (tok != NULL) type = tok->type;</div><div class='add'>+ else type = 0;</div><div class='add'>+</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case 0:</div><div class='add'>+ s = "??";</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case CHAR_TOKEN:</div><div class='add'>+ case SHORT_TOKEN:</div><div class='add'>+ case INT_TOKEN:</div><div class='add'>+ case LONG_TOKEN:</div><div class='add'>+ s = numbuf;</div><div class='add'>+ sprintf (s, "%ld", tok->v.long_val);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case UCHAR_TOKEN:</div><div class='add'>+ case USHORT_TOKEN:</div><div class='add'>+ case UINT_TOKEN:</div><div class='add'>+ case ULONG_TOKEN:</div><div class='add'>+ s = numbuf;</div><div class='add'>+ sprintf (s, "%lu", (unsigned long)tok->v.long_val);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case OBRACKET_TOKEN: s = "["; break;</div><div class='add'>+ case CBRACKET_TOKEN: s = "]"; break;</div><div class='add'>+ case OPAREN_TOKEN: s = "("; break;</div><div class='add'>+ case CPAREN_TOKEN: s = ")"; break;</div><div class='add'>+ case OBRACE_TOKEN: s = "{"; break;</div><div class='add'>+ case CBRACE_TOKEN: s = "}"; break;</div><div class='add'>+ case DEREF_TOKEN: s = "@"; break;</div><div class='add'>+ case POUND_TOKEN: s = "#"; break;</div><div class='add'>+ case COMMA_TOKEN: s = ","; break;</div><div class='add'>+ case SEMICOLON_TOKEN: s = ";"; break;</div><div class='add'>+ case COLON_TOKEN: s = ":"; break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ case FLOAT_TOKEN:</div><div class='add'>+ case DOUBLE_TOKEN:</div><div class='add'>+ case COMPLEX_TOKEN:</div><div class='add'>+#endif</div><div class='add'>+ case IDENT_TOKEN:</div><div class='add'>+ if ((tok->free_sval_flag == 0) || (tok->num_refs == 0))</div><div class='add'>+ break;</div><div class='add'>+ /* drop */</div><div class='add'>+ default:</div><div class='add'>+ s = tok->v.s_val;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (s == NULL)</div><div class='add'>+ {</div><div class='add'>+ s = numbuf;</div><div class='add'>+ sprintf (s, "(0x%02X)", type);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *make_line_file_error (char *buf, unsigned int buflen,</div><div class='add'>+ _SLang_Token_Type *tok, char *dsc, int line, char *file)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ if (tok != NULL) line = tok->line_number;</div><div class='add'>+#endif</div><div class='add'>+ if (file == NULL) file = "??";</div><div class='add'>+</div><div class='add'>+ (void) _SLsnprintf (buf, buflen, "%s: found '%s', line %d, file: %s",</div><div class='add'>+ dsc, map_token_to_string (tok), line, file);</div><div class='add'>+</div><div class='add'>+ return buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLparse_error(char *str, _SLang_Token_Type *tok, int flag)</div><div class='add'>+{</div><div class='add'>+ char buf [1024];</div><div class='add'>+</div><div class='add'>+ if (str == NULL)</div><div class='add'>+ str = "Parse Error";</div><div class='add'>+</div><div class='add'>+ make_line_file_error (buf, sizeof (buf), tok, str, LLT->line_num, (char *) LLT->name);</div><div class='add'>+</div><div class='add'>+ if ((flag == 0) && SLang_Error)</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, "%s", buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_line_file_error (int line, char *file)</div><div class='add'>+{</div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR,</div><div class='add'>+ "called from line %d, file: %s", line, file);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define ALPHA_CHAR 1</div><div class='add'>+#define DIGIT_CHAR 2</div><div class='add'>+#define EXCL_CHAR 3</div><div class='add'>+#define SEP_CHAR 4</div><div class='add'>+#define OP_CHAR 5</div><div class='add'>+#define DOT_CHAR 6</div><div class='add'>+#define BOLDOT_CHAR 7</div><div class='add'>+#define DQUOTE_CHAR 8</div><div class='add'>+#define QUOTE_CHAR 9</div><div class='add'>+#define COMMENT_CHAR 10</div><div class='add'>+#define NL_CHAR 11</div><div class='add'>+#define BAD_CHAR 12</div><div class='add'>+#define WHITE_CHAR 13</div><div class='add'>+</div><div class='add'>+#define CHAR_EOF 255</div><div class='add'>+</div><div class='add'>+#define CHAR_CLASS(c) (Char_Type_Table[(c)][0])</div><div class='add'>+#define CHAR_DATA(c) (Char_Type_Table[(c)][1])</div><div class='add'>+</div><div class='add'>+/* In this table, if a single character can represent an operator, e.g.,</div><div class='add'>+ * '&' (BAND_TOKEN), then it must be placed before multiple-character</div><div class='add'>+ * operators that begin with the same character, e.g., "&=". See</div><div class='add'>+ * get_op_token to see how this is exploited.</div><div class='add'>+ *</div><div class='add'>+ * The third character null terminates the operator string. This is for</div><div class='add'>+ * the token structure.</div><div class='add'>+ */</div><div class='add'>+static char Operators [29][4] =</div><div class='add'>+{</div><div class='add'>+#define OFS_EXCL 0</div><div class='add'>+ {'!', '=', 0, NE_TOKEN},</div><div class='add'>+#define OFS_POUND 1</div><div class='add'>+ {'#', 0, 0, POUND_TOKEN},</div><div class='add'>+#define OFS_BAND 2</div><div class='add'>+ {'&', 0, 0, BAND_TOKEN},</div><div class='add'>+ {'&', '&', 0, EOF_TOKEN},</div><div class='add'>+ {'&', '=', 0, BANDEQS_TOKEN},</div><div class='add'>+#define OFS_STAR 5</div><div class='add'>+ {'*', 0, 0, TIMES_TOKEN},</div><div class='add'>+ {'*', '=', 0, TIMESEQS_TOKEN},</div><div class='add'>+#define OFS_PLUS 7</div><div class='add'>+ {'+', 0, 0, ADD_TOKEN},</div><div class='add'>+ {'+', '+', 0, PLUSPLUS_TOKEN},</div><div class='add'>+ {'+', '=', 0, PLUSEQS_TOKEN},</div><div class='add'>+#define OFS_MINUS 10</div><div class='add'>+ {'-', 0, 0, SUB_TOKEN},</div><div class='add'>+ {'-', '-', 0, MINUSMINUS_TOKEN},</div><div class='add'>+ {'-', '=', 0, MINUSEQS_TOKEN},</div><div class='add'>+ {'-', '>', 0, NAMESPACE_TOKEN},</div><div class='add'>+#define OFS_DIV 14</div><div class='add'>+ {'/', 0, 0, DIV_TOKEN},</div><div class='add'>+ {'/', '=', 0, DIVEQS_TOKEN},</div><div class='add'>+#define OFS_LT 16</div><div class='add'>+ {'<', 0, 0, LT_TOKEN},</div><div class='add'>+ {'<', '=', 0, LE_TOKEN},</div><div class='add'>+#define OFS_EQS 18</div><div class='add'>+ {'=', 0, 0, ASSIGN_TOKEN},</div><div class='add'>+ {'=', '=', 0, EQ_TOKEN},</div><div class='add'>+#define OFS_GT 20</div><div class='add'>+ {'>', 0, 0, GT_TOKEN},</div><div class='add'>+ {'>', '=', 0, GE_TOKEN},</div><div class='add'>+#define OFS_AT 22</div><div class='add'>+ {'@', 0, 0, DEREF_TOKEN},</div><div class='add'>+#define OFS_POW 23</div><div class='add'>+ {'^', 0, 0, POW_TOKEN},</div><div class='add'>+#define OFS_BOR 24</div><div class='add'>+ {'|', 0, 0, BOR_TOKEN},</div><div class='add'>+ {'|', '|', 0, EOF_TOKEN},</div><div class='add'>+ {'|', '=', 0, BOREQS_TOKEN},</div><div class='add'>+#define OFS_BNOT 27</div><div class='add'>+ {'~', 0, 0, BNOT_TOKEN},</div><div class='add'>+ { 0, 0, 0, EOF_TOKEN}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static unsigned char Char_Type_Table[256][2] =</div><div class='add'>+{</div><div class='add'>+ { NL_CHAR, 0 }, /* 0x0 */ { BAD_CHAR, 0 }, /* 0x1 */</div><div class='add'>+ { BAD_CHAR, 0 }, /* 0x2 */ { BAD_CHAR, 0 }, /* 0x3 */</div><div class='add'>+ { BAD_CHAR, 0 }, /* 0x4 */ { BAD_CHAR, 0 }, /* 0x5 */</div><div class='add'>+ { BAD_CHAR, 0 }, /* 0x6 */ { BAD_CHAR, 0 }, /* 0x7 */</div><div class='add'>+ { WHITE_CHAR, 0 }, /* 0x8 */ { WHITE_CHAR, 0 }, /* 0x9 */</div><div class='add'>+ { NL_CHAR, 0 }, /* \n */ { WHITE_CHAR, 0 }, /* 0xb */</div><div class='add'>+ { WHITE_CHAR, 0 }, /* 0xc */ { WHITE_CHAR, 0 }, /* \r */</div><div class='add'>+ { BAD_CHAR, 0 }, /* 0xe */ { BAD_CHAR, 0 }, /* 0xf */</div><div class='add'>+ { BAD_CHAR, 0 }, /* 0x10 */ { BAD_CHAR, 0 }, /* 0x11 */</div><div class='add'>+ { BAD_CHAR, 0 }, /* 0x12 */ { BAD_CHAR, 0 }, /* 0x13 */</div><div class='add'>+ { BAD_CHAR, 0 }, /* 0x14 */ { BAD_CHAR, 0 }, /* 0x15 */</div><div class='add'>+ { BAD_CHAR, 0 }, /* 0x16 */ { BAD_CHAR, 0 }, /* 0x17 */</div><div class='add'>+ { BAD_CHAR, 0 }, /* 0x18 */ { BAD_CHAR, 0 }, /* 0x19 */</div><div class='add'>+ { BAD_CHAR, 0 }, /* 0x1a */ { BAD_CHAR, 0 }, /* 0x1b */</div><div class='add'>+ { BAD_CHAR, 0 }, /* 0x1c */ { BAD_CHAR, 0 }, /* 0x1d */</div><div class='add'>+ { BAD_CHAR, 0 }, /* 0x1e */ { BAD_CHAR, 0 }, /* 0x1f */</div><div class='add'>+ { WHITE_CHAR, 0 }, /* 0x20 */ { EXCL_CHAR, OFS_EXCL }, /* ! */</div><div class='add'>+ { DQUOTE_CHAR, 0 }, /* " */ { OP_CHAR, OFS_POUND }, /* # */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* $ */ { NL_CHAR, 0 },/* % */</div><div class='add'>+ { OP_CHAR, OFS_BAND }, /* & */ { QUOTE_CHAR, 0 }, /* ' */</div><div class='add'>+ { SEP_CHAR, OPAREN_TOKEN }, /* ( */ { SEP_CHAR, CPAREN_TOKEN }, /* ) */</div><div class='add'>+ { OP_CHAR, OFS_STAR }, /* * */ { OP_CHAR, OFS_PLUS}, /* + */</div><div class='add'>+ { SEP_CHAR, COMMA_TOKEN }, /* , */ { OP_CHAR, OFS_MINUS }, /* - */</div><div class='add'>+ { DOT_CHAR, 0 }, /* . */ { OP_CHAR, OFS_DIV }, /* / */</div><div class='add'>+ { DIGIT_CHAR, 0 }, /* 0 */ { DIGIT_CHAR, 0 }, /* 1 */</div><div class='add'>+ { DIGIT_CHAR, 0 }, /* 2 */ { DIGIT_CHAR, 0 }, /* 3 */</div><div class='add'>+ { DIGIT_CHAR, 0 }, /* 4 */ { DIGIT_CHAR, 0 }, /* 5 */</div><div class='add'>+ { DIGIT_CHAR, 0 }, /* 6 */ { DIGIT_CHAR, 0 }, /* 7 */</div><div class='add'>+ { DIGIT_CHAR, 0 }, /* 8 */ { DIGIT_CHAR, 0 }, /* 9 */</div><div class='add'>+ { SEP_CHAR, COLON_TOKEN }, /* : */ { SEP_CHAR, SEMICOLON_TOKEN }, /* ; */</div><div class='add'>+ { OP_CHAR, OFS_LT }, /* < */ { OP_CHAR, OFS_EQS }, /* = */</div><div class='add'>+ { OP_CHAR, OFS_GT }, /* > */ { BAD_CHAR, 0 }, /* ? */</div><div class='add'>+ { OP_CHAR, OFS_AT}, /* @ */ { ALPHA_CHAR, 0 }, /* A */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* B */ { ALPHA_CHAR, 0 }, /* C */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* D */ { ALPHA_CHAR, 0 }, /* E */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* F */ { ALPHA_CHAR, 0 }, /* G */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* H */ { ALPHA_CHAR, 0 }, /* I */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* J */ { ALPHA_CHAR, 0 }, /* K */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* L */ { ALPHA_CHAR, 0 }, /* M */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* N */ { ALPHA_CHAR, 0 }, /* O */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* P */ { ALPHA_CHAR, 0 }, /* Q */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* R */ { ALPHA_CHAR, 0 }, /* S */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* T */ { ALPHA_CHAR, 0 }, /* U */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* V */ { ALPHA_CHAR, 0 }, /* W */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* X */ { ALPHA_CHAR, 0 }, /* Y */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* Z */ { SEP_CHAR, OBRACKET_TOKEN }, /* [ */</div><div class='add'>+ { BAD_CHAR, 0 }, /* \ */ { SEP_CHAR, CBRACKET_TOKEN }, /* ] */</div><div class='add'>+ { OP_CHAR, OFS_POW }, /* ^ */ { ALPHA_CHAR, 0 }, /* _ */</div><div class='add'>+ { BAD_CHAR, 0 }, /* ` */ { ALPHA_CHAR, 0 }, /* a */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* b */ { ALPHA_CHAR, 0 }, /* c */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* d */ { ALPHA_CHAR, 0 }, /* e */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* f */ { ALPHA_CHAR, 0 }, /* g */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* h */ { ALPHA_CHAR, 0 }, /* i */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* j */ { ALPHA_CHAR, 0 }, /* k */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* l */ { ALPHA_CHAR, 0 }, /* m */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* n */ { ALPHA_CHAR, 0 }, /* o */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* p */ { ALPHA_CHAR, 0 }, /* q */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* r */ { ALPHA_CHAR, 0 }, /* s */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* t */ { ALPHA_CHAR, 0 }, /* u */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* v */ { ALPHA_CHAR, 0 }, /* w */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* x */ { ALPHA_CHAR, 0 }, /* y */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* z */ { SEP_CHAR, OBRACE_TOKEN }, /* { */</div><div class='add'>+ { OP_CHAR, OFS_BOR }, /* | */ { SEP_CHAR, CBRACE_TOKEN }, /* } */</div><div class='add'>+ { OP_CHAR, OFS_BNOT }, /* ~ */ { BAD_CHAR, 0 }, /* 0x7f */</div><div class='add'>+ </div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+ { ALPHA_CHAR, 0 }, /* � */ { ALPHA_CHAR, 0 }, /* � */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLcheck_identifier_syntax (char *name)</div><div class='add'>+{</div><div class='add'>+ unsigned char *p;</div><div class='add'>+ </div><div class='add'>+ p = (unsigned char *) name;</div><div class='add'>+ if (ALPHA_CHAR == Char_Type_Table[*p][0]) while (1)</div><div class='add'>+ {</div><div class='add'>+ unsigned ch;</div><div class='add'>+ unsigned char type;</div><div class='add'>+</div><div class='add'>+ ch = *++p;</div><div class='add'>+</div><div class='add'>+ type = Char_Type_Table [ch][0];</div><div class='add'>+ if ((type != ALPHA_CHAR) && (type != DIGIT_CHAR))</div><div class='add'>+ {</div><div class='add'>+ if (ch == 0)</div><div class='add'>+ return 0;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ SLang_verror (SL_SYNTAX_ERROR, </div><div class='add'>+ "Name %s contains an illegal character", name);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char prep_get_char (void)</div><div class='add'>+{</div><div class='add'>+ register unsigned char ch;</div><div class='add'>+</div><div class='add'>+ if (0 != (ch = *Input_Line_Pointer++))</div><div class='add'>+ return ch;</div><div class='add'>+</div><div class='add'>+ Input_Line_Pointer--;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void unget_prep_char (unsigned char ch)</div><div class='add'>+{</div><div class='add'>+ if ((Input_Line_Pointer != Input_Line)</div><div class='add'>+ && (ch != 0))</div><div class='add'>+ Input_Line_Pointer--;</div><div class='add'>+ /* *Input_Line_Pointer = ch; -- Do not modify the Input_Line */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#include "keywhash.c"</div><div class='add'>+</div><div class='add'>+static int get_ident_token (_SLang_Token_Type *tok, unsigned char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ unsigned char ch;</div><div class='add'>+ unsigned char type;</div><div class='add'>+ Keyword_Table_Type *table;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ ch = prep_get_char ();</div><div class='add'>+ type = CHAR_CLASS (ch);</div><div class='add'>+ if ((type != ALPHA_CHAR) && (type != DIGIT_CHAR))</div><div class='add'>+ {</div><div class='add'>+ unget_prep_char (ch);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ s [len++] = ch;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ s[len] = 0;</div><div class='add'>+</div><div class='add'>+ /* check if keyword */</div><div class='add'>+ table = is_keyword ((char *) s, len);</div><div class='add'>+ if (table != NULL)</div><div class='add'>+ {</div><div class='add'>+ tok->v.s_val = table->name;</div><div class='add'>+ return (tok->type = table->type);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ tok->v.s_val = _SLstring_make_hashed_string ((char *)s, len, &tok->hash);</div><div class='add'>+ tok->free_sval_flag = 1;</div><div class='add'>+ return (tok->type = IDENT_TOKEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_number_token (_SLang_Token_Type *tok, unsigned char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ unsigned char ch;</div><div class='add'>+ unsigned char type;</div><div class='add'>+</div><div class='add'>+ /* Look for pattern [0-9.xX]*([eE][-+]?[digits])?[ijfhul]? */</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ ch = prep_get_char ();</div><div class='add'>+</div><div class='add'>+ type = CHAR_CLASS (ch);</div><div class='add'>+ if ((type != DIGIT_CHAR) && (type != DOT_CHAR))</div><div class='add'>+ {</div><div class='add'>+ if ((ch != 'x') && (ch != 'X'))</div><div class='add'>+ break;</div><div class='add'>+ /* It must be hex */</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+ goto too_long_return_error;</div><div class='add'>+</div><div class='add'>+ s[len++] = ch;</div><div class='add'>+ ch = prep_get_char ();</div><div class='add'>+ type = CHAR_CLASS (ch);</div><div class='add'>+ }</div><div class='add'>+ while ((type == DIGIT_CHAR) || (type == ALPHA_CHAR));</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+ goto too_long_return_error;</div><div class='add'>+ s [len++] = ch;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* At this point, type and ch are synchronized */</div><div class='add'>+</div><div class='add'>+ if ((ch == 'e') || (ch == 'E'))</div><div class='add'>+ {</div><div class='add'>+ if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+ goto too_long_return_error;</div><div class='add'>+ s[len++] = ch;</div><div class='add'>+ ch = prep_get_char ();</div><div class='add'>+ if ((ch == '+') || (ch == '-'))</div><div class='add'>+ {</div><div class='add'>+ if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+ goto too_long_return_error;</div><div class='add'>+ s[len++] = ch;</div><div class='add'>+ ch = prep_get_char ();</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (DIGIT_CHAR == (type = CHAR_CLASS(ch)))</div><div class='add'>+ {</div><div class='add'>+ if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+ goto too_long_return_error;</div><div class='add'>+ s[len++] = ch;</div><div class='add'>+ ch = prep_get_char ();</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (ALPHA_CHAR == type)</div><div class='add'>+ {</div><div class='add'>+ if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+ goto too_long_return_error;</div><div class='add'>+ s[len++] = ch;</div><div class='add'>+ ch = prep_get_char ();</div><div class='add'>+ type = CHAR_CLASS(ch);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ unget_prep_char (ch);</div><div class='add'>+ s[len] = 0;</div><div class='add'>+</div><div class='add'>+ switch (SLang_guess_type ((char *) s))</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ tok->v.s_val = (char *) s;</div><div class='add'>+ _SLparse_error ("Not a number", tok, 0);</div><div class='add'>+ return (tok->type = EOF_TOKEN);</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ tok->v.s_val = _SLstring_make_hashed_string ((char *)s, len, &tok->hash);</div><div class='add'>+ tok->free_sval_flag = 1;</div><div class='add'>+ return (tok->type = FLOAT_TOKEN);</div><div class='add'>+</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ tok->v.s_val = _SLstring_make_hashed_string ((char *)s, len, &tok->hash);</div><div class='add'>+ tok->free_sval_flag = 1;</div><div class='add'>+ return (tok->type = DOUBLE_TOKEN);</div><div class='add'>+#endif</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+ case SLANG_COMPLEX_TYPE:</div><div class='add'>+ tok->v.s_val = _SLstring_make_hashed_string ((char *)s, len, &tok->hash);</div><div class='add'>+ tok->free_sval_flag = 1;</div><div class='add'>+ return (tok->type = COMPLEX_TOKEN);</div><div class='add'>+#endif</div><div class='add'>+ case SLANG_CHAR_TYPE:</div><div class='add'>+ tok->v.long_val = (char)SLatol (s);</div><div class='add'>+ return tok->type = CHAR_TOKEN;</div><div class='add'>+ case SLANG_UCHAR_TYPE:</div><div class='add'>+ tok->v.long_val = (unsigned char)SLatol (s);</div><div class='add'>+ return tok->type = UCHAR_TOKEN;</div><div class='add'>+ case SLANG_SHORT_TYPE:</div><div class='add'>+ tok->v.long_val = (short)SLatol (s);</div><div class='add'>+ return tok->type = SHORT_TOKEN;</div><div class='add'>+ case SLANG_USHORT_TYPE:</div><div class='add'>+ tok->v.long_val = (unsigned short)SLatoul (s);</div><div class='add'>+ return tok->type = USHORT_TOKEN;</div><div class='add'>+ case SLANG_INT_TYPE:</div><div class='add'>+ tok->v.long_val = (int)SLatol (s);</div><div class='add'>+ return tok->type = INT_TOKEN;</div><div class='add'>+ case SLANG_UINT_TYPE:</div><div class='add'>+ tok->v.long_val = (unsigned int)SLatoul (s);</div><div class='add'>+ return tok->type = UINT_TOKEN;</div><div class='add'>+ case SLANG_LONG_TYPE:</div><div class='add'>+ tok->v.long_val = SLatol (s);</div><div class='add'>+ return tok->type = LONG_TOKEN;</div><div class='add'>+ case SLANG_ULONG_TYPE:</div><div class='add'>+ tok->v.long_val = SLatoul (s);</div><div class='add'>+ return tok->type = ULONG_TOKEN;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ too_long_return_error:</div><div class='add'>+ _SLparse_error ("Number too long for buffer", NULL, 0);</div><div class='add'>+ return (tok->type == EOF_TOKEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_op_token (_SLang_Token_Type *tok, char ch)</div><div class='add'>+{</div><div class='add'>+ unsigned int offset;</div><div class='add'>+ char second_char;</div><div class='add'>+ unsigned char type;</div><div class='add'>+ char *name;</div><div class='add'>+</div><div class='add'>+ /* operators are: + - / * ++ -- += -= = == != > < >= <= | etc..</div><div class='add'>+ * These lex to the longest valid operator token.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+ offset = CHAR_DATA((unsigned char) ch);</div><div class='add'>+ if (0 == Operators [offset][1])</div><div class='add'>+ {</div><div class='add'>+ name = Operators [offset];</div><div class='add'>+ type = name [3];</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ type = EOF_TOKEN;</div><div class='add'>+ name = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ second_char = prep_get_char ();</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ if (second_char == Operators[offset][1])</div><div class='add'>+ {</div><div class='add'>+ name = Operators [offset];</div><div class='add'>+ type = name [3];</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ offset++;</div><div class='add'>+ }</div><div class='add'>+ while (ch == Operators[offset][0]);</div><div class='add'>+</div><div class='add'>+ tok->type = type;</div><div class='add'>+</div><div class='add'>+ if (type == EOF_TOKEN)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("Operator not supported", NULL, 0);</div><div class='add'>+ return type;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ tok->v.s_val = name;</div><div class='add'>+</div><div class='add'>+ if (name[1] == 0)</div><div class='add'>+ unget_prep_char (second_char);</div><div class='add'>+</div><div class='add'>+ return type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* If this returns non-zero, then it is a binary string */</div><div class='add'>+static int expand_escaped_string (register char *s,</div><div class='add'>+ register char *t, register char *tmax,</div><div class='add'>+ unsigned int *lenp)</div><div class='add'>+{</div><div class='add'>+ char *s0;</div><div class='add'>+ int is_binary = 0;</div><div class='add'>+ char ch;</div><div class='add'>+</div><div class='add'>+ s0 = s;</div><div class='add'>+ while (t < tmax)</div><div class='add'>+ {</div><div class='add'>+ ch = *t++;</div><div class='add'>+ if (ch == '\\')</div><div class='add'>+ {</div><div class='add'>+ t = _SLexpand_escaped_char (t, &ch);</div><div class='add'>+ if (ch == 0) is_binary = 1;</div><div class='add'>+ }</div><div class='add'>+ *s++ = ch;</div><div class='add'>+ }</div><div class='add'>+ *s = 0;</div><div class='add'>+</div><div class='add'>+ *lenp = (unsigned char) (s - s0);</div><div class='add'>+ return is_binary;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_string_token (_SLang_Token_Type *tok, unsigned char quote_char,</div><div class='add'>+ unsigned char *s)</div><div class='add'>+{</div><div class='add'>+ unsigned char ch;</div><div class='add'>+ unsigned int len = 0;</div><div class='add'>+ int has_quote = 0;</div><div class='add'>+ int is_binary;</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ ch = prep_get_char ();</div><div class='add'>+ if (ch == 0)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error("Expecting quote-character", NULL, 0);</div><div class='add'>+ return (tok->type = EOF_TOKEN);</div><div class='add'>+ }</div><div class='add'>+ if (ch == quote_char) break;</div><div class='add'>+</div><div class='add'>+ s[len++] = ch;</div><div class='add'>+</div><div class='add'>+ if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error ("String too long for buffer", NULL, 0);</div><div class='add'>+ return (tok->type == EOF_TOKEN);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (ch == '\\')</div><div class='add'>+ {</div><div class='add'>+ has_quote = 1;</div><div class='add'>+ ch = prep_get_char ();</div><div class='add'>+ s[len++] = ch;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ s[len] = 0;</div><div class='add'>+</div><div class='add'>+ if (has_quote)</div><div class='add'>+ is_binary = expand_escaped_string ((char *) s, (char *)s, (char *)s + len, &len);</div><div class='add'>+ else is_binary = 0;</div><div class='add'>+</div><div class='add'>+ if ('"' == quote_char)</div><div class='add'>+ {</div><div class='add'>+ tok->free_sval_flag = 1;</div><div class='add'>+ if (is_binary)</div><div class='add'>+ {</div><div class='add'>+ tok->v.b_val = SLbstring_create (s, len);</div><div class='add'>+ return tok->type = BSTRING_TOKEN;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ tok->v.s_val = _SLstring_make_hashed_string ((char *)s,</div><div class='add'>+ len,</div><div class='add'>+ &tok->hash);</div><div class='add'>+ tok->free_sval_flag = 1;</div><div class='add'>+ return (tok->type = STRING_TOKEN);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* else single character */</div><div class='add'>+ if (s[1] != 0)</div><div class='add'>+ {</div><div class='add'>+ _SLparse_error("Single char expected", NULL, 0);</div><div class='add'>+ return (tok->type = EOF_TOKEN);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ tok->v.long_val = s[0];</div><div class='add'>+ return (tok->type = UCHAR_TOKEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int extract_token (_SLang_Token_Type *tok, unsigned char ch, unsigned char t)</div><div class='add'>+{</div><div class='add'>+ unsigned char s [MAX_TOKEN_LEN];</div><div class='add'>+ unsigned int slen;</div><div class='add'>+</div><div class='add'>+ s[0] = (char) ch;</div><div class='add'>+ slen = 1;</div><div class='add'>+</div><div class='add'>+ switch (t)</div><div class='add'>+ {</div><div class='add'>+ case ALPHA_CHAR:</div><div class='add'>+ return get_ident_token (tok, s, slen);</div><div class='add'>+</div><div class='add'>+ case OP_CHAR:</div><div class='add'>+ return get_op_token (tok, ch);</div><div class='add'>+</div><div class='add'>+ case DIGIT_CHAR:</div><div class='add'>+ return get_number_token (tok, s, slen);</div><div class='add'>+</div><div class='add'>+ case EXCL_CHAR:</div><div class='add'>+ ch = prep_get_char ();</div><div class='add'>+ s [slen++] = ch;</div><div class='add'>+ t = CHAR_CLASS(ch);</div><div class='add'>+ if (t == ALPHA_CHAR) return get_ident_token (tok, s, slen);</div><div class='add'>+ if (t == OP_CHAR)</div><div class='add'>+ {</div><div class='add'>+ unget_prep_char (ch);</div><div class='add'>+ return get_op_token (tok, '!');</div><div class='add'>+ }</div><div class='add'>+ _SLparse_error("Misplaced !", NULL, 0);</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ case DOT_CHAR:</div><div class='add'>+ ch = prep_get_char ();</div><div class='add'>+ if (DIGIT_CHAR == CHAR_CLASS(ch))</div><div class='add'>+ {</div><div class='add'>+ s [slen++] = ch;</div><div class='add'>+ return get_number_token (tok, s, slen);</div><div class='add'>+ }</div><div class='add'>+ unget_prep_char (ch);</div><div class='add'>+ return (tok->type = DOT_TOKEN);</div><div class='add'>+</div><div class='add'>+ case SEP_CHAR:</div><div class='add'>+ return (tok->type = CHAR_DATA(ch));</div><div class='add'>+</div><div class='add'>+ case DQUOTE_CHAR:</div><div class='add'>+ case QUOTE_CHAR:</div><div class='add'>+ return get_string_token (tok, ch, s);</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ _SLparse_error("Invalid character", NULL, 0);</div><div class='add'>+ return (tok->type = EOF_TOKEN);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLget_rpn_token (_SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+ unsigned char ch;</div><div class='add'>+</div><div class='add'>+ tok->v.s_val = "??";</div><div class='add'>+ while ((ch = *Input_Line_Pointer) != 0)</div><div class='add'>+ {</div><div class='add'>+ unsigned char t;</div><div class='add'>+</div><div class='add'>+ Input_Line_Pointer++;</div><div class='add'>+ if (WHITE_CHAR == (t = CHAR_CLASS(ch)))</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ if (NL_CHAR == t)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ return extract_token (tok, ch, t);</div><div class='add'>+ }</div><div class='add'>+ Input_Line_Pointer = Empty_Line;</div><div class='add'>+ return EOF_TOKEN;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLget_token (_SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+ unsigned char ch;</div><div class='add'>+ unsigned char t;</div><div class='add'>+</div><div class='add'>+ tok->num_refs = 1;</div><div class='add'>+ tok->free_sval_flag = 0;</div><div class='add'>+ tok->v.s_val = "??";</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ tok->line_number = LLT->line_num;</div><div class='add'>+#endif</div><div class='add'>+ if (SLang_Error || (Input_Line == NULL))</div><div class='add'>+ return (tok->type = EOF_TOKEN);</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ ch = *Input_Line_Pointer++;</div><div class='add'>+ if (WHITE_CHAR == (t = CHAR_CLASS (ch)))</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ if (t != NL_CHAR)</div><div class='add'>+ return extract_token (tok, ch, t);</div><div class='add'>+</div><div class='add'>+ do</div><div class='add'>+ {</div><div class='add'>+ LLT->line_num++;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ tok->line_number++;</div><div class='add'>+#endif</div><div class='add'>+ Input_Line = LLT->read(LLT);</div><div class='add'>+ if ((NULL == Input_Line) || SLang_Error)</div><div class='add'>+ {</div><div class='add'>+ Input_Line_Pointer = Input_Line = NULL;</div><div class='add'>+ return (tok->type = EOF_TOKEN);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ while (0 == SLprep_line_ok(Input_Line, This_SLpp));</div><div class='add'>+</div><div class='add'>+ Input_Line_Pointer = Input_Line;</div><div class='add'>+ if (*Input_Line_Pointer == '.')</div><div class='add'>+ {</div><div class='add'>+ Input_Line_Pointer++;</div><div class='add'>+ return tok->type = RPN_TOKEN;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int prep_exists_function (char *line, char comment)</div><div class='add'>+{</div><div class='add'>+ char buf[MAX_FILE_LINE_LEN], *b, *bmax;</div><div class='add'>+ unsigned char ch;</div><div class='add'>+</div><div class='add'>+ bmax = buf + (sizeof (buf) - 1);</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ /* skip whitespace */</div><div class='add'>+ while ((ch = (unsigned char) *line),</div><div class='add'>+ ch && (ch != '\n') && (ch <= ' '))</div><div class='add'>+ line++;</div><div class='add'>+</div><div class='add'>+ if ((ch <= '\n')</div><div class='add'>+ || (ch == (unsigned char) comment)) break;</div><div class='add'>+</div><div class='add'>+ b = buf;</div><div class='add'>+ while ((ch = (unsigned char) *line) > ' ')</div><div class='add'>+ {</div><div class='add'>+ if (b < bmax) *b++ = (char) ch;</div><div class='add'>+ line++;</div><div class='add'>+ }</div><div class='add'>+ *b = 0;</div><div class='add'>+</div><div class='add'>+ if (SLang_is_defined (buf))</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int prep_eval_expr (char *expr)</div><div class='add'>+{</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (0 != SLang_load_string (expr))</div><div class='add'>+ return -1;</div><div class='add'>+ if (-1 == SLang_pop_integer (&ret))</div><div class='add'>+ return -1;</div><div class='add'>+ return (ret != 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+int SLang_load_object (SLang_Load_Type *x)</div><div class='add'>+{</div><div class='add'>+ SLPreprocess_Type this_pp;</div><div class='add'>+ SLPreprocess_Type *save_this_pp;</div><div class='add'>+ SLang_Load_Type *save_llt;</div><div class='add'>+ char *save_input_line, *save_input_line_ptr;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ int save_compile_line_num_info;</div><div class='add'>+#endif</div><div class='add'>+ int save_auto_declare_variables;</div><div class='add'>+</div><div class='add'>+ if (SLprep_exists_hook == NULL)</div><div class='add'>+ SLprep_exists_hook = prep_exists_function;</div><div class='add'>+</div><div class='add'>+ if (_SLprep_eval_hook == NULL)</div><div class='add'>+ _SLprep_eval_hook = prep_eval_expr;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLprep_open_prep (&this_pp)) return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLcompile_push_context (x))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ save_compile_line_num_info = _SLang_Compile_Line_Num_Info;</div><div class='add'>+#endif</div><div class='add'>+ save_this_pp = This_SLpp;</div><div class='add'>+ save_input_line = Input_Line;</div><div class='add'>+ save_input_line_ptr = Input_Line_Pointer;</div><div class='add'>+ save_llt = LLT;</div><div class='add'>+ save_auto_declare_variables = _SLang_Auto_Declare_Globals;</div><div class='add'>+</div><div class='add'>+ This_SLpp = &this_pp;</div><div class='add'>+ Input_Line_Pointer = Input_Line = Empty_Line;</div><div class='add'>+ LLT = x;</div><div class='add'>+</div><div class='add'>+ x->line_num = 0;</div><div class='add'>+ x->parse_level = 0;</div><div class='add'>+ _SLang_Auto_Declare_Globals = x->auto_declare_globals;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ _SLang_Compile_Line_Num_Info = Default_Compile_Line_Num_Info;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ _SLparse_start (x);</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ do_line_file_error (x->line_num, x->name);</div><div class='add'>+</div><div class='add'>+ _SLang_Auto_Declare_Globals = save_auto_declare_variables;</div><div class='add'>+</div><div class='add'>+ if (SLang_Error) SLang_restart (0);</div><div class='add'>+</div><div class='add'>+ (void) _SLcompile_pop_context ();</div><div class='add'>+</div><div class='add'>+ Input_Line = save_input_line;</div><div class='add'>+ Input_Line_Pointer = save_input_line_ptr;</div><div class='add'>+ LLT = save_llt;</div><div class='add'>+ This_SLpp = save_this_pp;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ _SLang_Compile_Line_Num_Info = save_compile_line_num_info;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ if (SLang_Error) return -1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Load_Type *SLallocate_load_type (char *name)</div><div class='add'>+{</div><div class='add'>+ SLang_Load_Type *x;</div><div class='add'>+</div><div class='add'>+ if (NULL == (x = (SLang_Load_Type *)SLmalloc (sizeof (SLang_Load_Type))))</div><div class='add'>+ return NULL;</div><div class='add'>+ memset ((char *) x, 0, sizeof (SLang_Load_Type));</div><div class='add'>+</div><div class='add'>+ if (name == NULL) name = "";</div><div class='add'>+</div><div class='add'>+ x->name = SLang_create_slstring (name);</div><div class='add'>+ if (x->name == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) x);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ return x;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLdeallocate_load_type (SLang_Load_Type *x)</div><div class='add'>+{</div><div class='add'>+ if (x != NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (x->name);</div><div class='add'>+ SLfree ((char *) x);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *string;</div><div class='add'>+ char *ptr;</div><div class='add'>+}</div><div class='add'>+String_Client_Data_Type;</div><div class='add'>+</div><div class='add'>+static char *read_from_string (SLang_Load_Type *x)</div><div class='add'>+{</div><div class='add'>+ String_Client_Data_Type *data;</div><div class='add'>+ char *s, *s1, ch;</div><div class='add'>+</div><div class='add'>+ data = (String_Client_Data_Type *)x->client_data;</div><div class='add'>+ s1 = s = data->ptr;</div><div class='add'>+</div><div class='add'>+ if (*s == 0)</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ while ((ch = *s) != 0)</div><div class='add'>+ {</div><div class='add'>+ s++;</div><div class='add'>+ if (ch == '\n')</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ data->ptr = s;</div><div class='add'>+ return s1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_load_string (char *string)</div><div class='add'>+{</div><div class='add'>+ SLang_Load_Type *x;</div><div class='add'>+ String_Client_Data_Type data;</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (string == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* Grab a private copy in case loading modifies string */</div><div class='add'>+ if (NULL == (string = SLang_create_slstring (string)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* To avoid creating a static data space for every string loaded,</div><div class='add'>+ * all string objects will be regarded as identical. So, identify</div><div class='add'>+ * all of them by ***string***</div><div class='add'>+ */</div><div class='add'>+ if (NULL == (x = SLallocate_load_type ("***string***")))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (string);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ x->client_data = (VOID_STAR) &data;</div><div class='add'>+ x->read = read_from_string;</div><div class='add'>+</div><div class='add'>+ data.ptr = data.string = string;</div><div class='add'>+ if (-1 == (ret = SLang_load_object (x)))</div><div class='add'>+ SLang_verror (SLang_Error, "called from eval: %s", string);</div><div class='add'>+</div><div class='add'>+ SLang_free_slstring (string);</div><div class='add'>+ SLdeallocate_load_type (x);</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ char *buf;</div><div class='add'>+ FILE *fp;</div><div class='add'>+}</div><div class='add'>+File_Client_Data_Type;</div><div class='add'>+</div><div class='add'>+char *SLang_User_Prompt;</div><div class='add'>+static char *read_from_file (SLang_Load_Type *x)</div><div class='add'>+{</div><div class='add'>+ FILE *fp;</div><div class='add'>+ File_Client_Data_Type *c;</div><div class='add'>+</div><div class='add'>+ c = (File_Client_Data_Type *)x->client_data;</div><div class='add'>+ fp = c->fp;</div><div class='add'>+</div><div class='add'>+ if ((fp == stdin) && (SLang_User_Prompt != NULL))</div><div class='add'>+ {</div><div class='add'>+ fputs (SLang_User_Prompt, stdout);</div><div class='add'>+ fflush (stdout);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return fgets (c->buf, MAX_FILE_LINE_LEN, c->fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note that file could be freed from Slang during run of this routine</div><div class='add'>+ * so get it and store it !! (e.g., autoloading)</div><div class='add'>+ */</div><div class='add'>+int (*SLang_Load_File_Hook) (char *);</div><div class='add'>+int SLang_load_file (char *f)</div><div class='add'>+{</div><div class='add'>+ File_Client_Data_Type client_data;</div><div class='add'>+ SLang_Load_Type *x;</div><div class='add'>+ char *name, *buf;</div><div class='add'>+ FILE *fp;</div><div class='add'>+</div><div class='add'>+ if (SLang_Load_File_Hook != NULL)</div><div class='add'>+ return (*SLang_Load_File_Hook) (f);</div><div class='add'>+</div><div class='add'>+ if (f == NULL) name = "<stdin>"; else name = f;</div><div class='add'>+</div><div class='add'>+ name = SLang_create_slstring (name);</div><div class='add'>+ if (name == NULL)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (NULL == (x = SLallocate_load_type (name)))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ buf = NULL;</div><div class='add'>+</div><div class='add'>+ if (f != NULL)</div><div class='add'>+ fp = fopen (f, "r");</div><div class='add'>+ else</div><div class='add'>+ fp = stdin;</div><div class='add'>+</div><div class='add'>+ if (fp == NULL)</div><div class='add'>+ SLang_verror (SL_OBJ_NOPEN, "Unable to open %s", name);</div><div class='add'>+ else if (NULL != (buf = SLmalloc (MAX_FILE_LINE_LEN + 1)))</div><div class='add'>+ {</div><div class='add'>+ client_data.fp = fp;</div><div class='add'>+ client_data.buf = buf;</div><div class='add'>+ x->client_data = (VOID_STAR) &client_data;</div><div class='add'>+ x->read = read_from_file;</div><div class='add'>+</div><div class='add'>+ (void) SLang_load_object (x);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((fp != NULL) && (fp != stdin))</div><div class='add'>+ fclose (fp);</div><div class='add'>+</div><div class='add'>+ SLfree (buf);</div><div class='add'>+ SLang_free_slstring (name);</div><div class='add'>+ SLdeallocate_load_type (x);</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_guess_type (char *t)</div><div class='add'>+{</div><div class='add'>+ char *p;</div><div class='add'>+ register char ch;</div><div class='add'>+ int modifier = 0;</div><div class='add'>+</div><div class='add'>+ if (*t == '-') t++;</div><div class='add'>+ p = t;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ if (*p != '.')</div><div class='add'>+ {</div><div class='add'>+#endif</div><div class='add'>+ modifier = 0;</div><div class='add'>+ while ((*p >= '0') && (*p <= '9')) p++;</div><div class='add'>+ if (t == p) return (SLANG_STRING_TYPE);</div><div class='add'>+ if ((*p == 'x') && (p == t + 1)) /* 0x?? */</div><div class='add'>+ {</div><div class='add'>+ modifier |= 8;</div><div class='add'>+ p++;</div><div class='add'>+ while (ch = *p,</div><div class='add'>+ ((ch >= '0') && (ch <= '9'))</div><div class='add'>+ || (((ch | 0x20) >= 'a') && ((ch | 0x20) <= 'f'))) p++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* Now look for UL, LU, UH, HU, L, H modifiers */</div><div class='add'>+ while ((ch = *p) != 0)</div><div class='add'>+ {</div><div class='add'>+ ch |= 0x20;</div><div class='add'>+ if (ch == 'h') modifier |= 1;</div><div class='add'>+ else if (ch == 'l') modifier |= 2;</div><div class='add'>+ else if (ch == 'u') modifier |= 4;</div><div class='add'>+ else break;</div><div class='add'>+ p++;</div><div class='add'>+ }</div><div class='add'>+ if ((1|2) == (modifier & (1|2))) /* hl present */</div><div class='add'>+ return SLANG_STRING_TYPE;</div><div class='add'>+</div><div class='add'>+ if (ch == 0)</div><div class='add'>+ {</div><div class='add'>+ if ((modifier & 0x7) == 0) return SLANG_INT_TYPE;</div><div class='add'>+ if (modifier & 4)</div><div class='add'>+ {</div><div class='add'>+ if (modifier & 1) return SLANG_USHORT_TYPE;</div><div class='add'>+ if (modifier & 2) return SLANG_ULONG_TYPE;</div><div class='add'>+ return SLANG_UINT_TYPE;</div><div class='add'>+ }</div><div class='add'>+ if (modifier & 1) return SLANG_SHORT_TYPE;</div><div class='add'>+ if (modifier & 2) return SLANG_LONG_TYPE;</div><div class='add'>+ return SLANG_INT_TYPE;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (modifier) return SLANG_STRING_TYPE;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* now down to double case */</div><div class='add'>+ if (*p == '.')</div><div class='add'>+ {</div><div class='add'>+ p++;</div><div class='add'>+ while ((*p >= '0') && (*p <= '9')) p++;</div><div class='add'>+ }</div><div class='add'>+ if (*p == 0) return(SLANG_DOUBLE_TYPE);</div><div class='add'>+ if ((*p != 'e') && (*p != 'E'))</div><div class='add'>+ {</div><div class='add'>+# if SLANG_HAS_COMPLEX</div><div class='add'>+ if (((*p == 'i') || (*p == 'j'))</div><div class='add'>+ && (p[1] == 0))</div><div class='add'>+ return SLANG_COMPLEX_TYPE;</div><div class='add'>+# endif</div><div class='add'>+ if (((*p | 0x20) == 'f') && (p[1] == 0))</div><div class='add'>+ return SLANG_FLOAT_TYPE;</div><div class='add'>+</div><div class='add'>+ return SLANG_STRING_TYPE;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ p++;</div><div class='add'>+ if ((*p == '-') || (*p == '+')) p++;</div><div class='add'>+ while ((*p >= '0') && (*p <= '9')) p++;</div><div class='add'>+ if (*p != 0)</div><div class='add'>+ {</div><div class='add'>+# if SLANG_HAS_COMPLEX</div><div class='add'>+ if (((*p == 'i') || (*p == 'j'))</div><div class='add'>+ && (p[1] == 0))</div><div class='add'>+ return SLANG_COMPLEX_TYPE;</div><div class='add'>+# endif</div><div class='add'>+ if (((*p | 0x20) == 'f') && (p[1] == 0))</div><div class='add'>+ return SLANG_FLOAT_TYPE;</div><div class='add'>+</div><div class='add'>+ return SLANG_STRING_TYPE;</div><div class='add'>+ }</div><div class='add'>+ return SLANG_DOUBLE_TYPE;</div><div class='add'>+#else</div><div class='add'>+ return SLANG_STRING_TYPE;</div><div class='add'>+#endif /* SLANG_HAS_FLOAT */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int hex_atoul (unsigned char *s, unsigned long *ul)</div><div class='add'>+{</div><div class='add'>+ register unsigned char ch;</div><div class='add'>+ register unsigned long value;</div><div class='add'>+ register int base;</div><div class='add'>+</div><div class='add'>+ s++; /* skip the leading 0 */</div><div class='add'>+</div><div class='add'>+ /* look for 'x' which indicates hex */</div><div class='add'>+ if ((*s | 0x20) == 'x')</div><div class='add'>+ {</div><div class='add'>+ base = 16;</div><div class='add'>+ s++;</div><div class='add'>+ if (*s == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ else base = 8;</div><div class='add'>+</div><div class='add'>+ value = 0;</div><div class='add'>+ while ((ch = *s++) != 0)</div><div class='add'>+ {</div><div class='add'>+ char ch1 = ch | 0x20;</div><div class='add'>+ switch (ch1)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'u':</div><div class='add'>+ case 'l':</div><div class='add'>+ case 'h':</div><div class='add'>+ *ul = value;</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case '8':</div><div class='add'>+ case '9':</div><div class='add'>+ if (base != 16) SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+ /* drop */</div><div class='add'>+ case '0':</div><div class='add'>+ case '1':</div><div class='add'>+ case '2':</div><div class='add'>+ case '3':</div><div class='add'>+ case '4':</div><div class='add'>+ case '5':</div><div class='add'>+ case '6':</div><div class='add'>+ case '7':</div><div class='add'>+ ch1 -= '0';</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 'a':</div><div class='add'>+ case 'b':</div><div class='add'>+ case 'c':</div><div class='add'>+ case 'd':</div><div class='add'>+ case 'e':</div><div class='add'>+ case 'f':</div><div class='add'>+ if (base != 16) SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+ ch1 = (ch1 - 'a') + 10;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ value = value * base + ch1;</div><div class='add'>+ }</div><div class='add'>+ *ul = value;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note: These routines do not check integer overflow. I would use the C</div><div class='add'>+ * library functions atol and atoul but some implementations check overflow</div><div class='add'>+ * and some do not. The following implementations provide a consistent</div><div class='add'>+ * behavior.</div><div class='add'>+ */</div><div class='add'>+unsigned long SLatoul (unsigned char *s)</div><div class='add'>+{</div><div class='add'>+ int sign;</div><div class='add'>+ unsigned long value;</div><div class='add'>+</div><div class='add'>+ if (*s == '-') sign = -1;</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ sign = 1;</div><div class='add'>+ if (*s == '+') s++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (*s == '0')</div><div class='add'>+ {</div><div class='add'>+ if (-1 == hex_atoul (s, &value))</div><div class='add'>+ return (unsigned long) -1;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ while (WHITE_CHAR == CHAR_CLASS(*s))</div><div class='add'>+ s++;</div><div class='add'>+</div><div class='add'>+ value = 0;</div><div class='add'>+ while (DIGIT_CHAR == CHAR_CLASS(*s))</div><div class='add'>+ {</div><div class='add'>+ value = value * 10 + (unsigned long) (*s - '0');</div><div class='add'>+ s++;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (sign == -1)</div><div class='add'>+ value = (unsigned long)-1L * value;</div><div class='add'>+</div><div class='add'>+ return value;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+long SLatol (unsigned char *s)</div><div class='add'>+{</div><div class='add'>+ while (WHITE_CHAR == CHAR_CLASS(*s))</div><div class='add'>+ s++;</div><div class='add'>+</div><div class='add'>+ if (*s == '-')</div><div class='add'>+ {</div><div class='add'>+ long value = (long) SLatoul (s+1);</div><div class='add'>+ return -value;</div><div class='add'>+ }</div><div class='add'>+ return (long) SLatoul (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLatoi (unsigned char *s)</div><div class='add'>+{</div><div class='add'>+ return (int) SLatol (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *check_byte_compiled_token (char *buf)</div><div class='add'>+{</div><div class='add'>+ unsigned int len_lo, len_hi, len;</div><div class='add'>+</div><div class='add'>+ len_lo = (unsigned char) *Input_Line_Pointer++;</div><div class='add'>+ if ((len_lo < 32)</div><div class='add'>+ || ((len_hi = (unsigned char)*Input_Line_Pointer++) < 32)</div><div class='add'>+ || ((len = (len_lo - 32) | ((len_hi - 32) << 7)) >= MAX_TOKEN_LEN))</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror ("Byte compiled file appears corrupt");</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLMEMCPY (buf, Input_Line_Pointer, len);</div><div class='add'>+ buf += len;</div><div class='add'>+ Input_Line_Pointer += len;</div><div class='add'>+ *buf = 0;</div><div class='add'>+ return buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLcompile_byte_compiled (void)</div><div class='add'>+{</div><div class='add'>+ unsigned char type;</div><div class='add'>+ _SLang_Token_Type tok;</div><div class='add'>+ char buf[MAX_TOKEN_LEN];</div><div class='add'>+ char *ebuf;</div><div class='add'>+ unsigned int len;</div><div class='add'>+</div><div class='add'>+ memset ((char *) &tok, 0, sizeof (_SLang_Token_Type));</div><div class='add'>+</div><div class='add'>+ while (SLang_Error == 0)</div><div class='add'>+ {</div><div class='add'>+ top_of_switch:</div><div class='add'>+ type = (unsigned char) *Input_Line_Pointer++;</div><div class='add'>+ switch (type)</div><div class='add'>+ {</div><div class='add'>+ case '\n':</div><div class='add'>+ case 0:</div><div class='add'>+ if (NULL == (Input_Line = LLT->read(LLT)))</div><div class='add'>+ {</div><div class='add'>+ Input_Line_Pointer = Input_Line = NULL;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ Input_Line_Pointer = Input_Line;</div><div class='add'>+ goto top_of_switch;</div><div class='add'>+</div><div class='add'>+ case LINE_NUM_TOKEN:</div><div class='add'>+ case CHAR_TOKEN:</div><div class='add'>+ case UCHAR_TOKEN:</div><div class='add'>+ case SHORT_TOKEN:</div><div class='add'>+ case USHORT_TOKEN:</div><div class='add'>+ case INT_TOKEN:</div><div class='add'>+ case UINT_TOKEN:</div><div class='add'>+ case LONG_TOKEN:</div><div class='add'>+ case ULONG_TOKEN:</div><div class='add'>+ if (NULL == check_byte_compiled_token (buf))</div><div class='add'>+ return;</div><div class='add'>+ tok.v.long_val = atol (buf);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case COMPLEX_TOKEN:</div><div class='add'>+ case FLOAT_TOKEN:</div><div class='add'>+ case DOUBLE_TOKEN:</div><div class='add'>+ if (NULL == check_byte_compiled_token (buf))</div><div class='add'>+ return;</div><div class='add'>+ tok.v.s_val = buf;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case ESC_STRING_TOKEN:</div><div class='add'>+ if (NULL == (ebuf = check_byte_compiled_token (buf)))</div><div class='add'>+ return;</div><div class='add'>+ tok.v.s_val = buf;</div><div class='add'>+ if (expand_escaped_string (buf, buf, ebuf, &len))</div><div class='add'>+ {</div><div class='add'>+ tok.hash = len;</div><div class='add'>+ type = _BSTRING_TOKEN;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ tok.hash = _SLstring_hash ((unsigned char *)buf, (unsigned char *)buf + len);</div><div class='add'>+ type = STRING_TOKEN;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case TMP_TOKEN:</div><div class='add'>+ case DEFINE_TOKEN:</div><div class='add'>+ case DEFINE_STATIC_TOKEN:</div><div class='add'>+ case DEFINE_PRIVATE_TOKEN:</div><div class='add'>+ case DEFINE_PUBLIC_TOKEN:</div><div class='add'>+ case DOT_TOKEN:</div><div class='add'>+ case STRING_TOKEN:</div><div class='add'>+ case IDENT_TOKEN:</div><div class='add'>+ case _REF_TOKEN:</div><div class='add'>+ case _DEREF_ASSIGN_TOKEN:</div><div class='add'>+ case _SCALAR_ASSIGN_TOKEN:</div><div class='add'>+ case _SCALAR_PLUSEQS_TOKEN:</div><div class='add'>+ case _SCALAR_MINUSEQS_TOKEN:</div><div class='add'>+ case _SCALAR_TIMESEQS_TOKEN:</div><div class='add'>+ case _SCALAR_DIVEQS_TOKEN:</div><div class='add'>+ case _SCALAR_BOREQS_TOKEN:</div><div class='add'>+ case _SCALAR_BANDEQS_TOKEN:</div><div class='add'>+ case _SCALAR_PLUSPLUS_TOKEN:</div><div class='add'>+ case _SCALAR_POST_PLUSPLUS_TOKEN:</div><div class='add'>+ case _SCALAR_MINUSMINUS_TOKEN:</div><div class='add'>+ case _SCALAR_POST_MINUSMINUS_TOKEN:</div><div class='add'>+ case _STRUCT_ASSIGN_TOKEN:</div><div class='add'>+ case _STRUCT_PLUSEQS_TOKEN:</div><div class='add'>+ case _STRUCT_MINUSEQS_TOKEN:</div><div class='add'>+ case _STRUCT_TIMESEQS_TOKEN:</div><div class='add'>+ case _STRUCT_DIVEQS_TOKEN:</div><div class='add'>+ case _STRUCT_BOREQS_TOKEN:</div><div class='add'>+ case _STRUCT_BANDEQS_TOKEN:</div><div class='add'>+ case _STRUCT_POST_MINUSMINUS_TOKEN:</div><div class='add'>+ case _STRUCT_MINUSMINUS_TOKEN:</div><div class='add'>+ case _STRUCT_POST_PLUSPLUS_TOKEN:</div><div class='add'>+ case _STRUCT_PLUSPLUS_TOKEN:</div><div class='add'>+ if (NULL == (ebuf = check_byte_compiled_token (buf)))</div><div class='add'>+ return;</div><div class='add'>+ tok.v.s_val = buf;</div><div class='add'>+ tok.hash = _SLstring_hash ((unsigned char *)buf, (unsigned char *)ebuf);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ tok.type = type;</div><div class='add'>+</div><div class='add'>+ (*_SLcompile_ptr) (&tok);</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int escape_string (unsigned char *s, unsigned char *smax,</div><div class='add'>+ unsigned char *buf, unsigned char *buf_max,</div><div class='add'>+ int *is_escaped)</div><div class='add'>+{</div><div class='add'>+ unsigned char ch;</div><div class='add'>+</div><div class='add'>+ *is_escaped = 0;</div><div class='add'>+ while (buf < buf_max)</div><div class='add'>+ {</div><div class='add'>+ if (s == smax)</div><div class='add'>+ {</div><div class='add'>+ *buf = 0;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ch = *s++;</div><div class='add'>+ switch (ch)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ *buf++ = ch;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 0:</div><div class='add'>+ *buf++ = '\\';</div><div class='add'>+ if (buf < buf_max) *buf++ = 'x';</div><div class='add'>+ if (buf < buf_max) *buf++ = '0';</div><div class='add'>+ if (buf < buf_max) *buf++ = '0';</div><div class='add'>+ *is_escaped = 1;</div><div class='add'>+ break; /* return 0; */</div><div class='add'>+</div><div class='add'>+ case '\n':</div><div class='add'>+ *buf++ = '\\';</div><div class='add'>+ if (buf < buf_max) *buf++ = 'n';</div><div class='add'>+ *is_escaped = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '\r':</div><div class='add'>+ *buf++ = '\\';</div><div class='add'>+ if (buf < buf_max) *buf++ = 'r';</div><div class='add'>+ *is_escaped = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case 0x1A: /* ^Z */</div><div class='add'>+ *buf++ = '\\';</div><div class='add'>+ if (buf < buf_max) *buf++ = 'x';</div><div class='add'>+ if (buf < buf_max) *buf++ = '1';</div><div class='add'>+ if (buf < buf_max) *buf++ = 'A';</div><div class='add'>+ *is_escaped = 1;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '\\':</div><div class='add'>+ *buf++ = ch;</div><div class='add'>+ if (buf < buf_max) *buf++ = ch;</div><div class='add'>+ *is_escaped = 1;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ _SLparse_error ("String too long to byte-compile", NULL, 0);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static FILE *Byte_Compile_Fp;</div><div class='add'>+static unsigned int Byte_Compile_Line_Len;</div><div class='add'>+</div><div class='add'>+static int bytecomp_write_data (char *buf, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ char *err = "Write Error";</div><div class='add'>+</div><div class='add'>+ if ((Byte_Compile_Line_Len + len + 1) >= MAX_FILE_LINE_LEN)</div><div class='add'>+ {</div><div class='add'>+ if (EOF == fputs ("\n", Byte_Compile_Fp))</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror (err);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ Byte_Compile_Line_Len = 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (EOF == fputs (buf, Byte_Compile_Fp))</div><div class='add'>+ {</div><div class='add'>+ SLang_doerror (err);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ Byte_Compile_Line_Len += len;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void byte_compile_token (_SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+ unsigned char buf [MAX_TOKEN_LEN + 4], *buf_max;</div><div class='add'>+ unsigned int len;</div><div class='add'>+ char *b3;</div><div class='add'>+ int is_escaped;</div><div class='add'>+ unsigned char *s;</div><div class='add'>+</div><div class='add'>+ if (SLang_Error) return;</div><div class='add'>+</div><div class='add'>+ buf [0] = (unsigned char) tok->type;</div><div class='add'>+ buf [1] = 0;</div><div class='add'>+</div><div class='add'>+ buf_max = buf + sizeof(buf);</div><div class='add'>+ b3 = (char *) buf + 3;</div><div class='add'>+</div><div class='add'>+ switch (tok->type)</div><div class='add'>+ {</div><div class='add'>+ case LINE_NUM_TOKEN:</div><div class='add'>+ case CHAR_TOKEN:</div><div class='add'>+ case SHORT_TOKEN:</div><div class='add'>+ case INT_TOKEN:</div><div class='add'>+ case LONG_TOKEN:</div><div class='add'>+ sprintf (b3, "%ld", tok->v.long_val);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case UCHAR_TOKEN:</div><div class='add'>+ case USHORT_TOKEN:</div><div class='add'>+ case UINT_TOKEN:</div><div class='add'>+ case ULONG_TOKEN:</div><div class='add'>+ sprintf (b3, "%lu", tok->v.long_val);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case _BSTRING_TOKEN:</div><div class='add'>+ s = (unsigned char *) tok->v.s_val;</div><div class='add'>+ len = (unsigned int) tok->hash;</div><div class='add'>+</div><div class='add'>+ if (-1 == escape_string (s, s + len,</div><div class='add'>+ (unsigned char *)b3, buf_max,</div><div class='add'>+ &is_escaped))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ buf[0] = ESC_STRING_TOKEN;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case BSTRING_TOKEN:</div><div class='add'>+ if (NULL == (s = SLbstring_get_pointer (tok->v.b_val, &len)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (-1 == escape_string (s, s + len,</div><div class='add'>+ (unsigned char *)b3, buf_max,</div><div class='add'>+ &is_escaped))</div><div class='add'>+ return;</div><div class='add'>+ buf[0] = ESC_STRING_TOKEN;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case STRING_TOKEN:</div><div class='add'>+ s = (unsigned char *)tok->v.s_val;</div><div class='add'>+</div><div class='add'>+ if (-1 == escape_string (s, s + strlen ((char *)s),</div><div class='add'>+ (unsigned char *)b3, buf_max,</div><div class='add'>+ &is_escaped))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ if (is_escaped)</div><div class='add'>+ buf[0] = ESC_STRING_TOKEN;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ /* a _SCALAR_* token is attached to an identifier. */</div><div class='add'>+ case _DEREF_ASSIGN_TOKEN:</div><div class='add'>+ case _SCALAR_ASSIGN_TOKEN:</div><div class='add'>+ case _SCALAR_PLUSEQS_TOKEN:</div><div class='add'>+ case _SCALAR_MINUSEQS_TOKEN:</div><div class='add'>+ case _SCALAR_TIMESEQS_TOKEN:</div><div class='add'>+ case _SCALAR_DIVEQS_TOKEN:</div><div class='add'>+ case _SCALAR_BOREQS_TOKEN:</div><div class='add'>+ case _SCALAR_BANDEQS_TOKEN:</div><div class='add'>+ case _SCALAR_PLUSPLUS_TOKEN:</div><div class='add'>+ case _SCALAR_POST_PLUSPLUS_TOKEN:</div><div class='add'>+ case _SCALAR_MINUSMINUS_TOKEN:</div><div class='add'>+ case _SCALAR_POST_MINUSMINUS_TOKEN:</div><div class='add'>+ case DOT_TOKEN:</div><div class='add'>+ case TMP_TOKEN:</div><div class='add'>+ case DEFINE_TOKEN:</div><div class='add'>+ case DEFINE_STATIC_TOKEN:</div><div class='add'>+ case DEFINE_PRIVATE_TOKEN:</div><div class='add'>+ case DEFINE_PUBLIC_TOKEN:</div><div class='add'>+ case FLOAT_TOKEN:</div><div class='add'>+ case DOUBLE_TOKEN:</div><div class='add'>+ case COMPLEX_TOKEN:</div><div class='add'>+ case IDENT_TOKEN:</div><div class='add'>+ case _REF_TOKEN:</div><div class='add'>+ case _STRUCT_ASSIGN_TOKEN:</div><div class='add'>+ case _STRUCT_PLUSEQS_TOKEN:</div><div class='add'>+ case _STRUCT_MINUSEQS_TOKEN:</div><div class='add'>+ case _STRUCT_TIMESEQS_TOKEN:</div><div class='add'>+ case _STRUCT_DIVEQS_TOKEN:</div><div class='add'>+ case _STRUCT_BOREQS_TOKEN:</div><div class='add'>+ case _STRUCT_BANDEQS_TOKEN:</div><div class='add'>+ case _STRUCT_POST_MINUSMINUS_TOKEN:</div><div class='add'>+ case _STRUCT_MINUSMINUS_TOKEN:</div><div class='add'>+ case _STRUCT_POST_PLUSPLUS_TOKEN:</div><div class='add'>+ case _STRUCT_PLUSPLUS_TOKEN:</div><div class='add'>+ strcpy (b3, tok->v.s_val);</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ b3 = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (b3 != NULL)</div><div class='add'>+ {</div><div class='add'>+ len = strlen (b3);</div><div class='add'>+ buf[1] = (unsigned char) ((len & 0x7F) + 32);</div><div class='add'>+ buf[2] = (unsigned char) (((len >> 7) & 0x7F) + 32);</div><div class='add'>+ len += 3;</div><div class='add'>+ }</div><div class='add'>+ else len = 1;</div><div class='add'>+</div><div class='add'>+ (void) bytecomp_write_data ((char *)buf, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_byte_compile_file (char *name, int method)</div><div class='add'>+{</div><div class='add'>+ char file [1024];</div><div class='add'>+</div><div class='add'>+ (void) method;</div><div class='add'>+ if (strlen (name) + 2 >= sizeof (file))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Filename too long");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ sprintf (file, "%sc", name);</div><div class='add'>+ if (NULL == (Byte_Compile_Fp = fopen (file, "w")))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror(SL_OBJ_NOPEN, "%s: unable to open", file);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Byte_Compile_Line_Len = 0;</div><div class='add'>+ if (-1 != bytecomp_write_data (".#", 2))</div><div class='add'>+ {</div><div class='add'>+ _SLcompile_ptr = byte_compile_token;</div><div class='add'>+ (void) SLang_load_file (name);</div><div class='add'>+ _SLcompile_ptr = _SLcompile;</div><div class='add'>+</div><div class='add'>+ (void) bytecomp_write_data ("\n", 1);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (EOF == fclose (Byte_Compile_Fp))</div><div class='add'>+ SLang_doerror ("Write Error");</div><div class='add'>+</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (0, "Error processing %s", name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_generate_debug_info (int x)</div><div class='add'>+{</div><div class='add'>+ int y = Default_Compile_Line_Num_Info;</div><div class='add'>+ Default_Compile_Line_Num_Info = x;</div><div class='add'>+ return y;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/sltypes.c b/mdk-stage1/slang/sltypes.c<br/>new file mode 100644<br/>index 000000000..05b8741b1<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sltypes.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltypes.c</a></div><div class='hunk'>@@ -0,0 +1,966 @@</div><div class='add'>+/* Basic type operations for S-Lang */</div><div class='add'>+/* Copyright (c) 1992, 1996, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+# include <math.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define SL_APP_WANTS_FOREACH /* for String_Type */</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+int SLpop_string (char **s) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ char *sls;</div><div class='add'>+</div><div class='add'>+ *s = NULL;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_slstring (&sls))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (NULL == (*s = SLmake_string (sls)))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (sls);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_free_slstring (sls);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int SLang_pop_slstring (char **s) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ return SLclass_pop_ptr_obj (SLANG_STRING_TYPE, (VOID_STAR *)s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* if *data != 0, string should be freed upon use. */</div><div class='add'>+int SLang_pop_string(char **s, int *data) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ if (SLpop_string (s))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ *data = 1;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int _SLang_push_slstring (char *s)</div><div class='add'>+{</div><div class='add'>+ if (0 == SLclass_push_ptr_obj (SLANG_STRING_TYPE, (VOID_STAR)s))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLpush_alloced_slstring (char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+ if (NULL == (s = _SLcreate_via_alloced_slstring (s, len)))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ return _SLang_push_slstring (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_string (char *t) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ if (t == NULL)</div><div class='add'>+ return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+ if (NULL == (t = SLang_create_slstring (t)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return _SLang_push_slstring (t);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int _SLang_dup_and_push_slstring (char *s)</div><div class='add'>+{</div><div class='add'>+ if (NULL == (s = _SLstring_dup_slstring (s)))</div><div class='add'>+ return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+ return _SLang_push_slstring (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* This function _always_ frees the malloced string */</div><div class='add'>+int SLang_push_malloced_string (char *c) /*{{{*/</div><div class='add'>+{</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ ret = SLang_push_string (c);</div><div class='add'>+ SLfree (c);</div><div class='add'>+</div><div class='add'>+ return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+static int int_int_power (int a, int b)</div><div class='add'>+{</div><div class='add'>+ int r, s;</div><div class='add'>+</div><div class='add'>+ if (a == 0) return 0;</div><div class='add'>+ if (b < 0) return 0;</div><div class='add'>+ if (b == 0) return 1;</div><div class='add'>+</div><div class='add'>+ s = 1;</div><div class='add'>+ if (a < 0)</div><div class='add'>+ {</div><div class='add'>+ if ((b % 2) == 1) s = -1;</div><div class='add'>+ a = -a;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ /* FIXME: Priority=low</div><div class='add'>+ * This needs optimized</div><div class='add'>+ */</div><div class='add'>+ r = 1;</div><div class='add'>+ while (b)</div><div class='add'>+ {</div><div class='add'>+ r = r * a;</div><div class='add'>+ b--;</div><div class='add'>+ }</div><div class='add'>+ return r * s;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+string_string_bin_op_result (int op, unsigned char a, unsigned char b,</div><div class='add'>+ unsigned char *c)</div><div class='add'>+{</div><div class='add'>+ (void) a;</div><div class='add'>+ (void) b;</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLANG_PLUS:</div><div class='add'>+ *c = SLANG_STRING_TYPE;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_GT:</div><div class='add'>+ case SLANG_GE:</div><div class='add'>+ case SLANG_LT:</div><div class='add'>+ case SLANG_LE:</div><div class='add'>+ case SLANG_EQ:</div><div class='add'>+ case SLANG_NE:</div><div class='add'>+ *c = SLANG_CHAR_TYPE;</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+string_string_bin_op (int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+ char *ic;</div><div class='add'>+ char **a, **b, **c;</div><div class='add'>+ unsigned int n, n_max;</div><div class='add'>+ unsigned int da, db;</div><div class='add'>+</div><div class='add'>+ (void) a_type;</div><div class='add'>+ (void) b_type;</div><div class='add'>+</div><div class='add'>+ if (na == 1) da = 0; else da = 1;</div><div class='add'>+ if (nb == 1) db = 0; else db = 1;</div><div class='add'>+</div><div class='add'>+ if (na > nb) n_max = na; else n_max = nb;</div><div class='add'>+</div><div class='add'>+ a = (char **) ap;</div><div class='add'>+ b = (char **) bp;</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if ((*a == NULL) || (*b == NULL))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_VARIABLE_UNINITIALIZED, "String element[%u] not initialized for binary operation", n);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ a = (char **) ap;</div><div class='add'>+ b = (char **) bp;</div><div class='add'>+ ic = (char *) cp;</div><div class='add'>+ c = NULL;</div><div class='add'>+</div><div class='add'>+ switch (op)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_DIVIDE:</div><div class='add'>+ case SLANG_MINUS:</div><div class='add'>+ default:</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ case SLANG_PLUS:</div><div class='add'>+ /* Concat */</div><div class='add'>+ c = (char **) cp;</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (NULL == (c[n] = SLang_concat_slstrings (*a, *b)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ a += da; b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case SLANG_NE:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ ic [n] = (0 != strcmp (*a, *b));</div><div class='add'>+ a += da;</div><div class='add'>+ b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_GT:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ ic [n] = (strcmp (*a, *b) > 0);</div><div class='add'>+ a += da;</div><div class='add'>+ b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_GE:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ ic [n] = (strcmp (*a, *b) >= 0);</div><div class='add'>+ a += da;</div><div class='add'>+ b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_LT:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ ic [n] = (strcmp (*a, *b) < 0);</div><div class='add'>+ a += da;</div><div class='add'>+ b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_LE:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ ic [n] = (strcmp (*a, *b) <= 0);</div><div class='add'>+ a += da;</div><div class='add'>+ b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ case SLANG_EQ:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ ic [n] = (strcmp (*a, *b) == 0);</div><div class='add'>+ a += da;</div><div class='add'>+ b += db;</div><div class='add'>+ }</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+</div><div class='add'>+ return_error:</div><div class='add'>+ if (c != NULL)</div><div class='add'>+ {</div><div class='add'>+ unsigned int nn;</div><div class='add'>+ for (nn = 0; nn < n; nn++)</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (c[nn]);</div><div class='add'>+ c[nn] = NULL;</div><div class='add'>+ }</div><div class='add'>+ for (nn = n; nn < n_max; nn++)</div><div class='add'>+ c[nn] = NULL;</div><div class='add'>+ }</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void string_destroy (unsigned char unused, VOID_STAR s)</div><div class='add'>+{</div><div class='add'>+ (void) unused;</div><div class='add'>+ SLang_free_slstring (*(char **) s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int string_push (unsigned char unused, VOID_STAR sptr)</div><div class='add'>+{</div><div class='add'>+ (void) unused;</div><div class='add'>+ return SLang_push_string (*(char **) sptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int string_cmp (unsigned char unused, VOID_STAR ap, VOID_STAR bp, int *c)</div><div class='add'>+{</div><div class='add'>+ char *a, *b;</div><div class='add'>+ (void) unused;</div><div class='add'>+ </div><div class='add'>+ a = *(char **) ap;</div><div class='add'>+ b = *(char **) bp;</div><div class='add'>+ if (a != b)</div><div class='add'>+ {</div><div class='add'>+ if (a == NULL) *c = -1;</div><div class='add'>+ else if (b == NULL) *c = 1;</div><div class='add'>+ else *c = strcmp (a, b);</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ *c = 0;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int string_to_int (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ char **s;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ int *b;</div><div class='add'>+</div><div class='add'>+ (void) a_type;</div><div class='add'>+ (void) b_type;</div><div class='add'>+</div><div class='add'>+ s = (char **) ap;</div><div class='add'>+ b = (int *) bp;</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ {</div><div class='add'>+ if (s[i] == NULL) b[i] = 0;</div><div class='add'>+ else b[i] = s[i][0];</div><div class='add'>+ }</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct _SLang_Foreach_Context_Type</div><div class='add'>+{</div><div class='add'>+ char *string;</div><div class='add'>+ unsigned int n;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static SLang_Foreach_Context_Type *</div><div class='add'>+string_foreach_open (unsigned char type, unsigned int num)</div><div class='add'>+{</div><div class='add'>+ char *s;</div><div class='add'>+ SLang_Foreach_Context_Type *c;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ if (num != 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+ "'foreach using' form not supported by String_Type");</div><div class='add'>+ SLdo_pop_n (num + 1);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ if (-1 == SLang_pop_slstring (&s))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ c = (SLang_Foreach_Context_Type *)SLmalloc (sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+ if (c == NULL)</div><div class='add'>+ {</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+ c->string = s;</div><div class='add'>+</div><div class='add'>+ return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void string_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ if (c == NULL) return;</div><div class='add'>+ SLang_free_slstring (c->string);</div><div class='add'>+ SLfree ((char *) c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int string_foreach (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+ char ch;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ ch = c->string[c->n];</div><div class='add'>+ if (ch == 0)</div><div class='add'>+ return 0; /* done */</div><div class='add'>+</div><div class='add'>+ c->n += 1;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_push_int_obj (SLANG_INT_TYPE, ch))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLstring_list_push (_SLString_List_Type *p)</div><div class='add'>+{</div><div class='add'>+ unsigned int num;</div><div class='add'>+ int inum;</div><div class='add'>+ SLang_Array_Type *at;</div><div class='add'>+ char **buf;</div><div class='add'>+</div><div class='add'>+ if ((buf = p->buf) == NULL)</div><div class='add'>+ return SLang_push_null ();</div><div class='add'>+ </div><div class='add'>+ num = p->num;</div><div class='add'>+ inum = (int) num;</div><div class='add'>+ </div><div class='add'>+ if (num == 0) num++;</div><div class='add'>+ if (num != p->max_num)</div><div class='add'>+ {</div><div class='add'>+ if (NULL == (buf = (char **)SLrealloc ((char *) buf, sizeof (char *) * num)))</div><div class='add'>+ {</div><div class='add'>+ _SLstring_list_delete (p);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ p->max_num = num;</div><div class='add'>+ p->buf = buf;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, (VOID_STAR) buf, &inum, 1)))</div><div class='add'>+ {</div><div class='add'>+ _SLstring_list_delete (p);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ p->buf = NULL;</div><div class='add'>+ _SLstring_list_delete (p);</div><div class='add'>+ return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLstring_list_init (_SLString_List_Type *p, unsigned int max_num, unsigned int delta_num)</div><div class='add'>+{</div><div class='add'>+ if (NULL == (p->buf = (char **) SLmalloc (max_num * sizeof (char *))))</div><div class='add'>+ return -1;</div><div class='add'>+ </div><div class='add'>+ p->max_num = max_num;</div><div class='add'>+ p->num = 0;</div><div class='add'>+ p->delta_num = delta_num;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLstring_list_append (_SLString_List_Type *p, char *s)</div><div class='add'>+{</div><div class='add'>+ if (s == NULL)</div><div class='add'>+ {</div><div class='add'>+ _SLstring_list_delete (p);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (p->max_num == p->num)</div><div class='add'>+ {</div><div class='add'>+ char **b;</div><div class='add'>+ unsigned int max_num = p->num + p->delta_num;</div><div class='add'>+ b = (char **)SLrealloc ((char *)p->buf, max_num * sizeof (char *));</div><div class='add'>+ if (b == NULL)</div><div class='add'>+ {</div><div class='add'>+ _SLstring_list_delete (p);</div><div class='add'>+ SLang_free_slstring (s);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ p->buf = b;</div><div class='add'>+ p->max_num = max_num;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ p->buf[p->num] = s;</div><div class='add'>+ p->num++;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLstring_list_delete (_SLString_List_Type *p)</div><div class='add'>+{</div><div class='add'>+ if (p->buf != NULL)</div><div class='add'>+ {</div><div class='add'>+ unsigned int i, imax;</div><div class='add'>+ char **buf = p->buf;</div><div class='add'>+ imax = p->num;</div><div class='add'>+ for (i = 0; i < imax; i++)</div><div class='add'>+ SLang_free_slstring (buf[i]);</div><div class='add'>+ SLfree ((char *)buf);</div><div class='add'>+ p->buf = NULL;</div><div class='add'>+ }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Ref type */</div><div class='add'>+int SLang_pop_ref (SLang_Ref_Type **ref)</div><div class='add'>+{</div><div class='add'>+ return SLclass_pop_ptr_obj (SLANG_REF_TYPE, (VOID_STAR *)ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note: This is ok if ptr is NULL. Some routines rely on this behavior */</div><div class='add'>+int _SLang_push_ref (int is_global, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ SLang_Ref_Type *r;</div><div class='add'>+</div><div class='add'>+ if (ptr == NULL)</div><div class='add'>+ return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+ r = (SLang_Ref_Type *) SLmalloc (sizeof (SLang_Ref_Type));</div><div class='add'>+ if (r == NULL) return -1;</div><div class='add'>+</div><div class='add'>+ r->is_global = is_global;</div><div class='add'>+ r->v.nt = (SLang_Name_Type *) ptr;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_push_ptr_obj (SLANG_REF_TYPE, (VOID_STAR) r))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) r);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void ref_destroy (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ SLfree ((char *) *(SLang_Ref_Type **)ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_free_ref (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+ SLfree ((char *) ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int ref_push (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ SLang_Ref_Type *ref;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+</div><div class='add'>+ ref = *(SLang_Ref_Type **) ptr;</div><div class='add'>+</div><div class='add'>+ if (ref == NULL)</div><div class='add'>+ return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+ return _SLang_push_ref (ref->is_global, (VOID_STAR) ref->v.nt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_assign_to_ref (SLang_Ref_Type *ref, unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type *stkptr;</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ </div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+ /* Use apush since this function is passing ``array'' bytes rather than the</div><div class='add'>+ * address of the data. I need to somehow make this more consistent. To</div><div class='add'>+ * see what I mean, consider:</div><div class='add'>+ * </div><div class='add'>+ * double z[2];</div><div class='add'>+ * char *s = "silly";</div><div class='add'>+ * int i;</div><div class='add'>+ * </div><div class='add'>+ * SLang_assign_to_ref (ref, SLANG_INT_TYPE, &i);</div><div class='add'>+ * SLang_assign_to_ref (ref, SLANG_STRING_TYPE, &s);</div><div class='add'>+ * SLang_assign_to_ref (ref, SLANG_COMPLEX_TYPE, z);</div><div class='add'>+ * </div><div class='add'>+ * That is, all external routines that take a VOID_STAR argument need to</div><div class='add'>+ * be documented such that how the function should be called with the</div><div class='add'>+ * various class_types.</div><div class='add'>+ */</div><div class='add'>+ if (-1 == (*cl->cl_apush) (type, v))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ stkptr = _SLStack_Pointer;</div><div class='add'>+ if (0 == _SLang_deref_assign (ref))</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ if (stkptr != _SLStack_Pointer)</div><div class='add'>+ SLdo_pop ();</div><div class='add'>+</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *ref_string (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ SLang_Ref_Type *ref;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ ref = *(SLang_Ref_Type **) ptr;</div><div class='add'>+ if (ref->is_global)</div><div class='add'>+ {</div><div class='add'>+ char *name, *s;</div><div class='add'>+</div><div class='add'>+ name = ref->v.nt->name;</div><div class='add'>+ if ((name != NULL)</div><div class='add'>+ && (NULL != (s = SLmalloc (strlen(name) + 2))))</div><div class='add'>+ {</div><div class='add'>+ *s = '&';</div><div class='add'>+ strcpy (s + 1, name);</div><div class='add'>+ return s;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ return SLmake_string ("Local Variable Reference");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int ref_dereference (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) unused;</div><div class='add'>+ return _SLang_dereference_ref (*(SLang_Ref_Type **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int ref_cmp (unsigned char type, VOID_STAR a, VOID_STAR b, int *c)</div><div class='add'>+{</div><div class='add'>+ SLang_Ref_Type *ra, *rb;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ </div><div class='add'>+ ra = *(SLang_Ref_Type **)a;</div><div class='add'>+ rb = *(SLang_Ref_Type **)b;</div><div class='add'>+ </div><div class='add'>+ if (ra == NULL)</div><div class='add'>+ {</div><div class='add'>+ if (rb == NULL) *c = 0;</div><div class='add'>+ else *c = -1;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ if (rb == NULL)</div><div class='add'>+ {</div><div class='add'>+ *c = 1;</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (ra->v.nt == rb->v.nt)</div><div class='add'>+ *c = 0;</div><div class='add'>+ else *c = strcmp (ra->v.nt->name, rb->v.nt->name);</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ </div><div class='add'>+SLang_Name_Type *SLang_pop_function (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Ref_Type *ref;</div><div class='add'>+ SLang_Name_Type *f;</div><div class='add'>+</div><div class='add'>+ if (SLang_peek_at_stack () == SLANG_STRING_TYPE)</div><div class='add'>+ {</div><div class='add'>+ char *name;</div><div class='add'>+ </div><div class='add'>+ if (-1 == SLang_pop_slstring (&name))</div><div class='add'>+ return NULL;</div><div class='add'>+ </div><div class='add'>+ if (NULL == (f = SLang_get_function (name)))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_UNDEFINED_NAME, "Function %s does not exist", name);</div><div class='add'>+ SLang_free_slstring (name);</div><div class='add'>+ return NULL;</div><div class='add'>+ }</div><div class='add'>+ SLang_free_slstring (name);</div><div class='add'>+ return f;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_ref (&ref))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ f = SLang_get_fun_from_ref (ref);</div><div class='add'>+ SLang_free_ref (ref);</div><div class='add'>+ return f;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is a placeholder for version 2 */</div><div class='add'>+void SLang_free_function (SLang_Name_Type *f)</div><div class='add'>+{</div><div class='add'>+ (void) f;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* NULL type */</div><div class='add'>+int SLang_push_null (void)</div><div class='add'>+{</div><div class='add'>+ return SLclass_push_ptr_obj (SLANG_NULL_TYPE, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_null (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type obj;</div><div class='add'>+ return _SLang_pop_object_of_type (SLANG_NULL_TYPE, &obj, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int null_push (unsigned char unused, VOID_STAR ptr_unused)</div><div class='add'>+{</div><div class='add'>+ (void) unused; (void) ptr_unused;</div><div class='add'>+ return SLang_push_null ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int null_pop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_null ())</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ *(char **) ptr = NULL;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Implement foreach (NULL) using (whatever) to do nothing. This is useful</div><div class='add'>+ * because suppose that X is a list but is NULL in some situations. Then</div><div class='add'>+ * when it is NULL, we want foreach(X) to do nothing.</div><div class='add'>+ */</div><div class='add'>+static SLang_Foreach_Context_Type *</div><div class='add'>+null_foreach_open (unsigned char type, unsigned int num)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ SLdo_pop_n (num + 1);</div><div class='add'>+ return (SLang_Foreach_Context_Type *)1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void null_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ (void) c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int null_foreach (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ (void) c;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int null_to_bool (unsigned char type, int *t)</div><div class='add'>+{</div><div class='add'>+ (void) type;</div><div class='add'>+ *t = 0;</div><div class='add'>+ return SLang_pop_null ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* AnyType */</div><div class='add'>+int _SLanytype_typecast (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ SLang_Any_Type **any;</div><div class='add'>+ unsigned int i;</div><div class='add'>+ unsigned int sizeof_type;</div><div class='add'>+</div><div class='add'>+ (void) b_type;</div><div class='add'>+</div><div class='add'>+ any = (SLang_Any_Type **) bp;</div><div class='add'>+ </div><div class='add'>+ cl = _SLclass_get_class (a_type);</div><div class='add'>+ sizeof_type = cl->cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < na; i++)</div><div class='add'>+ {</div><div class='add'>+ if ((-1 == (*cl->cl_apush) (a_type, ap))</div><div class='add'>+ || (-1 == SLang_pop_anytype (&any[i])))</div><div class='add'>+ {</div><div class='add'>+ while (i != 0)</div><div class='add'>+ {</div><div class='add'>+ i--;</div><div class='add'>+ SLang_free_anytype (any[i]);</div><div class='add'>+ any[i] = NULL;</div><div class='add'>+ }</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ ap = (VOID_STAR)((char *)ap + sizeof_type);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_anytype (SLang_Any_Type **any)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+ *any = NULL;</div><div class='add'>+</div><div class='add'>+ if (NULL == (obj = (SLang_Object_Type *) SLmalloc (sizeof (SLang_Object_Type))))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop (obj))</div><div class='add'>+ {</div><div class='add'>+ SLfree ((char *) obj);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ *any = (SLang_Any_Type *)obj;</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will result in an object that is represented by the</div><div class='add'>+ * anytype object.</div><div class='add'>+ */</div><div class='add'>+int SLang_push_anytype (SLang_Any_Type *any)</div><div class='add'>+{</div><div class='add'>+ return _SLpush_slang_obj ((SLang_Object_Type *)any);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* After this call, the stack will contain an Any_Type object */</div><div class='add'>+static int anytype_push (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ SLang_Any_Type *obj;</div><div class='add'>+</div><div class='add'>+ /* Push the object onto the stack, then pop it back off into our anytype</div><div class='add'>+ * container. That way, any memory managing associated with the type</div><div class='add'>+ * will be performed automatically. Another way to think of it is that</div><div class='add'>+ * pushing an Any_Type onto the stack will create another copy of the</div><div class='add'>+ * object represented by it.</div><div class='add'>+ */</div><div class='add'>+ if (-1 == _SLpush_slang_obj (*(SLang_Object_Type **)ptr))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_anytype (&obj))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* There is no need to reference count the anytype objects since every</div><div class='add'>+ * push results in a new anytype container.</div><div class='add'>+ */</div><div class='add'>+ if (-1 == SLclass_push_ptr_obj (type, (VOID_STAR) obj))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_anytype (obj);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void anytype_destroy (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+ (void) type;</div><div class='add'>+ obj = *(SLang_Object_Type **)ptr;</div><div class='add'>+ SLang_free_object (obj);</div><div class='add'>+ SLfree ((char *) obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_free_anytype (SLang_Any_Type *any)</div><div class='add'>+{</div><div class='add'>+ if (any != NULL)</div><div class='add'>+ anytype_destroy (SLANG_ANY_TYPE, (VOID_STAR) &any);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int anytype_dereference (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) unused;</div><div class='add'>+ return _SLpush_slang_obj (*(SLang_Object_Type **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* SLANG_INTP_TYPE */</div><div class='add'>+static int intp_push (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) unused;</div><div class='add'>+ return SLclass_push_int_obj (SLANG_INT_TYPE, **(int **)ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int intp_pop (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+ (void) unused;</div><div class='add'>+ return SLang_pop_integer (*(int **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int undefined_push (unsigned char t, VOID_STAR p)</div><div class='add'>+{</div><div class='add'>+ (void) t; (void) p;</div><div class='add'>+ if (SLang_Error == 0)</div><div class='add'>+ SLang_Error = SL_VARIABLE_UNINITIALIZED;</div><div class='add'>+ return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLregister_types (void)</div><div class='add'>+{</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+ /* A good compiler should optimize this code away. */</div><div class='add'>+ if ((sizeof(short) != SIZEOF_SHORT)</div><div class='add'>+ || (sizeof(int) != SIZEOF_INT)</div><div class='add'>+ || (sizeof(long) != SIZEOF_LONG)</div><div class='add'>+ || (sizeof(float) != SIZEOF_FLOAT)</div><div class='add'>+ || (sizeof(double) != SIZEOF_DOUBLE))</div><div class='add'>+ SLang_exit_error ("S-Lang Library not built properly. Fix SIZEOF_* in config.h and recompile");</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLclass_init ())</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* Undefined Type */</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("Undefined_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+ (void) SLclass_set_push_function (cl, undefined_push);</div><div class='add'>+ (void) SLclass_set_pop_function (cl, undefined_push);</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_UNDEFINED_TYPE, sizeof (int),</div><div class='add'>+ SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+ return -1;</div><div class='add'>+ /* Make Void_Type a synonym for Undefined_Type. Note that this does </div><div class='add'>+ * not mean that Void_Type represents SLANG_VOID_TYPE. Void_Type is </div><div class='add'>+ * used by array_map to indicate no array is to be created.</div><div class='add'>+ */</div><div class='add'>+ if (-1 == SLclass_create_synonym ("Void_Type", SLANG_UNDEFINED_TYPE))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLarith_register_types ())</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* SLANG_INTP_TYPE */</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("_IntegerP_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+ (void) SLclass_set_push_function (cl, intp_push);</div><div class='add'>+ (void) SLclass_set_pop_function (cl, intp_pop);</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_INTP_TYPE, sizeof (int),</div><div class='add'>+ SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* String Type */</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("String_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+ (void) SLclass_set_destroy_function (cl, string_destroy);</div><div class='add'>+ (void) SLclass_set_push_function (cl, string_push);</div><div class='add'>+ cl->cl_foreach_open = string_foreach_open;</div><div class='add'>+ cl->cl_foreach_close = string_foreach_close;</div><div class='add'>+ cl->cl_foreach = string_foreach;</div><div class='add'>+ cl->cl_cmp = string_cmp;</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_STRING_TYPE, sizeof (char *),</div><div class='add'>+ SLANG_CLASS_TYPE_PTR))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* ref Type */</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("Ref_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+ cl->cl_dereference = ref_dereference;</div><div class='add'>+ cl->cl_push = ref_push;</div><div class='add'>+ cl->cl_destroy = ref_destroy;</div><div class='add'>+ cl->cl_string = ref_string;</div><div class='add'>+ cl->cl_cmp = ref_cmp;</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_REF_TYPE,</div><div class='add'>+ sizeof (SLang_Ref_Type *),</div><div class='add'>+ SLANG_CLASS_TYPE_PTR))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* NULL Type */</div><div class='add'>+</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("Null_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+ cl->cl_push = null_push;</div><div class='add'>+ cl->cl_pop = null_pop;</div><div class='add'>+ cl->cl_foreach_open = null_foreach_open;</div><div class='add'>+ cl->cl_foreach_close = null_foreach_close;</div><div class='add'>+ cl->cl_foreach = null_foreach;</div><div class='add'>+ cl->cl_to_bool = null_to_bool;</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_NULL_TYPE, sizeof (char *),</div><div class='add'>+ SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ /* AnyType */</div><div class='add'>+ if (NULL == (cl = SLclass_allocate_class ("Any_Type")))</div><div class='add'>+ return -1;</div><div class='add'>+ (void) SLclass_set_push_function (cl, anytype_push);</div><div class='add'>+ (void) SLclass_set_destroy_function (cl, anytype_destroy);</div><div class='add'>+ cl->cl_dereference = anytype_dereference;</div><div class='add'>+ if (-1 == SLclass_register_class (cl, SLANG_ANY_TYPE, sizeof (VOID_STAR),</div><div class='add'>+ SLANG_CLASS_TYPE_PTR))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_init_bstring ())</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((-1 == SLclass_add_typecast (SLANG_STRING_TYPE, SLANG_INT_TYPE, string_to_int, 0))</div><div class='add'>+ || (-1 == SLclass_add_binary_op (SLANG_STRING_TYPE, SLANG_STRING_TYPE, string_string_bin_op, string_string_bin_op_result)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slutty.c b/mdk-stage1/slang/slutty.c<br/>new file mode 100644<br/>index 000000000..636c1bb90<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slutty.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slutty.c</a></div><div class='hunk'>@@ -0,0 +1,596 @@</div><div class='add'>+/* slutty.c --- Unix Low level terminal (tty) functions for S-Lang */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include <signal.h></div><div class='add'>+/* sequent support thanks to Kenneth Lorber <keni@oasys.dt.navy.mil> */</div><div class='add'>+/* SYSV (SYSV ISC R3.2 v3.0) provided by iain.lea@erlm.siemens.de */</div><div class='add'>+</div><div class='add'>+#if defined (_AIX) && !defined (_ALL_SOURCE)</div><div class='add'>+# define _ALL_SOURCE /* so NBBY is defined in <sys/types.h> */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include <sys/time.h></div><div class='add'>+#include <sys/types.h></div><div class='add'>+</div><div class='add'>+#ifdef SYSV</div><div class='add'>+# include <fcntl.h></div><div class='add'>+# ifndef CRAY</div><div class='add'>+# include <sys/termio.h></div><div class='add'>+# include <sys/stream.h></div><div class='add'>+# include <sys/ptem.h></div><div class='add'>+# include <sys/tty.h></div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __BEOS__</div><div class='add'>+/* Prototype for select */</div><div class='add'>+# include <net/socket.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include <sys/file.h></div><div class='add'>+</div><div class='add'>+#ifndef sun</div><div class='add'>+# include <sys/ioctl.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __QNX__</div><div class='add'>+# include <sys/select.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include <sys/stat.h></div><div class='add'>+#include <errno.h></div><div class='add'>+</div><div class='add'>+#if defined (_AIX) && !defined (FD_SET)</div><div class='add'>+# include <sys/select.h> /* for FD_ISSET, FD_SET, FD_ZERO */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef O_RDWR</div><div class='add'>+# include <fcntl.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+int SLang_TT_Read_FD = -1;</div><div class='add'>+int SLang_TT_Baud_Rate;</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TERMIOS_H</div><div class='add'>+# if !defined(HAVE_TCGETATTR) || !defined(HAVE_TCSETATTR)</div><div class='add'>+# undef HAVE_TERMIOS_H</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_TERMIOS_H</div><div class='add'>+</div><div class='add'>+# if !defined(CBREAK) && defined(sun)</div><div class='add'>+# ifndef BSD_COMP</div><div class='add'>+# define BSD_COMP 1</div><div class='add'>+# endif</div><div class='add'>+# include <sys/ioctl.h></div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+ {</div><div class='add'>+ struct tchars t;</div><div class='add'>+ struct ltchars lt;</div><div class='add'>+ struct sgttyb s;</div><div class='add'>+ }</div><div class='add'>+TTY_Termio_Type;</div><div class='add'>+#else</div><div class='add'>+# include <termios.h></div><div class='add'>+typedef struct termios TTY_Termio_Type;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static TTY_Termio_Type Old_TTY;</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TERMIOS_H</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+ unsigned int key;</div><div class='add'>+ unsigned int value;</div><div class='add'>+} Baud_Rate_Type;</div><div class='add'>+</div><div class='add'>+static Baud_Rate_Type Baud_Rates [] =</div><div class='add'>+{</div><div class='add'>+#ifdef B0</div><div class='add'>+ {B0, 0},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B50</div><div class='add'>+ {B50, 50},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B75</div><div class='add'>+ {B75, 75},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B110</div><div class='add'>+ {B110, 110},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B134</div><div class='add'>+ {B134, 134},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B150</div><div class='add'>+ {B150, 150},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B200</div><div class='add'>+ {B200, 200},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B300</div><div class='add'>+ {B300, 300},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B600</div><div class='add'>+ {B600, 600},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B1200</div><div class='add'>+ {B1200, 1200},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B1800</div><div class='add'>+ {B1800, 1800},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B2400</div><div class='add'>+ {B2400, 2400},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B4800</div><div class='add'>+ {B4800, 4800},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B9600</div><div class='add'>+ {B9600, 9600},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B19200</div><div class='add'>+ {B19200, 19200},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B38400</div><div class='add'>+ {B38400, 38400},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B57600</div><div class='add'>+ {B57600, 57600},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B115200</div><div class='add'>+ {B115200, 115200},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B230400</div><div class='add'>+ {B230400, 230400},</div><div class='add'>+#endif</div><div class='add'>+ {0, 0}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+set_baud_rate (TTY_Termio_Type *tty)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_CFGETOSPEED</div><div class='add'>+ unsigned int speed;</div><div class='add'>+ Baud_Rate_Type *b, *bmax;</div><div class='add'>+</div><div class='add'>+ if (SLang_TT_Baud_Rate)</div><div class='add'>+ return; /* already set */</div><div class='add'>+</div><div class='add'>+ speed = (unsigned int) cfgetospeed (tty);</div><div class='add'>+</div><div class='add'>+ b = Baud_Rates;</div><div class='add'>+ bmax = b + (sizeof (Baud_Rates)/sizeof(Baud_Rates[0]));</div><div class='add'>+ while (b < bmax)</div><div class='add'>+ {</div><div class='add'>+ if (b->key == speed)</div><div class='add'>+ {</div><div class='add'>+ SLang_TT_Baud_Rate = b->value;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ b++;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ (void) tty;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* HAVE_TERMIOS_H */</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TERMIOS_H</div><div class='add'>+# define GET_TERMIOS(fd, x) tcgetattr(fd, x)</div><div class='add'>+# define SET_TERMIOS(fd, x) tcsetattr(fd, TCSADRAIN, x)</div><div class='add'>+#else</div><div class='add'>+# ifdef TCGETS</div><div class='add'>+# define GET_TERMIOS(fd, x) ioctl(fd, TCGETS, x)</div><div class='add'>+# define SET_TERMIOS(fd, x) ioctl(fd, TCSETS, x)</div><div class='add'>+# else</div><div class='add'>+# define X(x,m) &(((TTY_Termio_Type *)(x))->m)</div><div class='add'>+# define GET_TERMIOS(fd, x) \</div><div class='add'>+ ((ioctl(fd, TIOCGETC, X(x,t)) || \</div><div class='add'>+ ioctl(fd, TIOCGLTC, X(x,lt)) || \</div><div class='add'>+ ioctl(fd, TIOCGETP, X(x,s))) ? -1 : 0)</div><div class='add'>+# define SET_TERMIOS(fd, x) \</div><div class='add'>+ ((ioctl(fd, TIOCSETC, X(x,t)) ||\</div><div class='add'>+ ioctl(fd, TIOCSLTC, X(x,lt)) || \</div><div class='add'>+ ioctl(fd, TIOCSETP, X(x,s))) ? -1 : 0)</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int TTY_Inited = 0;</div><div class='add'>+static int TTY_Open = 0;</div><div class='add'>+</div><div class='add'>+#ifdef ultrix /* Ultrix gets _POSIX_VDISABLE wrong! */</div><div class='add'>+# define NULL_VALUE -1</div><div class='add'>+#else</div><div class='add'>+# ifdef _POSIX_VDISABLE</div><div class='add'>+# define NULL_VALUE _POSIX_VDISABLE</div><div class='add'>+# else</div><div class='add'>+# define NULL_VALUE 255</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLang_init_tty (int abort_char, int no_flow_control, int opost)</div><div class='add'>+{</div><div class='add'>+ TTY_Termio_Type newtty;</div><div class='add'>+</div><div class='add'>+ SLsig_block_signals ();</div><div class='add'>+</div><div class='add'>+ if (TTY_Inited)</div><div class='add'>+ {</div><div class='add'>+ SLsig_unblock_signals ();</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ TTY_Open = 0;</div><div class='add'>+</div><div class='add'>+ if ((SLang_TT_Read_FD == -1)</div><div class='add'>+ || (1 != isatty (SLang_TT_Read_FD)))</div><div class='add'>+ {</div><div class='add'>+#ifdef O_RDWR</div><div class='add'>+# ifndef __BEOS__ /* I have been told that BEOS will HANG if passed /dev/tty */</div><div class='add'>+ if ((SLang_TT_Read_FD = open("/dev/tty", O_RDWR)) >= 0)</div><div class='add'>+ {</div><div class='add'>+ TTY_Open = 1;</div><div class='add'>+ }</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+ if (TTY_Open == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_TT_Read_FD = fileno (stderr);</div><div class='add'>+ if (1 != isatty (SLang_TT_Read_FD))</div><div class='add'>+ {</div><div class='add'>+ SLang_TT_Read_FD = fileno (stdin);</div><div class='add'>+ if (1 != isatty (SLang_TT_Read_FD))</div><div class='add'>+ {</div><div class='add'>+ fprintf (stderr, "Failed to open terminal.");</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLang_Abort_Char = abort_char;</div><div class='add'>+</div><div class='add'>+ /* Some systems may not permit signals to be blocked. As a result, the</div><div class='add'>+ * return code must be checked.</div><div class='add'>+ */</div><div class='add'>+ while (-1 == GET_TERMIOS(SLang_TT_Read_FD, &Old_TTY))</div><div class='add'>+ {</div><div class='add'>+ if (errno != EINTR)</div><div class='add'>+ {</div><div class='add'>+ SLsig_unblock_signals ();</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (-1 == GET_TERMIOS(SLang_TT_Read_FD, &newtty))</div><div class='add'>+ {</div><div class='add'>+ if (errno != EINTR)</div><div class='add'>+ {</div><div class='add'>+ SLsig_unblock_signals ();</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_TERMIOS_H</div><div class='add'>+ newtty.s.sg_flags &= ~(ECHO);</div><div class='add'>+ newtty.s.sg_flags &= ~(CRMOD);</div><div class='add'>+ /* if (Flow_Control == 0) newtty.s.sg_flags &= ~IXON; */</div><div class='add'>+ newtty.t.t_eofc = 1;</div><div class='add'>+ if (abort_char == -1) SLang_Abort_Char = newtty.t.t_intrc;</div><div class='add'>+ newtty.t.t_intrc = SLang_Abort_Char; /* ^G */</div><div class='add'>+ newtty.t.t_quitc = 255;</div><div class='add'>+ newtty.lt.t_suspc = 255; /* to ignore ^Z */</div><div class='add'>+ newtty.lt.t_dsuspc = 255; /* to ignore ^Y */</div><div class='add'>+ newtty.lt.t_lnextc = 255;</div><div class='add'>+ newtty.s.sg_flags |= CBREAK; /* do I want cbreak or raw????? */</div><div class='add'>+#else</div><div class='add'>+</div><div class='add'>+ /* get baud rate */</div><div class='add'>+</div><div class='add'>+ newtty.c_iflag &= ~(ECHO | INLCR | ICRNL);</div><div class='add'>+#ifdef ISTRIP</div><div class='add'>+ /* newtty.c_iflag &= ~ISTRIP; */</div><div class='add'>+#endif</div><div class='add'>+ if (opost == 0) newtty.c_oflag &= ~OPOST;</div><div class='add'>+</div><div class='add'>+ set_baud_rate (&newtty);</div><div class='add'>+</div><div class='add'>+ if (no_flow_control) newtty.c_iflag &= ~IXON; else newtty.c_iflag |= IXON;</div><div class='add'>+</div><div class='add'>+ newtty.c_cc[VEOF] = 1;</div><div class='add'>+ newtty.c_cc[VMIN] = 1;</div><div class='add'>+ newtty.c_cc[VTIME] = 0;</div><div class='add'>+ newtty.c_lflag = ISIG | NOFLSH;</div><div class='add'>+ if (abort_char == -1) SLang_Abort_Char = newtty.c_cc[VINTR];</div><div class='add'>+ newtty.c_cc[VINTR] = SLang_Abort_Char; /* ^G */</div><div class='add'>+ newtty.c_cc[VQUIT] = NULL_VALUE;</div><div class='add'>+ newtty.c_cc[VSUSP] = NULL_VALUE; /* to ignore ^Z */</div><div class='add'>+#ifdef VDSUSP</div><div class='add'>+ newtty.c_cc[VDSUSP] = NULL_VALUE; /* to ignore ^Y */</div><div class='add'>+#endif</div><div class='add'>+#ifdef VLNEXT</div><div class='add'>+ newtty.c_cc[VLNEXT] = NULL_VALUE; /* to ignore ^V ? */</div><div class='add'>+#endif</div><div class='add'>+#ifdef VSWTCH</div><div class='add'>+ newtty.c_cc[VSWTCH] = NULL_VALUE; /* to ignore who knows what */</div><div class='add'>+#endif</div><div class='add'>+#endif /* NOT HAVE_TERMIOS_H */</div><div class='add'>+</div><div class='add'>+ while (-1 == SET_TERMIOS(SLang_TT_Read_FD, &newtty))</div><div class='add'>+ {</div><div class='add'>+ if (errno != EINTR)</div><div class='add'>+ {</div><div class='add'>+ SLsig_unblock_signals ();</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ TTY_Inited = 1;</div><div class='add'>+ SLsig_unblock_signals ();</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtty_set_suspend_state (int mode)</div><div class='add'>+{</div><div class='add'>+ TTY_Termio_Type newtty;</div><div class='add'>+</div><div class='add'>+ SLsig_block_signals ();</div><div class='add'>+</div><div class='add'>+ if (TTY_Inited == 0)</div><div class='add'>+ {</div><div class='add'>+ SLsig_unblock_signals ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while ((-1 == GET_TERMIOS (SLang_TT_Read_FD, &newtty))</div><div class='add'>+ && (errno == EINTR))</div><div class='add'>+ ;</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_TERMIOS_H</div><div class='add'>+ /* I do not know if all systems define the t_dsuspc field */</div><div class='add'>+ if (mode == 0)</div><div class='add'>+ {</div><div class='add'>+ newtty.lt.t_suspc = 255;</div><div class='add'>+ newtty.lt.t_dsuspc = 255;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ newtty.lt.t_suspc = Old_TTY.lt.t_suspc;</div><div class='add'>+ newtty.lt.t_dsuspc = Old_TTY.lt.t_dsuspc;</div><div class='add'>+ }</div><div class='add'>+#else</div><div class='add'>+ if (mode == 0)</div><div class='add'>+ {</div><div class='add'>+ newtty.c_cc[VSUSP] = NULL_VALUE;</div><div class='add'>+#ifdef VDSUSP</div><div class='add'>+ newtty.c_cc[VDSUSP] = NULL_VALUE;</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ newtty.c_cc[VSUSP] = Old_TTY.c_cc[VSUSP];</div><div class='add'>+#ifdef VDSUSP</div><div class='add'>+ newtty.c_cc[VDSUSP] = Old_TTY.c_cc[VDSUSP];</div><div class='add'>+#endif</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+ while ((-1 == SET_TERMIOS (SLang_TT_Read_FD, &newtty))</div><div class='add'>+ && (errno == EINTR))</div><div class='add'>+ ;</div><div class='add'>+</div><div class='add'>+ SLsig_unblock_signals ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_reset_tty (void)</div><div class='add'>+{</div><div class='add'>+ SLsig_block_signals ();</div><div class='add'>+</div><div class='add'>+ if (TTY_Inited == 0)</div><div class='add'>+ {</div><div class='add'>+ SLsig_unblock_signals ();</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while ((-1 == SET_TERMIOS(SLang_TT_Read_FD, &Old_TTY))</div><div class='add'>+ && (errno == EINTR))</div><div class='add'>+ ;</div><div class='add'>+</div><div class='add'>+ if (TTY_Open)</div><div class='add'>+ {</div><div class='add'>+ while ((-1 == close (SLang_TT_Read_FD))</div><div class='add'>+ && (errno == EINTR))</div><div class='add'>+ ;</div><div class='add'>+</div><div class='add'>+ TTY_Open = 0;</div><div class='add'>+ SLang_TT_Read_FD = -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ TTY_Inited = 0;</div><div class='add'>+ SLsig_unblock_signals ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void default_sigint (int sig)</div><div class='add'>+{</div><div class='add'>+ sig = errno; /* use parameter */</div><div class='add'>+</div><div class='add'>+ SLKeyBoard_Quit = 1;</div><div class='add'>+ if (SLang_Ignore_User_Abort == 0) SLang_Error = SL_USER_BREAK;</div><div class='add'>+ SLsignal_intr (SIGINT, default_sigint);</div><div class='add'>+ errno = sig;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_set_abort_signal (void (*hand)(int))</div><div class='add'>+{</div><div class='add'>+ int save_errno = errno;</div><div class='add'>+ SLSig_Fun_Type *f;</div><div class='add'>+</div><div class='add'>+ if (hand == NULL) hand = default_sigint;</div><div class='add'>+ f = SLsignal_intr (SIGINT, hand);</div><div class='add'>+</div><div class='add'>+ errno = save_errno;</div><div class='add'>+</div><div class='add'>+ if (f == (SLSig_Fun_Type *) SIG_ERR)</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifndef FD_SET</div><div class='add'>+#define FD_SET(fd, tthis) *(tthis) = 1 << (fd)</div><div class='add'>+#define FD_ZERO(tthis) *(tthis) = 0</div><div class='add'>+#define FD_ISSET(fd, tthis) (*(tthis) & (1 << fd))</div><div class='add'>+typedef int fd_set;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static fd_set Read_FD_Set;</div><div class='add'>+</div><div class='add'>+/* HACK: If > 0, use 1/10 seconds. If < 0, use 1/1000 seconds */</div><div class='add'>+</div><div class='add'>+int _SLsys_input_pending(int tsecs)</div><div class='add'>+{</div><div class='add'>+ struct timeval wait;</div><div class='add'>+ long usecs, secs;</div><div class='add'>+</div><div class='add'>+ if (TTY_Inited == 0) return -1;</div><div class='add'>+</div><div class='add'>+ if (tsecs >= 0)</div><div class='add'>+ {</div><div class='add'>+ secs = tsecs / 10;</div><div class='add'>+ usecs = (tsecs % 10) * 100000;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ tsecs = -tsecs;</div><div class='add'>+ secs = tsecs / 1000;</div><div class='add'>+ usecs = (tsecs % 1000) * 1000;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ wait.tv_sec = secs;</div><div class='add'>+ wait.tv_usec = usecs;</div><div class='add'>+</div><div class='add'>+ FD_ZERO(&Read_FD_Set);</div><div class='add'>+ FD_SET(SLang_TT_Read_FD, &Read_FD_Set);</div><div class='add'>+</div><div class='add'>+ return select(SLang_TT_Read_FD + 1, &Read_FD_Set, NULL, NULL, &wait);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int (*SLang_getkey_intr_hook) (void);</div><div class='add'>+</div><div class='add'>+static int handle_interrupt (void)</div><div class='add'>+{</div><div class='add'>+ if (SLang_getkey_intr_hook != NULL)</div><div class='add'>+ {</div><div class='add'>+ int save_tty_fd = SLang_TT_Read_FD;</div><div class='add'>+</div><div class='add'>+ if (-1 == (*SLang_getkey_intr_hook) ())</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (save_tty_fd != SLang_TT_Read_FD)</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int _SLsys_getkey (void)</div><div class='add'>+{</div><div class='add'>+ unsigned char c;</div><div class='add'>+</div><div class='add'>+ if (TTY_Inited == 0)</div><div class='add'>+ {</div><div class='add'>+ int ic = fgetc (stdin);</div><div class='add'>+ if (ic == EOF) return SLANG_GETKEY_ERROR;</div><div class='add'>+ return (unsigned int) ic;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ int ret;</div><div class='add'>+</div><div class='add'>+ if (SLKeyBoard_Quit)</div><div class='add'>+ return SLang_Abort_Char;</div><div class='add'>+</div><div class='add'>+ if (0 == (ret = _SLsys_input_pending (100)))</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ if (ret != -1)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ if (SLKeyBoard_Quit)</div><div class='add'>+ return SLang_Abort_Char;</div><div class='add'>+</div><div class='add'>+ if (errno == EINTR)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == handle_interrupt ())</div><div class='add'>+ return SLANG_GETKEY_ERROR;</div><div class='add'>+</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ break; /* let read handle it */</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ while (1)</div><div class='add'>+ {</div><div class='add'>+ int status = read(SLang_TT_Read_FD, (char *) &c, 1);</div><div class='add'>+</div><div class='add'>+ if (status > 0)</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ if (status == 0)</div><div class='add'>+ {</div><div class='add'>+ /* We are at the end of a file. Let application handle it. */</div><div class='add'>+ return SLANG_GETKEY_ERROR;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (errno == EINTR)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == handle_interrupt ())</div><div class='add'>+ return SLANG_GETKEY_ERROR;</div><div class='add'>+</div><div class='add'>+ if (SLKeyBoard_Quit)</div><div class='add'>+ return SLang_Abort_Char;</div><div class='add'>+</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+#ifdef EAGAIN</div><div class='add'>+ if (errno == EAGAIN)</div><div class='add'>+ {</div><div class='add'>+ sleep (1);</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+#ifdef EWOULDBLOCK</div><div class='add'>+ if (errno == EWOULDBLOCK)</div><div class='add'>+ {</div><div class='add'>+ sleep (1);</div><div class='add'>+ continue;</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+#ifdef EIO</div><div class='add'>+ if (errno == EIO)</div><div class='add'>+ {</div><div class='add'>+ SLang_exit_error ("_SLsys_getkey: EIO error.");</div><div class='add'>+ }</div><div class='add'>+#endif</div><div class='add'>+ return SLANG_GETKEY_ERROR;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return((unsigned int) c);</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slxstrng.c b/mdk-stage1/slang/slxstrng.c<br/>new file mode 100644<br/>index 000000000..3f8a4dffa<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slxstrng.c?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slxstrng.c</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* These routines are simple and inefficient. They were designed to work on</div><div class='add'>+ * SunOS when using Electric Fence.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+char *SLstrcpy(register char *aa, register char *b)</div><div class='add'>+{</div><div class='add'>+ char *a = aa;</div><div class='add'>+ while ((*a++ = *b++) != 0);</div><div class='add'>+ return aa;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLstrcmp(register char *a, register char *b)</div><div class='add'>+{</div><div class='add'>+ while (*a && (*a == *b))</div><div class='add'>+ {</div><div class='add'>+ a++;</div><div class='add'>+ b++;</div><div class='add'>+ }</div><div class='add'>+ if (*a) return((unsigned char) *a - (unsigned char) *b);</div><div class='add'>+ else if (*b) return ((unsigned char) *a - (unsigned char) *b);</div><div class='add'>+ else return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLstrncpy(char *a, register char *b,register int n)</div><div class='add'>+{</div><div class='add'>+ register char *aa = a;</div><div class='add'>+ while ((n > 0) && *b)</div><div class='add'>+ {</div><div class='add'>+ *aa++ = *b++;</div><div class='add'>+ n--;</div><div class='add'>+ }</div><div class='add'>+ while (n-- > 0) *aa++ = 0;</div><div class='add'>+ return (a);</div><div class='add'>+}</div></td></tr></table></div> <!-- class=content --> <div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.1</a> (<a href='https://git-scm.com/'>git 2.21.0</a>) at 2025-03-04 20:31:00 +0000</div> </div> <!-- id=cgit --> </body> </html>