********************************

ORIGINAL RELEASE:

SymbEL is an interpretive language based on C that was created to address
the need for simplified access to data residing in the SunOS kernel.

The SMCCse.tar.{Z,gz} files contain the SymbEL engine binary, "se", the
"include" directory of SymbEL header files, a man page for "se", the user's
manual for the language, and example programs.

To install "se", do this:

ksh# gzcat SMCCse.tar | tar xvf -
ksh# pkgadd -d . SMCCse

The users' manual is in plain text form and is in first release.
It will be made into an official Interleaf Sun document at some future
date.  Please note that at this point, the users' manual is incomplete
as "se" has undergone much change and the documentation has not kept up.

Please send all bug reports, problems, suggestions, recommendations, etc.
to me:  Richard.Pettit@West.Sun.COM.  If the problem includes a core dump,
please provide instructions on how I can get at the core file.  The core file
should be from a run of "se", not the script, so if you have a #! at the
top of the file and are running the script, generate the core file by
running "se script-name".

********************************

NEW TO VERSION 2.4:

Bug fixes:
  values returned by itoa() in a loop are not correct
  passing arrays of ints to a function with an empty array declaration
    causes a core dump
  uninitialized local variable in two kstat functions causes core dump
  severly grizly memory screw-up in the kstat module causes se to grow
  installing RICHPse in a directory other than /opt now works
  minor debug-mode bugs
  certain array assignments cause core dump
  aggregrately initialized class block local vars aren't being propogated
    to new instances of active class vars

Changes:
  SMCCse now RICHPse so noone will think that SMCC supports it.  They don't.
  SMCCse now available for Solaris 2.4 x86
  fix-maxs script now in bin directory for updating the MAX_DISK and MAX_IF
    values in sysdepend.se
  change to live_rules.se to recognize smc ethernet controller (for i86pc)
  change to netif.se to recognize smc ethernet controller (for i86pc)
  ifdef(i86pc) in various include files
  address_of() function finally added even though I didn't want to
  RICHPse package no longer installs virtual_adrian
  curses.se nixed, sar_io.se just prints on stdout
  lots of functions uncommented in some include files
  xit program nixed
  address_of() builtin finally added even though I didn't want to
  integral constant expressions (including strings) now allowed in aggregate
    initialization
  ellipsis (...) as last parameter to attached functions
  calling an attached function with a structure will now send a pointer to a
    "C" version of the structure to the attached function

New include files:
  signal.se   - for signal names and kill() declaration
  poll.se     - for poll events and poll() and poll_se() declarations
  partinfo.se - get partition info for disks from vfstab
  se.se       - for attaching functions that are inside of the se binary

********************************
 
NEW TO VERSION 2.3.1

Bug fixes:
  auto struct initialization broke when aggregate initialization was added
  array of structures offsets were wrong

Changes:
  multiple instances of active class variables now allowed
  at last, array dimensions can be expressions, not just digits!
  se_function_call(char *fn, ...) entry point for attached libs (for callbacks)
  -n flag to se for running without cpp
  empty array declaration for parameters

********************************
 
NEW TO VERSION 2.3

Bug fixes:
  printf("%d %s\n", 1, sprintf("%d", 2)) resulted in "2 2" being output
  malloc memory wasted on strings in structure assignment
  *nasty* string memory allocation problems
  *nasty* free() problem in kstat

Changes:
  include files no longer include other files
    scripts need to include the necessary files themselves
  changes to inst_to_path_class.se

New builtins:
  struct_fill(struct, ulong) builtin
  struct_empty(struct, ulong) builtin

New include files:
  curses.se (work-in-progress)
  mutex.se
  condvar.se
  tiuser.se
  rpc_clnt.se
  nfs_clnt.se
  devinfo.se
  vfs.se
  sar_types.se
  sar.se

New examples:
  sar_io.se
  kvmname.se

New language constructs:
  do { } while(); construct

********************************
 
NEW TO VERSION 2.2

Bug fixes:
  kvm code more robust
  infinite loop when parsing structures with only structures as members

New builtins:
  long kvm_address(kvm_var)  - return the kvm address of kvm_var

New include files:
  ndd.se       - defines ndd variables for ip, tcp, udp, arp, and icmp
  nfs_class.se - returns the mnttab and mntinfo for all nfs mounts
  mnt_class.se - returns records from the /etc/mnttab file

New scripts:
  nfsstat-m.se - does what nfsstat -m does

New language class:
  ndd$ variables as defined by structures in ndd.se

********************************
 
NEW TO VERSION 2.1.3

Bug fixes:
  if (geteuid() == 0) now works like it's supposed to
  get_proc() bug for pids >= 30000

New builtins:
  kvm_cvt(kvm_var, new_address) - change the kvm address of a kvm variable
  timeval_t gettimeofday()      - variation of the Unix version

New scripts:
  modifications to virtual_adrian.se and mpvmstat.se

New installation stuff:
  adds /etc/init.d file for auto startup of virtual_adrian

********************************
 
NEW TO VERSION 2.1.2

New include file:
  netif.se          - finds all the network interfaces

New example scripts:
  netstatx.se       - Adrian Cockcroft
  xio.se            - Adrian Cockcroft
  virtual_adrian.se - Adrian Cockcroft
  fsflush.se        - Adrian Cockcroft
  pwatch.se         - Adrian Cockcroft

Changed example scripts:
  net.se            - gives info from netif user class
  collisions.se     - gives info from netif user class

Other changes:
  Functional port to 5.4 ea2 - complete port later

********************************
 
NEW TO VERSION 2.1.1
 
Bug fixes:
  kvm structure sizes
  kvm structure member offsets
  misc. annoying bugs
 
Other changes:
  sysconf.se removed, defines put into unistd.se where they belong

********************************
 
NEW TO VERSION 2.1
 
Many builtins deleted in lieu of the new attachment mechanism which
allows shared libraries to be attached to a script and functions
within the library called.
 
New include files:
  stdio.se
  unistd.se
  stdlib.se
  string.se
  socket.se
  p_netstat_class.se - Adrian Cockcroft
 
New example scripts:
  vmmonitor.se  - Adrian Cockcroft
  iomonitor.se  - Adrian Cockcroft
  netmonitor.se - Adrian Cockcroft
 
Application:
  xit - eXtended Iostat Tool - Motif GUI called by xit.se, a script
 
********************************

NEW TO VERSION 2.0 (beta)

New builtins:
  int getopt(int argc, string argv[], string opts)
  void debug_off(void)
  void debug_on(void)

New include files:
  sysinfo_class.se  - gathers system information from kstat
  app_wrap_class.se - wrapper an application run and compute stats
  wait.se           - for gleaning information returned from spawn()

New example scripts:
  aw.se - application wrapper

New features:
  arrays of structures
  indefinite dot notation
  interchangability between string type and array of char
  "se" is now the installable Solaris package "SMCCse"

********************************

NEW TO VERSION 1.9

New builtins:
  long time(void)
  string ctime(long seconds)
  struct tm_t localtime(seconds)
  string strftime(string format, struct tm_t ts)
  int strlen(string s)
  string fgetl(int fp)
  string getenv(string name)

New include files:
  time.se      - for the definition of struct tm_t

Updated example scripts:
  cpg.se     - now version 2.3.4

Also:
  improved debugging output (still far from what's desired though)
  now comes with libse.a for building the interpreter into an application
    (sorry, no docs on how to do it yet)

********************************

NEW TO VERSION 1.8

New builtins:
  int fclose(int file_handle)
  int fflush(int file_handle)
  string fgets(int file_handle)
  int fopen(string file_name, string mode)
  int fprintf(int file_handle, string format, ...)
  int fputs(string text, int file_handle)
  int fseek(int file_handle, int offset, int whence)
  string gets()
  int popen(string command, string mode)
  void perror(string complaint)
  int pclose(int file_handle)
  string sprintf(string format, ...)
  string strchr(string source, char c)
  string strrchr(string source, char c)
  string strtok(string source, string pattern)

New feature - pre-defined variables:
  stdin
  stdout
  stderr

********************************

NEW TO VERSION 1.7

Changes to language classes:
  sysconf class has been removed
  mib class has been added

New builtins:
  struct proc_info_t processor_info(int instance)
  void puts(string)
  long sysconf(int flag) is now a builtin
  struct utsname uname(void)

New include files:
  mib.se       - for the mib language class
  processor.se - for processor_info()
  sysconf.se   - changed to reflect the new builtin
  utsname.se   - for uname()

New example scripts:
  uname.se     - almost identical to the uname(1) command
  cpus.se      - show the instance number, state, and clock speed of cpus
  cpg.se       - modified to use mib class variable and look for udpInOverflows

********************************

NEW TO VERSION 1.5:

New builtins:
  long strtol(string pattern, int base)
  string itoa(long)
  prpsinfo_t first_proc()
  prpsinfo_t next_proc()
  prpsinfo_t get_proc(int pid)

Bug fixes:
  string operations

New functionality:
  builtin functions return a user defined type; odd, but necessary
  comparison of string variables to constant nil
  bitwise operators: &, |, ^, <<, >>, &=, |=, ^=, <<=, >>=

New include file:
  proc.se - for traversing procs

New example scripts:
  ps-a.se  - does a /usr/ucb/ps -a (almost)
  ps-p.se  - does a /usr/ucb/ps on supplied process id
  nproc.se - counts the processes on the system
