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

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 RICHPse.tar.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 RICHPse.tar | tar xvf -
ksh# pkgadd -d . RICHPse

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:  se-feedback@chessie.Eng.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 3.0

Bug fixes:
  minor cleanup of p_iostat_class
  better handling of scripts beginning with #!
  parameter checking broken for parameters of type char[]
  *hairy* bug passing lazy evaluated arrays of structures to attached funcs
  calling se functions from C with arrays as parameters didn't work just right
  attached functions returning structures did not work *at all*
  and many more

Features added:
  all kstats can now be dumped, see ks_cache type in include/kstat.se
  support for clarion array disk types
  example scripts no longer executable, start with "se filename.se"
    (#! still works, but the examples have been changed)
  added ppp interface to kstat.se and netif.se
  extern variables inside of attach blocks (for things like errno)
  rewrite of kvm reading code to cut down on system calls and to make sure
    string variables inside of kvm structures are themselves read
    (see kvmname.se)
  use &c instead of address_of(c) now
  deletion of the following builtins
    getopt, time, ctime, localtime, uname, stat, fstat, lstat, processor_info
  optimized kstat code such that if the only thing that the application touches
    is ks_system_misc then the only thing read from the kstat chain will be
    unix.0.system_misc
  warnings now issued about ununsed variables
  C++ style comments now accepted
  code regenerator with -o
  =~ regex operator for strings
  (a < b ? a : b) syntax for expressions
  use of increment/decrement in expressions (such as "printf("%d\n", j++);")
  support for oldold etherlink cards "el" and PCMCIA etherlink 3 cards "pcelx"
  syntax for definition of KSTAT_TYPE_NAMED structures without modifying the
    interpreter (see ks_inode_cache in kstat.se)
  and many more

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

NEW TO VERSION 2.5.0.2 (2.5.0.1 didn't last long)

Bug fixes:
  Didn't work on Solaris 2.5.1 for lots of reasons, all fixed, I hope.
    ks_segmap was confused on 2.5.1
    postinstall script just did the wrong thing on 2.5.1
  ks_fddi_network was confused
  If CPUS_CONFIGURED > CPUS_ONLINE vmstat classes didn't work.
  many examples and include files still had old MINOR_VERSION numbers

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

NEW TO VERSION 2.5

Bug fixes:
  inst_to_path_class fails with double digit controller numbers
    also had pretty ugly code, now cleaned up
  arrays of structures passed to attached functions should act as reference
    parameters not value parameters
  cleanup of package installation scripts
  arbitrary limitiation of 32 characters in symbol names is gone

Changes:
  kstat ie structure added to netif class (Intel ethernet)
  kstat elx structure added to netif class (for PowerPC)
  kstat hme structure added to netif class (for E class Ultra)
  kstat sa structure added to netif class (SAHI ATM)
  kstat ieef structure added to netif class (some PC board)
  kstat fddi structure added to netif class (fddi/cddi)
  ulong kvm_declare(string name) for declaring kvm variables on the fly
    return value is the kvm address, used as the second parameter to kvm_cvt
    zero return value means the variable was not found
  poll() call in poll.se now works normally without poll_se() due to
    array-of-structure-parameters-to-attached-functions changes
  SEPATH environment variable is a colon separated list of include directories
  MAX_CPU, MAX_DISK, MAX_IF, AND MAX_INTR are now "builtin constants"
    and are no longer defined in sysdepend.se
  command line parameter "-" available so args can be passed to scripts read
    from stdin.  ex: tail +2 aw.se | se - -sxy
  command line parameter "-t name" available to identify script name when read
    from stdin.  ex: tail +2 aw.se | se -t aw.se - -sxy
  definition of NANOSEC now in time.se instead p_iostat.se

New include files:
  dlfcn.se      - for dynamic lib calls dlopen(), dlsym(), etc.
  statvfs.se    - for statvfs system calls and structure definition
  systeminfo.se - for sysinfo() system call
  sadc_class.se - renaming of sadc.se

********************************
 
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.
  RICHPse 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
  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
