Switch branches/tags
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
725 lines (660 sloc) 34.5 KB
Languages are complicated...
These are new issues identified but not entered into the outstanding bug list
Priority Issues (Fix These First)
- High ASCII escaping failing on string literals
- cd "BANNIÈRE/";
^ Unexpected character ASCII 136
- check to see all string and character literals handle high ascii
- check to make sure get next token handles high ascii
- check to make sure parse shell word handles high ascii
- the new type qualifiers system and remaning
- disabling qualifiers when tests are underway and special regression
tests for the same. (tests)
- should subprogram parameters allow qualifiers?
- unstructured scripts
- additional examples to be added to automated tests
- should I relax the restriction on declaring variables in unstructured
- affirm blocks
- test if HTML escaping can be implemented in an affirm block
- should affirm blocks have an expression short-form?
- should affirm blocks have storage specifications?
- move DoContracts to parser_aux?
- complete log package
- unsorted/misc
- update distance example html
- quote handling on first shell word
- env isn't showing limited variables properly (property missing). This
probably has to do with changes to support both types and variables.
- ../../../spar not found?
- control-c is propogating to all child processes when it shouldn't
- check SIGPIPE handling also
- btree_io.cursor should have the key type assigned when declared. Why did I
choose not to? What's the reason?
Annoyances / Bugs with Workarounds / Updates
- add annotate/categories to example programs representing the example groupings
they belong to
- problem extracting byte code for blocks (copying whole lines)
- the search with same name problem
procedure p is
x : integer := 5;
procedure put_x is
? x;
end put_x;
procedure inner is
x : string := "inner";
-- puts "inner", not 5, as there is a new x that overshadows the
-- x of the definition. Would "overriding" help? Or change when/how
-- identifiers are handled at compile time.
end inner;
end outer;
- btree_io/hash_io
- negative test btree_io.replace with cursor
- negative test to ensure subprogram exceptions are not lost to parent
- json decode backslash good regression tests
- relative paths not working with bdb environments...research
- option to throw an exception on missing values (including replace, get, add (existing value)
- memcache/memcache.highread
- update design to use new resource system
- exceptions
- what are semantics of throwing an exception in a subscript `...`
- exceptions that propogate to the top aren't formatted properly in the
Apache log (single chars means single lines)
- should create a report on process resources using getrusage(2). Also will
need this for memory leak tests (though there are command line ways of
doing this).
- pragmas
- can't declare two licenses or software_models. This is a problem for a
redistributable library
- check double pragma import - test case
- unit testing and teamwork
- restricted shell tests
- xUnit support for tests (pragma test_result - output in JUNIT format?)
- records
- if constant records/arrays are allowed,they should have static expressions
during declaration assignments.
- strings
- some string functions have string, not universal_string, parameters, which
means parameters often must be typecast. Probably they should be universal
- strings.index is pretty useless without a position paramter. Can we enhance
- dir ops
- can we add a parameter to disable returning "." and "..", which require
special handling in the majority of cases (because they are not needed)?
- graphics and sound
- SDL - hardware accelleration not working with ...why not?
- SDL needs to be upgraded for version 2.0
- type system
- constant records are permitted but the fields are variables...the fields should all be constants
- build system
- David B wants me to bring back SparForte shared library
- shared library calling mechanism and integration with other languages
Lua's approach to being called by another language:
Java uses JNI
- you can call java from c using standard calls
- search for a class, load a method, run it
- business shell, though, only imports variables right now
- shell
- windows size change is not refreshing the terminal settings?
- escaping unprintable characters not working with readline prompt
- backquotes and redirections (e.g. `x 2>&1 ;`) raises an exception
- s := `set_error( current_output ); date -d "foo" '+%s'; set_error( standard_error );` does not work as expected (error output shoud be captured)
- unsorted/misc
- text_io's get requires a file but shouldn't, or docs should be updated
- doesn't accept an array element like a(i)
- control-z handling - fork, send a sleep signal and reset scanner
- get_line on an out mode file gives bad file descriptor but needs a better
error message
- function f(p), p should not be 'already exists' if there is a p in scope
- change pegasock to use bdb format exceptions with filename in message?
- check pragma block with @
- ParseGeneralStatement allows declarations. For body and user role blocks,
we need more restrictive variations of PGS.
- @ for a(x) gives an unexpected exception
- Apache doesn't allow command paramenters for running CGI scripts. There
should be an easy way to set the SDLC mode configuration without command
parameters or hard-coding in the shebang.
- Ada-compatible space in front of numbers should be pragma ada_95 because
it's annoying throwback to line printers...but every conversion of a
number would have to take into account adding/removing a space.
- verify type checking not in executable parts so is done at compile-time
Nice to Haves / Missing Functionality
- programming-by-contract
- optimizations - mark places in type tree where we know there's no need to
search further for contracts.
- overriding renamings
- require overriding on renamings of same identifier name but in different scope?
- this requires a new function to check for pre-exisiting names in a different
scope. It will need to apply to all variable declarations.
- maybe just elsif identifiers( token ).kind = new_t or identifiers( token ).deleted then
- refactor
- parser_tio globals should be put in a separate package, or a different
package, to help reduce circular dependencies
- memcache/memcache.highread
- update functionality to handle records, arrays, etc. like btree_io
- element as an alias for "get" in memcache, etc.
- generic types
- subtypes of generic types
- user-defined packages
- should packages support versioning (e.g. Composer/Cargo/NPM). Should
the language deal with expected versions with configuration block
pragmas? Should I deal with this at all?
- package specifications should be renames, not forwards, since they
can have their qualities modified on export (abstract, limited, constant)
.. can that work?
- pragmas
- distinguish types of pragmas, to later separate by block or context
- a pragma to check for the version of SparForte? Is it a doc pragma,
executable or both?
- pragma restriction is too restrictive. If the goal is to migrate
designs, we need levels of restrictions. For example, pragma
pending_restriction( x ), similar to pragma deprecated, which is
an error if x is used in the design phase only, and a warning in
the development phase.
- a way for archictural exceptions to be recorded, audited...i.e. with
team member that OK'ed it.
- pragma depreciated should be a list, not a string.
- review and improve help command reports for producing system audit reports. Are they complete? Usable? Any rsh restrictions needed? For example, we need a software_model report.
- while we want to default to security, we also want not to be overly restrictive with pragma restriction in general. We should probably default to secure and add would i code that?
- probably need a security pragma and not relying on rsh = security
- should disallow access to certain files or directories like /etc/password by
default, unless security pragma allows otherwise. This is similar to Java's
Security Manager.
- pragma deprecated is designed for scripts, but there is no way to deprecate
subprograms, types, etc. In general, I need to expand end-of-life
and migration features.
- teams package should be redesigned so team members can be more easily
used with pragmas (that is, team member info should be available at
syntax-check time)
- user role blocks
- configuration/policy/project <name> ... is separate (not with separate, which isn't
as specific)
- more separation of concerns
- with configuration
- with policy
- with project
- project block
- QA concerns?
- some way to determine if a configuration/policy/project should have been loaded.
perhaps an architectural pragma for same.
- unit testing and teamwork
- "status board" generation option for oustanding/in-progress work
- burndown charts option?
- review Test concept...what other requirements are missing?
- vectors
- complete vectors package
- tinyserve
- close tinyserve if open
- complete tinyserve package
- epoll_ Linux commands and threads to scale
- see libuv
- see node.js talk
- os package
- process id
- types and expressions
- type is new (record type) not yet implemented.
- private qualifier means copy-only on assignment...but aggregates
currently cannot be assigned to or copied so private hasn't been
implemented yet.
- return arrays and records in expressions (requires records revamp)
- allow users to create their own universal types
- record system refactor (in prep for aggregate expressions)
- thoughts on user-defined universals
- some features are looking for root storage types, but these are currently
equivalent to the built-in universals.
- since aggregates have no common structure, the type contained in a
universal variable should be the type of the value being assigned. This
is, in essence, polymorphism.
- should variables change type automatically or be declared as polymorphic?
- should the notion of extension be reversed? In Ada, types are about
applying restrictions. Would it make sense to have the root type to be
the broadest type. e.g. "type ... withOUT record x : integer..." to
make storage items hidden/off-limits as opposed to adding new fields?
- templates
- need template package to set return HTTP status
- strings
- more validation functions
- build system
- dynamic loadable built-in packages
- fuzz testing (i.e. oss fuzz) - testing for vulnerabilities with random data
- memory leak testing
- packages
- new vector or game math package (quads, etc).
- how can we enhance packages? Should a "service" be a collection of packages?
- unsorted/misc
- syntax check on templates, -e commands, policies, profiles
- update dynamic_hash_table functionality to handle records, arrays, etc. like btree_io
- standardize get_first as first, etc.
- safety check that a file cannot include itself
- redundancy and ways of handing command line option
- enums.last is slow...should be updated for namespaces to improve speed
- built-in cache - memory or disk?
- redesign is_writable, etc. so works better.
- raise [when]
- infinite loop detection - when variables in loop expression are not assigned
to - this may be tricky to implement
- new examples
- example program of ramdisk cache
- GitHub "badges" (see also shields)
- you need to be able to point at Jenkins. A URL to the site
containing an embedded URL to your Jenkins to get the data for the
- example -
- arrays of files / files in records are not implemented but are possible
- update FirstFileParam, etc., to work with references
- wasWritten on arrays and records
- rewrite references to .value to look use utility functions
- change or alias for consistency: set -> assign, get -> element
- with include doesn't work on the command because it is loaded at syntax check
time and the command line has no syntax check...but it would be good to load
libraries at the command line so can I come up with a strategy to make it work?
- libraries to load neutral (i.e. non-sf) config file formats?
- got a "s already declared" when using s as a function parameter and
s is declared in the outer scope but shouldn't be an error
- the formal parameters are declared in the same scope as the subprogram
name. The block is used to destroy the actual, usuable parameters
during the syntax check. Moving the block only destroys the formal
- not sure if SparForte has an existing mechanism for this
New Unique Concepts
- research
- continue learning Rust -
- revisit Go -
- checkout Indris -
- check out D -
- checkout Erlang for ideas
- what can be done to promote better, easier, more detailed error messages?
- SELinux-like ability to control who access what.
- for any function, restrict it to a list of parent functions which
may call it.
- for any command, restrict it to a list of parent functions which
may call it.
- objects more complicated but not an issue now.
- have an option for open access
- how to you lock the list and enforce it?
- % functionality should be extended and made usable in more contexts
- chould % chain objects methods? That is, % equals @ + first param?
- parallel blocks
- ability to track code meant to be used in pairs (e.g. defining two
procedures, one must appear first, one must appear last, both should
be used in the enclosing block)
- writing code
- embedded SQL or
- generally, features to allow a program to construct programs safely
in another language (e.g. SQL, shell or other), safeguarding from
code injection or other issues.
- sofware model + archecture
- allow architects to apply architecture policy to groups of software by the
software model system. Explore what needs to be involved. should the
software model be exposed through System? Currently pragmas are applied
directly to the current program, rather than triggered by pragma
software_model and applied through some kind of architecture system.
- units of measure for numerics
- define a standard record type for units with singular/plural/etc.
- allow the standard record type to be extended by subtype (providing
alternate spellings but compatible) or new types. Allow the creation
of unit hierarchies. e.g. null (root) units, currencies (abstract),
dollars (english canadian) and subtype dollars (french canadian)
- this requires derived records to be implemented
- e.g. distance : integer in feet := 0;
(where feet.singular := "foot", feet.plural := "feet")
- can units be applied to strings. e.g. x : title in spanish or
x : title in europe_region. Affecting concatenation.
- should multiple units be allowed? Is this a special case of multiple
inherance, where x belongs to multiple hierarches? Should it be
- naming convention
- what are the naming standards of functions. e.g. sin(), to_sin(), sin_of()?
- type system
- extending enums to strings and number sets
- what about users creating their own universal types?
- progamming by contract features - we have functions, so we can do them
but can we do it elegantly rather than as an add-on to the existing
- the similar types problem
- Classes/Objects partially, but do not completely, eliminate the problem
of using similar types together (notably, factory classes as a workaround
for "new" only able to produce one type of object). With the Ada-based
strong typing system, we need a better way to define similar types,
ensuring the these concepts are not limited to objects but can be used
throughout the language
- basic extensibility of aggregates
- arrays and records should be part of the core typing system, so that they
can be easily extended. A record type, for example, shouldn't need "tagged"
to be extended. An array type should be able to be extended with
new bounds (as the element type can be separately extensible). 'class
should not be necessary if we can trace subtypes back to originating parent
types. (None of this should require objects, which
are separate features to be introduced later.)
- privacy should probably not use a "private" package section, but be a
keyword in declarations.
- abstract should be usable anywhere to create a type that is not intended
to have a variable created of that type.
- would syntax trees help?
- some of these issue may have been addressed but not removed from this list
so check if they are still a problem
ISSUES (SparForte Environment)
* build system (SparForte Environment)
* regression test suite (SparForte Environemnt)
- break up good test into lesser tests (just too many for debugging
when there's a new error in the middle after massive changes)
- should test in-line for with ada and shell statements
- test upper ASCII escaped characters
- new string functions: neg tests
- for loops no longer confused by older vars of same name - neg test
- test suite test for var existence after declare block end, array & itself,
array casts, array subtypes, array default assignments, cmdline redirect &
restricted shells, -e, in / not in operator, unchecked_import tests in
test suite
- command line redirection tests in testsuite
- files.is_executable, files.is_readable, files.is_writable,
files.last_modified need negative tests
- tests for large numbers of open/close to make sure we don't run out
file descriptors because of improper closures
- changes to allow for "i : integer := i" not tested for arrays...that is,
values being assigned to arrays probably can't contain the same name as
the array. See ParseDeclarationPart for how to handle this.
- dir_separator, change_dir, remove_dir, get_current_dir, dir_name,
base_name, file_extension, file_name, format_pathname, expand_path & test
- enum package neg tests
- is separate tests
* sample programs
- update the sample programs for subprograms
- in morph.bush example, a single newline is output when Ada is shutting
down. Is something flushed or what??...BUT a short sample script doesn't
have this behaviour. Is this still an issue?
- random numbers
- benchmarks
- shell examples
- [broken?]
ISSUES (AdaScript)
* latest
- SOCK_NONBLOCK - obsolete in Linux, must be replaced
- rpmlint complains about gethostbyname (IP4-specific) -> getaddrinfo
* terminal control character escaping isn't working on readline prompt
- bold is turned off temporarily on prompt
* general syntax (AdaScript Issues)
- implement scientific notation numeric literals
- implement overloadable enumerateds
- implement attributes (will need to change byte code compiler)
- do not allow declarations between begin..end in a begin block
- a range could be a new class. That would allow arrays.range and a general
- enumerateds should be upper-case, if this doesn't conflict with type-
- vim syntax - $$ doesn't work
- unreachable code error doesn't indent token hilight properly
- case cases are not checked for identical cases but should be.
- should last output (%) be assignable?
* assignments
- naturals and positives compatibility (intTypesOK) not handled at this fixed?
- when declaring variables, should the type be optional when a value
is assigned (so that the type of the value is used, like a command line
auto declaration)? This is how the Go language does it.
* pragmas
- should there be a pragma that runs after every command (as in
the special trap for BASH)?
- dual license support for pragma license?
- pragma restriction( no_unextended_types ); -- variables must use
user-defined types derived from standard ones?
- additional safety features for pragma import/export?
* pen package (AdaScript Issues)
- pen package fails on AMD/Linux
- pen package fails on FreeBSD with SDL/SVGALIB (interfers with Spar
keyboard/mouse/display functions)
- deferred picture load
- locking issues
- null_rect, all_rect
- SDL/OpenGL binding
* database packages (AdaScript Issues)
- select statements should be pipeline-able (probably fails because the
child process closes database socket when the APQ library quits)
- db.schema can result in an error error
- db.users and related information procedures should be builtin commands
so they can be pipelined (ie. so "| less" can be used)
- turning off formatting in pipelines or redirection (especially SQL
commands which are unusable in wide layout format)
- \ at end of line will cause an error on SQL statements
- a database connection pool
- use ligda (GNU data access) for portable data needs?
* Text_IO package (AdaScript issues)
- enumerated subtypes - put_line / ? do not print the correct enum item
- set input/output/error cannot be redirected to an file_type in an array
- get_line doesn't strip ASCII.CR like I thought
- should "?" should trim strings?
- close with no filename could close all open user files (ala BASIC,
convenient for scripts)
- output numbers with alternative bases
- Allow standard output, etc. to be closed. (We dup them anyway.)
- Does scanner reset cause Current_Output/etc. to be double dup()'ed
- line count for a file doesn't work if put_line doesn't include the file
variable or if it's a built-in file (standard_output, current_output,
- managing files like types, by negotiating and have spar provide a
recommended handle. This would make the language more cloud-ready.
e.g. type <filehandle> for <type> range <1..num_records>... to
return a file handle on a device that meets these size requirements,
whether in memory, on a hard drive, etc. Similarily, specify if it needs
to be fast, indexed, etc. The architect could specify the options.
* TCP/IP client sockets
- "file /= eof_t" is wrong: standard_input could be specified explicitly
- linux socket calls in bush_linux
- set_output, etc. redirection for sockets
- optimize fd - don't need to pull it out with stringField for every DoGet
* command_line package (AdaScript issues)
- command_line.argument() cannot be used in open...get an error. Expects
a type not a keyword...why?
- implement gnat command_line
* enumerated types
- enumerateds are declare as constants of the enumerated type BUT if the
user declares a constant of the enumerated type (a rare occurrence) it
will be treated as an item of the enumerated type instead of a constant
so there needs to be a symbol table flag to identify enumerated items.
* sound package (AdaScript issues)
- sound.mute, sound.unmute
- Wavplay doesn't recover gracefully from errors...need to reset defaults
especially after an error
* strings package (AdaScript issues)
- strings.replace_match/glob
- strings.cvs - comma separated values - 2, 3, "hello", ... fields
* files package (AdaScript Issues)
- should it handle ~?
- should restricted shell affect?
* System package (AdaScript Issues)
- System_Name should be enumerated
* OS package
- export variables are not exported before a os.system(). Should they be?
- os.unrestricted_system vs. restricted system? or restricted backquotes
and unrestricted backquotes?
* Pen package
- TTF (True-type Fonts)
/* Initialize the TTF library */
if ( TTF_Init() < 0 ) {
fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());
/* Open the font file with the requested point size */
font = TTF_OpenFont(argv[0], ptsize);
if ( font == NULL ) {
fprintf(stderr, "Couldn't load %d pt font from %s: %s\n",
ptsize, argv[0], SDL_GetError());
TTF_SetFontStyle(font, renderstyle);
TTF_SetFontOutline(font, outline);
TTF_SetFontKerning(font, kerning);
TTF_SetFontHinting(font, hinting);
Basically two main functions:
text = TTF_RenderText_Solid(font, string, *forecol);
text = TTF_RenderText_Shaded(font, string, *forecol, *backcol)
text = TTF_RenderText_Blended(TTF_Font *font, const char *text, SDL_Color fg);
There are other functions to get font information, do UTF-8 or set features.
* template issues (AdaScript Issues)
- line numbering in templates - Text_IO skips blank lines. Template
scripts are missing blank lines, and throws line numbers off as a
result. May have to go with sequential I/O or UNIX file reading.
* subprograms (AdaScript Issues)
- parseFunction/ProcedureCallSemicolon requires rewriting parseGeneralStatement (that is, not one expect( ; ) for all general statements)
- expressions should be able to return records and arrays
- functions should be able to return records and arrays
- forward procedures broken (commented out in tests) - params are broke
when expecting forward subprogram
* command types (AdaScript Issues)
- can command types be implemented using appropriate pragmas
instead of a special type (ie. pragma command (strvar) );?
- command vars should be &-able with backquotes.
* Ada package bindings
- thick binding to: Gnat.Os_Lib
- binding to: Byte_IO (sequential)
- aggregates (AdaScript Issues)
- arrays probably won't work as parameters to user-defined subprograms
- errors when expecting scalars
- assigning records to records
- unsetting records
- string should be an array type, but they are not arrays in the bush sense
- ideally, unbounded_strings should not be a subtype of universal strings
for compatibility with Ada 95. As a result, an unbounded_string typecast
shouldn't work but it does in AdaScript.
- unconstrained arrays and forced initialization
- if array return values are implemented, arrays should be initialized with
array expression value.
* ZMQ support (new package)
- see
ISSUES (Bourne Shell)
- x/y command name relative paths
- ./foobar works as expected
- dir/foobar doesn't work - it must be quoted
- foo-bar also doesn't work - it must be quoted
- the byte code compiler could handle this, creating a shell word...but not break
other things
- redirections (Shell Issues)
- advanced job control (control-Z, fg, bg, etc.)
- 2>&1 doesn't work...2>, 2>>, >, >> work OK
- pipelines not allowed after 2>&1
- errors in `..` backquotes don't terminate script - may be fixed
- errors in `..` don't show outer script line number
- line numbers and procedures: if an error occurs, the line number is not
the line number of the procedure but where the procedure was called plus
the offset into the procedure
- job control (Shell Issues)
- check sig child flag after every general statement (already done?)
- single user mode detection, disabling job control
- SIGHUP handler: SIGHUP should be broadcast to all children like BASH
- other shell issues (Shell Issues)
- SHELL variable doesn't always initialize to spar command path
- pragma to disable emacs or vi mode
- collating order with file globbing and locales
- remove dependency on Ada.Command_Line.Environment -- not supported in Windows GNAT
- an error terminates all commands in an interactive semi-colon list, but
it should continue on for POSIX compatibility. Is this resolvable?
- because terminal attributes are toggled on and off, slow systems
sometimes echo characters during input, throwing off the display
- prompt script: final cr being ignored because it users compileandrun
- pathname completion "/" and " " append tests should use stat(), not
Text_IO and GNAT Dir Ops. Perhaps another c_os function??
- insert sometimes inserts characters wrong in the command line. Backing
up, deleting and retyping is OK, but cursoring over and changing
sometimes doesn't keep line position properly. Still an issue?
- @ works with procedures (but not with shell commands yet): the shell
command identifiers might be a path "/bin/ls" or if command is an
identifier($command if) will it still work?
- should be its own identifier...maybe comma, too, to simplify code
- document
- environment problems: using putenv removes the variable from the
environment but GNAT's command_line package still looks for it and
returns a garbage value for that environment entry (as if it caches the
- now that the initial environment is loaded at scanner startup, there may
be environment issues...haven't thought it through
- hash clash in pipeline for builtin--this might be fixed, confirm
- Bourne shell compatibility and syntax checking: declaring variables in
statements. Is it worth it? Example:
while i < 2 loop
if i = 0 then
j : integer;
end if;
end loop;
doesn't work since declarations are always done even if skipped because
the symbols need to be in the symbol table when walking through the
syntax even when the statements aren't being executed. This is a rare
case, but it also raises the issue of scope with pullBlock--technically,
j is a global but pullBlock treats all internal declarations as local.
- an undo for unset
- architecture
- pragmas for business architecture. e.g. pragma licence (gpl),
pragma license_limit_instances( 15 ), pragam license_limit_users( 12 )
- redesigning the symbol table to handle non-string values
- allows byte_io package based on sequential_io
- implement use clause
- multi-dimensional arrays
- records should allow nested arrays
- arrays should support nested arrays
- linked lists or other container types
- ParseExpression should return a storage record, not a string, so
arrays can be returned (and future records, objects)
- performance enhancements
- should the universal type (i.e. storage type - univeral_string, array,
root_enumerated, etc.) be stored with the variable
so SparForte doesn't have to be looked up constantly?
- commands like getBaseType could cache the result in the variable
- would require updating most of the built-in functions
- lineRead still reads as unbounded_string instead of copying directly
into script variable, causing double buffering and conversion slowdowns
- more sophisticated byte code for speed
- this will require the scanner and parser holding two different tables for
identifiers (because only the parser knowns what block(s) an identifier
belongs to). Otherwise, the existing get_next_token can be used to
tokenize the script file.
- change system calls to get tput results - remove system() reliance
- "kind" field should be a pointer for speed, not an array index
- no type-checking after syntax-check stage for performance? But command
prompt has no syntax check so must be excluded?
- a pragma inline should be created in order to cache other scripts
- DoRunTimeStatments should probably fork and use pipes to read results
instead of using a temp file
- otherwise, DoRunTimeStatements only read results one char at a time
- instead of the fast string library, just store the first character in
the identifier record and (optionally) test on that? Use a new record
type to prevent string assignments without updating the first character.
- can word_t byte code items also contain a trailing "pattern" as well as
- .list and .FieldOf can be combined as .Owner of aggregate sub item, where
.owner = eof_t indicates a simple variable. This would simplify the code.
- review parser/child package structure. A better way to organize?
* Platform issues
- Spar hangs with vt52 40x8 login, throws exception (perhaps division by
zero because attributes like bold null strings??) Also has ctrl-q's
so maybe a flow of control problem