changeset 46529:148f4d9a8905

Updated to IDLWAVE version 4.14. See idlwave.org.
author J.D. Smith <jdsmith@as.arizona.edu>
date Thu, 18 Jul 2002 18:58:07 +0000
parents 0fc136f66777
children 2e11b210c13b
files lisp/progmodes/idlw-rinfo.el lisp/progmodes/idlw-shell.el lisp/progmodes/idlw-toolbar.el lisp/progmodes/idlwave.el
diffstat 4 files changed, 1822 insertions(+), 753 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/progmodes/idlw-rinfo.el	Thu Jul 18 18:57:28 2002 +0000
+++ b/lisp/progmodes/idlw-rinfo.el	Thu Jul 18 18:58:07 2002 +0000
@@ -1,8 +1,10 @@
 ;;; idlw-rinfo.el --- Routine Information for IDLWAVE
-;; Copyright (c) 1999, 2000 Free Software Foundation
+;; Copyright (c) 1999 Carsten Dominik
+;; Copyright (c) 1999, 2000, 2001, 2002 Free Software Foundation
 
-;; Author: John-David Smith <jdsmith@astro.cornell.edu>
-;; Version: 4.7
+;; Author: Carsten Dominik <dominik@astro.uva.nl>
+;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
+;; Version: 4.14
 ;; Keywords: languages
 
 ;; This file is part of GNU Emacs.
@@ -29,21 +31,28 @@
 ;; information is extracted automatically from the IDL documentation
 ;; and by talking to IDL.
 ;;
-;; Created by get_rinfo54 on Fri Dec  8 14:06:41 2000
-;; IDL version: 5.4
-;; Number of files scanned:  5
+;; Created by get_rinfo on Wed May 22 16:40:34 2002
+;; IDL version: 5.5
+;; Number of files scanned:  6
 ;;       943 syntax entries in file refguide.txt
 ;;       327 syntax entries in file sdf.txt
 ;;         0 syntax entries in file datamine.txt
 ;;         6 syntax entries in file edg.txt
 ;;        45 syntax entries in file obsolete.txt
-;; Number of routines found: 1287
-;; Number of keywords found: 5724
-
+;;        38 syntax entries in file whatsnew55.txt
+;; Number of routines found: 1324
+;; Number of keywords found: 5958
+;;
+;; Fixed up documentation with file: ./help55fixup.txt
+;;	 93 total fix matches.
+;
+;; New versions of IDLWAVE, documentation, and more information
+;; available from:
+;;                 http://idlwave.org
+;; 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 ;;; Code:
-
 (defconst idlwave-system-routines
   '(
     ("ANNOTATE"               pro nil                 (system) "%s" (("COLOR_INDICES") ("DRAWABLE") ("LOAD_FILE") ("TEK_COLORS") ("WINDOW")))
@@ -52,7 +61,7 @@
     ("BAR_PLOT"               pro nil                 (system) "%s, Values" (("BACKGROUND") ("BARNAMES") ("BAROFFSET") ("BARSPACE") ("BARWIDTH") ("BASELINES") ("BASERANGE") ("COLORS") ("OUTLINE") ("OVERPLOT") ("ROTATE") ("TITLE") ("XTITLE") ("YTITLE")))
     ("BLAS_AXPY"              pro nil                 (system) "%s, Y, A, X [, D1, Loc1 [, D2, Range]]" nil)
     ("BOX_CURSOR"             pro nil                 (system) "%s, [ X0, Y0, NX, NY]" (("FIXED_SIZE") ("INIT") ("MESSAGE")))
-    ("BREAKPOINT"             pro nil                 (system) "%s [, File], Index" (("AFTER") ("CLEAR") ("CONDITION") ("DISABLE") ("ENABLE") ("ONCE") ("SET")))
+    ("BREAKPOINT"             pro nil                 (system) "%s [, File], Index" (("AFTER") ("CLEAR") ("CONDITION") ("DISABLE") ("ENABLE") ("ON_RECOMPILE") ("ONCE") ("SET")))
     ("BYTEORDER"              pro nil                 (system) "%s, Variable1, ..., Variablen" (("DTOGFLOAT") ("DTOVAX") ("DTOXDR") ("FTOVAX") ("FTOXDR") ("GFLOATTOD") ("HTONL") ("HTONS") ("L64SWAP") ("LSWAP") ("NTOHL") ("NTOHS") ("SSWAP") ("SWAP_IF_BIG_ENDIAN") ("SWAP_IF_LITTLE_ENDIAN") ("VAXTOD") ("VAXTOF") ("XDRTOD") ("XDRTOF")))
     ("CALDAT"                 pro nil                 (system) "%s, Julian, Month [, Day [, Year [, Hour [, Minute [, Second]]]]]" nil)
     ("CALENDAR"               pro nil                 (system) "%s [[, Month] , Year]" nil)
@@ -83,7 +92,8 @@
     ("COLOR_CONVERT"          pro nil                 (system) "%s, I0, I1, I2, O0, O1, O2" (("HLS_RGB") ("HSV_RGB") ("RGB_HLS") ("RGB_HSV")))
     ("COMMON"                 pro nil                 (system) "%s VOLUME_DATA, A" (("A")))
     ("CONSTRAINED_MIN"        pro nil                 (system) "%s, X, Xbnd, Gbnd, Nobj, Gcomp, Inform" (("ESPTOP") ("LIMSER") ("MAXIMIZE") ("NSTOP") ("REPORT") ("TITLE")))
-    ("CONTOUR"                pro nil                 (system) "%s, Z [, X, Y]" (("BACKGROUND") ("C_ANNOTATION") ("C_CHARSIZE") ("C_CHARTHICK") ("C_COLORS") ("C_LABELS") ("C_LINESTYLE") ("C_ORIENTATION") ("C_SPACING") ("C_THICK") ("CELL_FILL") ("CHARSIZE") ("CHARTHICK") ("CLIP") ("CLOSED") ("COLOR") ("DATA") ("DEVICE") ("DOWNHILL") ("FILL") ("FOLLOW") ("FONT") ("IRREGULAR") ("LEVELS") ("MAX_VALUE") ("MIN_VALUE") ("NLEVELS") ("NOCLIP") ("NODATA") ("NOERASE") ("NORMAL") ("NSUM") ("OVERPLOT") ("PATH_DATA_COORDS") ("PATH_DOUBLE") ("PATH_FILENAME") ("PATH_INFO") ("PATH_XY") ("POLAR") ("POSITION") ("SUBTITLE") ("T3D") ("THICK") ("TICKLEN") ("TITLE") ("TRIANGULATION") ("XCHARSIZE") ("XGRIDSTYLE") ("XLOG") ("XMARGIN") ("XMINOR") ("XRANGE") ("XSTYLE") ("XTHICK") ("XTICK_GET") ("XTICKFORMAT") ("XTICKINTERVAL") ("XTICKLAYOUT") ("XTICKLEN") ("XTICKNAME") ("XTICKS") ("XTICKUNITS") ("XTICKV") ("XTITLE") ("YCHARSIZE") ("YGRIDSTYLE") ("YLOG") ("YMARGIN") ("YMINOR") ("YNOZERO") ("YRANGE") ("YSTYLE") ("YTHICK") ("YTICK_GET") ("YTICKFORMAT") ("YTICKINTERVAL") ("YTICKLAYOUT") ("YTICKLEN") ("YTICKNAME") ("YTICKS") ("YTICKUNITS") ("YTICKV") ("YTITLE") ("ZAXIS") ("ZCHARSIZE") ("ZGRIDSTYLE") ("ZLOG") ("ZMARGIN") ("ZMINOR") ("ZRANGE") ("ZSTYLE") ("ZTHICK") ("ZTICK_GET") ("ZTICKFORMAT") ("ZTICKINTERVAL") ("ZTICKLAYOUT") ("ZTICKLEN") ("ZTICKNAME") ("ZTICKS") ("ZTICKUNITS") ("ZTICKV") ("ZTITLE") ("ZVALUE")))
+    ("CONTOUR"                pro nil                 (system) "%s, Z [, X, Y]" (("BACKGROUND") ("C_ANNOTATION") ("C_CHARSIZE") ("C_CHARTHICK") ("C_COLORS") ("C_LABELS") ("C_LINESTYLE") ("C_ORIENTATION") ("C_SPACING") ("C_THICK") ("CELL_FILL") ("CHARSIZE") ("CHARTHICK") ("CLIP") ("CLOSED") ("COLOR") ("DATA") ("DEVICE") ("DOWNHILL") ("FILL") ("FOLLOW") ("FONT") ("IRREGULAR") ("ISOTROPIC") ("LEVELS") ("MAX_VALUE") ("MIN_VALUE") ("NLEVELS") ("NOCLIP") ("NODATA") ("NOERASE") ("NORMAL") ("NSUM") ("OVERPLOT") ("PATH_DATA_COORDS") ("PATH_DOUBLE") ("PATH_FILENAME") ("PATH_INFO") ("PATH_XY") ("POLAR") ("POSITION") ("SUBTITLE") ("T3D") ("THICK") ("TICKLEN") ("TITLE") ("TRIANGULATION") ("XCHARSIZE") ("XGRIDSTYLE") ("XLOG") ("XMARGIN") ("XMINOR") ("XRANGE") ("XSTYLE") ("XTHICK") ("XTICK_GET") ("XTICKFORMAT") ("XTICKINTERVAL") ("XTICKLAYOUT") ("XTICKLEN") ("XTICKNAME") ("XTICKS") ("XTICKUNITS") ("XTICKV") ("XTITLE") ("YCHARSIZE") ("YGRIDSTYLE") ("YLOG") ("YMARGIN") ("YMINOR") ("YNOZERO") ("YRANGE") ("YSTYLE") ("YTHICK") ("YTICK_GET") ("YTICKFORMAT") ("YTICKINTERVAL") ("YTICKLAYOUT") ("YTICKLEN") ("YTICKNAME") ("YTICKS") ("YTICKUNITS") ("YTICKV") ("YTITLE") ("ZAXIS") ("ZCHARSIZE") ("ZGRIDSTYLE") ("ZLOG") ("ZMARGIN") ("ZMINOR") ("ZRANGE") ("ZSTYLE") ("ZTHICK") ("ZTICK_GET") ("ZTICKFORMAT") ("ZTICKINTERVAL") ("ZTICKLAYOUT") ("ZTICKLEN") ("ZTICKNAME") ("ZTICKS") ("ZTICKUNITS") ("ZTICKV") ("ZTITLE") ("ZVALUE")))
+    ("CPU"                    pro nil                 (system) "%s" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NTHREADS") ("VECTOR_ENABLE")))
     ("CREATE_VIEW"            pro nil                 (system) "%s" (("AX") ("AY") ("AZ") ("PERSP") ("RADIANS") ("WINX") ("WINY") ("XMAX") ("XMIN") ("YMAX") ("YMIN") ("ZFAC") ("ZMAX") ("ZMIN") ("ZOOM")))
     ("CURSOR"                 pro nil                 (system) "%s, X, Y [, Wait]" (("CHANGE") ("DATA") ("DEVICE") ("DOWN") ("NORMAL") ("NOWAIT") ("UP") ("WAIT")))
     ("CW_ANIMATE_GETP"        pro nil                 (system) "%s, Widget, Pixmaps" (("KILL_ANYWAY")))
@@ -94,11 +104,13 @@
     ("CW_PALETTE_EDITOR_GET"  pro nil                 (system) "%s, WidgetID" (("ALPHA") ("HISTOGRAM")))
     ("CW_PALETTE_EDITOR_SET"  pro nil                 (system) "%s, WidgetID" (("ALPHA") ("HISTOGRAM")))
     ("DEFINE_KEY"             pro nil                 (system) "%s, Key [, Value]" (("BACK_CHARACTER") ("BACK_WORD") ("CONTROL") ("DELETE_CHARACTER") ("DELETE_CURRENT") ("DELETE_EOL") ("DELETE_LINE") ("DELETE_WORD") ("END_OF_FILE") ("END_OF_LINE") ("ENTER_LINE") ("ESCAPE") ("FORWARD_CHARACTER") ("FORWARD_WORD") ("INSERT_OVERSTRIKE_TOGGLE") ("MATCH_PREVIOUS") ("NEXT_LINE") ("NOECHO") ("PREVIOUS_LINE") ("RECALL") ("REDRAW") ("START_OF_LINE") ("TERMINATE")))
+    ("DEFINE_MSGBLK"          pro nil                 (system) "%s, BlockName, ErrorNames, ErrorFormats" (("IGNORE_DUPLICATE") ("PREFIX")))
+    ("DEFINE_MSGBLK_FROM_FILE" pro nil                 (system) "%s, Filename" (("BLOCK") ("IGNORE_DUPLICATE") ("PREFIX") ("VERBOSE")))
     ("DEFSYSV"                pro nil                 (system) "%s, Name, Value [, Read_Only]" (("EXISTS")))
     ("DELETE_SYMBOL"          pro nil                 (system) "%s, Name" (("TYPE")))
     ("DELLOG"                 pro nil                 (system) "%s, Lognam" (("TABLE")))
     ("DELVAR"                 pro nil                 (system) "%s, V1, ..., Vn" nil)
-    ("DEVICE"                 pro nil                 (system) "%s" (("AVANTGARDE") ("AVERAGE_LINES") ("BINARY") ("BITS_PER_PIXEL") ("BKMAN") ("BOLD") ("BOOK") ("BYPASS_TRANSLATION") ("CLOSE") ("CLOSE_DOCUMENT") ("CLOSE_FILE") ("COLOR") ("COLORS") ("COPY") ("COURIER") ("CURSOR_CROSSHAIR") ("CURSOR_IMAGE") ("CURSOR_MASK") ("CURSOR_ORIGINAL") ("CURSOR_STANDARD") ("CURSOR_XY") ("DECOMPOSED") ("DEMI") ("DEPTH") ("DIRECT_COLOR") ("EJECT") ("ENCAPSULATED") ("ENCODING") ("FILENAME") ("FLOYD") ("FONT_INDEX") ("FONT_SIZE") ("GET_CURRENT_FONT") ("GET_DECOMPOSED") ("GET_FONTNAMES") ("GET_FONTNUM") ("GET_GRAPHICS_FUNCTION") ("GET_PAGESIZE") ("GET_SCREEN_SIZE") ("GET_VISUAL_DEPTH") ("GET_VISUAL_NAME") ("GET_WINDOW_POSITION") ("GET_WRITE_MASK") ("GIN_CHARS") ("GLYPH_CACHE") ("HELVETICA") ("INCHES") ("INDEX_COLOR") ("ISOLATIN1") ("ITALIC") ("LANDSCAPE") ("LIGHT") ("MEDIUM") ("NARROW") ("NCAR") ("OBLIQUE") ("OPTIMIZE") ("ORDERED") ("OUTPUT") ("PALATINO") ("PIXELS") ("PLOT_TO") ("PLOTTER_ON_OFF") ("POLYFILL") ("PORTRAIT") ("PRE_DEPTH") ("PRE_XSIZE") ("PRE_YSIZE") ("PREVIEW") ("PRINT_FILE") ("PSEUDO_COLOR") ("RESET_STRING") ("RESOLUTION") ("RETAIN") ("SCALE_FACTOR") ("SCHOOLBOOK") ("SET_CHARACTER_SIZE") ("SET_COLORMAP") ("SET_COLORS") ("SET_FONT") ("SET_GRAPHICS_FUNCTION") ("SET_RESOLUTION") ("SET_STRING") ("SET_TRANSLATION") ("SET_WRITE_MASK") ("STATIC_COLOR") ("STATIC_GRAY") ("SYMBOL") ("TEK4014") ("TEK4100") ("TEXT") ("THRESHOLD") ("TIMES") ("TRANSLATION") ("TRUE_COLOR") ("TT_FONT") ("TTY") ("VT240") ("VT241") ("VT340") ("VT341") ("WINDOW_STATE") ("XOFFSET") ("XON_XOFF") ("XSIZE") ("YOFFSET") ("YSIZE") ("Z_BUFFERING") ("ZAPFCHANCERY") ("ZAPFDINGBATS")))
+    ("DEVICE"                 pro nil                 (system) "%s" (("AVANTGARDE") ("AVERAGE_LINES") ("BINARY") ("BITS_PER_PIXEL") ("BKMAN") ("BOLD") ("BOOK") ("BYPASS_TRANSLATION") ("CLOSE") ("CLOSE_DOCUMENT") ("CLOSE_FILE") ("COLOR") ("COLORS") ("COPY") ("COURIER") ("CURSOR_CROSSHAIR") ("CURSOR_IMAGE") ("CURSOR_MASK") ("CURSOR_ORIGINAL") ("CURSOR_STANDARD") ("CURSOR_XY") ("DECOMPOSED") ("DEMI") ("DEPTH") ("DIRECT_COLOR") ("EJECT") ("ENCAPSULATED") ("ENCODING") ("FILENAME") ("FLOYD") ("FONT_INDEX") ("FONT_SIZE") ("GET_CURRENT_FONT") ("GET_DECOMPOSED") ("GET_FONTNAMES") ("GET_FONTNUM") ("GET_GRAPHICS_FUNCTION") ("GET_PAGESIZE") ("GET_SCREEN_SIZE") ("GET_VISUAL_DEPTH") ("GET_VISUAL_NAME") ("GET_WINDOW_POSITION") ("GET_WRITE_MASK") ("GIN_CHARS") ("GLYPH_CACHE") ("HELVETICA") ("INCHES") ("INDEX_COLOR") ("ISOLATIN1") ("ITALIC") ("LANDSCAPE") ("LANUAGE_LEVEL") ("LIGHT") ("MEDIUM") ("NARROW") ("NCAR") ("OBLIQUE") ("OPTIMIZE") ("ORDERED") ("OUTPUT") ("PALATINO") ("PIXELS") ("PLOT_TO") ("PLOTTER_ON_OFF") ("POLYFILL") ("PORTRAIT") ("PRE_DEPTH") ("PRE_XSIZE") ("PRE_YSIZE") ("PREVIEW") ("PRINT_FILE") ("PSEUDO_COLOR") ("RESET_STRING") ("RESOLUTION") ("RETAIN") ("SCALE_FACTOR") ("SCHOOLBOOK") ("SET_CHARACTER_SIZE") ("SET_COLORMAP") ("SET_COLORS") ("SET_FONT") ("SET_GRAPHICS_FUNCTION") ("SET_RESOLUTION") ("SET_STRING") ("SET_TRANSLATION") ("SET_WRITE_MASK") ("STATIC_COLOR") ("STATIC_GRAY") ("SYMBOL") ("TEK4014") ("TEK4100") ("TEXT") ("THRESHOLD") ("TIMES") ("TRANSLATION") ("TRUE_COLOR") ("TT_FONT") ("TTY") ("VT240") ("VT241") ("VT340") ("VT341") ("WINDOW_STATE") ("XOFFSET") ("XON_XOFF") ("XSIZE") ("YOFFSET") ("YSIZE") ("Z_BUFFERING") ("ZAPFCHANCERY") ("ZAPFDINGBATS")))
     ("DFPMIN"                 pro nil                 (system) "%s, X, Gtol, Fmin, Func, Dfunc" (("DOUBLE") ("EPS") ("ITER") ("ITMAX") ("STEPMAX") ("TOLX")))
     ("DISSOLVE"               pro nil                 (system) "%s, Image" (("ORDER") ("SIZ") ("WAIT") ("X0") ("Y0")))
     ("DLM_LOAD"               pro nil                 (system) "%s, DLMNameStr1 [, DLMNameStr2,..., DLMNameStrn]" nil)
@@ -113,9 +125,9 @@
     ("ERRPLOT"                pro nil                 (system) "%s, [ X, ] Low, High" (("WIDTH")))
     ("EXIT"                   pro nil                 (system) "%s" (("NO_CONFIRM") ("STATUS")))
     ("EXPAND"                 pro nil                 (system) "%s, A, Nx, Ny, Result" (("FILLVAL") ("MAXVAL")))
-    ("FILE_CHMOD"             pro nil                 (system) "%s, File [, Mode]" (("A_EXECUTE") ("A_READ") ("A_WRITE") ("G_EXECTUE") ("G_READ") ("G_WRITE") ("O_EXECTUE") ("O_READ") ("O_WRITE") ("SETGID") ("SETUID") ("STICKY_BIT") ("U_EXECTUE") ("U_READ") ("U_WRITE")))
-    ("FILE_DELETE"            pro nil                 (system) "%s, File1 [,... FileN]" (("QUIET")))
-    ("FILE_MKDIR"             pro nil                 (system) "%s, File1 [,... FileN]" nil)
+    ("FILE_CHMOD"             pro nil                 (system) "%s, File [, Mode]" (("A_EXECUTE") ("A_READ") ("A_WRITE") ("G_EXECTUE") ("G_READ") ("G_WRITE") ("NOEXPAND_PATH") ("O_EXECTUE") ("O_READ") ("O_WRITE") ("SETGID") ("SETUID") ("STICKY_BIT") ("U_EXECTUE") ("U_READ") ("U_WRITE")))
+    ("FILE_DELETE"            pro nil                 (system) "%s, File1 [,... FileN]" (("NOEXPAND_PATH") ("QUIET")))
+    ("FILE_MKDIR"             pro nil                 (system) "%s, File1 [,... FileN]" (("NOEXPAND_PATH")))
     ("FLICK"                  pro nil                 (system) "%s, A, B [, Rate]" nil)
     ("FLOW3"                  pro nil                 (system) "%s, Vx, Vy, Vz" (("ARROWSIZE") ("BLOB") ("LEN") ("NSTEPS") ("NVECS") ("SX") ("SY") ("SZ")))
     ("FLUSH"                  pro nil                 (system) "%s, Unit1, ..., Unitn" nil)
@@ -123,6 +135,7 @@
     ("FUNCT"                  pro nil                 (system) "%s, X, A, F [, Pder]" nil)
     ("GAMMA_CT"               pro nil                 (system) "%s, Gamma" (("CURRENT") ("INTENSITY")))
     ("GET_LUN"                pro nil                 (system) "%s, Unit" nil)
+    ("GRID_INPUT"             pro nil                 (system) "%s, X, Y, F, X1, Y1, F1" (("DEGREES") ("DUPLICATES") ("EPSILON") ("EXCLUDE") ("POLAR") ("SPHERE")))
     ("H_EQ_CT"                pro nil                 (system) "%s [, Image]" nil)
     ("H_EQ_INT"               pro nil                 (system) "%s [, Image]" nil)
     ("HANDLE_FREE"            pro nil                 (system) "%s, ID" nil)
@@ -187,6 +200,8 @@
     ("HDF_SD_SETEXTFILE"      pro nil                 (system) "%s, SDS_ID, Filename" (("OFFSET")))
     ("HDF_SD_SETINFO"         pro nil                 (system) "%s, SDS_ID" (("CALDATA") ("COORDSYS") ("FILL") ("FORMAT") ("LABEL") ("RANGE") ("UNIT")))
     ("HDF_UNPACKDATA"         pro nil                 (system) "%s, packeddata, data1 [, data2 [, data3 [, data4 [, data5 [, data6 [, data7 [, data8]]]]]]]" (("HDF_ORDER") ("HDF_TYPE") ("NREC")))
+    ("HDF_VD_ATTRINFO"        pro nil                 (system) "%s, VData, FieldID, AttrID, Values" (("COUNT") ("DATA") ("HDF_TYPE") ("NAME") ("TYPE")))
+    ("HDF_VD_ATTRSET"         pro nil                 (system) "%s, VData, FieldID, Attr_Name, Values [, Count]" (("BYTE") ("DFNT_CHAR8") ("DFNT_FLOAT32") ("DFNT_FLOAT64") ("DFNT_INT16") ("DFNT_INT32") ("DFNT_INT8") ("DFNT_UCHAR8") ("DFNT_UINT16") ("DFNT_UINT32") ("DFNT_UINT8") ("DOUBLE") ("FLOAT") ("INT") ("LONG") ("SHORT") ("STRING") ("UINT") ("ULONG")))
     ("HDF_VD_DETACH"          pro nil                 (system) "%s, VData" nil)
     ("HDF_VD_FDEFINE"         pro nil                 (system) "%s, VData, Fieldname" (("BYTE") ("DLONG") ("DOUBLE") ("DULONG") ("FLOAT") ("INT") ("LONG") ("ORDER") ("UINT") ("ULONG")))
     ("HDF_VD_GET"             pro nil                 (system) "%s, VData" (("CLASS") ("COUNT") ("FIELDS") ("INTERLACE") ("NAME") ("NFIELDS") ("REF") ("SIZE") ("TAG")))
@@ -202,14 +217,16 @@
     ("HDF_VG_GETTRS"          pro nil                 (system) "%s, VGroup, Tags, Refs" (("MAXSIZE")))
     ("HDF_VG_INSERT"          pro nil                 (system) "%s, VGroup, VData(or Vgroup)" (("POSITION")))
     ("HDF_VG_SETINFO"         pro nil                 (system) "%s, VGroup" (("CLASS") ("NAME")))
+    ("HEAP_FREE"              pro nil                 (system) "%s, Var" (("OBJ") ("PTR") ("VERBOSE")))
     ("HEAP_GC"                pro nil                 (system) "%s" (("OBJ") ("PTR") ("VERBOSE")))
     ("HELP"                   pro nil                 (system) "%s, Expression1, ..., Expressionn" (("ALL_KEYS") ("BREAKPOINTS") ("BRIEF") ("CALLS") ("DEVICE") ("DLM") ("FILES") ("FULL") ("FUNCTIONS") ("HEAP_VARIABLES") ("KEYS") ("LAST_MESSAGE") ("MEMORY") ("MESSAGES") ("NAMES") ("OBJECTS") ("OUTPUT") ("PROCEDURES") ("RECALL_COMMANDS") ("ROUTINES") ("SOURCE_FILES") ("STRUCTURES") ("SYSTEM_VARIABLES") ("TRACEBACK")))
     ("HLS"                    pro nil                 (system) "%s, Litlo, Lithi, Satlo, Sathi, Hue, Loops [, Colr]" nil)
-    ("HOUGH"                  pro nil                 (system) "%s Transform: Result = HOUGH( Array)" (("BACKPROJECT") ("DOUBLE") ("DRHO") ("DX") ("DY") ("GRAY") ("NRHO") ("NTHETA") ("NX") ("NY") ("RHO") ("RMIN") ("THETA") ("XMIN") ("YMIN")))
     ("HSV"                    pro nil                 (system) "%s, Vlo, Vhi, Satlo, Sathi, Hue, Loops [, Colr]" nil)
     ("IDL_SYSRTN_GENERIC"     pro nil                 (system) "%s IDL_SysRtnGetRealPtr(int is_function, char *name)" nil)
     ("IMAGE_CONT"             pro nil                 (system) "%s, A" (("ASPECT") ("INTERP") ("WINDOW_SCALE")))
     ("IMAGE_STATISTICS"       pro nil                 (system) "%s, Data" (("COUNT") ("DATA_SUM") ("LABELED") ("LUT") ("MASK") ("MAXIMUM") ("MEAN") ("MINIMUM") ("STDDEV") ("SUM_OF_SQUARES") ("VARIANCE") ("VECTOR") ("WEIGHT_SUM") ("WEIGHTED")))
+    ("INTERLEAVED"            pro nil                 (system) "%s Result = GRIDDATA( X, F ) Planar Result = GRIDDATA( X, Y, F ) Sphere From Cartesian Coordinates Result = GRIDDATA( X, Y, Z, F)" (("ANISOTROPY") ("DEGREES") ("DELTA") ("DIMENSION") ("EMPTY_SECTORS") ("FAULT_POLYGONS") ("FAULT_XY") ("FUNCTION_TYPE") ("GRID") ("INVERSE_DISTANCE") ("KRIGING") ("LINEAR") ("MAX_PER_SECTOR") ("METHOD") ("MIN_CURVATURE") ("MIN_POINTS") ("MISSING") ("NATURAL_NEIGHBOR") ("NEAREST_NEIGHBOR") ("NEIGHBORHOOD") ("POLYNOMIAL_REGRESSION") ("POWER") ("QUINTIC") ("RADIAL_BASIS_FUNCTION") ("SEARCH_ELLIPSE") ("SECTORS") ("SHEPARDS") ("SMOOTHING") ("SPHERE") ("START") ("TRIANGLES") ("VARIOGRAM") ("XOUT") ("YOUT")))
+    ("INTERVAL_VOLUME"        pro nil                 (system) "%s, Data, Value0, Value1, Outverts, Outconn" (("AUXDATA_IN") ("AUXDATA_OUT") ("GEOM_XYZ") ("TETRAHEDRA")))
     ("ISOCONTOUR"             pro nil                 (system) "%s, Values, Outverts, Outconn" (("AUXDATA_IN") ("AUXDATA_OUT") ("C_VALUE") ("DOUBLE") ("FILL") ("GEOMX") ("GEOMY") ("GEOMZ") ("LEVEL_VALUES") ("N_LEVELS") ("OUTCONN_INDICES") ("POLYGONS")))
     ("ISOSURFACE"             pro nil                 (system) "%s, Data, Value, Outverts, Outconn" (("AUXDATA_IN") ("AUXDATA_OUT") ("GEOM_XYZ") ("TETRAHEDRA")))
     ("JOURNAL"                pro nil                 (system) "%s [, Arg]" nil)
@@ -236,8 +253,8 @@
     ("MAP_GRID"               pro nil                 (system) "%s" (("BOX_AXES") ("CHARSIZE") ("CLIP_TEXT") ("COLOR") ("FILL_HORIZON") ("GLINESTYLE") ("GLINETHICK") ("HORIZON") ("INCREMENT") ("LABEL") ("LATALIGN") ("LATDEL") ("LATLAB") ("LATNAMES") ("LATS") ("LONALIGN") ("LONDEL") ("LONLAB") ("LONNAMES") ("LONS") ("NO_GRID") ("ORIENTATION") ("T3D") ("ZVALUE")))
     ("MAP_PROJ_INFO"          pro nil                 (system) "%s [, iproj]" (("AZIMUTHAL") ("CIRCLE") ("CURRENT") ("CYLINDRICAL") ("LL_LIMITS") ("NAME") ("PROJ_NAMES") ("UV_LIMITS") ("UV_RANGE")))
     ("MAP_SET"                pro nil                 (system) "%s [, P0lat, P0lon, Rot]" (("ADVANCE") ("AITOFF") ("ALBERS") ("AZIMUTHAL") ("CENTRAL_AZIMUTH") ("CHARSIZE") ("CLIP") ("COLOR") ("CON_COLOR") ("CONIC") ("CONTINENTS") ("CYLINDRICAL") ("E_CONTINENTS") ("E_GRID") ("E_HORIZON") ("ELLIPSOID") ("GLINESTYLE") ("GLINETHICK") ("GNOMIC") ("GOODESHOMOLOSINE") ("GRID") ("HAMMER") ("HIRES") ("HORIZON") ("ISOTROPIC") ("LABEL") ("LAMBERT") ("LATALIGN") ("LATDEL") ("LATLAB") ("LIMIT") ("LONDEL") ("LONLAB") ("MERCATOR") ("MILLER_CYLINDRICAL") ("MLINESTYLE") ("MLINETHICK") ("MOLLEWIDE") ("NAME") ("NOBORDER") ("NOERASE") ("ORTHOGRAPHIC") ("POSITION") ("REVERSE") ("ROBINSON") ("SAT_P") ("SATELLITE") ("SCALE") ("SINUSOIDAL") ("STANDARD_PARALLELS") ("STEREOGRAPHIC") ("T3D") ("TITLE") ("TRANSVERSE_MERCATOR") ("USA") ("XMARGIN") ("YMARGIN") ("ZVALUE")))
-    ("MESH_OBJ"               pro nil                 (system) "%s, Type, Vertex_List, Polygon_List, Array1 [, Array2]" (("DEGREES") ("P1") ("P2") ("P3") ("P4") ("P5")))
-    ("MESSAGE"                pro nil                 (system) "%s, [Text]" (("CONTINUE") ("INFORMATIONAL") ("IOERROR") ("NONAME") ("NOPREFIX") ("NOPRINT") ("RESET")))
+    ("MESH_OBJ"               pro nil                 (system) "%s, Type, Vertex_List, Polygon_List, Array1 [, Array2]" (("CLOSED") ("DEGREES") ("P1") ("P2") ("P3") ("P4") ("P5")))
+    ("MESSAGE"                pro nil                 (system) "%s, [Text]" (("BLOCK") ("CONTINUE") ("INFORMATIONAL") ("IOERROR") ("NAME") ("NONAME") ("NOPREFIX") ("NOPRINT") ("RESET")))
     ("MK_HTML_HELP"           pro nil                 (system) "%s, Sources, Filename" (("STRICT") ("TITLE") ("VERBOSE")))
     ("MODIFYCT"               pro nil                 (system) "%s, Itab, Name, R, G, B" (("FILE")))
     ("MPEG_CLOSE"             pro nil                 (system) "%s, mpegID" nil)
@@ -262,21 +279,21 @@
     ("ON_ERROR"               pro nil                 (system) "%s, N" nil)
     ("ON_IOERROR"             pro nil                 (system) "%s, Label" nil)
     ("ONLINE_HELP"            pro nil                 (system) "%s [, Value]" (("BOOK") ("CONTEXT") ("FULL_PATH") ("HTML_HELP") ("QUIT") ("TOPICS")))
-    ("OPENR"                  pro nil                 (system) "%s, Unit, File [, Record_Length]" (("APPEND") ("BLOCK") ("BUFSIZE") ("COMPRESS") ("DEFAULT") ("DELETE") ("ERROR") ("EXTENDSIZE") ("F77_UNFORMATTED") ("FIXED") ("FORTRAN") ("GET_LUN") ("INITIALSIZE") ("KEYED") ("LIST") ("MACCREATOR") ("MACTYPE") ("MORE") ("NONE") ("PRINT") ("RAWIO") ("SEGMENTED") ("SHARED") ("STDIO") ("STREAM") ("SUBMIT") ("SUPERSEDE") ("SWAP_ENDIAN") ("SWAP_IF_BIG_ENDIAN") ("SWAP_IF_LITTLE_ENDIAN") ("TRUNCATE_ON_CLOSE") ("UDF_BLOCK") ("VARIABLE") ("VAX_FLOAT") ("WIDTH") ("XDR")))
-    ("OPENU"                  pro nil                 (system) "%s, Unit, File [, Record_Length]" (("APPEND") ("BLOCK") ("BUFSIZE") ("COMPRESS") ("DEFAULT") ("DELETE") ("ERROR") ("EXTENDSIZE") ("F77_UNFORMATTED") ("FIXED") ("FORTRAN") ("GET_LUN") ("INITIALSIZE") ("KEYED") ("LIST") ("MACCREATOR") ("MACTYPE") ("MORE") ("NONE") ("PRINT") ("RAWIO") ("SEGMENTED") ("SHARED") ("STDIO") ("STREAM") ("SUBMIT") ("SUPERSEDE") ("SWAP_ENDIAN") ("SWAP_IF_BIG_ENDIAN") ("SWAP_IF_LITTLE_ENDIAN") ("TRUNCATE_ON_CLOSE") ("UDF_BLOCK") ("VARIABLE") ("VAX_FLOAT") ("WIDTH") ("XDR")))
-    ("OPENW"                  pro nil                 (system) "%s, Unit, File [, Record_Length]" (("APPEND") ("BLOCK") ("BUFSIZE") ("COMPRESS") ("DEFAULT") ("DELETE") ("ERROR") ("EXTENDSIZE") ("F77_UNFORMATTED") ("FIXED") ("FORTRAN") ("GET_LUN") ("INITIALSIZE") ("KEYED") ("LIST") ("MACCREATOR") ("MACTYPE") ("MORE") ("NONE") ("PRINT") ("RAWIO") ("SEGMENTED") ("SHARED") ("STDIO") ("STREAM") ("SUBMIT") ("SUPERSEDE") ("SWAP_ENDIAN") ("SWAP_IF_BIG_ENDIAN") ("SWAP_IF_LITTLE_ENDIAN") ("TRUNCATE_ON_CLOSE") ("UDF_BLOCK") ("VARIABLE") ("VAX_FLOAT") ("WIDTH") ("XDR")))
+    ("OPENR"                  pro nil                 (system) "%s, Unit, File [, Record_Length]" (("APPEND") ("BLOCK") ("BUFSIZE") ("COMPRESS") ("DEFAULT") ("DELETE") ("ERROR") ("EXTENDSIZE") ("F77_UNFORMATTED") ("FIXED") ("FORTRAN") ("GET_LUN") ("INITIALSIZE") ("KEYED") ("LIST") ("MACCREATOR") ("MACTYPE") ("MORE") ("NOEXPAND_PATH") ("NONE") ("PRINT") ("RAWIO") ("SEGMENTED") ("SHARED") ("STDIO") ("STREAM") ("SUBMIT") ("SUPERSEDE") ("SWAP_ENDIAN") ("SWAP_IF_BIG_ENDIAN") ("SWAP_IF_LITTLE_ENDIAN") ("TRUNCATE_ON_CLOSE") ("UDF_BLOCK") ("VARIABLE") ("VAX_FLOAT") ("WIDTH") ("XDR")))
+    ("OPENU"                  pro nil                 (system) "%s, Unit, File [, Record_Length]" (("APPEND") ("BLOCK") ("BUFSIZE") ("COMPRESS") ("DEFAULT") ("DELETE") ("ERROR") ("EXTENDSIZE") ("F77_UNFORMATTED") ("FIXED") ("FORTRAN") ("GET_LUN") ("INITIALSIZE") ("KEYED") ("LIST") ("MACCREATOR") ("MACTYPE") ("MORE") ("NOEXPAND_PATH") ("NONE") ("PRINT") ("RAWIO") ("SEGMENTED") ("SHARED") ("STDIO") ("STREAM") ("SUBMIT") ("SUPERSEDE") ("SWAP_ENDIAN") ("SWAP_IF_BIG_ENDIAN") ("SWAP_IF_LITTLE_ENDIAN") ("TRUNCATE_ON_CLOSE") ("UDF_BLOCK") ("VARIABLE") ("VAX_FLOAT") ("WIDTH") ("XDR")))
+    ("OPENW"                  pro nil                 (system) "%s, Unit, File [, Record_Length]" (("APPEND") ("BLOCK") ("BUFSIZE") ("COMPRESS") ("DEFAULT") ("DELETE") ("ERROR") ("EXTENDSIZE") ("F77_UNFORMATTED") ("FIXED") ("FORTRAN") ("GET_LUN") ("INITIALSIZE") ("KEYED") ("LIST") ("MACCREATOR") ("MACTYPE") ("MORE") ("NOEXPAND_PATH") ("NONE") ("PRINT") ("RAWIO") ("SEGMENTED") ("SHARED") ("STDIO") ("STREAM") ("SUBMIT") ("SUPERSEDE") ("SWAP_ENDIAN") ("SWAP_IF_BIG_ENDIAN") ("SWAP_IF_LITTLE_ENDIAN") ("TRUNCATE_ON_CLOSE") ("UDF_BLOCK") ("VARIABLE") ("VAX_FLOAT") ("WIDTH") ("XDR")))
     ("OPLOT"                  pro nil                 (system) "%s, [X,] Y" (("CLIP") ("COLOR") ("LINESTYLE") ("MAX_VALUE") ("MIN_VALUE") ("NOCLIP") ("NSUM") ("POLAR") ("PSYM") ("SYMSIZE") ("T3D") ("THICK") ("ZVALUE")))
     ("OPLOTERR"               pro nil                 (system) "%s, [ X ,] Y , Err [, Psym]" nil)
     ("PARTICLE_TRACE"         pro nil                 (system) "%s, Data, Seeds, Verts, Conn [, Normals]" (("ANISOTROPY") ("INTEGRATION") ("MAX_ITERATIONS") ("MAX_STEPSIZE") ("SEED_NORMAL") ("TOLERANCE") ("UNIFORM")))
-    ("PLOT"                   pro nil                 (system) "%s, [X,] Y" (("BACKGROUND") ("CHARSIZE") ("CHARTHICK") ("CLIP") ("COLOR") ("DATA") ("DEVICE") ("FONT") ("LINESTYLE") ("MAX_VALUE") ("MIN_VALUE") ("NOCLIP") ("NODATA") ("NOERASE") ("NORMAL") ("NSUM") ("POLAR") ("POSITION") ("PSYM") ("SUBTITLE") ("SYMSIZE") ("T3D") ("THICK") ("TICKLEN") ("TITLE") ("XCHARSIZE") ("XGRIDSTYLE") ("XLOG") ("XMARGIN") ("XMINOR") ("XRANGE") ("XSTYLE") ("XTHICK") ("XTICK_GET") ("XTICKFORMAT") ("XTICKINTERVAL") ("XTICKLAYOUT") ("XTICKLEN") ("XTICKNAME") ("XTICKS") ("XTICKUNITS") ("XTICKV") ("XTITLE") ("YCHARSIZE") ("YGRIDSTYLE") ("YLOG") ("YMARGIN") ("YMINOR") ("YNOZERO") ("YRANGE") ("YSTYLE") ("YTHICK") ("YTICK_GET") ("YTICKFORMAT") ("YTICKINTERVAL") ("YTICKLAYOUT") ("YTICKLEN") ("YTICKNAME") ("YTICKS") ("YTICKUNITS") ("YTICKV") ("YTITLE") ("ZCHARSIZE") ("ZGRIDSTYLE") ("ZMARGIN") ("ZMINOR") ("ZRANGE") ("ZSTYLE") ("ZTHICK") ("ZTICK_GET") ("ZTICKFORMAT") ("ZTICKINTERVAL") ("ZTICKLAYOUT") ("ZTICKLEN") ("ZTICKNAME") ("ZTICKS") ("ZTICKUNITS") ("ZTICKV") ("ZTITLE") ("ZVALUE")))
-    ("PLOT_3DBOX"             pro nil                 (system) "%s, X, Y, Z" (("AX") ("AZ") ("BACKGROUND") ("CHARSIZE") ("CHARTHICK") ("CLIP") ("COLOR") ("DATA") ("DEVICE") ("GRIDSTYLE") ("LINESTYLE") ("MAX_VALUE") ("MIN_VALUE") ("NOCLIP") ("NODATA") ("NOERASE") ("NORMAL") ("NSUM") ("POLAR") ("POSITION") ("PSYM") ("SOLID_WALLS") ("SUBTITLE") ("T3D") ("THICK") ("TICKLEN") ("TITLE") ("XCHARSIZE") ("XGRIDSTYLE") ("XLOG") ("XMARGIN") ("XMINOR") ("XRANGE") ("XSTYLE") ("XTHICK") ("XTICKFORMAT") ("XTICKINTERVAL") ("XTICKLAYOUT") ("XTICKLEN") ("XTICKNAME") ("XTICKS") ("XTICKUNITS") ("XTICKV") ("XTITLE") ("XY_PLANE") ("XYSTYLE") ("XZ_PLANE") ("XZSTYLE") ("YCHARSIZE") ("YGRIDSTYLE") ("YLOG") ("YMARGIN") ("YMINOR") ("YNOZERO") ("YRANGE") ("YSTYLE") ("YTHICK") ("YTICKFORMAT") ("YTICKINTERVAL") ("YTICKLAYOUT") ("YTICKLEN") ("YTICKNAME") ("YTICKS") ("YTICKUNITS") ("YTICKV") ("YTITLE") ("YZ_PLANE") ("YZSTYLE") ("ZAXIS") ("ZCHARSIZE") ("ZGRIDSTYLE") ("ZMARGIN") ("ZMINOR") ("ZRANGE") ("ZSTYLE") ("ZTHICK") ("ZTICKFORMAT") ("ZTICKINTERVAL") ("ZTICKLAYOUT") ("ZTICKLEN") ("ZTICKNAME") ("ZTICKS") ("ZTICKUNITS") ("ZTICKV") ("ZTITLE")))
+    ("PLOT"                   pro nil                 (system) "%s, [X,] Y" (("BACKGROUND") ("CHARSIZE") ("CHARTHICK") ("CLIP") ("COLOR") ("DATA") ("DEVICE") ("FONT") ("ISOTROPIC") ("LINESTYLE") ("MAX_VALUE") ("MIN_VALUE") ("NOCLIP") ("NODATA") ("NOERASE") ("NORMAL") ("NSUM") ("POLAR") ("POSITION") ("PSYM") ("SUBTITLE") ("SYMSIZE") ("T3D") ("THICK") ("TICKLEN") ("TITLE") ("XCHARSIZE") ("XGRIDSTYLE") ("XLOG") ("XMARGIN") ("XMINOR") ("XRANGE") ("XSTYLE") ("XTHICK") ("XTICK_GET") ("XTICKFORMAT") ("XTICKINTERVAL") ("XTICKLAYOUT") ("XTICKLEN") ("XTICKNAME") ("XTICKS") ("XTICKUNITS") ("XTICKV") ("XTITLE") ("YCHARSIZE") ("YGRIDSTYLE") ("YLOG") ("YMARGIN") ("YMINOR") ("YNOZERO") ("YRANGE") ("YSTYLE") ("YTHICK") ("YTICK_GET") ("YTICKFORMAT") ("YTICKINTERVAL") ("YTICKLAYOUT") ("YTICKLEN") ("YTICKNAME") ("YTICKS") ("YTICKUNITS") ("YTICKV") ("YTITLE") ("ZCHARSIZE") ("ZGRIDSTYLE") ("ZMARGIN") ("ZMINOR") ("ZRANGE") ("ZSTYLE") ("ZTHICK") ("ZTICK_GET") ("ZTICKFORMAT") ("ZTICKINTERVAL") ("ZTICKLAYOUT") ("ZTICKLEN") ("ZTICKNAME") ("ZTICKS") ("ZTICKUNITS") ("ZTICKV") ("ZTITLE") ("ZVALUE")))
+    ("PLOT_3DBOX"             pro nil                 (system) "%s, X, Y, Z" (("AX") ("AZ") ("BACKGROUND") ("CHARSIZE") ("CHARTHICK") ("CLIP") ("COLOR") ("DATA") ("DEVICE") ("GRIDSTYLE") ("ISOTROPIC") ("LINESTYLE") ("MAX_VALUE") ("MIN_VALUE") ("NOCLIP") ("NODATA") ("NOERASE") ("NORMAL") ("NSUM") ("POLAR") ("POSITION") ("PSYM") ("SOLID_WALLS") ("SUBTITLE") ("T3D") ("THICK") ("TICKLEN") ("TITLE") ("XCHARSIZE") ("XGRIDSTYLE") ("XLOG") ("XMARGIN") ("XMINOR") ("XRANGE") ("XSTYLE") ("XTHICK") ("XTICKFORMAT") ("XTICKINTERVAL") ("XTICKLAYOUT") ("XTICKLEN") ("XTICKNAME") ("XTICKS") ("XTICKUNITS") ("XTICKV") ("XTITLE") ("XY_PLANE") ("XYSTYLE") ("XZ_PLANE") ("XZSTYLE") ("YCHARSIZE") ("YGRIDSTYLE") ("YLOG") ("YMARGIN") ("YMINOR") ("YNOZERO") ("YRANGE") ("YSTYLE") ("YTHICK") ("YTICKFORMAT") ("YTICKINTERVAL") ("YTICKLAYOUT") ("YTICKLEN") ("YTICKNAME") ("YTICKS") ("YTICKUNITS") ("YTICKV") ("YTITLE") ("YZ_PLANE") ("YZSTYLE") ("ZAXIS") ("ZCHARSIZE") ("ZGRIDSTYLE") ("ZMARGIN") ("ZMINOR") ("ZRANGE") ("ZSTYLE") ("ZTHICK") ("ZTICKFORMAT") ("ZTICKINTERVAL") ("ZTICKLAYOUT") ("ZTICKLEN") ("ZTICKNAME") ("ZTICKS") ("ZTICKUNITS") ("ZTICKV") ("ZTITLE")))
     ("PLOT_FIELD"             pro nil                 (system) "%s, U, V" (("ASPECT") ("LENGTH") ("N") ("TITLE")))
     ("PLOTERR"                pro nil                 (system) "%s, [ X ,] Y , Err" (("PSYM") ("TYPE")))
     ("PLOTS"                  pro nil                 (system) "%s, X [, Y [, Z]]" (("CLIP") ("COLOR") ("CONTINUE") ("DATA") ("DEVICE") ("LINESTYLE") ("NOCLIP") ("NORMAL") ("PSYM") ("SYMSIZE") ("T3D") ("THICK") ("Z")))
     ("POINT_LUN"              pro nil                 (system) "%s, Unit, Position" nil)
     ("POLAR_CONTOUR"          pro nil                 (system) "%s, Z, Theta, R" (("C_ANNOTATION") ("C_CHARSIZE") ("C_CHARTHICK") ("C_COLORS") ("C_LINESTYLE") ("C_ORIENTATION") ("C_SPACING") ("C_THICK") ("CLOSED") ("FILL") ("IRREGULAR") ("LEVELS") ("MAX_VALUE") ("MIN_VALUE") ("NLEVELS") ("OVERPLOT") ("PATH_DATA_COORDS") ("SHOW_TRIANGULATION") ("TRIANGULATION") ("XLOG") ("YLOG") ("ZAXIS")))
     ("POLYFILL"               pro nil                 (system) "%s, X [, Y [, Z]]" (("CLIP") ("COLOR") ("DATA") ("DEVICE") ("IMAGE_COORD") ("IMAGE_INTERP") ("LINE_FILL") ("LINESTYLE") ("NOCLIP") ("NORMAL") ("ORIENTATION") ("PATTERN") ("SPACING") ("T3D") ("THICK") ("TRANSPARENT") ("Z")))
-    ("POLYWARP"               pro nil                 (system) "%s, Xi, Yi, Xo, Yo, Degree, Kx, Ky" nil)
+    ("POLYWARP"               pro nil                 (system) "%s, Xi, Yi, Xo, Yo, Degree, Kx, Ky" (("DOUBLE") ("STATUS")))
     ("POPD"                   pro nil                 (system) "%s" nil)
     ("POWELL"                 pro nil                 (system) "%s, P, Xi, Ftol, Fmin, Func" (("DOUBLE") ("ITER") ("ITMAX")))
     ("PRINT"                  pro nil                 (system) "%s [, Expr1, ..., Exprn]" (("AM_PM") ("DAYS_OF_WEEK") ("FORMAT") ("MONTHS") ("REWRITE") ("STDIO_NON_FINITE")))
@@ -289,7 +306,7 @@
     ("PSEUDO"                 pro nil                 (system) "%s, Litlo, Lithi, Satlo, Sathi, Hue, Loops [, Colr]" nil)
     ("PTR_FREE"               pro nil                 (system) "%s, P1, ... ..., Pn" nil)
     ("PUSHD"                  pro nil                 (system) "%s, Dir" nil)
-    ("RADON"                  pro nil                 (system) "%s Transform: Result = RADON( Array)" (("BACKPROJECT") ("DOUBLE") ("DRHO") ("DX") ("DY") ("GRAY") ("LINEAR") ("NRHO") ("NTHETA") ("NX") ("NY") ("RHO") ("RMIN") ("THETA") ("XMIN") ("YMIN")))
+    ("QHULL"                  pro nil                 (system) "%s, V, Tr or, QHULL, V0 , V1, [, V2 ... [, V6] ] , Tr" (("BOUNDS") ("CONNECTIVITY") ("DELAUNAY") ("SPHERE") ("VDIAGRAM") ("VNORMALS") ("VVERTICES")))
     ("RDPIX"                  pro nil                 (system) "%s, Image [, X0, Y0]" nil)
     ("READ"                   pro nil                 (system) "%s, [Prompt,] Var1, ..., Varn" (("AM_PM") ("DAYS_OF_WEEK") ("FORMAT") ("KEY_ID") ("KEY_MATCH") ("KEY_VALUE") ("MONTHS") ("PROMPT")))
     ("READ_INTERFILE"         pro nil                 (system) "%s, File, Data" nil)
@@ -338,7 +355,7 @@
     ("STRPUT"                 pro nil                 (system) "%s, Destination, Source [, Position]" nil)
     ("STRUCT_ASSIGN"          pro nil                 (system) "%s, Source, Destination" (("NOZERO") ("VERBOSE")))
     ("STRUCT_HIDE"            pro nil                 (system) "%s, Arg1 [, Arg2, ..., Argn]" nil)
-    ("SURFACE"                pro nil                 (system) "%s, Z [, X, Y]" (("AX") ("AZ") ("BACKGROUND") ("BOTTOM") ("CHARSIZE") ("CHARTHICK") ("CLIP") ("COLOR") ("DATA") ("DEVICE") ("FONT") ("HORIZONTAL") ("LEGO") ("LINESTYLE") ("LOWER_ONLY") ("MAX_VALUE") ("MIN_VALUE") ("NOCLIP") ("NODATA") ("NOERASE") ("NORMAL") ("NSUM") ("POLAR") ("POSITION") ("SAVE") ("SHADES") ("SKIRT") ("SUBTITLE") ("T3D") ("THICK") ("TICKLEN") ("TITLE") ("UPPER_ONLY") ("XCHARSIZE") ("XGRIDSTYLE") ("XLOG") ("XMARGIN") ("XMINOR") ("XRANGE") ("XSTYLE") ("XTHICK") ("XTICK_GET") ("XTICKFORMAT") ("XTICKINTERVAL") ("XTICKLAYOUT") ("XTICKLEN") ("XTICKNAME") ("XTICKS") ("XTICKUNITS") ("XTICKV") ("XTITLE") ("YCHARSIZE") ("YGRIDSTYLE") ("YLOG") ("YMARGIN") ("YMINOR") ("YNOZERO") ("YRANGE") ("YSTYLE") ("YTHICK") ("YTICK_GET") ("YTICKFORMAT") ("YTICKINTERVAL") ("YTICKLAYOUT") ("YTICKLEN") ("YTICKNAME") ("YTICKS") ("YTICKUNITS") ("YTICKV") ("YTITLE") ("ZAXIS") ("ZCHARSIZE") ("ZGRIDSTYLE") ("ZLOG") ("ZMARGIN") ("ZMINOR") ("ZRANGE") ("ZSTYLE") ("ZTHICK") ("ZTICK_GET") ("ZTICKFORMAT") ("ZTICKINTERVAL") ("ZTICKLAYOUT") ("ZTICKLEN") ("ZTICKNAME") ("ZTICKS") ("ZTICKUNITS") ("ZTICKV") ("ZTITLE") ("ZVALUE")))
+    ("SURFACE"                pro nil                 (system) "%s, Z [, X, Y]" (("AX") ("AZ") ("BACKGROUND") ("BOTTOM") ("CHARSIZE") ("CHARTHICK") ("CLIP") ("COLOR") ("DATA") ("DEVICE") ("FONT") ("HORIZONTAL") ("ISOTROPIC") ("LEGO") ("LINESTYLE") ("LOWER_ONLY") ("MAX_VALUE") ("MIN_VALUE") ("NOCLIP") ("NODATA") ("NOERASE") ("NORMAL") ("NSUM") ("POLAR") ("POSITION") ("SAVE") ("SHADES") ("SKIRT") ("SUBTITLE") ("T3D") ("THICK") ("TICKLEN") ("TITLE") ("UPPER_ONLY") ("XCHARSIZE") ("XGRIDSTYLE") ("XLOG") ("XMARGIN") ("XMINOR") ("XRANGE") ("XSTYLE") ("XTHICK") ("XTICK_GET") ("XTICKFORMAT") ("XTICKINTERVAL") ("XTICKLAYOUT") ("XTICKLEN") ("XTICKNAME") ("XTICKS") ("XTICKUNITS") ("XTICKV") ("XTITLE") ("YCHARSIZE") ("YGRIDSTYLE") ("YLOG") ("YMARGIN") ("YMINOR") ("YNOZERO") ("YRANGE") ("YSTYLE") ("YTHICK") ("YTICK_GET") ("YTICKFORMAT") ("YTICKINTERVAL") ("YTICKLAYOUT") ("YTICKLEN") ("YTICKNAME") ("YTICKS") ("YTICKUNITS") ("YTICKV") ("YTITLE") ("ZAXIS") ("ZCHARSIZE") ("ZGRIDSTYLE") ("ZLOG") ("ZMARGIN") ("ZMINOR") ("ZRANGE") ("ZSTYLE") ("ZTHICK") ("ZTICK_GET") ("ZTICKFORMAT") ("ZTICKINTERVAL") ("ZTICKLAYOUT") ("ZTICKLEN") ("ZTICKNAME") ("ZTICKS") ("ZTICKUNITS") ("ZTICKV") ("ZTITLE") ("ZVALUE")))
     ("SURFR"                  pro nil                 (system) "%s" (("AX") ("AZ")))
     ("SVDC"                   pro nil                 (system) "%s, A, W, U, V" (("COLUMN") ("DOUBLE") ("ITMAX")))
     ("T3D"                    pro nil                 (system) "%s [, Array]" (("MATRIX") ("OBLIQUE") ("PERSPECTIVE") ("RESET") ("ROTATE") ("SCALE") ("TRANSLATE") ("XYEXCH") ("XZEXCH") ("YZEXCH")))
@@ -366,7 +383,8 @@
     ("WEOF"                   pro nil                 (system) "%s, Unit" nil)
     ("WF_DRAW"                pro nil                 (system) "%s, X, Y" (("COLD") ("COLOR") ("CONVERGENCE") ("DATA") ("DEVICE") ("FRONT_TYPE") ("INTERVAL") ("NORMAL") ("OCCLUDED") ("PSYM") ("STATIONARY") ("SYM_HT") ("SYM_LEN") ("THICK") ("WARM")))
     ("WIDED"                  pro nil                 (system) "%s" nil)
-    ("WIDGET_CONTROL"         pro nil                 (system) "%s [, Widget_ID]" (("ALIGNMENT") ("ALL_TABLE_EVENTS") ("ALL_TEXT_EVENTS") ("AM_PM") ("APPEND") ("BAD_ID") ("BITMAP") ("CANCEL_BUTTON") ("CLEAR_EVENTS") ("COLUMN_LABELS") ("COLUMN_WIDTHS") ("DAYS_OF_WEEK") ("DEFAULT_BUTTON") ("DEFAULT_FONT") ("DELAY_DESTROY") ("DELETE_COLUMNS") ("DELETE_ROWS") ("DESTROY") ("DRAW_BUTTON_EVENTS") ("DRAW_EXPOSE_EVENTS") ("DRAW_MOTION_EVENTS") ("DRAW_VIEWPORT_EVENTS") ("DRAW_XSIZE") ("DRAW_YSIZE") ("DYNAMIC_RESIZE") ("EDIT_CELL") ("EDITABLE") ("EVENT_FUNC") ("EVENT_PRO") ("FORMAT") ("FUNC_GET_VALUE") ("GET_DRAW_VIEW") ("GET_UVALUE") ("GET_VALUE") ("GROUP_LEADER") ("HOURGLASS") ("ICONIFY") ("INPUT_FOCUS") ("INSERT_COLUMNS") ("INSERT_ROWS") ("KBRD_FOCUS_EVENTS") ("KILL_NOTIFY") ("MAP") ("MONTHS") ("NO_COPY") ("NO_NEWLINE") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("REALIZE") ("RESET") ("ROW_HEIGHTS") ("ROW_LABELS") ("SCR_XSIZE") ("SCR_YSIZE") ("SEND_EVENT") ("SENSITIVE") ("SET_BUTTON") ("SET_DRAW_VIEW") ("SET_DROPLIST_SELECT") ("SET_LIST_SELECT") ("SET_LIST_TOP") ("SET_SLIDER_MAX") ("SET_SLIDER_MIN") ("SET_TABLE_SELECT") ("SET_TABLE_VIEW") ("SET_TEXT_SELECT") ("SET_TEXT_TOP_LINE") ("SET_UNAME") ("SET_UVALUE") ("SET_VALUE") ("SHOW") ("TABLE_XSIZE") ("TABLE_YSIZE") ("TIMER") ("TLB_GET_OFFSET") ("TLB_GET_SIZE") ("TLB_KILL_REQUEST_EVENTS") ("TLB_SET_TITLE") ("TLB_SET_XOFFSET") ("TLB_SET_YOFFSET") ("TRACKING_EVENTS") ("UNITS") ("UPDATE") ("USE_TABLE_SELECT") ("USE_TEXT_SELECT") ("X_BITMAP_EXTRA") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
+    ("WIDGET_CONTROL"         pro nil                 (system) "%s [, Widget_ID]" (("ALIGNMENT") ("ALL_TABLE_EVENTS") ("ALL_TEXT_EVENTS") ("AM_PM") ("APPEND") ("BAD_ID") ("BITMAP") ("CANCEL_BUTTON") ("CLEAR_EVENTS") ("COLUMN_LABELS") ("COLUMN_WIDTHS") ("CONTEXT_MENU") ("DAYS_OF_WEEK") ("DEFAULT_BUTTON") ("DEFAULT_FONT") ("DELAY_DESTROY") ("DELETE_COLUMNS") ("DELETE_ROWS") ("DESTROY") ("DRAW_BUTTON_EVENTS") ("DRAW_EXPOSE_EVENTS") ("DRAW_MOTION_EVENTS") ("DRAW_VIEWPORT_EVENTS") ("DRAW_XSIZE") ("DRAW_YSIZE") ("DYNAMIC_RESIZE") ("EDIT_CELL") ("EDITABLE") ("EVENT_FUNC") ("EVENT_PRO") ("FORMAT") ("FUNC_GET_VALUE") ("GET_DRAW_VIEW") ("GET_UVALUE") ("GET_VALUE") ("GROUP_LEADER") ("HOURGLASS") ("ICONIFY") ("INPUT_FOCUS") ("INSERT_COLUMNS") ("INSERT_ROWS") ("KBRD_FOCUS_EVENTS") ("KILL_NOTIFY") ("MAP") ("MONTHS") ("NO_COPY") ("NO_NEWLINE") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("REALIZE") ("RESET") ("ROW_HEIGHTS") ("ROW_LABELS") ("SCR_XSIZE") ("SCR_YSIZE") ("SEND_EVENT") ("SENSITIVE") ("SET_BUTTON") ("SET_DRAW_VIEW") ("SET_DROPLIST_SELECT") ("SET_LIST_SELECT") ("SET_LIST_TOP") ("SET_SLIDER_MAX") ("SET_SLIDER_MIN") ("SET_TABLE_SELECT") ("SET_TABLE_VIEW") ("SET_TEXT_SELECT") ("SET_TEXT_TOP_LINE") ("SET_UNAME") ("SET_UVALUE") ("SET_VALUE") ("SHOW") ("TABLE_XSIZE") ("TABLE_YSIZE") ("TIMER") ("TLB_GET_OFFSET") ("TLB_GET_SIZE") ("TLB_KILL_REQUEST_EVENTS") ("TLB_SET_TITLE") ("TLB_SET_XOFFSET") ("TLB_SET_YOFFSET") ("TRACKING_EVENTS") ("UNITS") ("UPDATE") ("USE_TABLE_SELECT") ("USE_TEXT_SELECT") ("X_BITMAP_EXTRA") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
+    ("WIDGET_DISPLAYCONTEXTMENU" pro nil                 (system) "%s, Parent, X, Y, ContextBase_ID" nil)
     ("WINDOW"                 pro nil                 (system) "%s [, Window_Index]" (("COLORS") ("FREE") ("PIXMAP") ("RETAIN") ("TITLE") ("XPOS") ("XSIZE") ("YPOS") ("YSIZE")))
     ("WRITE_BMP"              pro nil                 (system) "%s, Filename, Image[, R, G, B]" (("FOUR_BIT") ("HEADER_DEFINE") ("IHDR") ("RGB")))
     ("WRITE_IMAGE"            pro nil                 (system) "%s, Filename, Format, Data [, Red, Green, Blue]" (("APPEND")))
@@ -377,7 +395,7 @@
     ("WRITE_PPM"              pro nil                 (system) "%s, Filename, Image" (("ASCII")))
     ("WRITE_SPR"              pro nil                 (system) "%s, AS, Filename" nil)
     ("WRITE_SRF"              pro nil                 (system) "%s, Filename [, Image, R, G, B]" (("ORDER") ("WRITE_32")))
-    ("WRITE_TIFF"             pro nil                 (system) "%s, Filename [, Image, Order]" (("APPEND") ("BLUE") ("COMPRESSION") ("FLOAT") ("GEOTIFF") ("GREEN") ("LONG") ("PLANARCONFIG") ("RED") ("SHORT") ("VERBOSE") ("XRESOL") ("YRESOL")))
+    ("WRITE_TIFF"             pro nil                 (system) "%s, Filename [, Image, Order]" (("APPEND") ("BITS_PER_SAMPLE") ("BLUE") ("COMPRESSION") ("FLOAT") ("GEOTIFF") ("GREEN") ("LONG") ("ORIENTATION") ("PLANARCONFIG") ("RED") ("SHORT") ("UNITS") ("VERBOSE") ("XRESOL") ("YRESOL")))
     ("WRITE_WAV"              pro nil                 (system) "%s, Filename, Data, Rate" nil)
     ("WRITE_WAVE"             pro nil                 (system) "%s, File, Array" (("BIN") ("DATANAME") ("MESHNAME") ("NOMESHDEF") ("VECTOR")))
     ("WRITEU"                 pro nil                 (system) "%s, Unit, Expr1 ..., Exprn" (("REWRITE") ("TRANSFER_COUNT")))
@@ -391,7 +409,9 @@
     ("XMANAGER"               pro nil                 (system) "%s [, Name, ID]" (("CATCH") ("CLEANUP") ("EVENT_HANDLER") ("GROUP_LEADER") ("JUST_REG") ("NO_BLOCK")))
     ("XMNG_TMPL"              pro nil                 (system) "%s" (("BLOCK") ("GROUP")))
     ("XMTOOL"                 pro nil                 (system) "%s" (("BLOCK") ("GROUP")))
-    ("XOBJVIEW"               pro nil                 (system) "%s, Obj" (("BACKGROUND") ("BLOCK") ("DOUBLE_VIEW") ("GROUP") ("MODAL") ("REFRESH") ("SCALE") ("STATIONARY") ("TEST") ("TITLE") ("TLB") ("XSIZE") ("YSIZE")))
+    ("XOBJVIEW"               pro nil                 (system) "%s, Obj" (("BACKGROUND") ("BLOCK") ("DOUBLE_VIEW") ("GROUP") ("JUST_REG") ("MODAL") ("REFRESH") ("RENDERER") ("SCALE") ("STATIONARY") ("TEST") ("TITLE") ("TLB") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
+    ("XOBJVIEW_ROTATE"        pro nil                 (system) "%s, Axis, Angle" (("PREMULTIPLY")))
+    ("XOBJVIEW_WRITE_IMAGE"   pro nil                 (system) "%s, Filename, Format" (("DIMENSIONS")))
     ("XPALETTE"               pro nil                 (system) "%s" (("BLOCK") ("GROUP") ("UPDATECALLBACK") ("UPDATECBDATA")))
     ("XPCOLOR"                pro nil                 (system) "%s" (("GROUP")))
     ("XPLOT3D"                pro nil                 (system) "%s, X, Y, Z" (("BLOCK") ("COLOR") ("DOUBLE_VIEW") ("GROUP") ("LINESTYLE") ("MODAL") ("NAME") ("OVERPLOT") ("SYMBOL") ("TEST") ("THICK") ("TITLE") ("XRANGE") ("XTITLE") ("YRANGE") ("YTITLE") ("ZRANGE") ("ZTITLE")))
@@ -407,7 +427,7 @@
     ("A_CORRELATE"            fun nil                 (system) "Result = %s(X, Lag)" (("COVARIANCE") ("DOUBLE")))
     ("ABS"                    fun nil                 (system) "Result = %s(X)" nil)
     ("ACOS"                   fun nil                 (system) "Result = %s(X)" nil)
-    ("ADAPT_HIST_EQUAL"       fun nil                 (system) "Result = %s (Image)" (("CLIP") ("NREGIONS") ("TOP")))
+    ("ADAPT_HIST_EQUAL"       fun nil                 (system) "Result = %s (Image)" (("CLIP") ("FCN") ("NREGIONS") ("TOP")))
     ("ALOG"                   fun nil                 (system) "Result = %s(X)" nil)
     ("ALOG10"                 fun nil                 (system) "Result = %s(X)" nil)
     ("AMOEBA"                 fun nil                 (system) "Result = %s( Ftol)" (("FUNCTION_NAME") ("FUNCTION_VALUE") ("NCALLS") ("NMAX") ("P0") ("SCALE") ("SIMPLEX")))
@@ -461,15 +481,15 @@
     ("COLOR_QUAN"             fun nil                 (system) "Result = %s( Image_R, Image_G, Image_B, R, G, B) or Result = COLOR_QUAN( Image, Dim, R, G, B )" (("COLORS") ("CUBE") ("DITHER") ("ERROR") ("GET_TRANSLATION") ("MAP_ALL") ("TRANSLATION")))
     ("COLORMAP_APPLICABLE"    fun nil                 (system) "Result = %s( redrawRequired )" nil)
     ("COMFIT"                 fun nil                 (system) "Result = %s( X, Y, A)" (("EXPONENTIAL") ("GEOMETRIC") ("GOMPERTZ") ("HYPERBOLIC") ("LOGISTIC") ("LOGSQUARE") ("SIGMA") ("WEIGHTS") ("YFIT")))
-    ("COMPLEX"                fun nil                 (system) "Result = %s( Real [, Imaginary] ) or Result = COMPLEX(Expression, Offset, Dim1 [, ..., Dim8])" nil)
+    ("COMPLEX"                fun nil                 (system) "Result = %s( Real [, Imaginary] ) or Result = COMPLEX(Expression, Offset, Dim1 [, ..., Dim8])" (("DOUBLE")))
     ("COMPLEXARR"             fun nil                 (system) "Result = %s( D1, ..., D8)" (("NOZERO")))
     ("COMPLEXROUND"           fun nil                 (system) "Result = %s(Input)" nil)
     ("COMPUTE_MESH_NORMALS"   fun nil                 (system) "Result = %s( fVerts[, iConn] )" nil)
-    ("COND"                   fun nil                 (system) "Result = %s( A)" (("DOUBLE")))
-    ("CONGRID"                fun nil                 (system) "Result = %s( Array, X, Y, Z)" (("CUBIC") ("INTERP") ("MINUS_ONE")))
+    ("COND"                   fun nil                 (system) "Result = %s( A)" (("DOUBLE") ("LNORM")))
+    ("CONGRID"                fun nil                 (system) "Result = %s( Array, X, Y, Z)" (("CENTER") ("CUBIC") ("INTERP") ("MINUS_ONE")))
     ("CONJ"                   fun nil                 (system) "Result = %s(X)" nil)
     ("CONVERT_COORD"          fun nil                 (system) "Result = %s( X [, Y [, Z]])" (("DATA") ("DEVICE") ("DOUBLE") ("NORMAL") ("T3D") ("TO_DATA") ("TO_DEVICE") ("TO_NORMAL")))
-    ("CONVOL"                 fun nil                 (system) "Result = %s( Array, Kernel [, Scale_Factor])" (("CENTER") ("EDGE_TRUNCATE") ("EDGE_WRAP")))
+    ("CONVOL"                 fun nil                 (system) "Result = %s( Array, Kernel [, Scale_Factor])" (("CENTER") ("EDGE_TRUNCATE") ("EDGE_WRAP") ("MISSING") ("NAN")))
     ("COORD2TO3"              fun nil                 (system) "Result = %s( Mx, My, Dim, D0 [, PTI] )" nil)
     ("CORRELATE"              fun nil                 (system) "Result = %s( X [, Y])" (("COVARIANCE") ("DOUBLE")))
     ("COS"                    fun nil                 (system) "Result = %s(X)" nil)
@@ -492,11 +512,11 @@
     ("CW_FIELD"               fun nil                 (system) "Result = %s( Parent)" (("ALL_EVENTS") ("COLUMN") ("FIELDFONT") ("FLOATING") ("FONT") ("FRAME") ("INTEGER") ("LONG") ("NOEDIT") ("RETURN_EVENTS") ("ROW") ("STRING") ("TEXT_FRAME") ("TITLE") ("UNAME") ("UVALUE") ("VALUE") ("XSIZE") ("YSIZE")))
     ("CW_FILESEL"             fun nil                 (system) "Result = %s ( Parent)" (("FILENAME") ("FILTER") ("FIX_FILTER") ("FRAME") ("IMAGE_FILTER") ("MULTIPLE") ("PATH") ("SAVE") ("UNAME") ("UVALUE") ("WARN_EXIST")))
     ("CW_FORM"                fun nil                 (system) "Result = %s( [Parent,] Desc)" (("COLUMN") ("IDS") ("TITLE") ("UNAME") ("UVALUE")))
-    ("CW_FSLIDER"             fun nil                 (system) "Result = %s( Parent)" (("DRAG") ("EDIT") ("FORMAT") ("FRAME") ("MAXIMUM") ("MINIMUM") ("SCROLL") ("SUPPRESS_VALUE") ("TITLE") ("UNAME") ("UVALUE") ("VALUE") ("VERTICAL") ("XSIZE") ("YSIZE")))
+    ("CW_FSLIDER"             fun nil                 (system) "Result = %s( Parent)" (("DOUBLE") ("DRAG") ("EDIT") ("FORMAT") ("FRAME") ("MAXIMUM") ("MINIMUM") ("SCROLL") ("SUPPRESS_VALUE") ("TITLE") ("UNAME") ("UVALUE") ("VALUE") ("VERTICAL") ("XSIZE") ("YSIZE")))
     ("CW_LIGHT_EDITOR"        fun nil                 (system) "Result = %s (Parent)" (("DIRECTION_DISABLED") ("DRAG_EVENTS") ("FRAME") ("HIDE_DISABLED") ("LIGHT") ("LOCATION_DISABLED") ("TYPE_DISABLED") ("UVALUE") ("XRANGE") ("XSIZE") ("YRANGE") ("YSIZE") ("ZRANGE")))
     ("CW_ORIENT"              fun nil                 (system) "Result = %s( Parent)" (("AX") ("AZ") ("FRAME") ("TITLE") ("UNAME") ("UVALUE") ("XSIZE") ("YSIZE")))
     ("CW_PALETTE_EDITOR"      fun nil                 (system) "Result = %s (Parent)" (("DATA") ("FRAME") ("HISTOGRAM") ("HORIZONTAL") ("SELECTION") ("UNAME") ("UVALUE") ("XSIZE") ("YSIZE")))
-    ("CW_PDMENU"              fun nil                 (system) "Result = %s( Parent, Desc)" (("COLUMN") ("DELIMITER") ("FONT") ("HELP") ("IDS") ("MBAR") ("RETURN_FULL_NAME") ("RETURN_ID") ("RETURN_INDEX") ("RETURN_NAME") ("UNAME") ("UVALUE") ("XOFFSET") ("YOFFSET")))
+    ("CW_PDMENU"              fun nil                 (system) "Result = %s( Parent, Desc)" (("COLUMN") ("CONTEXT_MENU") ("DELIMITER") ("FONT") ("HELP") ("IDS") ("MBAR") ("RETURN_FULL_NAME") ("RETURN_ID") ("RETURN_INDEX") ("RETURN_NAME") ("UNAME") ("UVALUE") ("XOFFSET") ("YOFFSET")))
     ("CW_RGBSLIDER"           fun nil                 (system) "Result = %s( Parent)" (("CMY") ("COLOR_INDEX") ("DRAG") ("FRAME") ("GRAPHICS_LEVEL") ("HLS") ("HSV") ("LENGTH") ("RGB") ("UNAME") ("UVALUE") ("VALUE") ("VERTICAL")))
     ("CW_TMPL"                fun nil                 (system) "Result = %s( Parent)" (("UNAME") ("UVALUE")))
     ("CW_ZOOM"                fun nil                 (system) "Result = %s( Parent)" (("FRAME") ("MAX") ("MIN") ("RETAIN") ("SAMPLE") ("SCALE") ("TRACK") ("UNAME") ("UVALUE") ("X_SCROLL_SIZE") ("X_ZSIZE") ("XSIZE") ("Y_SCROLL_SIZE") ("Y_ZSIZE") ("YSIZE")))
@@ -653,6 +673,9 @@
     ("EOS_SW_WRITEDATAMETA"   fun nil                 (system) "Result = %s(swathID, fieldname, dimlist, numbertype)" nil)
     ("EOS_SW_WRITEFIELD"      fun nil                 (system) "Result = %s( swathID, fieldname, cut, data)" (("EDGE") ("START") ("STRIDE")))
     ("EOS_SW_WRITEGEOMETA"    fun nil                 (system) "Result = %s(swathID, fieldname, dimlist, numbertype)" nil)
+    ("ERF"                    fun nil                 (system) "Result = %s(X)" nil)
+    ("ERFC"                   fun nil                 (system) "Result = %s(X)" nil)
+    ("ERFCX"                  fun nil                 (system) "Result = %s(X)" nil)
     ("ERODE"                  fun nil                 (system) "Result = %s( Image, Structure [, X0 [, Y0 [, Z0]]])" (("GRAY") ("PRESERVE_TYPE") ("UINT") ("ULONG") ("VALUES")))
     ("ERRORF"                 fun nil                 (system) "Result = %s(X)" nil)
     ("EXECUTE"                fun nil                 (system) "Result = %s(String [, QuietCompile])" nil)
@@ -664,14 +687,16 @@
     ("F_CVF"                  fun nil                 (system) "Result = %s(P, Dfn, Dfd)" nil)
     ("F_PDF"                  fun nil                 (system) "Result = %s(V, Dfn, Dfd)" nil)
     ("FACTORIAL"              fun nil                 (system) "Result = %s( N)" (("STIRLING") ("UL64")))
-    ("FFT"                    fun nil                 (system) "Result = %s( Array [, Direction])" (("DOUBLE") ("INVERSE") ("OVERWRITE")))
+    ("FFT"                    fun nil                 (system) "Result = %s( Array [, Direction])" (("DIMENSION") ("DOUBLE") ("INVERSE") ("OVERWRITE")))
     ("FILE_EXPAND_PATH"       fun nil                 (system) "Result = %s (Path)" nil)
-    ("FILE_TEST"              fun nil                 (system) "Result = %s( File)" (("BLOCK_SPECIAL") ("CHARACTER_SPECIAL") ("DANGLING_SYMLINK") ("DIRECTORY") ("EXECUTABLE") ("GET_MODE") ("GROUP") ("NAMED_PIPE") ("READ") ("REGULAR") ("SETGID") ("SETUID") ("SOCKET") ("STICKY_BIT") ("SYMLINK") ("USER") ("WRITE") ("ZERO_LENGTH")))
+    ("FILE_INFO"              fun nil                 (system) "Result = %s(Path)" (("NOEXPAND_PATH")))
+    ("FILE_SEARCH"            fun nil                 (system) "Result = %s(Path_Specification) or for recursive searching, Result = FILE_SEARCH(Dir_Specification, Recur_Pattern)" (("COUNT") ("EXPAND_ENVIRONMENT") ("EXPAND_TILDE") ("FOLD_CASE") ("FULLY_QUALIFY_PATH") ("ISSUE_ACCESS_ERROR") ("MARK_DIRECTORY") ("MATCH_ALL_INITIAL_DOT") ("MATCH_INITIAL_DOT") ("NOSORT") ("QUOTE") ("TEST_BLOCK_SPECIAL") ("TEST_CHARACTER_SPECIAL") ("TEST_DANGLING_SYMLINK") ("TEST_DIRECTORY") ("TEST_EXECUTABLE") ("TEST_GROUP") ("TEST_NAMED_PIPE") ("TEST_READ") ("TEST_REGULAR") ("TEST_SETGID") ("TEST_SETUID") ("TEST_SOCKET") ("TEST_STICKY_BIT") ("TEST_SYMLINK") ("TEST_USER") ("TEST_WRITE") ("TEST_ZERO_LENGTH")))
+    ("FILE_TEST"              fun nil                 (system) "Result = %s( File)" (("BLOCK_SPECIAL") ("CHARACTER_SPECIAL") ("DANGLING_SYMLINK") ("DIRECTORY") ("EXECUTABLE") ("GET_MODE") ("GROUP") ("NAMED_PIPE") ("NOEXPAND_PATH") ("READ") ("REGULAR") ("SETGID") ("SETUID") ("SOCKET") ("STICKY_BIT") ("SYMLINK") ("USER") ("WRITE") ("ZERO_LENGTH")))
     ("FILE_WHICH"             fun nil                 (system) "Result = %s( [Path, ] File)" (("INCLUDE_CURRENT_DIR")))
     ("FILEPATH"               fun nil                 (system) "Result = %s( Filename)" (("ROOT_DIR") ("SUBDIRECTORY") ("TERMINAL") ("TMP")))
     ("FINDFILE"               fun nil                 (system) "Result = %s( File_Specification)" (("COUNT")))
     ("FINDGEN"                fun nil                 (system) "Result = %s(D1, ..., D8)" nil)
-    ("FINITE"                 fun nil                 (system) "Result = %s( X)" (("INFINITY") ("NAN")))
+    ("FINITE"                 fun nil                 (system) "Result = %s( X)" (("INFINITY") ("NAN") ("SIGN")))
     ("FIX"                    fun nil                 (system) "Result = %s( Expression [, Offset [, Dim1, ..., Dim8]])" (("PRINT") ("TYPE")))
     ("FLOAT"                  fun nil                 (system) "Result = %s( Expression [, Offset [, Dim1, ..., Dim8]] )" nil)
     ("FLOOR"                  fun nil                 (system) "Result = %s(X)" (("L64")))
@@ -688,7 +713,7 @@
     ("GAUSS_PDF"              fun nil                 (system) "Result = %s(V)" nil)
     ("GAUSSFIT"               fun nil                 (system) "Result = %s( X, Y [, A])" (("ESTIMATES") ("NTERMS")))
     ("GAUSSINT"               fun nil                 (system) "Result = %s(X)" nil)
-    ("GET_DRIVE_LIST"         fun nil                 (system) "Result = %s( )" nil)
+    ("GET_DRIVE_LIST"         fun nil                 (system) "Result = %s( )" (("CDROM") ("COUNT") ("FIXED") ("REMOTE") ("REMOVABLE")))
     ("GET_KBRD"               fun nil                 (system) "Result = %s(Wait)" nil)
     ("GET_SCREEN_SIZE"        fun nil                 (system) "Result = %s( [Display_name])" (("DISPLAY_NAME") ("RESOLUTION")))
     ("GET_SYMBOL"             fun nil                 (system) "Result = %s( Name)" (("TYPE")))
@@ -700,6 +725,7 @@
     ("HANDLE_CREATE"          fun nil                 (system) "Result = %s([ID])" nil)
     ("HANDLE_INFO"            fun nil                 (system) "Result = %s(ID)" nil)
     ("HANNING"                fun nil                 (system) "Result = %s( N1 [, N2])" (("ALPHA") ("DOUBLE")))
+    ("HDF_"                   fun nil                 (system) "Result = %s VD _NATTRS( VData, FieldID )" nil)
     ("HDF_AN_ANNLEN"          fun nil                 (system) "Result = %s(ann_id)" nil)
     ("HDF_AN_ANNLIST"         fun nil                 (system) "Result = %s(an_id, annot_type, obj_tag, obj_ref, ann_list)" nil)
     ("HDF_AN_ATYPE2TAG"       fun nil                 (system) "Result = %s(annot_type)" nil)
@@ -767,10 +793,12 @@
     ("HDF_SD_SELECT"          fun nil                 (system) "Result = %s(SD_ID, Number)" nil)
     ("HDF_SD_START"           fun nil                 (system) "Result = %s( Filename)" (("CREATE") ("RDWR") ("READ")))
     ("HDF_VD_ATTACH"          fun nil                 (system) "Result = %s( FileHandle, VDataId)" (("READ") ("WRITE")))
+    ("HDF_VD_ATTRFIND"        fun nil                 (system) "Result = %s(VData, FieldID, Name)" nil)
     ("HDF_VD_FEXIST"          fun nil                 (system) "Result = %s(VData, Fieldnames)" nil)
     ("HDF_VD_FIND"            fun nil                 (system) "Result = %s(FileHandle, Name)" nil)
     ("HDF_VD_GETID"           fun nil                 (system) "Result = %s(FileHandle, VDataId)" nil)
     ("HDF_VD_GETNEXT"         fun nil                 (system) "Result = %s(VData, Id)" nil)
+    ("HDF_VD_ISATTR"          fun nil                 (system) "Result = %s(VData)" nil)
     ("HDF_VD_ISVD"            fun nil                 (system) "Result = %s(VGroup, Id)" nil)
     ("HDF_VD_LONE"            fun nil                 (system) "Result = %s( FileHandle)" (("MAXSIZE")))
     ("HDF_VD_READ"            fun nil                 (system) "Result = %s( VData, Data)" (("FIELDS") ("FULL_INTERLACE") ("NO_INTERLACE") ("NRECORDS")))
@@ -784,8 +812,9 @@
     ("HDF_VG_NUMBER"          fun nil                 (system) "Result = %s(VGroup)" nil)
     ("HILBERT"                fun nil                 (system) "Result = %s(X [, D])" nil)
     ("HIST_2D"                fun nil                 (system) "Result = %s( V1, V2)" (("BIN1") ("BIN2") ("MAX1") ("MAX2") ("MIN1") ("MIN2")))
-    ("HIST_EQUAL"             fun nil                 (system) "Result = %s( A)" (("BINSIZE") ("HISTOGRAM_ONLY") ("MAXV") ("MINV") ("OMAX") ("OMIN") ("PERCENT") ("TOP")))
+    ("HIST_EQUAL"             fun nil                 (system) "Result = %s( A)" (("BINSIZE") ("FCN") ("HISTOGRAM_ONLY") ("MAXV") ("MINV") ("OMAX") ("OMIN") ("PERCENT") ("TOP")))
     ("HISTOGRAM"              fun nil                 (system) "Result = %s( Array)" (("BINSIZE") ("INPUT") ("L64") ("MAX") ("MIN") ("NAN") ("NBINS") ("OMAX") ("OMIN") ("REVERSE_INDICES")))
+    ("HOUGH"                  fun nil                 (system) "Result = %s( Array)" (("BACKPROJECT") ("DOUBLE") ("DRHO") ("DX") ("DY") ("GRAY") ("NRHO") ("NTHETA") ("NX") ("NY") ("RHO") ("RMIN") ("THETA") ("XMIN") ("YMIN")))
     ("HQR"                    fun nil                 (system) "Result = %s( A)" (("COLUMN") ("DOUBLE")))
     ("IBETA"                  fun nil                 (system) "Result = %s( A, B, X)" (("DOUBLE") ("EPS") ("ITER") ("ITMAX")))
     ("IDENTITY"               fun nil                 (system) "Result = %s( N)" (("DOUBLE")))
@@ -799,7 +828,7 @@
     ("INTERPOL"               fun nil                 (system) "Result = %s( V, N) or Result = INTERPOL( V, X, U)" (("LSQUADRATIC") ("QUADRATIC") ("SPLINE")))
     ("INTERPOLATE"            fun nil                 (system) "Result = %s( P, X [, Y [, Z]])" (("CUBIC") ("GRID") ("MISSING")))
     ("INVERT"                 fun nil                 (system) "Result = %s( Array [, Status])" (("DOUBLE")))
-    ("IOCTL"                  fun nil                 (system) "Result = %s( File_Unit [, Request, Arg])" (("BY_VALUE") ("MT_OFFLINE") ("MT_REWIND") ("MT_SKIP_FILE") ("MT_SKIP_RECORD") ("MT_WEOF") ("SUPRESS_ERROR")))
+    ("IOCTL"                  fun nil                 (system) "Result = %s( File_Unit [, Request, Arg])" (("BY_VALUE") ("MT_OFFLINE") ("MT_REWIND") ("MT_SKIP_FILE") ("MT_SKIP_RECORD") ("MT_WEOF") ("SUPPRESS_ERROR")))
     ("ISHFT"                  fun nil                 (system) "Result = %s(P1, P2)" nil)
     ("JULDAY"                 fun nil                 (system) "Result = %s(Month, Day, Year, Hour, Minute, Second)" nil)
     ("KEYWORD_SET"            fun nil                 (system) "Result = %s(Expression)" nil)
@@ -838,7 +867,7 @@
     ("MAP_IMAGE"              fun nil                 (system) "Result = %s( Image [, Startx, Starty [, Xsize, Ysize]])" (("BILINEAR") ("COMPRESS") ("LATMAX") ("LATMIN") ("LONMAX") ("LONMIN") ("MAX_VALUE") ("MIN_VALUE") ("MISSING") ("SCALE")))
     ("MAP_PATCH"              fun nil                 (system) "Result = %s( Image_Orig [, Lons, Lats])" (("LAT0") ("LAT1") ("LON0") ("LON1") ("MAX_VALUE") ("MISSING") ("TRIANGULATE") ("XSIZE") ("XSTART") ("YSIZE") ("YSTART")))
     ("MATRIX_MULTIPLY"        fun nil                 (system) "Result = %s( A, B)" (("ATRANSPOSE") ("BTRANSPOSE")))
-    ("MAX"                    fun nil                 (system) "Result = %s( Array [, Max_Subscript])" (("MIN") ("NAN")))
+    ("MAX"                    fun nil                 (system) "Result = %s( Array [, Max_Subscript])" (("DIMENSION") ("MIN") ("NAN") ("SUBSCRIPT_MIN")))
     ("MD_TEST"                fun nil                 (system) "Result = %s( X)" (("ABOVE") ("BELOW") ("MDC")))
     ("MEAN"                   fun nil                 (system) "Result = %s( X)" (("DOUBLE") ("NAN")))
     ("MEANABSDEV"             fun nil                 (system) "Result = %s( X)" (("DOUBLE") ("MEDIAN") ("NAN")))
@@ -853,7 +882,7 @@
     ("MESH_SURFACEAREA"       fun nil                 (system) "Result = %s ( Verts, Conn)" (("AUXDATA") ("MOMENT")))
     ("MESH_VALIDATE"          fun nil                 (system) "Result = %s ( Verts, Conn)" (("COMBINE_VERTICES") ("PACK_VERTICES") ("REMOVE_NAN") ("TOLERANCE")))
     ("MESH_VOLUME"            fun nil                 (system) "Result = %s ( Verts, Conn)" (("SIGNED")))
-    ("MIN"                    fun nil                 (system) "Result = %s( Array [, Min_Subscript])" (("MAX") ("NAN")))
+    ("MIN"                    fun nil                 (system) "Result = %s( Array [, Min_Subscript])" (("DIMENSION") ("MAX") ("NAN") ("SUBSCRIPT_MAX")))
     ("MIN_CURVE_SURF"         fun nil                 (system) "Result = %s(Z [, X, Y])" (("BOUNDS") ("CONST") ("DOUBLE") ("GS") ("NX") ("NY") ("REGULAR") ("SPHERE") ("TPS") ("XGRID") ("XOUT") ("XPOUT") ("XVALUES") ("YGRID") ("YOUT") ("YPOUT") ("YVALUES")))
     ("MOMENT"                 fun nil                 (system) "Result = %s( X)" (("DOUBLE") ("MDEV") ("NAN") ("SDEV")))
     ("MORPH_CLOSE"            fun nil                 (system) "Result = %s (Image, Structure)" (("GRAY") ("PRESERVE_TYPE") ("UINT") ("ULONG") ("VALUES")))
@@ -867,7 +896,7 @@
     ("MSG_CAT_OPEN"           fun nil                 (system) "Result = %s( application)" (("DEFAULT_FILENAME") ("FILENAME") ("FOUND") ("LOCALE") ("PATH") ("SUB_QUERY")))
     ("N_ELEMENTS"             fun nil                 (system) "Result = %s(Expression)" nil)
     ("N_PARAMS"               fun nil                 (system) "Result = %s()" nil)
-    ("N_TAGS"                 fun nil                 (system) "Result = %s( Expression)" (("LENGTH")))
+    ("N_TAGS"                 fun nil                 (system) "Result = %s( Expression)" (("DATA_LENGTH") ("LENGTH")))
     ("NCDF_ATTCOPY"           fun nil                 (system) "Result = %s( Incdf [, Invar])" (("IN_GLOBAL") ("OUT_GLOBAL")))
     ("NCDF_ATTINQ"            fun nil                 (system) "Result = %s( Cdfid [, Varid])" (("GLOBAL")))
     ("NCDF_ATTNAME"           fun nil                 (system) "Result = %s( Cdfid [, Varid])" (("GLOBAL")))
@@ -881,19 +910,20 @@
     ("NCDF_VARID"             fun nil                 (system) "Result = %s(Cdfid, Name)" nil)
     ("NCDF_VARINQ"            fun nil                 (system) "Result = %s(Cdfid, Varid)" nil)
     ("NEWTON"                 fun nil                 (system) "Result = %s( X, Vecfunc)" (("CHECK") ("DOUBLE") ("ITMAX") ("STEPMAX") ("TOLF") ("TOLMIN") ("TOLX")))
-    ("NORM"                   fun nil                 (system) "Result = %s( A)" (("DOUBLE")))
+    ("NORM"                   fun nil                 (system) "Result = %s( A)" (("DOUBLE") ("LNORM")))
     ("OBJ_CLASS"              fun nil                 (system) "Result = %s( [Arg])" (("COUNT") ("SUPERCLASS")))
     ("OBJ_ISA"                fun nil                 (system) "Result = %s(ObjectInstance, ClassName)" nil)
     ("OBJ_NEW"                fun nil                 (system) "Result = %s( [ObjectClassName [, Arg1......Argn]] )" nil)
     ("OBJ_VALID"              fun nil                 (system) "Result = %s( [Arg])" (("CAST") ("COUNT")))
     ("OBJARR"                 fun nil                 (system) "Result = %s( D1, ..., D8)" (("NOZERO")))
     ("P_CORRELATE"            fun nil                 (system) "Result = %s( X, Y, C)" (("DOUBLE")))
+    ("PATH_SEP"               fun nil                 (system) "Result = %s()" (("PARENT_DIRECTORY") ("SEARCH_PATH")))
     ("PCOMP"                  fun nil                 (system) "Result = %s( A)" (("COEFFICIENTS") ("COVARIANCE") ("DOUBLE") ("EIGENVALUES") ("NVARIABLES") ("STANDARDIZE") ("VARIANCES")))
     ("PNT_LINE"               fun nil                 (system) "Result = %s( P0, L0, L1 [, Pl])" (("INTERVAL")))
     ("POLAR_SURFACE"          fun nil                 (system) "Result = %s( Z, R, Theta)" (("BOUNDS") ("GRID") ("MISSING") ("QUINTIC") ("SPACING")))
     ("POLY"                   fun nil                 (system) "Result = %s(X, C)" nil)
     ("POLY_2D"                fun nil                 (system) "Result = %s( Array, P, Q [, Interp [, Dimx, Dimy]])" (("CUBIC") ("MISSING")))
-    ("POLY_AREA"              fun nil                 (system) "Result = %s( X, Y)" (("SIGNED")))
+    ("POLY_AREA"              fun nil                 (system) "Result = %s( X, Y)" (("DOUBLE") ("SIGNED")))
     ("POLY_FIT"               fun nil                 (system) "Result = %s( X, Y, Degree)" (("CHISQ") ("COVAR") ("DOUBLE") ("MEASURE_ERRORS") ("SIGMA") ("STATUS") ("YBAND") ("YERROR") ("YFIT")))
     ("POLYFILLV"              fun nil                 (system) "Result = %s( X, Y, Sx, Sy [, Run_Length] )" nil)
     ("POLYFITW"               fun nil                 (system) "Result = %s(X, Y, Weights, NDegree [, Yfit, Yband, Sigma, Corrm])" (("DOUBLE") ("STATUS")))
@@ -904,6 +934,7 @@
     ("PTR_NEW"                fun nil                 (system) "Result = %s( [InitExpr])" (("ALLOCATE_HEAP") ("NO_COPY")))
     ("PTR_VALID"              fun nil                 (system) "Result = %s( [Arg])" (("CAST") ("COUNT")))
     ("PTRARR"                 fun nil                 (system) "Result = %s( D1, ... ..., D8)" (("ALLOCATE_HEAP") ("NOZERO")))
+    ("QGRID3"                 fun nil                 (system) "Result = %s( XYZ, F, Tetrahedra)" (("DELTA") ("DIMENSION") ("MISSING") ("START")))
     ("QROMB"                  fun nil                 (system) "Result = %s( Func, A, B)" (("DOUBLE") ("EPS") ("JMAX") ("K")))
     ("QROMO"                  fun nil                 (system) "Result = %s(Func, A [, B])" (("DOUBLE") ("EPS") ("JMAX") ("K") ("MIDEXP") ("MIDINF") ("MIDPNT") ("MIDSQL") ("MIDSQU")))
     ("QSIMP"                  fun nil                 (system) "Result = %s( Func, A, B)" (("DOUBLE") ("EPS") ("JMAX")))
@@ -911,6 +942,7 @@
     ("QUERY_DICOM"            fun nil                 (system) "Result = %s( Filename [, Info])" (("IMAGE_INDEX")))
     ("QUERY_IMAGE"            fun nil                 (system) "Result = %s ( Filename[, Info])" (("CHANNELS") ("DIMENSIONS") ("HAS_PALETTE") ("IMAGE_INDEX") ("NUM_IMAGES") ("PIXEL_TYPE") ("SUPPORTED_READ") ("SUPPORTED_WRITE") ("TYPE")))
     ("QUERY_JPEG"             fun nil                 (system) "Result = %s ( Filename [, Info] )" nil)
+    ("QUERY_MRSID"            fun nil                 (system) "Result = %s( Filename [, Info])" (("LEVEL")))
     ("QUERY_PICT"             fun nil                 (system) "Result = %s ( Filename [, Info] )" nil)
     ("QUERY_PNG"              fun nil                 (system) "Result = %s ( Filename [, Info] )" nil)
     ("QUERY_PPM"              fun nil                 (system) "Result = %s ( Filename [, Info])" (("MAXVAL")))
@@ -919,6 +951,7 @@
     ("QUERY_WAV"              fun nil                 (system) "Result = %s ( Filename[, Info] )" nil)
     ("R_CORRELATE"            fun nil                 (system) "Result = %s( X, Y)" (("D") ("KENDALL") ("PROBD") ("ZD")))
     ("R_TEST"                 fun nil                 (system) "Result = %s( X)" (("N0") ("N1") ("R")))
+    ("RADON"                  fun nil                 (system) "Result = %s( Array)" (("BACKPROJECT") ("DOUBLE") ("DRHO") ("DX") ("DY") ("GRAY") ("LINEAR") ("NRHO") ("NTHETA") ("NX") ("NY") ("RHO") ("RMIN") ("THETA") ("XMIN") ("YMIN")))
     ("RANDOMN"                fun nil                 (system) "Result = %s( Seed [, D1, ..., D8])" (("BINOMIAL") ("DOUBLE") ("GAMMA") ("LONG") ("NORMAL") ("POISSON") ("UNIFORM")))
     ("RANDOMU"                fun nil                 (system) "Result = %s( Seed [, D1, ..., D8])" (("BINOMIAL") ("DOUBLE") ("GAMMA") ("LONG") ("NORMAL") ("POISSON") ("UNIFORM")))
     ("RANKS"                  fun nil                 (system) "Result = %s(X)" nil)
@@ -927,16 +960,19 @@
     ("READ_BMP"               fun nil                 (system) "Result = %s( Filename, [, R, G, B] [, Ihdr])" (("RGB")))
     ("READ_DICOM"             fun nil                 (system) "Result = %s (Filename [, Red, Green, Blue])" (("IMAGE_INDEX")))
     ("READ_IMAGE"             fun nil                 (system) "Result = %s (Filename [, Red, Green, Blue])" (("IMAGE_INDEX")))
+    ("READ_MRSID"             fun nil                 (system) "Result = %s ( Filename)" (("LEVEL") ("SUB_RECT")))
     ("READ_PNG"               fun nil                 (system) "Result = %s ( Filename [, R, G, B])" (("ORDER") ("TRANSPARENT") ("VERBOSE")))
     ("READ_SPR"               fun nil                 (system) "Result = %s(Filename)" nil)
     ("READ_SYLK"              fun nil                 (system) "Result = %s( File)" (("ARRAY") ("COLMAJOR") ("NCOLS") ("NROWS") ("STARTCOL") ("STARTROW") ("USEDOUBLES") ("USELONGS")))
-    ("READ_TIFF"              fun nil                 (system) "Result = %s( Filename [, R, G, B])" (("CHANNELS") ("GEOTIFF") ("IMAGE_INDEX") ("INTERLEAVE") ("ORDER") ("PLANARCONFIG") ("SUB_RECT") ("UNSIGNED") ("VERBOSE")))
+    ("READ_TIFF"              fun nil                 (system) "Result = %s( Filename [, R, G, B])" (("CHANNELS") ("GEOTIFF") ("IMAGE_INDEX") ("INTERLEAVE") ("ORDER") ("ORIENTATION") ("PLANARCONFIG") ("SUB_RECT") ("UNSIGNED") ("VERBOSE")))
     ("READ_WAV"               fun nil                 (system) "Result = %s ( Filename [, Rate] )" nil)
     ("READ_XWD"               fun nil                 (system) "Result = %s( Filename[, R, G, B] )" nil)
+    ("REAL_PART"              fun nil                 (system) "Result = %s(Z)" nil)
     ("REBIN"                  fun nil                 (system) "Result = %s( Array, D1 [, ..., D8])" (("SAMPLE")))
     ("RECALL_COMMANDS"        fun nil                 (system) "Result = %s()" nil)
-    ("RECON3"                 fun nil                 (system) "Result = %s( Images, Obj_Rot, Obj_Pos, Focal, Dist,Vol_Pos, Img_Ref, Img_Mag, Vol_Size)" (("CUBIC") ("MISSING") ("MODE")))
+    ("RECON3"                 fun nil                 (system) "Result = %s( Images, Obj_Rot, Obj_Pos, Focal, Dist,Vol_Pos, Img_Ref, Img_Mag, Vol_Size)" (("CUBIC") ("MISSING") ("MODE") ("QUIET")))
     ("REFORM"                 fun nil                 (system) "Result = %s( Array, D1, ..., D8)" (("OVERWRITE")))
+    ("REGION_GROW"            fun nil                 (system) "Result = %s(Array, ROIPixels)" (("ALL_NEIGHBORS") ("STDDEV_MULTIPLIER") ("THRESHOLD")))
     ("REGRESS"                fun nil                 (system) "Result = %s( X, Y)" (("CHISQ") ("CONST") ("CORRELATION") ("DOUBLE") ("FTEST") ("MCORRELATION") ("MEASURE_ERRORS") ("SIGMA") ("STATUS") ("YFIT")))
     ("REPLICATE"              fun nil                 (system) "Result = %s( Value, D1 [, ..., D8] )" nil)
     ("REVERSE"                fun nil                 (system) "Result = %s( Array [, Subscript_Index])" (("OVERWRITE")))
@@ -954,12 +990,13 @@
     ("SEARCH3D"               fun nil                 (system) "Result = %s( Array, Xpos, Ypos, Zpos, Min_Val, Max_Val)" (("DECREASE") ("DIAGONAL") ("INCREASE") ("LPF_BAND")))
     ("SFIT"                   fun nil                 (system) "Result = %s( Data, Degree)" (("KX")))
     ("SHIFT"                  fun nil                 (system) "Result = %s(Array, S1, ..., Sn)" nil)
+    ("SIMPLEX"                fun nil                 (system) "Result = %s( Zequation, Constraints, M1, M2, M3 [, Tableau [, Izrov [, Iposv]]])" (("DOUBLE") ("EPS") ("STATUS")))
     ("SIN"                    fun nil                 (system) "Result = %s(X)" nil)
     ("SINDGEN"                fun nil                 (system) "Result = %s(D1, ..., D8)" nil)
     ("SINH"                   fun nil                 (system) "Result = %s(X)" nil)
     ("SIZE"                   fun nil                 (system) "Result = %s( Expression)" (("DIMENSIONS") ("FILE_LUN") ("L64") ("N_DIMENSIONS") ("N_ELEMENTS") ("STRUCTURE") ("TNAME") ("TYPE")))
     ("SKEWNESS"               fun nil                 (system) "Result = %s( X)" (("DOUBLE") ("NAN")))
-    ("SMOOTH"                 fun nil                 (system) "Result = %s( Array, Width)" (("EDGE_TRUNCATE") ("NAN")))
+    ("SMOOTH"                 fun nil                 (system) "Result = %s( Array, Width)" (("EDGE_TRUNCATE") ("MISSING") ("NAN")))
     ("SOBEL"                  fun nil                 (system) "Result = %s(Image)" nil)
     ("SORT"                   fun nil                 (system) "Result = %s(Array)" (("L64")))
     ("SPH_SCAT"               fun nil                 (system) "Result = %s( Lon, Lat, F)" (("BOUNDS") ("BOUT") ("GOUT") ("GS") ("NLAT") ("NLON")))
@@ -1035,20 +1072,21 @@
     ("VERT_T3D"               fun nil                 (system) "Result = %s( Vertex_List)" (("MATRIX") ("NO_COPY") ("NO_DIVIDE") ("SAVE_DIVIDE")))
     ("VOIGT"                  fun nil                 (system) "Result = %s(A, U)" nil)
     ("VOXEL_PROJ"             fun nil                 (system) "Result = %s( V [, RGBO])" (("BACKGROUND") ("CUTTING_PLANE") ("INTERPOLATE") ("MAXIMUM_INTENSITY") ("STEP") ("XSIZE") ("YSIZE") ("ZBUFFER") ("ZPIXELS")))
-    ("WARP_TRI"               fun nil                 (system) "Result = %s( Xo, Yo, Xi, Yi, Image)" (("EXTRAPOLATE") ("OUTPUT_SIZE") ("QUINTIC")))
+    ("WARP_TRI"               fun nil                 (system) "Result = %s( Xo, Yo, Xi, Yi, Image)" (("EXTRAPOLATE") ("OUTPUT_SIZE") ("QUINTIC") ("TPS")))
     ("WATERSHED"              fun nil                 (system) "Result = %s ( Image)" (("CONNECTIVITY")))
     ("WHERE"                  fun nil                 (system) "Result = %s( Array_Expression [, Count])" (("COMPLEMENT") ("L64") ("NCOMPLEMENT")))
-    ("WIDGET_BASE"            fun nil                 (system) "Result = %s( [Parent])" (("ALIGN_BOTTOM") ("ALIGN_CENTER") ("ALIGN_LEFT") ("ALIGN_RIGHT") ("ALIGN_TOP") ("APP_MBAR") ("BASE_ALIGN_BOTTOM") ("BASE_ALIGN_CENTER") ("BASE_ALIGN_LEFT") ("BASE_ALIGN_RIGHT") ("BASE_ALIGN_TOP") ("COLUMN") ("DISPLAY_NAME") ("EVENT_FUNC") ("EVENT_PRO") ("EXCLUSIVE") ("FLOATING") ("FRAME") ("FUNC_GET_VALUE") ("GRID_LAYOUT") ("GROUP_LEADER") ("KBRD_FOCUS_EVENTS") ("KILL_NOTIFY") ("MAP") ("MBAR") ("MODAL") ("NO_COPY") ("NONEXCLUSIVE") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("RNAME_MBAR") ("ROW") ("SCR_XSIZE") ("SCR_YSIZE") ("SCROLL") ("SENSITIVE") ("SPACE") ("TITLE") ("TLB_FRAME_ATTR") ("TLB_KILL_REQUEST_EVENTS") ("TLB_SIZE_EVENTS") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("X_SCROLL_SIZE") ("XOFFSET") ("XPAD") ("XSIZE") ("Y_SCROLL_SIZE") ("YOFFSET") ("YPAD") ("YSIZE")))
+    ("WIDGET_ACTIVEX"         fun nil                 (system) "Result = %s( Parent, COM_ID)" (("ALIGN_BOTTOM") ("ALIGN_CENTER") ("ALIGN_LEFT") ("ALIGN_RIGHT") ("ALIGN_TOP") ("EVENT_FUNC") ("EVENT_PRO") ("FUNC_GET_VALUE") ("ID_TYPE") ("KILL_NOTIFY") ("NO_COPY") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("SCR_XSIZE") ("SCR_YSIZE") ("SENSITIVE") ("UNAME") ("UNITS") ("UVALUE") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
+    ("WIDGET_BASE"            fun nil                 (system) "Result = %s( [Parent])" (("ALIGN_BOTTOM") ("ALIGN_CENTER") ("ALIGN_LEFT") ("ALIGN_RIGHT") ("ALIGN_TOP") ("APP_MBAR") ("BASE_ALIGN_BOTTOM") ("BASE_ALIGN_CENTER") ("BASE_ALIGN_LEFT") ("BASE_ALIGN_RIGHT") ("BASE_ALIGN_TOP") ("COLUMN") ("CONTEXT_MENU") ("DISPLAY_NAME") ("EVENT_FUNC") ("EVENT_PRO") ("EXCLUSIVE") ("FLOATING") ("FRAME") ("FUNC_GET_VALUE") ("GRID_LAYOUT") ("GROUP_LEADER") ("KBRD_FOCUS_EVENTS") ("KILL_NOTIFY") ("MAP") ("MBAR") ("MODAL") ("NO_COPY") ("NONEXCLUSIVE") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("RNAME_MBAR") ("ROW") ("SCR_XSIZE") ("SCR_YSIZE") ("SCROLL") ("SENSITIVE") ("SPACE") ("TITLE") ("TLB_FRAME_ATTR") ("TLB_KILL_REQUEST_EVENTS") ("TLB_SIZE_EVENTS") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("X_SCROLL_SIZE") ("XOFFSET") ("XPAD") ("XSIZE") ("Y_SCROLL_SIZE") ("YOFFSET") ("YPAD") ("YSIZE")))
     ("WIDGET_BUTTON"          fun nil                 (system) "Result = %s( Parent)" (("ALIGN_CENTER") ("ALIGN_LEFT") ("ALIGN_RIGHT") ("BITMAP") ("DYNAMIC_RESIZE") ("EVENT_FUNC") ("EVENT_PRO") ("FONT") ("FRAME") ("FUNC_GET_VALUE") ("GROUP_LEADER") ("HELP") ("KILL_NOTIFY") ("MENU") ("NO_COPY") ("NO_RELEASE") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("SCR_XSIZE") ("SCR_YSIZE") ("SENSITIVE") ("SEPARATOR") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("VALUE") ("X_BITMAP_EXTRA") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
     ("WIDGET_DRAW"            fun nil                 (system) "Result = %s(Parent)" (("APP_SCROLL") ("BUTTON_EVENTS") ("COLOR_MODEL") ("COLORS") ("EVENT_FUNC") ("EVENT_PRO") ("EXPOSE_EVENTS") ("FRAME") ("FUNC_GET_VALUE") ("GRAPHICS_LEVEL") ("GROUP_LEADER") ("KILL_NOTIFY") ("MOTION_EVENTS") ("NO_COPY") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RENDERER") ("RESOURCE_NAME") ("RETAIN") ("SCR_XSIZE") ("SCR_YSIZE") ("SCROLL") ("SENSITIVE") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("VALUE") ("VIEWPORT_EVENTS") ("X_SCROLL_SIZE") ("XOFFSET") ("XSIZE") ("Y_SCROLL_SIZE") ("YOFFSET") ("YSIZE")))
     ("WIDGET_DROPLIST"        fun nil                 (system) "Result = %s( Parent)" (("DYNAMIC_RESIZE") ("EVENT_FUNC") ("EVENT_PRO") ("FONT") ("FRAME") ("FUNC_GET_VALUE") ("GROUP_LEADER") ("KILL_NOTIFY") ("NO_COPY") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("SCR_XSIZE") ("SCR_YSIZE") ("SENSITIVE") ("TITLE") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("VALUE") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
     ("WIDGET_EVENT"           fun nil                 (system) "Result = %s([Widget_ID])" (("BAD_ID") ("NOWAIT") ("SAVE_HOURGLASS") ("YIELD_TO_TTY")))
-    ("WIDGET_INFO"            fun nil                 (system) "Result = %s( [Widget_ID] )" (("ACTIVE") ("CHILD") ("COLUMN_WIDTHS") ("DRAW_BUTTON_EVENTS") ("DRAW_EXPOSE_EVENTS") ("DRAW_MOTION_EVENTS") ("DRAW_VIEWPORT_EVENTS") ("DROPLIST_NUMBER") ("DROPLIST_SELECT") ("DYNAMIC_RESIZE") ("EVENT_FUNC") ("EVENT_PRO") ("FIND_BY_UNAME") ("GEOMETRY") ("KBRD_FOCUS_EVENTS") ("LIST_MULTIPLE") ("LIST_NUM_VISIBLE") ("LIST_NUMBER") ("LIST_SELECT") ("LIST_TOP") ("MANAGED") ("MODAL") ("NAME") ("PARENT") ("REALIZED") ("ROW_HEIGHTS") ("SIBLING") ("SLIDER_MIN_MAX") ("TABLE_ALL_EVENTS") ("TABLE_EDIT_CELL") ("TABLE_EDITABLE") ("TABLE_SELECT") ("TABLE_VIEW") ("TEXT_ALL_EVENTS") ("TEXT_EDITABLE") ("TEXT_NUMBER") ("TEXT_OFFSET_TO_XY") ("TEXT_SELECT") ("TEXT_TOP_LINE") ("TEXT_XY_TO_OFFSET") ("TLB_KILL_REQUEST_EVENTS") ("TRACKING_EVENTS") ("TYPE") ("UNAME") ("UNITS") ("UPDATE") ("USE_TABLE_SELECT") ("VALID_ID") ("VERSION")))
+    ("WIDGET_INFO"            fun nil                 (system) "Result = %s( [Widget_ID] )" (("ACTIVE") ("CHILD") ("COLUMN_WIDTHS") ("CONTEXT_EVENTS") ("DRAW_BUTTON_EVENTS") ("DRAW_EXPOSE_EVENTS") ("DRAW_MOTION_EVENTS") ("DRAW_VIEWPORT_EVENTS") ("DROPLIST_NUMBER") ("DROPLIST_SELECT") ("DYNAMIC_RESIZE") ("EVENT_FUNC") ("EVENT_PRO") ("FIND_BY_UNAME") ("GEOMETRY") ("KBRD_FOCUS_EVENTS") ("LIST_MULTIPLE") ("LIST_NUM_VISIBLE") ("LIST_NUMBER") ("LIST_SELECT") ("LIST_TOP") ("MANAGED") ("MODAL") ("NAME") ("PARENT") ("REALIZED") ("ROW_HEIGHTS") ("SIBLING") ("SLIDER_MIN_MAX") ("SYSTEM_COLORS") ("TABLE_ALL_EVENTS") ("TABLE_EDIT_CELL") ("TABLE_EDITABLE") ("TABLE_SELECT") ("TABLE_VIEW") ("TEXT_ALL_EVENTS") ("TEXT_EDITABLE") ("TEXT_NUMBER") ("TEXT_OFFSET_TO_XY") ("TEXT_SELECT") ("TEXT_TOP_LINE") ("TEXT_XY_TO_OFFSET") ("TLB_KILL_REQUEST_EVENTS") ("TRACKING_EVENTS") ("TYPE") ("UNAME") ("UNITS") ("UPDATE") ("USE_TABLE_SELECT") ("VALID_ID") ("VERSION")))
     ("WIDGET_LABEL"           fun nil                 (system) "Result = %s( Parent)" (("ALIGN_CENTER") ("ALIGN_LEFT") ("ALIGN_RIGHT") ("DYNAMIC_RESIZE") ("FONT") ("FRAME") ("FUNC_GET_VALUE") ("GROUP_LEADER") ("KILL_NOTIFY") ("NO_COPY") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("SCR_XSIZE") ("SCR_YSIZE") ("SENSITIVE") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("VALUE") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
-    ("WIDGET_LIST"            fun nil                 (system) "Result = %s( Parent)" (("EVENT_FUNC") ("EVENT_PRO") ("FONT") ("FRAME") ("FUNC_GET_VALUE") ("GROUP_LEADER") ("KILL_NOTIFY") ("MULTIPLE") ("NO_COPY") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("SCR_XSIZE") ("SCR_YSIZE") ("SENSITIVE") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("VALUE") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
+    ("WIDGET_LIST"            fun nil                 (system) "Result = %s( Parent)" (("CONTEXT_EVENTS") ("EVENT_FUNC") ("EVENT_PRO") ("FONT") ("FRAME") ("FUNC_GET_VALUE") ("GROUP_LEADER") ("KILL_NOTIFY") ("MULTIPLE") ("NO_COPY") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("SCR_XSIZE") ("SCR_YSIZE") ("SENSITIVE") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("VALUE") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
     ("WIDGET_SLIDER"          fun nil                 (system) "Result = %s( Parent)" (("DRAG") ("EVENT_FUNC") ("EVENT_PRO") ("FONT") ("FRAME") ("FUNC_GET_VALUE") ("GROUP_LEADER") ("KILL_NOTIFY") ("MAXIMUM") ("MINIMUM") ("NO_COPY") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("SCR_XSIZE") ("SCR_YSIZE") ("SCROLL") ("SENSITIVE") ("SUPPRESS_VALUE") ("TITLE") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("VALUE") ("VERTICAL") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
     ("WIDGET_TABLE"           fun nil                 (system) "Result = %s( Parent)" (("ALIGNMENT") ("ALL_EVENTS") ("AM_PM") ("COLUMN_LABELS") ("COLUMN_MAJOR") ("COLUMN_WIDTHS") ("DAYS_OF_WEEK") ("EDITABLE") ("EVENT_FUNC") ("EVENT_PRO") ("FONT") ("FORMAT") ("FRAME") ("FUNC_GET_VALUE") ("GROUP_LEADER") ("KBRD_FOCUS_EVENTS") ("KILL_NOTIFY") ("MONTHS") ("NO_COPY") ("NO_HEADERS") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESIZEABLE_COLUMNS") ("RESIZEABLE_ROWS") ("RESOURCE_NAME") ("ROW_HEIGHTS") ("ROW_LABELS") ("ROW_MAJOR") ("SCR_XSIZE") ("SCR_YSIZE") ("SCROLL") ("SENSITIVE") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("VALUE") ("X_SCROLL_SIZE") ("XOFFSET") ("XSIZE") ("Y_SCROLL_SIZE") ("YOFFSET") ("YSIZE")))
-    ("WIDGET_TEXT"            fun nil                 (system) "Result = %s( Parent)" (("ALL_EVENTS") ("EDITABLE") ("EVENT_FUNC") ("EVENT_PRO") ("FONT") ("FRAME") ("FUNC_GET_VALUE") ("GROUP_LEADER") ("KBRD_FOCUS_EVENTS") ("KILL_NOTIFY") ("NO_COPY") ("NO_NEWLINE") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("SCR_XSIZE") ("SCR_YSIZE") ("SCROLL") ("SENSITIVE") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("VALUE") ("WRAP") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
+    ("WIDGET_TEXT"            fun nil                 (system) "Result = %s( Parent)" (("ALL_EVENTS") ("CONTEXT_EVENTS") ("EDITABLE") ("EVENT_FUNC") ("EVENT_PRO") ("FONT") ("FRAME") ("FUNC_GET_VALUE") ("GROUP_LEADER") ("KBRD_FOCUS_EVENTS") ("KILL_NOTIFY") ("NO_COPY") ("NO_NEWLINE") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("SCR_XSIZE") ("SCR_YSIZE") ("SCROLL") ("SENSITIVE") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("VALUE") ("WRAP") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
     ("WRITE_SYLK"             fun nil                 (system) "Result = %s( File, Data)" (("STARTCOL") ("STARTROW")))
     ("WTN"                    fun nil                 (system) "Result = %s( A, Coef)" (("COLUMN") ("DOUBLE") ("INVERSE") ("OVERWRITE")))
     ("XFONT"                  fun nil                 (system) "Result = %s()" (("GROUP") ("PRESERVE_FONT_INFO")))
@@ -1085,6 +1123,9 @@
     ("ComputeMesh"            fun "IDLanROIGroup"     (system) "Result = Obj->[%s::]%s( Vertices, Conn)" (("CAPPED") ("SURFACE_AREA")))
     ("ContainsPoints"         fun "IDLanROIGroup"     (system) "Result = Obj->[%s::]%s( X[, Y[, Z]] )" nil)
     ("Init"                   fun "IDLanROIGroup"     (system) "Result = Obj->[%s::]%s( ) ('IDLanROIGroup')" nil)
+    ("GetProperty"            pro "IDLcomIDispatch"   (system) "Obj->[%s::]%s" (("PROPERTY_NAME")))
+    ("SetProperty"            pro "IDLcomIDispatch"   (system) "Obj->[%s::]%s" (("PROPERTY_NAME")))
+    ("Init"                   fun "IDLcomIDispatch"   (system) "Result = Obj -> [%s::]%s()" nil)
     ("Connect"                pro "IDLdbDatabase"     (system) "DBobj ->[%s::]%s" (("CONNECTION") ("DATASOURCE") ("PASSWORD") ("USER_ID")))
     ("ExecuteSQL"             pro "IDLdbDatabase"     (system) "DBobj->ExecuteSQL, strSQL" nil)
     ("GetProperty"            pro "IDLdbDatabase"     (system) "DBobj->GetProperty" (("CAN_GET_TABLES") ("DBMS_NAME") ("DBMS_VERSION") ("DRIVER_ODBC_LEVEL") ("DRIVER_VERSION") ("IS_CONNECTED") ("IS_READONLY") ("MAX_CONNECTIONS") ("MAX_RECORDSETS") ("ODBC_LEVEL") ("SQL_LEVEL") ("SQL_SERVER_NAME") ("USE_CURSOR_LIB") ("USER_NAME")))
@@ -1129,6 +1170,11 @@
     ("IsValid"                fun "IDLffLanguageCat"  (system) "Result = Obj ->[%s::]%s( )" nil)
     ("Query"                  fun "IDLffLanguageCat"  (system) "Result = Obj ->[%s::]%s( key)" (("DEFAULT_STRING")))
     ("SetCatalog"             fun "IDLffLanguageCat"  (system) "Result = Obj ->[%s::]%s( application)" (("FILENAME") ("LOCALE") ("PATH")))
+    ("Cleanup"                pro "IDLffMrSID"        (system) "Obj -> [%s::]%s" nil)
+    ("GetProperty"            pro "IDLffMrSID"        (system) "Obj->[%s::]%s" (("CHANNELS") ("DIMENSIONS") ("GEO_ORIGIN") ("GEO_PROJTYPE") ("GEO_RESOLUTION") ("GEO_VALID") ("LEVELS") ("PIXEL_TYPE") ("TYPE")))
+    ("GetDimsAtLevel"         fun "IDLffMrSID"        (system) "Dims = Obj -> [%s::]%s ( Level )" nil)
+    ("GetImageData"           fun "IDLffMrSID"        (system) "ImageData = Obj->[%s::]%s ()" (("LEVEL") ("SUB_RECT")))
+    ("Init"                   fun "IDLffMrSID"        (system) "Result = Obj -> [%s::]%s(, Filename)" (("QUIET")))
     ("AddAttribute"           pro "IDLffShape"        (system) "Obj->[%s::]%s, Name, Type, Width" (("PRECISION")))
     ("Cleanup"                pro "IDLffShape"        (system) "Obj -> [%s::]%s" nil)
     ("Close"                  pro "IDLffShape"        (system) "Obj->[%s::]%s" nil)
@@ -1138,7 +1184,7 @@
     ("SetAttributes"          pro "IDLffShape"        (system) "Obj->[%s::]%s, Index, Attribute_Num, Value or Obj->[IDLffShape::]SetAttributes, Index, Attributes" nil)
     ("GetAttributes"          fun "IDLffShape"        (system) "Result = Obj->[%s::]%s([Index])" (("ALL") ("ATTRIBUTE_STRUCTURE")))
     ("GetEntity"              fun "IDLffShape"        (system) "Result = Obj->[%s::]%s( [Index])" (("ALL") ("ATTRIBUTES")))
-    ("Init"                   fun "IDLffShape"        (system) "Result = Obj -> [%s::]%s()" nil)
+    ("Init"                   fun "IDLffShape"        (system) "Result = Obj -> [%s::]%s( [ Filename])" (("ENTITY_TYPE") ("UPDATE")))
     ("Open"                   fun "IDLffShape"        (system) "Result = Obj->[%s::]%s( `Filename')" (("ENTITY_TYPE") ("UPDATE")))
     ("Cleanup"                pro "IDLgrAxis"         (system) "Obj -> [%s::]%s" nil)
     ("GetProperty"            pro "IDLgrAxis"         (system) "Obj -> [%s::]%s" (("ALL") ("AM_PM") ("COLOR") ("CRANGE") ("DAYS_OF_WEEK") ("DIRECTION") ("EXACT") ("EXTEND") ("GRIDSTYLE") ("HIDE") ("LOCATION") ("LOG") ("MAJOR") ("MINOR") ("MONTHS") ("NAME") ("NOTEXT") ("PALETTE") ("PARENT") ("RANGE") ("SUBTICKLEN") ("TEXTALIGNMENTS") ("TEXTBASELINE") ("TEXTPOS") ("TEXTUPDIR") ("THICK") ("TICKDIR") ("TICKFORMAT") ("TICKFRMTDATA") ("TICKINTERVAL") ("TICKLAYOUT") ("TICKLEN") ("TICKTEXT") ("TICKUNITS") ("TICKVALUES") ("TITLE") ("USE_TEXT_COLOR") ("UVALUE") ("XCOORD_CONV") ("XRANGE") ("YCOORD_CONV") ("YRANGE") ("ZCOORD_CONV") ("ZRANGE")))
@@ -1155,7 +1201,7 @@
     ("GetFontnames"           fun "IDLgrBuffer"       (system) "Return = Obj -> [%s::]%s( FamilyName)" (("IDL_FONTS") ("STYLES")))
     ("GetTextDimensions"      fun "IDLgrBuffer"       (system) "Result = Obj ->[%s::]%s( TextObj)" (("DESCENT") ("PATH")))
     ("Init"                   fun "IDLgrBuffer"       (system) "Result = Obj -> [%s::]%s( ) ('IDLgrBuffer')" (("COLOR_MODEL") ("DIMENSIONS") ("GRAPHICS_TREE") ("N_COLORS") ("PALETTE") ("QUALITY") ("RESOLUTION") ("UNITS") ("UVALUE")))
-    ("PickData"               fun "IDLgrBuffer"       (system) "Result = Obj -> [%s::]%s( View, Object, Location, XYZLocation)" (("PATH")))
+    ("PickData"               fun "IDLgrBuffer"       (system) "Result = Obj -> [%s::]%s( View, Object, Location, XYZLocation)" (("DIMENSIONS") ("PATH")))
     ("Read"                   fun "IDLgrBuffer"       (system) "Result = Obj -> [%s::]%s()" nil)
     ("Select"                 fun "IDLgrBuffer"       (system) "Result = Obj -> [%s::]%s(Picture, XY)" (("DIMENSIONS") ("UNITS")))
     ("Cleanup"                pro "IDLgrClipboard"    (system) "Obj-> [%s::]%s" nil)
@@ -1173,13 +1219,13 @@
     ("ComputeDimensions"      fun "IDLgrColorbar"     (system) "Result = Obj ->[%s::]%s( DestinationObj)" (("PATH")))
     ("Init"                   fun "IDLgrColorbar"     (system) "Result = Obj -> [%s::]%s( [aRed, aGreen, aBlue] ) ( 'IDLgrColorbar' [, aRed, aGreen, aBlue])" (("BLUE_VALUES") ("COLOR") ("DIMENSIONS") ("GREEN_VALUES") ("HIDE") ("MAJOR") ("MINOR") ("NAME") ("PALETTE") ("RED_VALUES") ("SHOW_AXIS") ("SHOW_OUTLINE") ("SUBTICKLEN") ("THICK") ("THREED") ("TICKFORMAT") ("TICKFRMTDATA") ("TICKLEN") ("TICKTEXT") ("TICKVALUES") ("TITLE") ("UVALUE") ("XCOORD_CONV") ("YCOORD_CONV") ("ZCOORD_CONV")))
     ("Cleanup"                pro "IDLgrContour"      (system) "Obj -> [%s::]%s" nil)
-    ("GetProperty"            pro "IDLgrContour"      (system) "Obj -> [%s::]%s" (("ALL") ("ANISOTROPY") ("C_COLOR") ("C_FILL_PATTERN") ("C_LINESTYLE") ("C_THICK") ("C_VALUE") ("COLOR") ("DATA_VALUES") ("DOWNHILL") ("FILL") ("GEOM") ("HIDE") ("MAX_VALUE") ("MIN_VALUE") ("N_LEVELS") ("NAME") ("PALETTE") ("PARENT") ("PLANAR") ("POLYGONS") ("SHADE_RANGE") ("SHADING") ("TICKINTERVAL") ("TICKLEN") ("UVALUE") ("XCOORD_CONV") ("XRANGE") ("YCOORD_CONV") ("YRANGE") ("ZCOORD_CONV") ("ZRANGE")))
-    ("SetProperty"            pro "IDLgrContour"      (system) "Obj -> [%s::]%s" (("ANISOTROPY") ("C_COLOR") ("C_FILL_PATTERN") ("C_LINESTYLE") ("C_THICK") ("C_VALUE") ("COLOR") ("DATA_VALUES") ("DOWNHILL") ("FILL") ("GEOMX") ("GEOMY") ("GEOMZ") ("HIDE") ("MAX_VALUE") ("MIN_VALUE") ("N_LEVELS") ("NAME") ("PALETTE") ("PLANAR") ("POLYGONS") ("SHADE_RANGE") ("SHADING") ("TICKINTERVAL") ("TICKLEN") ("UVALUE") ("XCOORD_CONV") ("YCOORD_CONV") ("ZCOORD_CONV")))
+    ("GetProperty"            pro "IDLgrContour"      (system) "Obj -> [%s::]%s" (("ALL") ("ANISOTROPY") ("C_COLOR") ("C_FILL_PATTERN") ("C_LINESTYLE") ("C_THICK") ("C_VALUE") ("COLOR") ("DATA_VALUES") ("DEPTH_OFFSET") ("DOWNHILL") ("FILL") ("GEOM") ("HIDE") ("MAX_VALUE") ("MIN_VALUE") ("N_LEVELS") ("NAME") ("PALETTE") ("PARENT") ("PLANAR") ("POLYGONS") ("SHADE_RANGE") ("SHADING") ("TICKINTERVAL") ("TICKLEN") ("UVALUE") ("XCOORD_CONV") ("XRANGE") ("YCOORD_CONV") ("YRANGE") ("ZCOORD_CONV") ("ZRANGE")))
+    ("SetProperty"            pro "IDLgrContour"      (system) "Obj -> [%s::]%s" (("ANISOTROPY") ("C_COLOR") ("C_FILL_PATTERN") ("C_LINESTYLE") ("C_THICK") ("C_VALUE") ("COLOR") ("DATA_VALUES") ("DEPTH_OFFSET") ("DOWNHILL") ("FILL") ("GEOMX") ("GEOMY") ("GEOMZ") ("HIDE") ("MAX_VALUE") ("MIN_VALUE") ("N_LEVELS") ("NAME") ("PALETTE") ("PLANAR") ("POLYGONS") ("SHADE_RANGE") ("SHADING") ("TICKINTERVAL") ("TICKLEN") ("UVALUE") ("XCOORD_CONV") ("YCOORD_CONV") ("ZCOORD_CONV")))
     ("GetCTM"                 fun "IDLgrContour"      (system) "Result = Obj -> [%s::]%s()" (("DESTINATION") ("PATH") ("TOP")))
-    ("Init"                   fun "IDLgrContour"      (system) "Result = Obj -> [%s::]%s( [Values] ) ('IDLgrContour' [, Values])" (("ANISOTROPY") ("C_COLOR") ("C_FILL_PATTERN") ("C_LINESTYLE") ("C_THICK") ("C_VALUE") ("COLOR") ("DATA_VALUES") ("DOUBLE_DATA") ("DOUBLE_GEOM") ("DOWNHILL") ("FILL") ("GEOMX") ("GEOMY") ("GEOMZ") ("HIDE") ("MAX_VALUE") ("MIN_VALUE") ("N_LEVELS") ("NAME") ("PALETTE") ("PLANAR") ("POLYGONS") ("SHADE_RANGE") ("SHADING") ("TICKINTERVAL") ("TICKLEN") ("UVALUE") ("XCOORD_CONV") ("YCOORD_CONV") ("ZCOORD_CONV")))
+    ("Init"                   fun "IDLgrContour"      (system) "Result = Obj -> [%s::]%s( [Values] ) ('IDLgrContour' [, Values])" (("ANISOTROPY") ("C_COLOR") ("C_FILL_PATTERN") ("C_LINESTYLE") ("C_THICK") ("C_VALUE") ("COLOR") ("DATA_VALUES") ("DEPTH_OFFSET") ("DOUBLE_DATA") ("DOUBLE_GEOM") ("DOWNHILL") ("FILL") ("GEOMX") ("GEOMY") ("GEOMZ") ("HIDE") ("MAX_VALUE") ("MIN_VALUE") ("N_LEVELS") ("NAME") ("PALETTE") ("PLANAR") ("POLYGONS") ("SHADE_RANGE") ("SHADING") ("TICKINTERVAL") ("TICKLEN") ("UVALUE") ("XCOORD_CONV") ("YCOORD_CONV") ("ZCOORD_CONV")))
     ("Cleanup"                pro "IDLgrFont"         (system) "Obj -> [%s::]%s" nil)
-    ("GetProperty"            pro "IDLgrFont"         (system) "Obj -> [%s:]%s" (("ALL") ("NAME") ("SIZE") ("SUBSTITUTE") ("THICK") ("UVALUE")))
-    ("SetProperty"            pro "IDLgrFont"         (system) "Obj -> [%s:]%s" (("NAME") ("SIZE") ("SUBSTITUTE") ("THICK") ("UVALUE")))
+    ("GetProperty"            pro "IDLgrFont"         (system) "" (("NAME") ("SIZE") ("SUBSTITUTE") ("THICK") ("UVALUE")))
+    ("SetProperty"            pro "IDLgrFont"         (system) "" (("NAME") ("SIZE") ("SUBSTITUTE") ("THICK") ("UVALUE")))
     ("Init"                   fun "IDLgrFont"         (system) "Result = Obj -> [%s::]%s( [Fontname] ) ('IDLgrFont' [, Fontname])" (("NAME") ("SIZE") ("SUBSTITUTE") ("THICK") ("UVALUE")))
     ("Cleanup"                pro "IDLgrImage"        (system) "Obj -> [%s::]%s" nil)
     ("GetProperty"            pro "IDLgrImage"        (system) "Obj -> [%s::]%s" (("ALL") ("BLEND_FUNCTION") ("CHANNEL") ("DATA") ("DIMENSIONS") ("GREYSCALE") ("HIDE") ("INTERLEAVE") ("INTERPOLATE") ("LOCATION") ("NAME") ("NO_COPY") ("ORDER") ("PALETTE") ("PARENT") ("SUB_RECT") ("UVALUE") ("XCOORD_CONV") ("XRANGE") ("YCOORD_CONV") ("YRANGE") ("ZCOORD_CONV") ("ZRANGE")))
@@ -1313,7 +1359,7 @@
     ("SetProperty"            pro "IDLgrVRML"         (system) "Obj -> [%s::]%s" (("DIMENSIONS") ("FILENAME") ("GRAPHICS_TREE") ("PALETTE") ("QUALITY") ("RESOLUTION") ("UNITS") ("UVALUE")))
     ("GetFontnames"           fun "IDLgrVRML"         (system) "Return = Obj ->[%s::]%s( FamilyName)" (("IDL_FONTS") ("STYLES")))
     ("GetTextDimensions"      fun "IDLgrVRML"         (system) "Result = Obj ->[%s::]%s( TextObj)" (("DESCENT") ("PATH")))
-    ("Init"                   fun "IDLgrVRML"         (system) "Result = Obj -> [%s::]%s( ) ('IDLgrVRML')" (("COLOR_MODEL") ("DIMENSIONS") ("FILENAME") ("GRAPHICS_TREE") ("N_COLORS") ("PALETTE") ("QUALITY") ("RESOLUTION") ("UNITS") ("UVALUE") ("WORLDTITLE") ("WORLDINFO")))
+    ("Init"                   fun "IDLgrVRML"         (system) "Result = Obj -> [%s::]%s( ) ('IDLgrVRML')" (("COLOR_MODEL") ("DIMENSIONS") ("FILENAME") ("GRAPHICS_TREE") ("N_COLORS") ("PALETTE") ("QUALITY") ("RESOLUTION") ("UNITS") ("UVALUE") ("WORLDINFO") ("WORLDTITLE")))
     ("Cleanup"                pro "IDLgrWindow"       (system) "Obj -> [%s::]%s" nil)
     ("Draw"                   pro "IDLgrWindow"       (system) "Obj -> [%s::]%s [, Picture]" (("CREATE_INSTANCE") ("DRAW_INSTANCE")))
     ("Erase"                  pro "IDLgrWindow"       (system) "Obj -> [%s::]%s" (("COLOR")))
@@ -1334,18 +1380,19 @@
     ("Init"                   fun "TrackBall"         (system) "Result = Obj -> [%s::]%s( Center, Radius ) ('TrackBall', Center, Radius)" (("AXIS") ("CONSTRAIN") ("MOUSE")))
     ("Update"                 fun "TrackBall"         (system) "Result = Obj -> [%s::]%s( sEvent)" (("MOUSE") ("TRANSFORM") ("TRANSLATE")))
    )
-  "1287 builtin routines with 5724 keywords for IDL version 5.4.")
+  "1324 builtin routines with 5958 keywords for IDL version 5.5.")
 
 (setq idlwave-system-variables-alist
   '(
     ("C")
+    ("CPU" ("HW_VECTOR") ("VECTOR_ENABLE") ("HW_NCPU") ("TPOOL_NTHREADS") ("TPOOL_MIN_ELTS") ("TPOOL_MAX_ELTS"))
     ("D" ("NAME") ("X_SIZE") ("Y_SIZE") ("X_VSIZE") ("Y_VSIZE") ("X_CH_SIZE") ("Y_CH_SIZE") ("X_PX_CM") ("Y_PX_CM") ("N_COLORS") ("TABLE_SIZE") ("FILL_DIST") ("WINDOW") ("UNIT") ("FLAGS") ("ORIGIN") ("ZOOM"))
     ("DIR")
     ("DLM_PATH")
     ("DPI")
     ("DTOR")
     ("EDIT_INPUT")
-    ("ERROR_STATE" ("NAME") ("BLOCK") ("CODE") ("SYS_CODE") ("MSG") ("SYS_MSG") ("MSG_PREFIX"))
+    ("ERROR_STATE" ("NAME") ("BLOCK") ("CODE") ("SYS_CODE") ("SYS_CODE_TYPE") ("MSG") ("SYS_MSG") ("MSG_PREFIX"))
     ("EXCEPT")
     ("HELP_PATH")
     ("JOURNAL")
@@ -1361,8 +1408,8 @@
     ("QUIET")
     ("RADEG")
     ("VALUES" ("F_INFINITY") ("F_NAN") ("D_INFINITY") ("D_NAN"))
-    ("VERSION" ("ARCH") ("OS") ("OS_FAMILY") ("RELEASE") ("BUILD_DATE") ("MEMORY_BITS") ("FILE_OFFSET_BITS"))
-    ("WARN" ("OBS_ROUTINES") ("OBS_SYSVARS") ("PARENS") ("TRUNCATED_FILENAME"))
+    ("VERSION" ("ARCH") ("OS") ("OS_FAMILY") ("OS_NAME") ("RELEASE") ("BUILD_DATE") ("MEMORY_BITS") ("FILE_OFFSET_BITS"))
+    ("WARN" ("OBS_ROUTINES") ("OBS_SYSVARS") ("PARENS"))
     ("X" ("TITLE") ("TYPE") ("STYLE") ("TICKS") ("TICKLEN") ("THICK") ("RANGE") ("CRANGE") ("S") ("MARGIN") ("OMARGIN") ("WINDOW") ("REGION") ("CHARSIZE") ("MINOR") ("TICKV") ("TICKNAME") ("GRIDSTYLE") ("TICKFORMAT") ("TICKINTERVAL") ("TICKLAYOUT") ("TICKUNITS"))
     ("Y" ("TITLE") ("TYPE") ("STYLE") ("TICKS") ("TICKLEN") ("THICK") ("RANGE") ("CRANGE") ("S") ("MARGIN") ("OMARGIN") ("WINDOW") ("REGION") ("CHARSIZE") ("MINOR") ("TICKV") ("TICKNAME") ("GRIDSTYLE") ("TICKFORMAT") ("TICKINTERVAL") ("TICKLAYOUT") ("TICKUNITS"))
     ("Z" ("TITLE") ("TYPE") ("STYLE") ("TICKS") ("TICKLEN") ("THICK") ("RANGE") ("CRANGE") ("S") ("MARGIN") ("OMARGIN") ("WINDOW") ("REGION") ("CHARSIZE") ("MINOR") ("TICKV") ("TICKNAME") ("GRIDSTYLE") ("TICKFORMAT") ("TICKINTERVAL") ("TICKLAYOUT") ("TICKUNITS"))))
@@ -1373,30 +1420,30 @@
     ("IDLgrAxis"
      (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRAXIS_TOP" "IDLGRAXISVERSION" "AM_PM" "AXIS_TYPE" "CALCFLAGS" "DAYS_OF_WEEK" "DIRECTION" "AXISFLAGS" "GRIDSTYLE" "LOCATION" "MAJOR" "MINOR" "MONTHS" "OUTRANGE" "RANGE" "SUBTICKLEN" "TEXTALIGNMENTS" "TEXTBASELINE" "TEXTUPDIR" "THICK" "TICKDIR" "TICKFORMAT" "ARRAY_TICKFORMAT" "TICKFRMTDATA" "TICKINTERVAL" "TICKLAYOUT" "TICKLEN" "TICKTEXT" "TICKUNITCODES" "TICKUNITS" "TICKVALUES" "TITLE" "CURRENT_LEVEL" "LEVEL_DATA" "STEPRANGEUNITS" "STEPRANGE")
      (inherits))
+    ("IDLgrContour"
+     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRCONTOURTOP" "IDLGRCONTOURVERSION" "ANISOTROPY" "DATA_FORMAT" "DATA" "GEOM_FORMAT" "GEOM" "CONTOURFLAGS" "C_COLOR" "C_FILLPATTERN" "C_LINESTYLE" "C_THICK" "C_VALUE" "MAXVAL" "MINVAL" "NLEVELS" "POLYGONS" "SHADERANGE" "SHADING" "TICKINTERVAL" "TICKLEN" "PRECISIONDATA" "PRECISIONGEOM" "PRECISIONGRAPH" "LEVELINFO" "CFILL1" "DEPTHOFFSET" "IDLGRCONTOURBOTTOM")
+     (inherits))
     ("IDLgrLegend"
      (tags "OSCALENODE" "BORDER_GAP" "COLUMNS" "OOUTLINE" "OFILL" "OFONT" "GAP" "GLYPHWIDTH" "PITEM_COLOR" "PITEM_LINESTYLE" "PITEM_NAME" "PITEM_OBJECT" "PITEM_THICK" "PITEM_TYPE" "OTITLE" "PTEXT_COLOR" "BRECOMPUTE" "PGLYPHS" "PTEXTS" "HGLYPHWIDTH" "VGLYPHWIDTH" "COLORMODE" "CLEANLEAVE" "CLEANGLYPHS" "IDLGRLEGENDVERSION")
      (inherits "IDLgrModel"))
-    ("IDLgrContour"
-     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRCONTOURTOP" "IDLGRCONTOURVERSION" "ANISOTROPY" "DATA_FORMAT" "DATA" "GEOM_FORMAT" "GEOM" "CONTOURFLAGS" "C_COLOR" "C_FILLPATTERN" "C_LINESTYLE" "C_THICK" "C_VALUE" "MAXVAL" "MINVAL" "NLEVELS" "POLYGONS" "SHADERANGE" "SHADING" "TICKINTERVAL" "TICKLEN" "PRECISIONDATA" "PRECISIONGEOM" "PRECISIONGRAPH" "LEVELINFO" "CFILL1" "IDLGRCONTOURBOTTOM")
-     (inherits))
     ("IDLgrROI"
      (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRROI_TOP" "IDLGRROIVERSION" "LINESTYLE" "STYLE" "SYMBOL" "THICK" "IDLGRROI_BOTTOM")
      (inherits "IDLanROI"))
     ("IDLgrSurface"
-     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRSURFACETOP" "IDLGRSURFACEVERSION" "DATA" "PRECISION" "SKIRT" "VERTCOLORS" "BTMCOLOR" "SURFACEFLAGS" "LINESTYLE" "MAXVALUE" "MINVALUE" "SHADING" "SHADERANGE" "STYLE" "NORMALS" "TXTRCOORD" "TXTRMAP" "THICK" "IDLGRSURFACEBOTTOM")
+     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRSURFACETOP" "IDLGRSURFACEVERSION" "DATA" "PRECISION" "SKIRT" "VERTCOLORS" "BTMCOLOR" "SURFACEFLAGS" "LINESTYLE" "MAXVALUE" "MINVALUE" "SHADING" "SHADERANGE" "STYLE" "NORMALS" "TXTRCOORD" "TXTRMAP" "THICK" "DEPTHOFFSET" "IDLGRSURFACEBOTTOM")
+     (inherits))
+    ("IDLgrPolygon"
+     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRPOLYGONTOP" "IDLGRPOLYGONVERSION" "DATA" "PRECISION" "FILLPATTERN" "POLYGONS" "NORMALS" "POLYGONFLAGS" "SHADING" "SHADERANGE" "STYLE" "TXTRCOORD" "TXTRMAP" "VERTCOLORS" "BTMCOLOR" "LINESTYLE" "THICK" "DEPTHOFFSET" "IDLGRPOLYGONBOTTOM")
      (inherits))
     ("IDLgrWindow"
      (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "UVALUE" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRWINDOW_TOP" "IDLGRWINDOWVERSION" "WINDOWFLAGS" "DIMENSIONS" "DISPLAYNAME" "INDEX" "LOCATION" "RENDERER" "RETAIN" "SCREENDIMENSIONS" "SELF" "TITLE" "UNITS" "NEXT" "WFILL1" "PARENT" "WFILL2" "IDLGRWINDOW_BOTTOM")
      (inherits))
-    ("IDLgrPolygon"
-     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRPOLYGONTOP" "IDLGRPOLYGONVERSION" "DATA" "PRECISION" "FILLPATTERN" "POLYGONS" "NORMALS" "POLYGONFLAGS" "SHADING" "SHADERANGE" "STYLE" "TXTRCOORD" "TXTRMAP" "VERTCOLORS" "BTMCOLOR" "LINESTYLE" "THICK" "IDLGRPOLYGONBOTTOM")
+    ("IDLgrPlot"
+     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRPLOT_TOP" "IDLGRPLOTVERSION" "DATA" "PLOTFLAGS" "LINESTYLE" "PRECISION" "MAXVAL" "MINVAL" "NSUM" "SYMBOL" "PSYMBOL" "THICK" "VERTCOLORS" "ZVALUE" "LINEDATA" "PFILL1" "IDLGRPLOT_BOTTOM")
      (inherits))
     ("IDLgrVolume"
      (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRVOLUMETOP" "IDLGRVOLUMEVERSION" "AMBIENT" "BOUNDS" "LIMITS" "DIMENSIONS" "COLORTABLE" "COMPOSITEFUNC" "CUTPLANES" "NUMCUTPLANES" "DEPTH_CUE" "OPACITYTABLE" "RENDERSTEP" "DATA" "EDM_VOLUME" "VOLUMEFLAGS" "IDLGRVOLUMEBOTTOM")
      (inherits))
-    ("IDLgrPlot"
-     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRPLOT_TOP" "IDLGRPLOTVERSION" "DATA" "PLOTFLAGS" "LINESTYLE" "PRECISION" "MAXVAL" "MINVAL" "NSUM" "SYMBOL" "PSYMBOL" "THICK" "VERTCOLORS" "ZVALUE" "LINEDATA" "PFILL1" "IDLGRPLOT_BOTTOM")
-     (inherits))
     ("IDLgrROIGroup"
      (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRROIGROUP_TOP" "IDLGRROIGROUPVERSION" "IDLGRROI_BOTTOM")
      (inherits "IDLanROIGroup"))
@@ -1406,39 +1453,39 @@
     ("IDLgrText"
      (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRTEXT_TOP" "IDLGRTEXTVERSION" "TEXTFLAGS" "ALIGNMENT" "BASELINE" "CHAR_DIMENSIONS" "RECOMP_CTM" "FONT" "LOCATIONS" "STRINGS" "SUBPARENT" "UPDIR" "VERTICAL_ALIGNMENT" "IDLGRTEXT_BOTTOM")
      (inherits))
-    ("IDLgrPolyline"
-     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRPOLYLINETOP" "IDLGRPOLYLINEVERSION" "DATA" "PRECISION" "LINESTYLE" "POLYLINES" "SYMBOL" "PSYMBOL" "THICK" "SHADING" "VERTCOLORS" "IDLGRPOLYLINEBOTTOM")
+    ("IDLgrImage"
+     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRIMAGE_TOP" "IDLGRIMAGEVERSION" "CHANNEL" "DATA" "DIMENSIONS" "SUB_RECT" "IMAGEFLAGS" "LOCATION" "INTERLEAVE" "INTERPOLATE" "BLEND_FUNCTIONS" "IDLGRIMAGE_BOTTOM")
      (inherits))
     ("IDLgrView"
      (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRCONTAINER_TOP" "IDLGRCONTAINERVERSION" "ISDYING" "IDLGRCONTAINER_BOTTOM" "IDLGRVIEW_TOP" "IDLGRVIEWVERSION" "COLOR" "DEPTH_CUE" "DIMENSIONS" "PRECISION" "EYE" "LOCATION" "OBLIQUE" "PROJECTION" "TRANSPARENT" "UNITS" "VIEW" "ZCLIP" "IDLGRVIEW_BOTTOM")
      (inherits "IDL_Container"))
-    ("IDLgrImage"
-     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRIMAGE_TOP" "IDLGRIMAGEVERSION" "CHANNEL" "DATA" "DIMENSIONS" "SUB_RECT" "IMAGEFLAGS" "LOCATION" "INTERLEAVE" "INTERPOLATE" "BLEND_FUNCTIONS" "IDLGRIMAGE_BOTTOM")
+    ("IDLgrPolyline"
+     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRPOLYLINETOP" "IDLGRPOLYLINEVERSION" "DATA" "PRECISION" "LINESTYLE" "POLYLINES" "SYMBOL" "PSYMBOL" "THICK" "SHADING" "VERTCOLORS" "IDLGRPOLYLINEBOTTOM")
      (inherits))
     ("IDLgrLight"
      (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRGRAPHIC_TOP" "IDLGRGRAPHICVERSION" "COLOR" "GRAPHICFLAGS" "PALETTE" "XCOORD_CONV" "YCOORD_CONV" "ZCOORD_CONV" "XRANGE" "YRANGE" "ZRANGE" "GRAPHIC_DATA_OBJECT" "IDLGRGRAPHIC_BOTTOM" "IDLGRLIGHT_TOP" "IDLGRLIGHTVERSION" "ATTENUATION" "CONEANGLE" "DIRECTION" "FOCUS" "INTENSITY" "LOCATION" "TYPE" "IDLGRLIGHT_BOTTOM")
      (inherits))
+    ("IDLgrVRML"
+     (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "UVALUE" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRVRMLTOP" "IDLGRVRMLVERSION" "UNITS" "DIMENSIONS" "FILENAME" "WORLDINFO" "WORLDTITLE" "IDLGRVRMLBOTTOM")
+     (inherits))
     ("IDLgrClipboard"
      (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "UVALUE" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRCLIPBOARDTOP" "IDLGRCLIPBOARDVERSION" "UNITS" "DIMENSIONS" "FILENAME" "VECTOR" "POSTSCRIPT" "IDLGRCLIPBOARDBOTTOM")
      (inherits))
-    ("IDLgrVRML"
-     (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "UVALUE" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRVRMLTOP" "IDLGRVRMLVERSION" "UNITS" "DIMENSIONS" "FILENAME" "WORLDINFO" "WORLDTITLE" "IDLGRVRMLBOTTOM")
-     (inherits))
     ("IDLgrPrinter"
      (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "UVALUE" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRPRINTER_TOP" "IDLGRPRINTERVERSION" "PRINTERFLAGS" "NAME" "NCOPIES" "UNITS" "GAMMA" "IDLGRPRINTER_BOTTOM")
      (inherits))
     ("IDLgrBuffer"
      (tags "IDLGRSRCDEST_TOP" "IDLGRSRCDESTVERSION" "CLIENTDIMENSIONS" "COLORMODEL" "SRCDESTFLAGS" "GRAPHICS_TREE" "NCOLORS" "PALETTE" "QUALITY" "RESOLUTION" "UVALUE" "DIST" "FILL1" "DEV" "FILL2" "ATTRS" "FILL3" "CACHES" "FILL4" "IDLGRSRCDEST_BOTTOM" "IDLGRBUFFERTOP" "IDLGRBUFFERVERSION" "UNITS" "DIMENSIONS" "IDLGRBUFFERBOTTOM")
      (inherits))
+    ("IDLgrMPEG"
+     (tags "IDLGRMPEG_TOP" "IDLGRMPEGVERSION" "DIMENSIONS" "FILENAME" "FORMAT" "FRAMERATE" "INTERLACED" "QUALITY" "SCALE" "STATISTICS" "DISPLAYDIMS" "FIRSTFRAME" "LASTFRAME" "MPEGID" "TEMPNODE" "TEMPNODEFILLER" "TEMP_DIRECTORY" "BITRATE" "IFRAME_GAP" "MOTION_LENGTH" "FLAGS" "IDLGRMPEG_BOTTOM")
+     (inherits))
+    ("IDLgrScene"
+     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRCONTAINER_TOP" "IDLGRCONTAINERVERSION" "ISDYING" "IDLGRCONTAINER_BOTTOM" "IDLGRSCENE_TOP" "IDLGRSCENEVERSION" "COLOR" "TRANSPARENT" "IDLGRSCENE_BOTTOM")
+     (inherits "IDL_Container"))
     ("IDLgrModel"
      (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRCONTAINER_TOP" "IDLGRCONTAINERVERSION" "ISDYING" "IDLGRCONTAINER_BOTTOM" "IDLGRMODEL_TOP" "IDLGRMODELVERSION" "MODELFLAGS" "TRANSFORM" "IDLGRMODEL_BOTTOM")
      (inherits "IDL_Container"))
-    ("IDLgrScene"
-     (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRCONTAINER_TOP" "IDLGRCONTAINERVERSION" "ISDYING" "IDLGRCONTAINER_BOTTOM" "IDLGRSCENE_TOP" "IDLGRSCENEVERSION" "COLOR" "TRANSPARENT" "IDLGRSCENE_BOTTOM")
-     (inherits "IDL_Container"))
-    ("IDLgrMPEG"
-     (tags "IDLGRMPEG_TOP" "IDLGRMPEGVERSION" "DIMENSIONS" "FILENAME" "FORMAT" "FRAMERATE" "INTERLACED" "QUALITY" "SCALE" "STATISTICS" "DISPLAYDIMS" "FIRSTFRAME" "LASTFRAME" "MPEGID" "TEMPNODE" "TEMPNODEFILLER" "TEMP_DIRECTORY" "BITRATE" "IFRAME_GAP" "MOTION_LENGTH" "FLAGS" "IDLGRMPEG_BOTTOM")
-     (inherits))
     ("IDLgrViewgroup"
      (tags "IDLGRCOMPONENT_TOP" "IDLGRCOMPONENTVERSION" "HIDE" "NAME" "PARENT" "UVALUE" "IDLGRCOMPONENT_BOTTOM" "IDLGRCONTAINER_TOP" "IDLGRCONTAINERVERSION" "ISDYING" "IDLGRCONTAINER_BOTTOM" "IDLGRVIEWGROUPTOP" "IDLGRVIEWGROUPVERSION" "IDLGRVIEWGROUPBOTTOM")
      (inherits "IDL_Container"))
@@ -1469,20 +1516,20 @@
     ("IDLffShape"
      (tags "IDLFFSHAPE_TOP" "IDLFFSHAPEVERSION" "FILENAME" "ISOPEN" "SHPTYPE" "PATTRIBUTE" "SHAPEHANDLE" "DBFHANDLE" "IDLFFSHAPE_BOTTOM")
      (inherits))
-    ("TrackBall"
-     (tags "BTNDOWN" "AXIS" "CONSTRAIN" "MOUSE" "CENTER" "RADIUS" "PT0" "PT1")
-     (inherits))
     ("IDLffDXF"
-     (tags "IDLFFDXF_TOP" "IDLFFDXFVERSION" "DXFREADVALID" "DXFHANDLEVALID" "DXFLUT" "DXFHANDLE" "DXFHANDLEFILLER" "IDLFFDXF_BOTTOM")
+     (tags "IDLFFDXF_TOP" "IDLFFDXFVERSION" "DXFREADVALID" "DXFHANDLEVALID" "DXFLUT" "SERIAL" "DXFHANDLE" "DXFHANDLEFILLER" "IDLFFDXF_BOTTOM")
      (inherits))
     ("IDLffDICOM"
      (tags "IDLFFDICOM_TOP" "IDLFFDICOMVERSION" "DICOMFLAGS" "DICOMELEMENTS" "DICOMPREAMBLE" "DICOMHANDLE" "DICOMHANDLEFILLER" "IDLFFDICOM_BOTTOM")
      (inherits))
-    ("IDLgrTessellator"
-     (tags "IDLGRTESSELLATORTOP" "IDLGRTESSELLATORVERSION" "ITESSFLAGS" "IVERTS" "HVIDLIST" "IDLGRTESSELLATORBOTTOM")
+    ("TrackBall"
+     (tags "BTNDOWN" "AXIS" "CONSTRAIN" "MOUSE" "CENTER" "RADIUS" "PT0" "PT1")
      (inherits))
     ("IDL_Container"
      (tags "IDL_CONTAINER_TOP" "IDLCONTAINERVERSION" "PHEAD" "PTAIL" "NLIST" "IDL_CONTAINER_BOTTOM")
+     (inherits))
+    ("IDLgrTessellator"
+     (tags "IDLGRTESSELLATORTOP" "IDLGRTESSELLATORVERSION" "ITESSFLAGS" "IVERTS" "HVIDLIST" "IDLGRTESSELLATORBOTTOM")
      (inherits))))
 
 (provide 'idlw-rinfo)
--- a/lisp/progmodes/idlw-shell.el	Thu Jul 18 18:57:28 2002 +0000
+++ b/lisp/progmodes/idlw-shell.el	Thu Jul 18 18:58:07 2002 +0000
@@ -1,10 +1,11 @@
-;;; idlw-shell.el --- run IDL or WAVE as an inferior process of Emacs
-;; Copyright (c) 1999, 2000 Free Software Foundation
-
-;; Author: Chris Chase <chase@att.com>
-;; Maintainer: John-David Smith <jdsmith@astro.cornell.edu>
-;; Version: 4.7
-;; Date: $Date: 2002/07/09 10:47:02 $
+;; idlw-shell.el --- run IDL as an inferior process of Emacs.
+;; Copyright (c) 1999, 2000, 2001 Free Software Foundation
+
+;; Author: Carsten Dominik <dominik@astro.uva.nl>
+;;         Chris Chase <chase@att.com>
+;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
+;; Version: 4.14
+;; Date: $Date: 2002/06/14 19:05:30 $
 ;; Keywords: processes
 
 ;; This file is part of GNU Emacs.
@@ -25,10 +26,10 @@
 ;; Boston, MA 02111-1307, USA.
 
 ;;; Commentary:
-
-;; This mode is for IDL version 4 or later.  It should work on Emacs
-;; or XEmacs version 19 or later.
-
+;;
+;; This mode is for IDL version 5 or later.  It should work on
+;; Emacs>20.3 or XEmacs>20.4.
+;;
 ;; Runs IDL as an inferior process of Emacs, much like the emacs
 ;; `shell' or `telnet' commands.  Provides command history and
 ;; searching.  Provides debugging commands available in buffers
@@ -37,7 +38,11 @@
 ;; visual line pointer for current execution line, etc.
 ;;
 ;; Documentation should be available online with `M-x idlwave-info'.
-
+;;
+;; New versions of IDLWAVE, documentation, and more information
+;; available from:
+;;                 http://idlwave.org
+;;
 ;; INSTALLATION:
 ;; =============
 ;; 
@@ -54,7 +59,7 @@
 ;;   The newest version of this file can be found on the maintainers
 ;;   web site.
 ;; 
-;;     http://www.strw.leidenuniv.el/~dominik/Tools/idlwave
+;;     http://idlwave.org
 ;; 
 ;; DOCUMENTATION
 ;; =============
@@ -88,7 +93,6 @@
 ;;
 ;;--------------------------------------------------------------------------
 ;;
-;;
 
 ;;; Code:
 
@@ -99,17 +103,17 @@
 
 (defvar idlwave-shell-have-new-custom nil)
 (eval-and-compile
- ;; Kludge to allow `defcustom' for Emacs 19.
- (condition-case () (require 'custom) (error nil))
- (if (and (featurep 'custom)
-          (fboundp 'custom-declare-variable)
-          (fboundp 'defface))	   
-     ;; We've got what we needed
-     (setq idlwave-shell-have-new-custom t)
-     ;; We have the old or no custom-library, hack around it!
-     (defmacro defgroup (&rest args) nil)
-     (defmacro defcustom (var value doc &rest args) 
-       `(defvar ,var ,value ,doc))))
+  ;; Kludge to allow `defcustom' for Emacs 19.
+  (condition-case () (require 'custom) (error nil))
+  (if (and (featurep 'custom)
+	   (fboundp 'custom-declare-variable)
+	   (fboundp 'defface))	   
+      ;; We've got what we needed
+      (setq idlwave-shell-have-new-custom t)
+    ;; We have the old or no custom-library, hack around it!
+    (defmacro defgroup (&rest args) nil)
+    (defmacro defcustom (var value doc &rest args) 
+      `(defvar ,var ,value ,doc))))
 
 ;;; Customizations: idlwave-shell group
 
@@ -141,9 +145,25 @@
   "Initial commands, separated by newlines, to send to IDL.
 This string is sent to the IDL process by `idlwave-shell-mode' which is
 invoked by `idlwave-shell'."
-  :group 'idlwave-shell-initial-commands
+  :group 'idlwave-shell-general-setup
   :type 'string)
 
+(defcustom idlwave-shell-save-command-history t
+  "Non-nil means preserve command history between sessions.
+The file `idlwave-shell-command-history-file' is used to save and restore
+the history."
+  :group 'idlwave-shell-general-setup
+  :type 'boolean)
+
+(defcustom idlwave-shell-command-history-file "~/.idlwhist"
+  "The file in which the command history of the idlwave shell is saved.
+In order to change the size of the history, see the variable
+`comint-input-ring-size'.
+The history is only saved if the variable `idlwave-shell-save-command-history'
+is non-nil."
+  :group 'idlwave-shell-general-setup
+  :type 'file)
+  
 (defcustom idlwave-shell-use-dedicated-frame nil
   "*Non-nil means, IDLWAVE should use a special frame to display shell buffer."
   :group 'idlwave-shell-general-setup
@@ -158,6 +178,11 @@
   :type '(repeat
 	  (cons symbol sexp)))
 
+(defcustom idlwave-shell-raise-frame t
+  "*Non-nil means, `idlwave-shell' raises the frame showing the shell window."
+  :group 'idlwave-shell-general-setup
+  :type 'boolean)
+
 (defcustom idlwave-shell-arrows-do-history t
   "*Non-nil means UP and DOWN arrows move through command history.
 This variable can have 3 values:
@@ -172,6 +197,21 @@
 	  (const :tag "everywhere" t)
 	  (const :tag "in command line only" cmdline)))
 
+;; FIXME: add comint-input-ring-size?
+(defcustom idlwave-shell-comint-settings
+  '((comint-scroll-to-bottom-on-input . t)
+    (comint-scroll-to-bottom-on-output . nil)
+    (comint-scroll-show-maximum-output . t)
+    )
+  "Alist of special settings for the comint variables in the IDLWAVE Shell.
+Each entry is a cons cell with the name of a variable and a value.
+The function `idlwave-shell-mode' will make local variables out of each entry.
+Changes to this variable will only be active when the shell buffer is
+newly created."
+  :group 'idlwave-shell-general-setup
+  :type '(repeat
+	  (cons variable sexp)))
+
 (defcustom idlwave-shell-use-toolbar t
   "*Non-nil means, use the debugging toolbar in all IDL related buffers.
 Starting the shell will then add the toolbar to all idlwave-mode buffers.
@@ -185,7 +225,7 @@
 (defcustom idlwave-shell-temp-pro-prefix "/tmp/idltemp"
   "*The prefix for temporary IDL files used when compiling regions.
 It should be an absolute pathname.
-The full temporary file name is obtained by to using `make-temp-name'
+The full temporary file name is obtained by using `make-temp-file'
 so that the name will be unique among multiple Emacs processes."
   :group 'idlwave-shell-general-setup
   :type 'string)
@@ -240,15 +280,36 @@
   :group 'idlwave-shell-general-setup
   :type 'hook)
 
-(defcustom idlwave-shell-print-expression-function nil
-  "When non-nil, a function to handle display of evaluated expressions.
-This can be used to arrange for displaying the value of an expression
-in (e.g.) a special frame.  The function must accept one argument:
-the expression which was evaluated.  The output from IDL will be
-available in the variable `idlwave-shell-command-output'."
-  :group 'idlwave-shell-highlighting-and-faces
-  :type 'symbol)
-
+(defvar idlwave-shell-print-expression-function nil
+  "*OBSOLETE VARIABLE, is no longer used.")
+
+(defcustom idlwave-shell-examine-alist 
+  '(("Print"          	. "print,___")
+    ("Help"           	. "help,___")
+    ("Structure Help"  	. "help,___,/STRUCTURE")
+    ("Dimensions"     	. "print,size(___,/DIMENSIONS)")
+    ("Type"           	. "print,size(___,/TNAME)")
+    ("N_Elements"     	. "print,n_elements(___)")
+    ("All Size Info"  	. "help,(__IWsz__=size(___,/STRUCTURE)),/STRUCTURE & print,__IWsz__.DIMENSIONS")
+    ("Ptr Valid"      	. "print,ptr_valid(___)")
+    ("Widget Valid"     . "print,widget_info(___,/VALID)")
+    ("Widget Geometry"  . "help,widget_info(___,/GEOMETRY)"))
+  "Alist of special examine commands for popup selection.  
+The keys are used in the selection popup created by
+`idlwave-shell-examine-select', and the corresponding value is sent as
+a command to the shell, with special sequence `___' replaced by the
+expression being examined."
+  :group 'idlwave-shell-general-setup
+  :type '(repeat
+	  (cons 
+	   (string :tag "Label  ")
+	   (string :tag "Command"))))
+
+(defcustom idlwave-shell-separate-examine-output t
+  "*Non-nil mean, put output of examine commands in their own buffer."
+  :group 'idlwave-shell-general-setup
+  :type 'boolean)
+  
 (defcustom idlwave-shell-use-input-mode-magic nil
   "*Non-nil means, IDLWAVE should check for input mode spells in output.
 The spells are strings printed by your IDL program and matched
@@ -346,7 +407,7 @@
 The overlay-arrow has the disadvantage to hide the first chars of a line.
 Since many people do not have the main block of IDL programs indented,
 a face highlighting may be better.
-On Emacs 21, the overlay arrow is displayed in a special area and never
+In Emacs 21, the overlay arrow is displayed in a special area and never
 hides any code, so setting this to 'arrow on Emacs 21 sounds like a good idea."
   :group 'idlwave-shell-highlighting-and-faces
   :type '(choice
@@ -413,33 +474,78 @@
   :group 'idlwave-shell-highlighting-and-faces
   :type 'symbol)
 
+(defcustom idlwave-shell-output-face 'secondary-selection
+  "*The face for `idlwave-shell-output-overlay'.
+Allows you to choose the font, color and other properties for
+the expression output by IDL."
+  :group 'idlwave-shell-highlighting-and-faces
+  :type 'symbol)
+
 ;;; End user customization variables
 
 ;;; External variables
 (defvar comint-last-input-start)
 (defvar comint-last-input-end)
 
+(defun idlwave-shell-temp-file (type)
+  "Return a temp file, creating it if necessary.
+
+TYPE is either 'pro or 'rinfo, and idlwave-shell-temp-pro-file or
+idlwave-shell-temp-rinfo-save-file is set (respectively)."
+  (cond 
+   ((eq type 'rinfo)
+    (or idlwave-shell-temp-rinfo-save-file 
+	(setq idlwave-shell-temp-rinfo-save-file 
+	      (idlwave-shell-make-temp-file idlwave-shell-temp-pro-prefix))))
+   ((eq type 'pro)
+    (or idlwave-shell-temp-pro-file
+	(setq idlwave-shell-temp-pro-file 
+	      (idlwave-shell-make-temp-file idlwave-shell-temp-pro-prefix))))
+   (t (error "Wrong argument (idlwave-shell-temp-file): %s" 
+	     (symbol-name type)))))
+    
+
+(defun idlwave-shell-make-temp-file (prefix)
+  "Create a temporary file."
+  ; Hard coded make-temp-file for Emacs<21
+  (if (fboundp 'make-temp-file)
+      (make-temp-file prefix)
+    (let (file
+	  (temp-file-dir (if (boundp 'temporary-file-directory)
+			     temporary-file-directory
+			   "/tmp")))
+      (while (condition-case ()
+		 (progn
+		   (setq file
+			 (make-temp-name
+			  (expand-file-name prefix temp-file-dir)))
+                   (if (featurep 'xemacs)
+		       (write-region "" nil file nil 'silent nil)
+		     (write-region "" nil file nil 'silent nil 'excl))
+		   nil)
+	       (file-already-exists t))
+	;; the file was somehow created by someone else between
+	;; `make-temp-name' and `write-region', let's try again.
+	nil)
+      file)))
+
 ;; Other variables
-
-(defvar idlwave-shell-temp-file-base
-  (make-temp-name idlwave-shell-temp-pro-prefix)
-  "Base name of the temporary files.")
-
-(defvar idlwave-shell-temp-pro-file 
-  (concat idlwave-shell-temp-file-base ".pro")
+(defvar idlwave-shell-temp-pro-file
+  nil
   "Absolute pathname for temporary IDL file for compiling regions")
 
 (defvar idlwave-shell-temp-rinfo-save-file
-  (concat idlwave-shell-temp-file-base ".sav")
+  nil
   "Absolute pathname for temporary IDL file save file for routine_info.
 This is used to speed up the reloading of the routine info procedure
 before use by the shell.")
 
-
 (defvar idlwave-shell-dirstack-query "printd"
   "Command used by `idlwave-shell-resync-dirs' to query IDL for 
 the directory stack.")
 
+(defvar idlwave-shell-wd-is-synched nil)
+
 (defvar idlwave-shell-path-query "__pa=expand_path(!path,/array)&for i=0,n_elements(__pa)-1 do print,'PATH:<'+__pa[i]+'>'&print,'SYSDIR:<'+!dir+'>'"
   "The command which gets !PATH and !DIR infor from the shell.")
 
@@ -463,15 +569,22 @@
 (defvar idlwave-shell-is-stopped nil)
 (defvar idlwave-shell-expression-overlay nil
   "The overlay for where IDL is currently stopped.")
+(defvar idlwave-shell-output-overlay nil
+  "The overlay for the last IDL output.")
+
 ;; If these were already overlays, delete them.  This probably means that we
 ;; are reloading this file.
 (if (overlayp idlwave-shell-stop-line-overlay)
     (delete-overlay idlwave-shell-stop-line-overlay))
 (if (overlayp idlwave-shell-expression-overlay)
     (delete-overlay idlwave-shell-expression-overlay))
+(if (overlayp idlwave-shell-output-overlay)
+    (delete-overlay idlwave-shell-output-overlay))
+
 ;; Set to nil initially
 (setq idlwave-shell-stop-line-overlay nil
-      idlwave-shell-expression-overlay nil)
+      idlwave-shell-expression-overlay nil
+      idlwave-shell-output-overlay nil)
 
 ;; Define the shell stop overlay.  When left nil, the arrow will be used.
 (cond
@@ -499,10 +612,14 @@
 	(overlay-put idlwave-shell-stop-line-overlay 
 		     'face idlwave-shell-stop-line-face)))))
 
-;; Now the expression overlay
+;; Now the expression and output overlays
 (setq idlwave-shell-expression-overlay (make-overlay 1 1))
 (overlay-put idlwave-shell-expression-overlay
 	     'face idlwave-shell-expression-face)
+(setq idlwave-shell-output-overlay (make-overlay 1 1))
+(overlay-put idlwave-shell-output-overlay
+	     'face idlwave-shell-output-face)
+
 (defvar idlwave-shell-bp-query "help,/breakpoints"
   "Command to obtain list of breakpoints")
 
@@ -514,6 +631,9 @@
 The current command is finished when the IDL prompt is displayed.
 This is evaluated if it is a list or called with funcall.")
 
+(defvar idlwave-shell-sentinel-hook nil
+  "Hook run when the idl process exits.")
+
 (defvar idlwave-shell-hide-output nil
   "If non-nil the process output is not inserted into the output
   buffer.")
@@ -665,7 +785,7 @@
    Info documentation for this package is available.  Use \\[idlwave-info]
    to display (complain to your sysadmin if that does not work).
    For Postscript and HTML versions of the documentation, check IDLWAVE's
-   homepage at `http://www.strw.leidenuniv.nl/~dominik/Tools/idlwave'.
+   homepage at `http://idlwave.org'.
    IDLWAVE has customize support - see the group `idlwave'.
 
 7. Keybindings
@@ -679,7 +799,7 @@
   (setq comint-process-echoes t)
   ;; Can not use history expansion because "!" is used for system variables.
   (setq comint-input-autoexpand nil)
-  (setq comint-input-ring-size 64)
+;  (setq comint-input-ring-size 64)
   (make-local-variable 'comint-completion-addsuffix)
   (set (make-local-variable 'completion-ignore-case) t)
   (setq comint-completion-addsuffix '("/" . ""))
@@ -723,6 +843,9 @@
   (setq idlwave-shell-sources-alist nil)
   (setq idlwave-shell-default-directory default-directory)
   (setq idlwave-shell-hide-output nil)
+
+  ;; NB: `make-local-hook' needed for older/alternative Emacs compatibility
+  (make-local-hook 'kill-buffer-hook)
   (add-hook 'kill-buffer-hook 'idlwave-shell-kill-shell-buffer-confirm
 	    nil 'local)
   (add-hook 'kill-buffer-hook 'idlwave-shell-delete-temp-files nil 'local)
@@ -730,16 +853,30 @@
   (use-local-map idlwave-shell-mode-map)
   (easy-menu-add idlwave-shell-mode-menu idlwave-shell-mode-map)
 
-  (set (make-local-variable 'comint-scroll-to-bottom-on-input) t)
-  (set (make-local-variable 'comint-scroll-show-maximum-output) t)
+  ;; Set the optional comint variables
+  (when idlwave-shell-comint-settings
+    (let ((list idlwave-shell-comint-settings) entry)
+      (while (setq entry (pop list))
+	(set (make-local-variable (car entry)) (cdr entry)))))
 
   ;; IDLWAVE syntax, and turn on abbreviations
   (setq local-abbrev-table idlwave-mode-abbrev-table)
   (set-syntax-table idlwave-mode-syntax-table)
   (set (make-local-variable 'comment-start) ";")
   (setq abbrev-mode t)
+
+  ;; NB: `make-local-hook' needed for older/alternative Emacs compatibility
+  (make-local-hook 'post-command-hook)
   (add-hook 'post-command-hook 'idlwave-command-hook nil t)
 
+  ;; Read the command history?
+  (when (and idlwave-shell-save-command-history
+	     (stringp idlwave-shell-command-history-file))
+    (set (make-local-variable 'comint-input-ring-file-name)
+	 idlwave-shell-command-history-file)
+    (if (file-regular-p idlwave-shell-command-history-file)
+	(comint-read-input-ring)))
+
   ;; Run the hooks.
   (run-hooks 'idlwave-shell-mode-hook)
   (idlwave-shell-send-command idlwave-shell-initial-commands nil 'hide)
@@ -780,10 +917,20 @@
 	  ;; The frame exists, so we use it.
 	  idlwave-shell-display-wframe
 	;; The frame does not exist.  We use the current frame.
-	;; However, if the current is the shell frame, we make a new frame.
+	;; However, if the current is the shell frame, we make a new frame,
+	;; or recycle the first existing visible frame
 	(setq idlwave-shell-display-wframe
 	      (if (eq (selected-frame) idlwave-shell-idl-wframe)
-		  (make-frame)
+		  (or
+		   (let ((flist (visible-frame-list))
+			 (frame (selected-frame)))
+		     (catch 'exit
+		       (while flist
+			 (if (not (eq (car flist) 
+				      idlwave-shell-idl-wframe)) 
+			     (throw 'exit (car flist))
+			   (setq flist (cdr flist))))))
+		   (make-frame))
 		(selected-frame))))))
 
 (defun idlwave-shell-shell-frame ()
@@ -802,7 +949,7 @@
 	      (make-frame idlwave-shell-frame-parameters)))))
   
 ;;;###autoload
-(defun idlwave-shell (&optional arg)
+(defun idlwave-shell (&optional arg quick)
   "Run an inferior IDL, with I/O through buffer `(idlwave-shell-buffer)'.
 If buffer exists but shell process is not running, start new IDL.
 If buffer exists and shell process is running, just switch to the buffer.
@@ -811,7 +958,8 @@
 is non-nil, the shell buffer and the source buffers will be in
 separate frames.
 
-The command to run comes from variable `idlwave-shell-explicit-file-name'.
+The command to run comes from variable `idlwave-shell-explicit-file-name',
+with options taken from `idlwave-shell-command-line-options'.
 
 The buffer is put in `idlwave-shell-mode', providing commands for sending
 input and controlling the IDL job.  See help on `idlwave-shell-mode'.
@@ -819,34 +967,47 @@
 
 \(Type \\[describe-mode] in the shell buffer for a list of commands.)"
   (interactive "P")
-
-  ;; A non-nil arg means, we want a dedicated frame.  This will last
-  ;; for the current editing session.
-  (if arg (setq idlwave-shell-use-dedicated-frame t))
-  (if (equal arg '(16)) (setq idlwave-shell-use-dedicated-frame nil))
-
-  ;; Check if the process still exists.  If not, create it.
-  (unless (comint-check-proc (idlwave-shell-buffer))
-    (let* ((prg (or idlwave-shell-explicit-file-name "idl"))
-	   (buf (apply 'make-comint
-		       idlwave-shell-process-name prg nil
-		       idlwave-shell-command-line-options))
-	   (process (get-buffer-process buf)))
-      (setq idlwave-idlwave_routine_info-compiled nil)
-      (set-process-filter process 'idlwave-shell-filter)
-      (set-process-sentinel process 'idlwave-shell-sentinel)
-      (set-buffer buf)
-      (idlwave-shell-mode)))
-  (let ((window (idlwave-display-buffer (idlwave-shell-buffer) nil
-					(idlwave-shell-shell-frame)))
-	(current-window (selected-window)))
-    (select-window window)
-    (goto-char (point-max))
-    (select-window current-window)    
-    (raise-frame (window-frame window))
-    (if (eq (selected-frame) (window-frame window))
-	(select-window window))
-    ))
+  (if (eq arg 'quick)
+      (progn
+	(let ((idlwave-shell-use-dedicated-frame nil))
+	  (idlwave-shell nil)
+	  (delete-other-windows))
+	(and idlwave-shell-use-dedicated-frame
+	     (setq idlwave-shell-idl-wframe (selected-frame)))
+	(add-hook 'idlwave-shell-sentinel-hook 
+		  'save-buffers-kill-emacs t))
+
+    ;; A non-nil arg means, we want a dedicated frame.  This will last
+    ;; for the current editing session.
+    (if arg (setq idlwave-shell-use-dedicated-frame t))
+    (if (equal arg '(16)) (setq idlwave-shell-use-dedicated-frame nil))
+    
+    ;; Check if the process still exists.  If not, create it.
+    (unless (comint-check-proc (idlwave-shell-buffer))
+      (let* ((prg (or idlwave-shell-explicit-file-name "idl"))
+	     (buf (apply 'make-comint
+			 idlwave-shell-process-name prg nil
+			 (if (stringp idlwave-shell-command-line-options)
+			     (idlwave-split-string
+			      idlwave-shell-command-line-options)
+			   idlwave-shell-command-line-options)))
+	     (process (get-buffer-process buf)))
+	(setq idlwave-idlwave_routine_info-compiled nil)
+	(set-process-filter process 'idlwave-shell-filter)
+	(set-process-sentinel process 'idlwave-shell-sentinel)
+	(set-buffer buf)
+	(idlwave-shell-mode)))
+    (let ((window (idlwave-display-buffer (idlwave-shell-buffer) nil
+					  (idlwave-shell-shell-frame)))
+	  (current-window (selected-window)))
+      (select-window window)
+      (goto-char (point-max))
+      (select-window current-window)
+      (if idlwave-shell-ready
+	  (raise-frame (window-frame window)))
+      (if (eq (selected-frame) (window-frame window))
+	  (select-window window))
+      )))
 
 (defun idlwave-shell-recenter-shell-window (&optional arg)
   "Run `idlwave-shell', but make sure the current window stays selected."
@@ -871,6 +1032,7 @@
 and if `idlwave-shell-ready' is non-nil."
 
   ;(setq hide nil)  ;  FIXME: turn this on for debugging only
+;  (message "SENDING %s|||%s" cmd pcmd) ;??????????????????????
   (let (buf proc)
     ;; Get or make the buffer and its process
     (if (or (not (setq buf (get-buffer (idlwave-shell-buffer))))
@@ -1061,17 +1223,14 @@
   ;; We no longer do the cleanup here - this is done by the process sentinel
   (when (eq (process-status idlwave-shell-process-name) 'run)
     ;; OK, process is still running, so we can use it.
-    (let ((data (match-data)))
+    (setq idlwave-shell-wd-is-synched nil)  ;; something might have changed cwd
+    (let ((data (match-data)) p)
       (unwind-protect
           (progn
             ;; May change the original match data.
-            (let (p)
-              (while (setq p (string-match "\C-M" string))
-                (aset string p ?  )))
-;;; Test/Debug code
-;;          (save-excursion (set-buffer (get-buffer-create "*test*"))
-;;                          (goto-char (point-max))
-;;                          (insert "%%%" string))
+	    (while (setq p (string-match "\C-M" string))
+	      (aset string p ?\  ))
+
             ;;
             ;; Keep output
 
@@ -1084,6 +1243,9 @@
 ;                 (concat idlwave-shell-command-output string))
             ;; Insert the string. Do this before getting the
             ;; state. 
+	    (while (setq p (string-match "\C-G" string))
+	      (ding)
+	      (aset string p ?\C-j ))
             (if idlwave-shell-hide-output
                 (save-excursion
                   (set-buffer
@@ -1091,7 +1253,7 @@
                   (goto-char (point-max))
                   (insert string))
               (idlwave-shell-comint-filter proc string))
-            ;; Watch for prompt - need to accumulate the current line
+            ;; Watch for magic - need to accumulate the current line
             ;; since it may not be sent all at once.
             (if (string-match "\n" string)
 		(progn
@@ -1106,7 +1268,13 @@
                     (concat idlwave-shell-accumulation string)))
 
 
-            ;; Check for prompt in current line 
+;;; Test/Debug code
+;	     (save-excursion (set-buffer
+;			      (get-buffer-create "*idlwave-shell-output*"))
+;			     (goto-char (point-max))
+;			     (insert "\nSTRING===>\n" string "\n<====\n"))
+	    
+            ;; Check for prompt in current accumulating line 
             (if (setq idlwave-shell-ready
                       (string-match idlwave-shell-prompt-pattern
                                     idlwave-shell-accumulation))
@@ -1114,10 +1282,19 @@
                   (if idlwave-shell-hide-output
                       (save-excursion
                         (set-buffer idlwave-shell-hidden-output-buffer)
-                        (goto-char (point-min))
-                        (re-search-forward idlwave-shell-prompt-pattern nil t)
+;                        (goto-char (point-min))
+;                        (re-search-forward idlwave-shell-prompt-pattern nil t)
+                        (goto-char (point-max))
+                        (re-search-backward idlwave-shell-prompt-pattern nil t)
+			(goto-char (match-end 0))
                         (setq idlwave-shell-command-output
                               (buffer-substring (point-min) (point)))
+;; Test/Debug
+;			 (save-excursion (set-buffer
+;					  (get-buffer-create "*idlwave-shell-output*"))
+;					 (goto-char (point-max))
+;					 (insert "\nOUPUT===>\n" idlwave-shell-command-output "\n<===\n"))
+
                         (delete-region (point-min) (point)))
                     (setq idlwave-shell-command-output
                           (save-excursion
@@ -1129,11 +1306,6 @@
                                (beginning-of-line nil)
                                (point))
                              comint-last-input-end))))
-;;; Test/Debug code
-;;                (save-excursion (set-buffer
-;;                                 (get-buffer-create "*idlwave-shell-output*"))
-;;                                (goto-char (point-max))
-;;                                (insert "%%%" string))
                   ;; Scan for state and do post command - bracket them
                   ;; with idlwave-shell-ready=nil since they
                   ;; may call idlwave-shell-send-command.
@@ -1163,15 +1335,28 @@
       (save-excursion
 	(set-buffer (idlwave-shell-buffer))
 	(goto-char (point-max))
-	(insert (format "\n\n  Process %s %s" process event))))
+	(insert (format "\n\n  Process %s %s" process event))
+	(if (and idlwave-shell-save-command-history
+		 (stringp idlwave-shell-command-history-file))
+	    (condition-case nil
+		(comint-write-input-ring)
+	      (error nil)))))
+	    
     (when (and (> (length (frame-list)) 1)
 	       (frame-live-p idlwave-shell-idl-wframe))
       (delete-frame idlwave-shell-idl-wframe)
       (setq idlwave-shell-idl-wframe nil
 	    idlwave-shell-display-wframe nil))
-    (when (window-live-p win)
+    (when (and (window-live-p win)
+	       (not (one-window-p 'nomini)))
       (delete-window win))
-    (idlwave-shell-cleanup)))
+    (idlwave-shell-cleanup)
+    ;; Run the hook, if possible in the shell buffer.
+    (if (get-buffer buf)
+	(save-excursion
+	  (set-buffer buf)
+	  (run-hooks 'idlwave-shell-sentinel-hook))
+      (run-hooks 'idlwave-shell-sentinel-hook))))
 
 (defun idlwave-shell-scan-for-state ()
   "Scan for state info.
@@ -1471,6 +1656,7 @@
   (let ((text idlwave-shell-command-output)
 	(start 0)
 	sep sep-re file type spec specs name cs key keys class entry)
+;    (message "GOT: %s" text) ;??????????????????????
     ;; Initialize variables
     (setq idlwave-compiled-routines nil
 	  idlwave-unresolved-routines nil)
@@ -1483,10 +1669,12 @@
 	      text (substring text (match-end 0)))
       ;; Set dummy values and kill the text
       (setq sep "@" sep-re "@ *" text "")
-      (message "Routine Info warning: No match for BEGIN line"))
+      (message "Routine Info warning: No match for BEGIN line in \n>>>>\n%s\n<<<<\n" 
+	       idlwave-shell-command-output))
     (if (string-match "^>>>END OF IDLWAVE ROUTINE INFO.*" text)
 	(setq text (substring text 0 (match-beginning 0)))
-      (message "Routine Info warning: No match for END line"))
+      (message "Routine Info warning: No match for END line in \n>>>>\n%s\n<<<<\n" 
+	       idlwave-shell-command-output))
     (if (string-match "\\S-" text)
 	;; Obviously, the pro worked.  Make a note that we have it now.
 	(setq idlwave-idlwave_routine_info-compiled t))
@@ -1604,10 +1792,28 @@
 We assume that we are after a file name when completing one of the
 args of an executive .run, .rnew or .compile.  Also, in a string
 constant we complete file names.  Otherwise return nil, so that
-other completion functions can do thier work."
-  (let* ((comint-file-name-chars idlwave-shell-file-name-chars)
-	 (completion-ignore-case (default-value 'completion-ignore-case)))
-    (comint-dynamic-complete-filename)))
+other completion functions can do their work."
+  ;; Comint does something funny with the default directory,
+  ;; so we set it here from out safe own variable
+  (setq default-directory 
+	(file-name-as-directory idlwave-shell-default-directory))
+  (if (not idlwave-shell-wd-is-synched)
+      ;; Some IDL stuff has been executed since last update, so we need to
+      ;; do it again.
+      (idlwave-shell-send-command
+       idlwave-shell-dirstack-query
+       `(progn
+	  (idlwave-shell-filter-directory)
+	  (setq idlwave-shell-wd-is-synched t)
+	  (switch-to-buffer (idlwave-shell-buffer))
+	  (goto-char ,(point))  ;; This is necesary on Emacs, don't know why
+	  ;; after the update, we immediately redo the completion, so the
+	  ;; user will hardly notice we did the update.
+	  (idlwave-shell-complete-filename))
+       'hide)
+    (let* ((comint-file-name-chars idlwave-shell-file-name-chars)
+	   (completion-ignore-case (default-value 'completion-ignore-case)))
+      (comint-dynamic-complete-filename))))
 
 (defun idlwave-shell-executive-command ()
   "Return the name of the current executive command, if any."
@@ -2045,36 +2251,91 @@
   (interactive "P")
   (idlwave-shell-print arg 'help))
 
+(defmacro idlwave-shell-mouse-examine (help &optional ev)
+  "Create a function for generic examination of expressions."
+  `(lambda (event)
+     "Expansion function for expression examination."
+     (interactive "e")
+     (let ((transient-mark-mode t)
+	   (zmacs-regions t)
+	   (tracker (if (featurep 'xemacs) 'mouse-track 
+		      'mouse-drag-region)))
+       (funcall tracker event)
+       (idlwave-shell-print (if (idlwave-region-active-p) '(16) nil)
+			    ,help ,ev))))
+
 (defun idlwave-shell-mouse-print (event)
-  "Call `idlwave-shell-print' at the mouse position."
+  "Print value of variable at the mouse position, with `help'"
   (interactive "e")
-  (mouse-set-point event)
-  (idlwave-shell-print nil nil 'mouse))
+  (funcall (idlwave-shell-mouse-examine nil) event))
 
 (defun idlwave-shell-mouse-help (event)
-  "Call `idlwave-shell-print' at the mouse position."
+  "Print value of variable at the mouse position, with `print'."
+  (interactive "e")
+  (funcall (idlwave-shell-mouse-examine 'help) event))
+
+(defun idlwave-shell-examine-select (event)
+  "Pop-up a list to select from for examining the expression"
   (interactive "e")
-  (mouse-set-point event)
-  (idlwave-shell-print nil 'help 'mouse))
-
-(defun idlwave-shell-print (arg &optional help mouse)
-  "Print current expression.  With HELP, show help on expression.
+  (funcall (idlwave-shell-mouse-examine nil event) event))
+
+(defmacro idlwave-shell-examine (help)
+  "Create a function for key-driven expression examination."
+  `(lambda ()
+     (interactive)
+     (idlwave-shell-print nil ,help)))
+
+(defun idlwave-shell-define-key-both (key hook)
+  "Define a key in both the shell and buffer mode maps."
+  (define-key idlwave-mode-map key hook)
+  (define-key idlwave-shell-mode-map key hook))
+
+(defvar idlwave-shell-examine-label nil
+  "Label to include with examine text if separate.")
+
+(defun idlwave-shell-print (arg &optional help ev)
+  "Print current expression.  
+
+With HELP non-nil, show help on expression.  If HELP is a string,
+the expression will be put in place of ___, e.g.:
+
+   print,size(___,/DIMENSIONS)
+
+Otherwise, print is called on the expression.
+
 An expression is an identifier plus 1 pair of matched parentheses
-directly following the identifier - an array or function
-call.  Alternatively, an expression is the contents of any matched
-parentheses when the open parentheses is not directly preceded by an
+directly following the identifier - an array or function call.
+Alternatively, an expression is the contents of any matched
+parentheses when the open parenthesis is not directly preceded by an
 identifier. If point is at the beginning or within an expression
 return the inner-most containing expression, otherwise, return the
 preceding expression.
 
-With prefix arg ARG, or when called from the shell buffer, prompt
-for an expression."
+With prefix arg ARG prompt for an expression.
+
+With double prefix arg, use the current region.
+
+If EV is a valid event passed, pop-up a list from
+idlw-shell-examine-alist from which to select the help command text."
   (interactive "P")
   (save-excursion
-    (let (expr beg end cmd)
-      (if (and (not mouse)
-	       (or arg (eq major-mode 'idlwave-shell-mode)))
-	  (setq expr (read-string "Expression: "))
+    (let* ((process (get-buffer-process (current-buffer)))
+	   (process-mark (if process (process-mark process)))
+	   (stack-label 
+	    (if (and (integerp idlwave-shell-calling-stack-index)
+		     (> idlwave-shell-calling-stack-index 0))
+		(format "  [-%d:%s]" 
+			idlwave-shell-calling-stack-index 
+			idlwave-shell-calling-stack-routine)))
+	   expr beg end cmd examine-hook)
+      (cond
+       ((and (equal arg '(16))
+	     (< (- (region-end) (region-beginning)) 2000))
+	(setq beg (region-beginning)
+	      end (region-end)))
+       (arg
+	(setq expr (read-string "Expression: ")))
+       (t
 	(idlwave-with-special-syntax1
 	 ;; Move to beginning of current or previous expression
 	 (if (looking-at "\\<\\|(")
@@ -2093,27 +2354,177 @@
 	 (while (looking-at "\\>[[(]\\|\\.")
 	   ;; an array
 	   (forward-sexp))
-	 (setq end (point))
-	 (setq expr (buffer-substring beg end))))
+	 (setq end (point)))))
+      
+      ;; Get expression, but first move the begin mark if a
+      ;; process-mark is inside the region, to keep the overlay from
+      ;; wandering in the Shell.
+      (when (and beg end)
+	(if (and process-mark (> process-mark beg) (< process-mark end))
+	    (setq beg (marker-position process-mark)))
+	(setq expr (buffer-substring beg end)))
+
+      ;; Show the overlay(s) and attach any necessary hooks and filters
       (when (and beg end idlwave-shell-expression-overlay)
 	(move-overlay idlwave-shell-expression-overlay beg end 
 		      (current-buffer))
-	(add-hook 'pre-command-hook 'idlwave-shell-delete-expression-overlay))
-      (if (and (integerp idlwave-shell-calling-stack-index)
-	       (> idlwave-shell-calling-stack-index 0))
+	(add-hook 'pre-command-hook 
+		  'idlwave-shell-delete-expression-overlay))
+      (setq examine-hook 
+	    (if idlwave-shell-separate-examine-output
+		'idlwave-shell-examine-display
+	      'idlwave-shell-examine-highlight))
+      (add-hook 'pre-command-hook
+		'idlwave-shell-delete-output-overlay)
+      
+      ;; Remove empty or comment-only lines
+      (while (string-match "\n[ \t]*\\(;.*\\)?\r*\n" expr)
+	(setq expr (replace-match "\n" t t expr)))
+      ;; Concatenate continuation lines
+      (while (string-match "[ \t]*\\$.*\\(;.*\\)?\\(\n[ \t]*\\|$\\)" expr)
+	(setq expr (replace-match "" t t expr)))
+      ;; Remove final newline
+      (if (string-match "\n[ \t\r]*\\'" expr)
+	  (setq expr (replace-match "" t t expr)))
+      ;; Pop-up the examine selection list, if appropriate
+      (if (and ev idlwave-shell-examine-alist)
+	  (let* ((help-cons 
+		  (assoc 
+		   (idlwave-popup-select 
+		    ev (mapcar 'car idlwave-shell-examine-alist)
+		    "Examine with")
+		   idlwave-shell-examine-alist)))
+	    (setq help (cdr help-cons))
+	    (if idlwave-shell-separate-examine-output
+		(setq idlwave-shell-examine-label 
+		      (concat 
+		       (format "==>%s<==\n%s:" expr (car help-cons))
+		       stack-label "\n"))))
+	(setq idlwave-shell-examine-label
+	      (concat
+	       (format "==>%s<==\n%s:" expr 
+		       (cond ((null help) "print")
+			     ((stringp help) help)
+			     (t (symbol-name help))))
+	       stack-label "\n")))
+
+      ;; Send the command
+      (if stack-label
 	  (setq cmd (idlwave-retrieve-expression-from-level
 		     expr
 		     idlwave-shell-calling-stack-index
 		     idlwave-shell-calling-stack-routine
 		     help))
-	(setq cmd (concat (if help "help," "print,") expr)))
-      (if idlwave-shell-print-expression-function
-	  (idlwave-shell-send-command 
-	   cmd
-	   (list idlwave-shell-print-expression-function expr)
-	   'hide)
-	(idlwave-shell-recenter-shell-window)
-	(idlwave-shell-send-command cmd)))))
+	(setq cmd (idlwave-shell-help-statement help expr)))
+      ;(idlwave-shell-recenter-shell-window)
+      (idlwave-shell-send-command 
+       cmd 
+       examine-hook 
+       (if idlwave-shell-separate-examine-output 'hide)))))
+
+(defvar idlwave-shell-examine-window-alist nil
+  "Variable to hold the win/height pairs for all *Examine* windows.")
+
+(defun idlwave-shell-examine-display ()
+  "View the examine command output in a separate buffer."
+  (let (win cur-beg cur-end)
+    (save-excursion
+      (set-buffer (get-buffer-create "*Examine*"))
+      (use-local-map idlwave-shell-examine-map)
+      (setq buffer-read-only nil)
+      (goto-char (point-max))
+      (save-restriction
+	(narrow-to-region (point) (point))
+	(if (string-match "^% Syntax error." idlwave-shell-command-output)
+	    (insert "% Syntax error.\n")
+	  (insert idlwave-shell-command-output)
+	  ;; Just take the last bit between the prompts (if more than one).
+	  (let* ((end (or
+		       (re-search-backward idlwave-shell-prompt-pattern nil t)
+		       (point-max)))
+		 (beg (progn 
+			(goto-char
+			 (or (progn (if (re-search-backward 
+					 idlwave-shell-prompt-pattern nil t)
+					(match-end 0)))
+			     (point-min)))
+			(re-search-forward "\n")))
+		 (str (buffer-substring beg end)))
+	    (delete-region (point-min) (point-max))
+	    (insert str)
+	    (if idlwave-shell-examine-label
+		(progn (goto-char (point-min))
+		       (insert idlwave-shell-examine-label)
+		       (setq idlwave-shell-examine-label nil)))))
+	(setq cur-beg (point-min)
+	      cur-end (point-max))
+	(setq buffer-read-only t)
+	(move-overlay idlwave-shell-output-overlay cur-beg cur-end
+		      (current-buffer))
+	
+	;; Look for the examine buffer in all windows.  If one is
+	;; found in a frame all by itself, use that, otherwise, switch
+	;; to or create an examine window in this frame, and resize if
+	;; it's a newly created window
+	(let* ((winlist (get-buffer-window-list "*Examine*" nil 'visible)))
+	  (setq win (idlwave-display-buffer 
+		     "*Examine*" 
+		     nil
+		     (let ((list winlist) thiswin)
+		       (catch 'exit
+			 (save-selected-window
+			   (while (setq thiswin (pop list))
+			     (select-window thiswin)
+			     (if (one-window-p) 
+				 (throw 'exit (window-frame thiswin)))))))))
+	  (set-window-start win (point-min)) ; Ensure the point is visible.
+	  (save-selected-window
+	    (select-window win)
+	    (let ((elt (assoc win idlwave-shell-examine-window-alist)))
+	      (when (and (not (one-window-p))
+			 (or (not (memq win winlist)) ;a newly created window
+			     (eq (window-height) (cdr elt))))
+		;; Autosize it.
+		(enlarge-window (- (/ (frame-height) 2)
+				   (window-height)))
+		(shrink-window-if-larger-than-buffer)
+		;; Clean the window list of dead windows
+		(setq idlwave-shell-examine-window-alist
+		      (delq nil
+			    (mapcar (lambda (x) (if (window-live-p (car x)) x))
+				    idlwave-shell-examine-window-alist)))
+		;; And add the new value.
+		(if (setq elt (assoc win idlwave-shell-examine-window-alist))
+		    (setcdr elt (window-height))
+		  (add-to-list 'idlwave-shell-examine-window-alist 
+			       (cons win (window-height)))))))))
+      ;; Recenter for maximum output, after widened
+      (save-selected-window
+	(select-window win)
+	(goto-char (point-max))
+	(skip-chars-backward "\n")
+	(recenter -1)))))
+
+(defvar idlwave-shell-examine-map (make-sparse-keymap))
+(define-key idlwave-shell-examine-map "q" 'idlwave-shell-examine-display-quit)
+(define-key idlwave-shell-examine-map "c" 'idlwave-shell-examine-display-clear)
+
+(defun idlwave-shell-examine-display-quit ()
+  (interactive)
+  (let ((win (selected-window)))
+    (if (one-window-p)
+	(delete-frame (window-frame win))
+      (delete-window win))))
+
+(defun idlwave-shell-examine-display-clear ()
+  (interactive)
+  (save-excursion 
+    (let ((buf (get-buffer "*Examine*")))
+      (when (bufferp buf)
+	(set-buffer buf)
+	(setq buffer-read-only nil)
+	(erase-buffer)
+	(setq buffer-read-only t)))))
 
 (defun idlwave-retrieve-expression-from-level (expr level routine help)
   "Return IDL command to print the expression EXPR from stack level LEVEL.
@@ -2126,37 +2537,38 @@
 level.
 
 Since this function depends upon the undocumented IDL routine routine_names,
-there is no guarantie that this will work with future versions of IDL."
+there is no guarantee that this will work with future versions of IDL."
   (let ((prefix "___")         ;; No real variables should starts with this.
 	(fetch (- 0 level))
 	(start 0)
         var tvar fetch-vars pre post)
 
      ;; FIXME: In the following we try to find the variables in expression
-     ;; This is quite empirical - I don't know in what situations this will
-     ;; break.  We will look for identifiers and exclude cases where we
-     ;; know it is not a variable.  To distinguish array references from
-     ;; function calls, we require that arrays use [] instead of ()
-
-     (while (string-match
-    "\\(\\`\\|[^a-zA-Z0-9$_]\\)\\([a-zA-Z][a-zA-Z0-9$_]*\\)\\([^a-zA-Z0-9$_]\\|\\'\\)" expr start)
-       (setq var (match-string 2 expr)
-             tvar (concat prefix var)
-             start (match-beginning 2)
-             pre (substring expr 0 (match-beginning 2))
-             post (substring expr (match-end 2)))
-       (cond
-        ;; Exclude identifiers which are not variables
-        ((string-match ",[ \t]*/\\'" pre))        ;; a `/' KEYWORD
-        ((and (string-match "[,(][ \t]*\\'" pre)
- 	      (string-match "\\`[ \t]*=" post)))  ;; a `=' KEYWORD
-        ((string-match "\\`(" post))              ;; a function
-        ((string-match "->[ \t]*\\'" pre))        ;; a method
-        ((string-match "\\.\\'" pre))             ;; structure member
-        (t ;; seems to be a variable - arrange to get it and replace
-           ;; its name in the expression with the temproary name.
- 	 (push (cons var tvar) fetch-vars)
-	 (setq expr (concat pre tvar post)))))
+    ;; This is quite empirical - I don't know in what situations this will
+    ;; break.  We will look for identifiers and exclude cases where we
+    ;; know it is not a variable.  To distinguish array references from
+    ;; function calls, we require that arrays use [] instead of ()
+    
+    (while (string-match
+	    "\\(\\`\\|[^a-zA-Z0-9$_]\\)\\([a-zA-Z][a-zA-Z0-9$_]*\\)\\([^a-zA-Z0-9$_]\\|\\'\\)" expr start)
+      (setq var (match-string 2 expr)
+	    tvar (concat prefix var)
+	    start (match-beginning 2)
+	    pre (substring expr 0 (match-beginning 2))
+	    post (substring expr (match-end 2)))
+      (cond
+       ;; Exclude identifiers which are not variables
+       ((string-match ",[ \t]*/\\'" pre))        ;; a `/' KEYWORD
+       ((and (string-match "[,(][ \t]*\\'" pre)
+	     (string-match "\\`[ \t]*=" post)))  ;; a `=' KEYWORD
+       ((string-match "\\`(" post))              ;; a function
+       ((string-match "->[ \t]*\\'" pre))        ;; a method
+       ((string-match "\\.\\'" pre))             ;; structure member
+       (t ;; seems to be a variable - arrange to get it and replace
+	;; its name in the expression with the temproary name.
+	(push (cons var tvar) fetch-vars)
+	(setq expr (concat pre tvar post))))
+      (if (= start 0) (setq start 1)))
     ;; Make a command line that first copies the relevant variables
     ;; and then prints the expression.
     (concat
@@ -2165,17 +2577,65 @@
 	(format "%s = routine_names('%s',fetch=%d)" (cdr x) (car x) fetch))
       (nreverse fetch-vars)
       " & ")
-     (if idlwave-shell-print-expression-function " & " "\n")
-     (if help "help, " "print, ")
-     expr
+     "\n"
+     (idlwave-shell-help-statement help expr)
      (format " ; [-%d:%s]" level routine))))
 
+(defun idlwave-shell-help-statement (help expr)
+  "Construct a help statement for printing expression EXPR.
+
+HELP can be non-nil for `help,', nil for 'print,' or any string into which
+to insert expression in place of the marker ___, e.g.: print,
+size(___,/DIMENSIONS)"
+  (cond
+   ((null help) (concat "print, " expr))
+   ((stringp help) 
+    (if (string-match "\\(^\\|[^_]\\)\\(___\\)\\([^_]\\|$\\)" help)
+	(concat (substring help 0 (match-beginning 2))
+		expr
+		(substring help (match-end 2)))))
+   (t (concat "help, " expr))))
+   
+
+(defun idlwave-shell-examine-highlight ()
+  "Highlight the most recent IDL output."
+  (let* ((buffer (get-buffer (idlwave-shell-buffer)))
+	 (process (get-buffer-process buffer))
+	 (process-mark (if process (process-mark process)))
+	 output-begin output-end)
+    (save-excursion 
+      (set-buffer buffer)
+      (goto-char process-mark)
+      (beginning-of-line)
+      (setq output-end (point))
+      (re-search-backward idlwave-shell-prompt-pattern nil t)
+      (beginning-of-line 2)
+      (setq output-begin (point)))
+	    
+    ;; First make sure the shell window is visible
+    (idlwave-display-buffer (idlwave-shell-buffer)
+			    nil (idlwave-shell-shell-frame))
+    (if (and idlwave-shell-output-overlay process-mark)
+	(move-overlay idlwave-shell-output-overlay 
+		      output-begin output-end buffer))))
+
+(defun idlwave-shell-delete-output-overlay ()
+  (if (eq this-command 'idlwave-shell-mouse-nop)
+      nil
+    (condition-case nil
+	(if idlwave-shell-output-overlay
+	    (delete-overlay idlwave-shell-output-overlay))
+      (error nil))
+    (remove-hook 'pre-command-hook 'idlwave-shell-delete-output-overlay)))
+  
 (defun idlwave-shell-delete-expression-overlay ()
-  (condition-case nil
-      (if idlwave-shell-expression-overlay
-	  (delete-overlay idlwave-shell-expression-overlay))
-    (error nil))
-  (remove-hook 'pre-command-hook 'idlwave-shell-delete-expression-overlay))
+  (if (eq this-command 'idlwave-shell-mouse-nop)
+      nil
+    (condition-case nil
+	(if idlwave-shell-expression-overlay
+	    (delete-overlay idlwave-shell-expression-overlay))
+      (error nil))
+    (remove-hook 'pre-command-hook 'idlwave-shell-delete-expression-overlay)))
 
 (defvar idlwave-shell-bp-alist nil
   "Alist of breakpoints.
@@ -2213,7 +2673,9 @@
   (let ((oldbuf (current-buffer)))
     (save-excursion
       (set-buffer (idlwave-find-file-noselect
-		   idlwave-shell-temp-pro-file 'tmp))
+		   (idlwave-shell-temp-file 'pro) 'tmp))
+      (set (make-local-variable 'comment-start-skip) ";+[ \t]*")
+      (set (make-local-variable 'comment-start) ";")
       (erase-buffer)
       (insert-buffer-substring oldbuf beg end)
       (if (not (save-excursion
@@ -2253,13 +2715,8 @@
 	(error nil))))
 
 (defun idlwave-display-buffer (buf not-this-window-p &optional frame)
-  (if (or (< emacs-major-version 20)
-	  (and (= emacs-major-version 20)
-	       (< emacs-minor-version 3)))
-      ;; Only two args.
-      (display-buffer buf not-this-window-p)
-    ;; Three ares possible.
-    (display-buffer buf not-this-window-p frame)))
+  (if (not (frame-live-p frame)) (setq frame nil))
+  (display-buffer buf not-this-window-p frame))
 
 (defvar idlwave-shell-bp-buffer " *idlwave-shell-bp*"
   "Scratch buffer for parsing IDL breakpoint lists and other stuff.")
@@ -2302,22 +2759,37 @@
     (insert idlwave-shell-command-output)
     (goto-char (point-min))
     (let ((old-bp-alist idlwave-shell-bp-alist)
-	  file line index module)
+	  ;; Searching the breakpoints
+	  ;; In IDL 5.5, the breakpoint reporting format changed.
+	  (bp-re54 "^[ \t]*\\([0-9]+\\)[ \t]+\\(\\S-+\\)?[ \t]+\\([0-9]+\\)[ \t]+\\(\\S-+\\)")
+	  (bp-re55 "^\\s-*\\([0-9]+\\)\\s-+\\([0-9]+\\)\\s-+\\(Uncompiled\\|Func=\\|Pro=\\)\\(\\S-+\\)?\\s-+\\(\\S-+\\)")
+	  file line index module 
+	  bp-re indmap)
       (setq idlwave-shell-bp-alist (list nil))
-      (when (re-search-forward "^\\s-*Index.*\n\\s-*-" nil t)
+      ;; Search for either header type, and set the correct regexp
+      (when (or 
+	     (if (re-search-forward "^\\s-*Index.*\n\\s-*-" nil t)
+		 (setq bp-re bp-re54    ; versions <= 5.4 
+		       indmap '(1 2 3 4)))
+	     (if (re-search-forward 
+		  "^\\s-*Index\\s-*Line\\s-*Attributes\\s-*File" nil t)
+		 (setq bp-re bp-re55    ; versions >= 5.5
+		       indmap '(1 4 2 5))))
 	;; There seems to be a breakpoint listing here.
 	;; Parse breakpoint lines.
-	;; Breakpoints have the form:
+	;; Breakpoints have the form 
+        ;;    for IDL<=v5.4:
 	;;  Index Module Line File
-	;;  All seperated by whitespace. 
+	;;  All separated by whitespace. 
 	;;  Module may be missing if the file is not compiled.
-	;;
-	(while (re-search-forward
-		"^[ \t]*\\([0-9]+\\)[ \t]+\\(\\S-+\\)?[ \t]+\\([0-9]+\\)[ \t]+\\(\\S-+\\)" nil t)
-	  (setq index (match-string 1)
-		module (match-string 2)
-		line (string-to-int (match-string 3))
-		file (idlwave-shell-file-name (match-string 4)))
+        ;;    for IDL>=v5.5:
+	;;  Index Line Attributes File
+	;;    (attributes replaces module, "Uncompiled" included)
+	(while (re-search-forward bp-re nil t)
+	  (setq index (match-string (nth 0 indmap))
+		module (match-string (nth 1 indmap))
+		line (string-to-int (match-string (nth 2 indmap)))
+		file (idlwave-shell-file-name (match-string (nth 3 indmap))))
 	  ;; Add the breakpoint info to the list
 	  (nconc idlwave-shell-bp-alist
 		 (list (cons (list file line)
@@ -2372,24 +2844,24 @@
 The breakpoint will be placed at the beginning of the statement on the
 line specified by BP or at the next IDL statement if that line is not
 a statement.
-Determines IDL's internal representation for the breakpoint which may
-have occurred at a different line then used with the breakpoint
+Determines IDL's internal representation for the breakpoint, which may
+have occurred at a different line than used with the breakpoint
 command."
   
   ;; Get and save the old breakpoints
   (idlwave-shell-send-command 
    idlwave-shell-bp-query
    '(progn
-     (idlwave-shell-filter-bp)
-     (setq idlwave-shell-old-bp idlwave-shell-bp-alist))
+      (idlwave-shell-filter-bp)
+      (setq idlwave-shell-old-bp idlwave-shell-bp-alist))
    'hide)
   ;; Get sources for IDL compiled procedures followed by setting
   ;; breakpoint.
   (idlwave-shell-send-command
    idlwave-shell-sources-query
    `(progn
-     (idlwave-shell-sources-filter)
-     (idlwave-shell-set-bp2 (quote ,bp)))
+      (idlwave-shell-sources-filter)
+      (idlwave-shell-set-bp2 (quote ,bp)))
    'hide))
 
 (defun idlwave-shell-set-bp2 (bp)
@@ -2619,7 +3091,7 @@
 	   idlwave-routines)
     (idlwave-shell-update-routine-info t)))
 
-(defvar idlwave-shell-sources-query "help,/source"
+(defvar idlwave-shell-sources-query "help,/source,/full"
   "IDL command to obtain source files for compiled procedures.")
 
 (defvar idlwave-shell-sources-alist nil
@@ -2746,11 +3218,10 @@
   (let ((def-dir (if (eq major-mode 'idlwave-shell-mode)
 		     default-directory
 		   idlwave-shell-default-directory)))
-    (if idlwave-shell-use-truename 
-	(file-truename name def-dir) 
+    (if idlwave-shell-use-truename
+	(file-truename name def-dir)
       (expand-file-name name def-dir))))
 
-
 ;; Keybindings --------------------------------------------------------------
 
 (defvar idlwave-shell-mode-map (copy-keymap comint-mode-map)
@@ -2777,23 +3248,42 @@
 (define-key idlwave-shell-mode-map [(down)] 'idlwave-shell-down-or-history)
 (define-key idlwave-mode-map "\C-c\C-y" 'idlwave-shell-char-mode-loop)
 (define-key idlwave-mode-map "\C-c\C-x" 'idlwave-shell-send-char)
-(define-key idlwave-mode-map 
-  (if (featurep 'xemacs) [(shift button2)] [(shift mouse-2)])
-  'idlwave-shell-mouse-print)
-(define-key idlwave-mode-map 
-  (if (featurep 'xemacs) [(shift control button2)] [(shift control mouse-2)])
+
+;; The mouse bindings for PRINT and HELP
+(idlwave-shell-define-key-both
+ (if (featurep 'xemacs) 
+     [(shift button2)] 
+   [(shift down-mouse-2)])
+ 'idlwave-shell-mouse-print)
+(idlwave-shell-define-key-both
+ (if (featurep 'xemacs) 
+     [(control meta button2)] 
+   [(control meta down-mouse-2)])
   'idlwave-shell-mouse-help)
+(idlwave-shell-define-key-both
+ (if (featurep 'xemacs)
+     [(control shift button2)]
+   [(control shift down-mouse-2)])
+ 'idlwave-shell-examine-select)
+;; Add this one from the idlwave-mode-map
 (define-key idlwave-shell-mode-map 
-  (if (featurep 'xemacs) [(shift button2)] [(shift mouse-2)])
-  'idlwave-shell-mouse-print)
-(define-key idlwave-shell-mode-map 
-  (if (featurep 'xemacs) [(shift control button2)] [(shift control mouse-2)])
-  'idlwave-shell-mouse-help)
-(define-key idlwave-shell-mode-map 
-  (if (featurep 'xemacs) [(shift button3)] [(shift mouse-3)])
+  (if (featurep 'xemacs)
+      [(shift button3)]
+    [(shift mouse-3)])
   'idlwave-mouse-context-help)
 
-
+;; For Emacs, we need to turn off the button release events.
+(defun idlwave-shell-mouse-nop (event) 
+  (interactive "e"))
+(unless (featurep 'xemacs)
+  (idlwave-shell-define-key-both
+   [(shift mouse-2)] 'idlwave-shell-mouse-nop)
+  (idlwave-shell-define-key-both
+   [(shift control mouse-2)] 'idlwave-shell-mouse-nop)
+  (idlwave-shell-define-key-both
+   [(control meta mouse-2)] 'idlwave-shell-mouse-nop))
+
+  
 ;; The following set of bindings is used to bind the debugging keys.
 ;; If `idlwave-shell-activate-prefix-keybindings' is non-nil, the first key
 ;; in the list gets bound the C-c C-d prefix map.
@@ -2994,7 +3484,7 @@
 (let ((image-string "/* XPM */
 static char * file[] = {
 \"14 12 3 1\",
-\" 	c #FFFFFFFFFFFF s backgroundColor\",
+\" 	c None s backgroundColor\",
 \".	c #4B4B4B4B4B4B\",
 \"R	c #FFFF00000000\",
 \"              \",
@@ -3017,7 +3507,7 @@
 	      ((and (not (featurep 'xemacs))
 		    (fboundp 'image-type-available-p)
 		    (image-type-available-p 'xpm))
-	       (list 'image :type 'xpm :data image-string))
+	       (list 'image :type 'xpm :data image-string :ascent 'center))
 	      (t nil))))
 
 (provide 'idlw-shell)
--- a/lisp/progmodes/idlw-toolbar.el	Thu Jul 18 18:57:28 2002 +0000
+++ b/lisp/progmodes/idlw-toolbar.el	Thu Jul 18 18:58:07 2002 +0000
@@ -1,10 +1,10 @@
 ;;; idlw-toolbar.el --- a debugging toolbar for IDLWAVE
-;; Copyright (c) 1999, 2000 Free Software Foundation
+;; Copyright (c) 1999, 2000, 2001,2002 Free Software Foundation
 
-;; Author: Carsten Dominik <dominik@strw.leidenuniv.nl>
-;; Maintainer: John-David Smith <jdsmith@astro.cornell.edu>
-;; Version: 4.7
-;; Date: $Date: 2001/07/16 12:22:59 $
+;; Author: Carsten Dominik <dominik@astro.uva.nl>
+;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
+;; Version: 4.14
+;; Date: $Date: 2002/06/14 19:06:16 $
 ;; Keywords: processes
 
 ;; This file is part of GNU Emacs.
@@ -29,6 +29,10 @@
 ;; This file implements a debugging toolbar for IDLWAVE.  It requires
 ;; Emacs or XEmacs with toolbar and xpm support.
 
+;; New versions of IDLWAVE, documentation, and more information
+;; available from:
+;;                 http://idlwave.org
+
 
 ;;; Code:
 
@@ -59,7 +63,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 2 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	c #000000000000\",
 \"                            \",
 \"                            \",
@@ -96,7 +100,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 3 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	c #000000000000\",
 \"R	c #FFFF00000000\",
 \"                            \",
@@ -134,7 +138,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 3 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	c #000000000000\",
 \"R	c #FFFF00000000\",
 \"                            \",
@@ -172,7 +176,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 4 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \"_	c #FFFFFFFFFFFF\",
 \".	c #000000000000\",
 \"R	c #FFFF00000000\",
@@ -212,7 +216,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 3 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	c #000000000000\",
 \"R	c #FFFF00000000\",
 \"                            \",
@@ -250,7 +254,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 4 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	c #000000000000\",
 \"X	c #FFFFFFFFFFFF\",
 \"R	c #FFFF00000000\",
@@ -289,7 +293,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 2 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	c #000000000000\",
 \"                            \",
 \"                            \",
@@ -326,7 +330,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 3 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	s FgColor c #000000000000\",
 \"G	c #0000BBBB0000\",
 \"                            \",
@@ -364,7 +368,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 3 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	s FgColor c #000000000000\",
 \"G	c #0000BBBB0000\",
 \"                            \",
@@ -402,7 +406,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 4 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	c #000000000000\",
 \"G	c #0000BBBB0000\",
 \"R	c #FFFF00000000\",
@@ -441,7 +445,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 3 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	c #000000000000\",
 \"G	c #0000BBBB0000\",
 \"                            \",
@@ -479,7 +483,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 3 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	c #000000000000\",
 \"G	c #0000BBBB0000\",
 \"                            \",
@@ -517,7 +521,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 3 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	c #000000000000\",
 \"G	c #0000BBBB0000\",
 \"                            \",
@@ -556,7 +560,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 2 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	c #000000000000\",
 \"                            \",
 \"                            \",
@@ -593,7 +597,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 5 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	s FgColor c #000000000000\",
 \"_	c #FFFFFFFFFFFF\",
 \"G	c #0000BBBB0000\",
@@ -633,7 +637,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 5 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \".	s FgColor c #000000000000\",
 \"_	c #FFFFFFFFFFFF\",
 \"G	c #0000BBBB0000\",
@@ -673,7 +677,7 @@
    "/* XPM */
 static char * file[] = {
 \"28 28 3 1\",
-\" 	c #C8C8C8C8C8C8 s backgroundToolBarColor\",
+\" 	c None s backgroundToolBarColor\",
 \"G	c #0000BBBB0000\",
 \". 	c #000000000000\",
 \"                            \",
@@ -874,3 +878,5 @@
 (provide 'idlwave-toolbar)
 
 ;;; idlw-toolbar.el ends here
+
+
--- a/lisp/progmodes/idlwave.el	Thu Jul 18 18:57:28 2002 +0000
+++ b/lisp/progmodes/idlwave.el	Thu Jul 18 18:58:07 2002 +0000
@@ -1,10 +1,11 @@
 ;;; idlwave.el --- IDL and WAVE CL editing mode for GNU Emacs
-;; Copyright (c) 1999, 2000 Free Software Foundation
-
-;; Author: Chris Chase <chase@att.com>
-;; Maintainer: John-David Smith <jdsmith@astro.cornell.edu>
-;; Version: 4.7
-;; Date: $Date: 2002/02/16 12:53:42 $
+;; Copyright (c) 1999, 2000, 2001,2002 Free Software Foundation
+
+;; Author: Carsten Dominik <dominik@astro.uva.nl>
+;;         Chris Chase <chase@att.com>
+;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
+;; Version: 4.14
+;; Date: $Date: 2002/06/14 19:03:30 $
 ;; Keywords: languages
 
 ;; This file is part of GNU Emacs.
@@ -37,6 +38,9 @@
 ;; for features, key bindings, and info.
 ;; Also, Info format documentation is available with `M-x idlwave-info'
 ;;
+;; New versions of IDLWAVE, documentation, and more information
+;; available from:
+;;                 http://idlwave.org
 ;;
 ;; INSTALLATION
 ;; ============
@@ -56,7 +60,7 @@
 ;; The newest version of this file is available from the maintainers
 ;; Webpage.
 ;;
-;;   http://www.strw.leidenuniv.el/~dominik/Tools/idlwave
+;;   http://idlwave.org
 ;;
 ;; DOCUMENTATION
 ;; =============
@@ -126,10 +130,6 @@
 ;;   problems with pointer dereferencing statements.  I don't use
 ;;   pointers often enough to find out - please report any problems.
 ;;
-;;   Completion and Routine Info do not know about inheritance.  Thus,
-;;   Keywords inherited from superclasses are not displayed and cannot
-;;   completed.
-;;
 ;;   When forcing completion of method keywords, the initial
 ;;   query for a method has multiple entries for some methods.  Would
 ;;   be too difficult to fix this hardly used case.
@@ -140,20 +140,20 @@
 (eval-when-compile (require 'cl))
 
 (eval-and-compile
- ;; Kludge to allow `defcustom' for Emacs 19.
- (condition-case () (require 'custom) (error nil))
- (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
-     nil ;; We've got what we needed
-     ;; We have the old or no custom-library, hack around it!
-     (defmacro defgroup (&rest args) nil)
-     (defmacro defcustom (var value doc &rest args) 
-       `(defvar ,var ,value ,doc))))
+  ;; Kludge to allow `defcustom' for Emacs 19.
+  (condition-case () (require 'custom) (error nil))
+  (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
+      nil ;; We've got what we needed
+    ;; We have the old or no custom-library, hack around it!
+    (defmacro defgroup (&rest args) nil)
+    (defmacro defcustom (var value doc &rest args) 
+      `(defvar ,var ,value ,doc))))
 
 (defgroup idlwave nil
-  "Major mode for editing IDL/WAVE CL .pro files"
+  "Major mode for editing IDL .pro files"
   :tag "IDLWAVE"
   :link '(url-link :tag "Home Page" 
-		   "http://strw.leidenuniv.nl/~dominik/Tools/idlwave")
+		   "http://idlwave.org")
   :link '(emacs-commentary-link :tag "Commentary in idlw-shell.el"
 				"idlw-shell.el")
   :link '(emacs-commentary-link :tag "Commentary in idlwave.el" "idlwave.el")
@@ -190,13 +190,48 @@
 (defcustom idlwave-continuation-indent 2
   "*Extra indentation applied to continuation lines.
 This extra offset applies to the first of a set of continuation lines.
-The following lines receive the same indentation as the first.
-Also, the value of this variable applies to continuation lines inside
-parenthesis.  When the current line contains an open unmatched ([{,
-the next line is indented to that parenthesis plus the value of this variable."
+The following lines receive the same indentation as the first."
+  :group 'idlwave-code-formatting
+  :type 'integer)
+
+(defcustom idlwave-max-extra-continuation-indent 20
+  "*Maximum additional indentation for special continuation indent.
+Several special indentations are tried to help line up continuation
+lines in routine calls or definitions, other statements with
+parentheses, or assigment statements.  This variable specifies a
+maximum amount by which this special indentation can exceed the
+standard continuation indentation, otherwise defaulting to a fixed
+offset.  Set to 0 to effectively disable all special continuation
+indentation, or to a large number (like 100) to enable it in all
+cases.  See also `idlwave-indent-top-open-paren', which can override
+this variable."
   :group 'idlwave-code-formatting
   :type 'integer)
 
+(defcustom idlwave-indent-to-open-paren t
+  "*Non-nil means, indent continuation lines to innermost open
+parenthesis.  This indentation occurs even if otherwise disallowed by
+`idlwave-max-extra-continuation-indent'.  Matching parens and the
+interleaving args are lined up.  Example:
+
+  x = function_a(function_b(function_c( a, b, [1,2,3, $
+                                               4,5,6 $
+                                              ], $
+                                        c, d $
+                                      )))
+
+When this variable is nil, paren alignment may still occur, based on
+the value of `max-extra-continuation-indent', which, if zero, would
+yield:
+
+  x = function_a(function_b(function_c( a, b, [1,2,3, $
+     4,5,6 $
+     ], $
+     c, d $
+     )))"
+ :group 'idlwave-code-formatting
+  :type 'boolean)
+
 (defcustom idlwave-hanging-indent t
   "*If set non-nil then comment paragraphs are indented under the
 hanging indent given by `idlwave-hang-indent-regexp' match in the first line
@@ -274,6 +309,22 @@
   "Routine Info options for IDLWAVE mode."
   :group 'idlwave)
 
+
+(defcustom idlwave-init-rinfo-when-idle-after 10
+  "*Seconds of idle time before routine info is automatically initialized.
+Initializing the routine info can take long, in particular if a large
+library catalog is involved.  When Emacs is idle for more than the number
+of seconds specified by this variable, it starts the initialization.
+The process is split into five steps, in order to keep possible work 
+interruption as short as possible.  If one of the steps finishes, and no
+user input has arrived in the mean time, initialization proceeds immediately
+to the next step.
+A good value for this variable is about 1/3 of the time initialization
+take in you setup.  So if you have a fast machine and no problems with a slow network connection, don't hesitate to set this to 2 seconds.
+A Value of 0 means, don't initialize automatically."
+  :group 'idlwave-routine-info
+  :type 'number)
+
 (defcustom idlwave-scan-all-buffers-for-routine-info t
   "*Non-nil means, scan buffers for IDL programs when updating info.
 The scanning is done by the command `idlwave-update-routine-info'.
@@ -449,7 +500,7 @@
   "Face for highlighting links into IDLWAVE online help."
   :group 'idlwave-online-help)
 
-(defcustom idlwave-help-activate-links-agressively t
+(defcustom idlwave-help-activate-links-aggressively t
   "*Non-nil means, make all possible links in help active.
 This just activates all words which are also a help topic - some links may
 be misleading."
@@ -558,6 +609,17 @@
   :group 'idlwave-routine-info
   :type 'boolean)
 
+(defcustom idlwave-keyword-class-inheritance '("^[gs]etproperty$" "^init$")
+  "List of regular expressions for class-driven keyword inheritance.
+Keyword inheritance is often tied to class inheritance by \"chaining\"
+up the class tree.  While it cannot be assumed that the presence of an
+_EXTRA or _REF_EXTRA symbol guarantees such chaining will occur, for
+certain methods this assumption is almost always true.  The methods
+for which to assume this can be set here."
+  :group 'idlwave-routine-info
+  :type '(repeat (regexp :tag "Match method:")))
+  
+
 (defcustom idlwave-completion-show-classes 1
   "*Number of classes to show when completing object methods and keywords.
 When completing methods or keywords for an object with unknown class,
@@ -588,21 +650,21 @@
 				 (keyword-default . nil))
   "Association list governing specification of object classes for completion.
 
-When IDLWAVE is trying to complete items which belong to the object
-oriented part of IDL, it usually cannot determine the class of a given
-object from context.  In order to provide the user with a correct list
-of methods or keywords, it would have to determine the appropriate
-class.  IDLWAVE has two ways to deal with this problem.
-
-1. One possibility is to combine the items of all available
-   classes for the purpose of completion.  So when completing a
-   method, all methods of all classes are available, and when
-   completing a keyword, all keywords allowed for this method in any
-   class will be possible completions.  This behavior is very much
-   like normal completion and is therefore the default.  It works much 
+When IDLWAVE tries to complete object-oriented methods, it usually
+cannot determine the class of a given object from context.  In order
+to provide the user with a correct list of methods or keywords, it
+needs have to determine the appropriate class.  IDLWAVE has two ways
+to deal with this problem.
+
+1. One possibility is to combine the items of all available classes
+   which contain this method for the purpose of completion.  So when
+   completing a method, all methods of all known classes are
+   available, and when completing a keyword, all keywords allowed for
+   this method in any class are shown.  This behavior is very much
+   like normal completion and is therefore the default.  It works much
    better than one might think - only for the INIT, GETPROPERTY and
-   SETPROPERTY the keyword lists become uncomfortably long.
-   See also `idlwave-completion-show-classes'.
+   SETPROPERTY the keyword lists become uncomfortably long.  See also
+   `idlwave-completion-show-classes'.
 
 2. The second possibility is to ask the user on each occasion.  To
    make this less interruptive, IDLWAVE can store the class as a text
@@ -613,11 +675,12 @@
    You will have to turn on the storage of the selected class
    explicitly with the variable `idlwave-store-inquired-class'.
 
-This variable allows to configure IDLWAVE's behavior during
-completion.  Its value is an alist, which should contain at least two
-elements: (method-default . VALUE) and (keyword-default . VALUE),
-where VALUE is either t or nil.  These specify if the class should be
-determined during method and keyword completion, respectively.
+This variable allows you to configure IDLWAVE's method and
+method-keyword completion behavior.  Its value is an alist, which
+should contain at least two elements: (method-default . VALUE) and
+(keyword-default . VALUE), where VALUE is either t or nil.  These
+specify if the class should be found during method and keyword
+completion, respectively.
 
 The alist may have additional entries specifying exceptions from the 
 keyword completion rule for specific methods, like INIT or
@@ -917,6 +980,14 @@
 For example you might set PATHNAME to the path for the
 lib_template.pro file included in the IDL distribution.")
 
+(defcustom idlwave-header-to-beginning-of-file nil
+  "*Non-nil means, the documentation header will always be at start of file.
+When nil, the header is positioned between the PRO/FUNCTION line of
+the current routine and the code, allowing several routine headers in
+a file."
+  :group 'idlwave-documentation
+  :type 'boolean)
+
 (defcustom idlwave-timestamp-hook 'idlwave-default-insert-timestamp
   "*The hook function used to update the timestamp of a function."
   :group 'idlwave-documentation
@@ -951,16 +1022,26 @@
 ;; anything.
 
 (defcustom idlwave-shell-explicit-file-name "idl"
-  "*If non-nil, is the command to run IDL.
+  "*If non-nil, this is the command to run IDL.
 Should be an absolute file path or path relative to the current environment
-execution search path."
+execution search path.  If you want to specify command line switches
+for the idl program, use `idlwave-shell-command-line-options'.
+
+I know the name of this variable is badly chosen, but I cannot change
+it without compromizing backwards-compatibility."
   :group 'idlwave-external-programs
   :type 'string)
 
-;; FIXME: Document a case when is this needed.
 (defcustom idlwave-shell-command-line-options nil
-  "*A list of command line options for calling the IDL program."
-  :type '(repeat (string :value ""))
+  "*A list of command line options for calling the IDL program.
+Since IDL is executed directly without going through a shell like /bin/sh,
+this should be a list of strings like '(\"-rt=file\" \"-nw\") with a separate
+string for each argument.  But you may also give a single string which
+contains the options whitespace-separated.  Emacs will be kind enough to
+split it for you."
+  :type '(choice
+	  string
+	  (repeat (string :value "")))
   :group 'idlwave-external-programs)
 
 (defcustom idlwave-help-application "idlhelp"
@@ -1356,12 +1437,12 @@
   "Character which is inserted as a last character on previous line by
    \\[idlwave-split-line] to begin a continuation line.  Normally $.")
 
-(defconst idlwave-mode-version " 4.7")
+(defconst idlwave-mode-version " 4.14")
 
 (defmacro idlwave-keyword-abbrev (&rest args)
   "Creates a function for abbrev hooks to call `idlwave-check-abbrev' with args."
   `(quote (lambda ()
-            ,(append '(idlwave-check-abbrev) args))))
+	    ,(append '(idlwave-check-abbrev) args))))
 
 ;; If I take the time I can replace idlwave-keyword-abbrev with
 ;; idlwave-code-abbrev and remove the quoted abbrev check from
@@ -1374,10 +1455,10 @@
 Specifically, if the abbrev is in a comment or string it is unexpanded.
 Otherwise ARGS forms a list that is evaluated."
   `(quote (lambda ()
-            ,(prin1-to-string args) ;; Puts the code in the doc string
-            (if (idlwave-quoted)
-                (progn (unexpand-abbrev) nil)
-                ,(append args)))))
+	    ,(prin1-to-string args)  ;; Puts the code in the doc string
+	    (if (idlwave-quoted)
+		(progn (unexpand-abbrev) nil)
+	      ,(append args)))))
 
 (defvar idlwave-mode-map (make-sparse-keymap)
   "Keymap used in IDL mode.")
@@ -1449,7 +1530,7 @@
 `self-insert-command' followed by CMD.  If KEY contains more than one
 character a binding will only be set if SELECT is 'both.
 
-(KEY . CMD\ is also placed in the `idlwave-indent-expand-table',
+\(KEY . CMD\) is also placed in the `idlwave-indent-expand-table',
 replacing any previous value for KEY.  If a binding is not set then it
 will instead be placed in `idlwave-indent-action-table'.
 
@@ -1512,6 +1593,7 @@
 (define-key idlwave-mode-map "\C-c\C-n" 'idlwave-next-statement)
 ;; (define-key idlwave-mode-map "\r"       'idlwave-newline)
 ;; (define-key idlwave-mode-map "\t"       'idlwave-indent-line)
+(define-key idlwave-mode-map (kbd "S-<iso-lefttab>") 'idlwave-indent-statement)
 (define-key idlwave-mode-map "\C-c\C-a" 'idlwave-auto-fill-mode)
 (define-key idlwave-mode-map "\M-q"     'idlwave-fill-paragraph)
 (define-key idlwave-mode-map "\M-s"     'idlwave-edit-in-idlde)
@@ -1567,8 +1649,10 @@
 ;; Automatically add spaces for the following characters
 (idlwave-action-and-binding "&"  '(idlwave-surround -1 -1))
 (idlwave-action-and-binding "<"  '(idlwave-surround -1 -1))
-(idlwave-action-and-binding ">"  '(idlwave-surround -1 -1 '(?-)))
-(idlwave-action-and-binding "->" '(idlwave-surround -1 -1 nil 2))
+;; Binding works for both > and ->, by changing the length of the token.
+(idlwave-action-and-binding ">"  '(idlwave-surround -1 -1 '(?-) 1 
+						    'idlwave-gtr-pad-hook))
+(idlwave-action-and-binding "->" '(idlwave-surround -1 -1 nil 2) t)
 (idlwave-action-and-binding ","  '(idlwave-surround 0 -1))
 ;; Automatically add spaces to equal sign if not keyword
 (idlwave-action-and-binding "="  '(idlwave-expand-equal -1 -1))
@@ -1580,135 +1664,147 @@
 ;;; space is inserted (this is the space typed by the user to expanded
 ;;; the abbrev).
 ;;;
+(defvar idlwave-mode-abbrev-table nil
+  "Abbreviation table used for IDLWAVE mode")
+(define-abbrev-table 'idlwave-mode-abbrev-table ())
+
+(defun idlwave-define-abbrev (name expansion hook &optional noprefix table)
+  "Define-abbrev with backward compatibility.
+
+If NOPREFIX is non-nil, don't prepend prefix character.  Installs into
+idlwave-mode-abbrev-table unless TABLE is non-nil."
+  (let ((abbrevs-changed nil)  ;; mask the current value to avoid save
+	(args (list (or table idlwave-mode-abbrev-table)
+		    (if noprefix name (concat idlwave-abbrev-start-char name))
+		    expansion
+		    hook)))
+    (condition-case nil
+	(apply 'define-abbrev (append args '(0 t)))
+      (error (apply 'define-abbrev args)))))
 
 (condition-case nil
     (modify-syntax-entry (string-to-char idlwave-abbrev-start-char) 
 			 "w" idlwave-mode-syntax-table)
   (error nil))
 
-(defvar idlwave-mode-abbrev-table nil
-  "Abbreviation table used for IDLWAVE mode")
-(define-abbrev-table 'idlwave-mode-abbrev-table ())
-(let ((abbrevs-changed nil)          ;; mask the current value to avoid save
-      (tb idlwave-mode-abbrev-table)
-      (c idlwave-abbrev-start-char))
-  ;;
-  ;; Templates
-  ;;
-  (define-abbrev tb (concat c "c")   "" (idlwave-code-abbrev idlwave-case) 0 t)
-  (define-abbrev tb (concat c "sw")  "" (idlwave-code-abbrev idlwave-switch) 0 t)
-  (define-abbrev tb (concat c "f")   "" (idlwave-code-abbrev idlwave-for) 0 t)
-  (define-abbrev tb (concat c "fu")  "" (idlwave-code-abbrev idlwave-function) 0 t)
-  (define-abbrev tb (concat c "pr")  "" (idlwave-code-abbrev idlwave-procedure) 0 t)
-  (define-abbrev tb (concat c "r")   "" (idlwave-code-abbrev idlwave-repeat) 0 t)
-  (define-abbrev tb (concat c "w")   "" (idlwave-code-abbrev idlwave-while) 0 t)
-  (define-abbrev tb (concat c "i")   "" (idlwave-code-abbrev idlwave-if) 0 t)
-  (define-abbrev tb (concat c "elif") "" (idlwave-code-abbrev idlwave-elif) 0 t)
-  ;;
-  ;; Keywords, system functions, conversion routines
-  ;;
-  (define-abbrev tb (concat c "b")  "begin"        (idlwave-keyword-abbrev 0 t)  0 t)
-  (define-abbrev tb (concat c "co") "common"       (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb (concat c "cb") "byte()"       (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "cx") "fix()"        (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "cl") "long()"       (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "cf") "float()"      (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "cs") "string()"     (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "cc") "complex()"    (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "cd") "double()"     (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "e")  "else"         (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb (concat c "ec") "endcase"      'idlwave-show-begin  0 t)
-  (define-abbrev tb (concat c "es") "endswitch"    'idlwave-show-begin 0 t)
-  (define-abbrev tb (concat c "ee") "endelse"      'idlwave-show-begin 0 t)
-  (define-abbrev tb (concat c "ef") "endfor"       'idlwave-show-begin 0 t)
-  (define-abbrev tb (concat c "ei") "endif else if" 'idlwave-show-begin 0 t)
-  (define-abbrev tb (concat c "el") "endif else"   'idlwave-show-begin 0 t)
-  (define-abbrev tb (concat c "en") "endif"        'idlwave-show-begin 0 t)
-  (define-abbrev tb (concat c "er") "endrep"       'idlwave-show-begin 0 t)
-  (define-abbrev tb (concat c "ew") "endwhile"     'idlwave-show-begin 0 t)
-  (define-abbrev tb (concat c "g")  "goto,"        (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb (concat c "h")  "help,"        (idlwave-keyword-abbrev 0) 0 t)
-  (define-abbrev tb (concat c "k")  "keyword_set()" (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "n")  "n_elements()" (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "on") "on_error,"    (idlwave-keyword-abbrev 0) 0 t)
-  (define-abbrev tb (concat c "oi") "on_ioerror,"  (idlwave-keyword-abbrev 0 1) 0 t)
-  (define-abbrev tb (concat c "ow") "openw,"       (idlwave-keyword-abbrev 0) 0 t)
-  (define-abbrev tb (concat c "or") "openr,"       (idlwave-keyword-abbrev 0) 0 t)
-  (define-abbrev tb (concat c "ou") "openu,"       (idlwave-keyword-abbrev 0) 0 t)
-  (define-abbrev tb (concat c "p")  "print,"       (idlwave-keyword-abbrev 0) 0 t)
-  (define-abbrev tb (concat c "pt") "plot,"        (idlwave-keyword-abbrev 0) 0 t)
-  (define-abbrev tb (concat c "re") "read,"        (idlwave-keyword-abbrev 0) 0 t)
-  (define-abbrev tb (concat c "rf") "readf,"       (idlwave-keyword-abbrev 0) 0 t)
-  (define-abbrev tb (concat c "ru") "readu,"       (idlwave-keyword-abbrev 0) 0 t)
-  (define-abbrev tb (concat c "rt") "return"       (idlwave-keyword-abbrev 0) 0 t)
-  (define-abbrev tb (concat c "sc") "strcompress()" (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "sn") "strlen()"     (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "sl") "strlowcase()" (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "su") "strupcase()"  (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "sm") "strmid()"     (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "sp") "strpos()"     (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "st") "strput()"     (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "sr") "strtrim()"    (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "t")  "then"         (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb (concat c "u")  "until"        (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb (concat c "wu") "writeu,"      (idlwave-keyword-abbrev 0) 0 t)
-  (define-abbrev tb (concat c "ine") "if n_elements() eq 0 then"
-    (idlwave-keyword-abbrev 11) 0 t)
-  (define-abbrev tb (concat c "inn") "if n_elements() ne 0 then"
-    (idlwave-keyword-abbrev 11) 0 t)
-  (define-abbrev tb (concat c "np") "n_params()"   (idlwave-keyword-abbrev 0) 0 t)
-  (define-abbrev tb (concat c "s")  "size()"       (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "wi") "widget_info()" (idlwave-keyword-abbrev 1) 0 t)
-  (define-abbrev tb (concat c "wc") "widget_control," (idlwave-keyword-abbrev 0) 0 t)
+;;
+;; Templates
+;;
+(idlwave-define-abbrev "c"   "" (idlwave-code-abbrev idlwave-case))
+(idlwave-define-abbrev "sw"  "" (idlwave-code-abbrev idlwave-switch))
+(idlwave-define-abbrev "f"   "" (idlwave-code-abbrev idlwave-for))
+(idlwave-define-abbrev "fu"  "" (idlwave-code-abbrev idlwave-function))
+(idlwave-define-abbrev "pr"  "" (idlwave-code-abbrev idlwave-procedure))
+(idlwave-define-abbrev "r"   "" (idlwave-code-abbrev idlwave-repeat))
+(idlwave-define-abbrev "w"   "" (idlwave-code-abbrev idlwave-while))
+(idlwave-define-abbrev "i"   "" (idlwave-code-abbrev idlwave-if))
+(idlwave-define-abbrev "elif" "" (idlwave-code-abbrev idlwave-elif))
+;;
+;; Keywords, system functions, conversion routines
+;;
+(idlwave-define-abbrev "ap" "arg_present()" (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "b"  "begin"        (idlwave-keyword-abbrev 0 t))
+(idlwave-define-abbrev "co" "common"       (idlwave-keyword-abbrev 0 t))
+(idlwave-define-abbrev "cb" "byte()"       (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "cx" "fix()"        (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "cl" "long()"       (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "cf" "float()"      (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "cs" "string()"     (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "cc" "complex()"    (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "cd" "double()"     (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "e"  "else"         (idlwave-keyword-abbrev 0 t))
+(idlwave-define-abbrev "ec" "endcase"      'idlwave-show-begin)
+(idlwave-define-abbrev "es" "endswitch"    'idlwave-show-begin)
+(idlwave-define-abbrev "ee" "endelse"      'idlwave-show-begin)
+(idlwave-define-abbrev "ef" "endfor"       'idlwave-show-begin)
+(idlwave-define-abbrev "ei" "endif else if" 'idlwave-show-begin)
+(idlwave-define-abbrev "el" "endif else"   'idlwave-show-begin)
+(idlwave-define-abbrev "en" "endif"        'idlwave-show-begin)
+(idlwave-define-abbrev "er" "endrep"       'idlwave-show-begin)
+(idlwave-define-abbrev "ew" "endwhile"     'idlwave-show-begin)
+(idlwave-define-abbrev "g"  "goto,"        (idlwave-keyword-abbrev 0 t))
+(idlwave-define-abbrev "h"  "help,"        (idlwave-keyword-abbrev 0))
+(idlwave-define-abbrev "k"  "keyword_set()" (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "n"  "n_elements()" (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "on" "on_error,"    (idlwave-keyword-abbrev 0))
+(idlwave-define-abbrev "oi" "on_ioerror,"  (idlwave-keyword-abbrev 0 1))
+(idlwave-define-abbrev "ow" "openw,"       (idlwave-keyword-abbrev 0))
+(idlwave-define-abbrev "or" "openr,"       (idlwave-keyword-abbrev 0))
+(idlwave-define-abbrev "ou" "openu,"       (idlwave-keyword-abbrev 0))
+(idlwave-define-abbrev "p"  "print,"       (idlwave-keyword-abbrev 0))
+(idlwave-define-abbrev "pt" "plot,"        (idlwave-keyword-abbrev 0))
+(idlwave-define-abbrev "re" "read,"        (idlwave-keyword-abbrev 0))
+(idlwave-define-abbrev "rf" "readf,"       (idlwave-keyword-abbrev 0))
+(idlwave-define-abbrev "ru" "readu,"       (idlwave-keyword-abbrev 0))
+(idlwave-define-abbrev "rt" "return"       (idlwave-keyword-abbrev 0))
+(idlwave-define-abbrev "sc" "strcompress()" (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "sn" "strlen()"     (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "sl" "strlowcase()" (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "su" "strupcase()"  (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "sm" "strmid()"     (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "sp" "strpos()"     (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "st" "strput()"     (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "sr" "strtrim()"    (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "t"  "then"         (idlwave-keyword-abbrev 0 t))
+(idlwave-define-abbrev "u"  "until"        (idlwave-keyword-abbrev 0 t))
+(idlwave-define-abbrev "wu" "writeu,"      (idlwave-keyword-abbrev 0))
+(idlwave-define-abbrev "iap" "if arg_present() then"     (idlwave-keyword-abbrev 6))
+(idlwave-define-abbrev "ik" "if keyword_set() then" (idlwave-keyword-abbrev 6))
+(idlwave-define-abbrev "ine" "if n_elements() eq 0 then" (idlwave-keyword-abbrev 11))
+(idlwave-define-abbrev "inn" "if n_elements() ne 0 then" (idlwave-keyword-abbrev 11))
+(idlwave-define-abbrev "np" "n_params()"   (idlwave-keyword-abbrev 0))
+(idlwave-define-abbrev "s"  "size()"       (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "wi" "widget_info()" (idlwave-keyword-abbrev 1))
+(idlwave-define-abbrev "wc" "widget_control," (idlwave-keyword-abbrev 0))
   
-  ;; This section is reserved words only. (From IDL user manual)
-  ;;
-  (define-abbrev tb "and"        "and"        (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "begin"      "begin"      (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "break"      "break"      (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "case"       "case"       (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "common"     "common"     (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "continue"   "continue"   (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "do"         "do"         (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "else"       "else"       (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "end"        "end"        'idlwave-show-begin-check 0 t)
-  (define-abbrev tb "endcase"    "endcase"    'idlwave-show-begin-check 0 t)
-  (define-abbrev tb "endelse"    "endelse"    'idlwave-show-begin-check 0 t)
-  (define-abbrev tb "endfor"     "endfor"     'idlwave-show-begin-check 0 t)
-  (define-abbrev tb "endif"      "endif"      'idlwave-show-begin-check 0 t)
-  (define-abbrev tb "endrep"     "endrep"     'idlwave-show-begin-check 0 t)
-  (define-abbrev tb "endswitch"  "endswitch"  'idlwave-show-begin-check 0 t)
-  (define-abbrev tb "endwhi"     "endwhi"     'idlwave-show-begin-check 0 t)
-  (define-abbrev tb "endwhile"   "endwhile"   'idlwave-show-begin-check 0 t)
-  (define-abbrev tb "eq"         "eq"         (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "for"        "for"        (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "function"   "function"   (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "ge"         "ge"         (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "goto"       "goto"       (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "gt"         "gt"         (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "if"         "if"         (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "le"         "le"         (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "lt"         "lt"         (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "mod"        "mod"        (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "ne"         "ne"         (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "not"        "not"        (idlwave-keyword-abbrev 0 t 0 t))
-  (define-abbrev tb "of"         "of"         (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "on_ioerror" "on_ioerror" (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "or"         "or"         (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "pro"        "pro"        (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "repeat"     "repeat"     (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "switch"     "switch"     (idlwave-keyword-abbrev 0 t 0 t))
-  (define-abbrev tb "then"       "then"       (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "until"      "until"      (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "while"      "while"      (idlwave-keyword-abbrev 0 t) 0 t)
-  (define-abbrev tb "xor"        "xor"        (idlwave-keyword-abbrev 0 t) 0 t))
+;; This section is reserved words only. (From IDL user manual)
+;;
+(idlwave-define-abbrev "and"        "and"       (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "begin"      "begin"     (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "break"      "break"     (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "case"       "case"      (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "common"     "common"    (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "continue"   "continue"  (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "do"         "do"        (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "else"       "else"      (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "end"        "end"       'idlwave-show-begin-check t)
+(idlwave-define-abbrev "endcase"    "endcase"   'idlwave-show-begin-check t)
+(idlwave-define-abbrev "endelse"    "endelse"   'idlwave-show-begin-check t)
+(idlwave-define-abbrev "endfor"     "endfor"    'idlwave-show-begin-check t)
+(idlwave-define-abbrev "endif"      "endif"     'idlwave-show-begin-check t)
+(idlwave-define-abbrev "endrep"     "endrep"    'idlwave-show-begin-check t)
+(idlwave-define-abbrev "endswitch"  "endswitch" 'idlwave-show-begin-check t)
+(idlwave-define-abbrev "endwhi"     "endwhi"    'idlwave-show-begin-check t)
+(idlwave-define-abbrev "endwhile"   "endwhile"  'idlwave-show-begin-check t)
+(idlwave-define-abbrev "eq"         "eq"        (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "for"        "for"       (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "function"   "function"  (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "ge"         "ge"        (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "goto"       "goto"      (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "gt"         "gt"        (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "if"         "if"        (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "le"         "le"        (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "lt"         "lt"        (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "mod"        "mod"       (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "ne"         "ne"        (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "not"        "not"       (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "of"         "of"        (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "on_ioerror" "on_ioerror" (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "or"         "or"        (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "pro"        "pro"       (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "repeat"     "repeat"    (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "switch"     "switch"    (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "then"       "then"      (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "until"      "until"     (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "while"      "while"     (idlwave-keyword-abbrev 0 t) t)
+(idlwave-define-abbrev "xor"        "xor"       (idlwave-keyword-abbrev 0 t) t)
 
 (defvar imenu-create-index-function)
 (defvar extract-index-name-function)
 (defvar prev-index-position-function)
 (defvar imenu-extract-index-name-function)
 (defvar imenu-prev-index-position-function)
-;; defined later - so just make the compiler shut up
+;; defined later - so just make the compiler hush
 (defvar idlwave-mode-menu)  
 (defvar idlwave-mode-debug-menu)
 
@@ -1723,10 +1819,10 @@
    Like other Emacs programming modes, C-j inserts a newline and indents.
    TAB is used for explicit indentation of the current line.
 
-   To start a continuation line, use \\[idlwave-split-line].  This function can also
-   be used in the middle of a line to split the line at that point.
-   When used inside a long constant string, the string is split at
-   that point with the `+' concatenation operator.
+   To start a continuation line, use \\[idlwave-split-line].  This
+   function can also be used in the middle of a line to split the line
+   at that point.  When used inside a long constant string, the string
+   is split at that point with the `+' concatenation operator.
 
    Comments are indented as follows:
 
@@ -1736,24 +1832,28 @@
 
    The indentation of comments starting in column 0 is never changed.
 
-   Use \\[idlwave-fill-paragraph] to refill a paragraph inside a comment.  The indentation
-   of the second line of the paragraph relative to the first will be
-   retained.  Use \\[idlwave-auto-fill-mode] to toggle auto-fill mode for these comments.
-   When the variable `idlwave-fill-comment-line-only' is nil, code
-   can also be auto-filled and auto-indented (not recommended).
+   Use \\[idlwave-fill-paragraph] to refill a paragraph inside a
+   comment.  The indentation of the second line of the paragraph
+   relative to the first will be retained.  Use
+   \\[idlwave-auto-fill-mode] to toggle auto-fill mode for these
+   comments.  When the variable `idlwave-fill-comment-line-only' is
+   nil, code can also be auto-filled and auto-indented (not
+   recommended).
 
    To convert pre-existing IDL code to your formatting style, mark the
-   entire buffer with \\[mark-whole-buffer] and execute \\[idlwave-expand-region-abbrevs].
-   Then mark the entire buffer again followed by \\[indent-region] (`indent-region').
+   entire buffer with \\[mark-whole-buffer] and execute
+   \\[idlwave-expand-region-abbrevs].  Then mark the entire buffer
+   again followed by \\[indent-region] (`indent-region').
 
 2. Routine Info
    ------------
-   IDLWAVE displays information about the calling sequence and the accepted
-   keyword parameters of a procedure or function with \\[idlwave-routine-info].
-   \\[idlwave-find-module] jumps to the source file of a module.
-   These commands know about system routines, all routines in idlwave-mode
-   buffers and (when the idlwave-shell is active) about all modules
-   currently compiled under this shell.  Use \\[idlwave-update-routine-info] to update this
+   IDLWAVE displays information about the calling sequence and the
+   accepted keyword parameters of a procedure or function with
+   \\[idlwave-routine-info].  \\[idlwave-find-module] jumps to the
+   source file of a module.  These commands know about system
+   routines, all routines in idlwave-mode buffers and (when the
+   idlwave-shell is active) about all modules currently compiled under
+   this shell.  Use \\[idlwave-update-routine-info] to update this
    information, which is also used for completion (see item 4).
 
 3. Online IDL Help
@@ -1812,10 +1912,10 @@
 
 9. Documentation and Customization
    -------------------------------
-   Info documentation for this package is available.  Use \\[idlwave-info]
-   to display (complain to your sysadmin if that does not work).
-   For Postscript and HTML versions of the documentation, check IDLWAVE's
-   homepage at `http://www.strw.leidenuniv.nl/~dominik/Tools/idlwave'.
+   Info documentation for this package is available.  Use
+   \\[idlwave-info] to display (complain to your sysadmin if that does
+   not work).  For Postscript, PDF, and HTML versions of the
+   documentation, check IDLWAVE's homepage at `http://idlwave.org'.
    IDLWAVE has customize support - see the group `idlwave'.
 
 10.Keybindings
@@ -1861,7 +1961,8 @@
   (set (make-local-variable idlwave-fill-function) 'idlwave-auto-fill)
   (setq comment-end "")
   (set (make-local-variable 'comment-multi-line) nil)
-  (set (make-local-variable 'paragraph-separate) "[ \t\f]*$\\|[ \t]*;+[ \t]*$")
+  (set (make-local-variable 'paragraph-separate) 
+       "[ \t\f]*$\\|[ \t]*;+[ \t]*$\\|;+[+=-_*]+$")
   (set (make-local-variable 'paragraph-start) "[ \t\f]\\|[ \t]*;+[ \t]")
   (set (make-local-variable 'paragraph-ignore-fill-prefix) nil)
   (set (make-local-variable 'parse-sexp-ignore-comments) nil)
@@ -1884,10 +1985,15 @@
        'idlwave-prev-index-position)
 
   ;; Make a local post-command-hook and add our hook to it
+  ;; NB: `make-local-hook' needed for older/alternative Emacs compatibility
+  (make-local-hook 'post-command-hook)
   (add-hook 'post-command-hook 'idlwave-command-hook nil 'local)
 
   ;; Make local hooks for buffer updates
+  ;; NB: `make-local-hook' needed for older/alternative Emacs compatibility
+  (make-local-hook 'kill-buffer-hook)
   (add-hook 'kill-buffer-hook 'idlwave-kill-buffer-update nil 'local)
+  (make-local-hook 'after-save-hook)
   (add-hook 'after-save-hook 'idlwave-save-buffer-update nil 'local)
   (add-hook 'after-save-hook 'idlwave-revoke-license-to-kill nil 'local)
 
@@ -1988,6 +2094,16 @@
            (backward-char 1)
            (point)))))
 
+(defvar transient-mark-mode)
+(defvar zmacs-regions)
+(defvar mark-active)
+(defun idlwave-region-active-p ()
+  "Is transien-mark-mode on an the region active?
+Works on both Emacs and XEmacs."
+  (if (featurep 'xemacs)
+      (and zmacs-regions (region-active-p))
+    (and transient-mark-mode mark-active)))
+
 (defun idlwave-show-matching-quote ()
   "Insert quote and show matching quote if this is end of a string."
   (interactive)
@@ -2006,19 +2122,17 @@
 (defun idlwave-show-begin-check ()
   "Ensure that the previous word was a token before `idlwave-show-begin'.
 An END token must be preceded by whitespace."
-  (if
-      (save-excursion
-        (backward-word 1)
-        (backward-char 1)
-        (looking-at "[ \t\n\f]"))
-      (idlwave-show-begin)))
+  (if (not (idlwave-quoted))
+      (if
+	  (save-excursion
+	    (backward-word 1)
+	    (backward-char 1)
+	    (looking-at "[ \t\n\f]"))
+	  (idlwave-show-begin))))
 
 (defun idlwave-show-begin ()
   "Finds the start of current block and blinks to it for a second.
 Also checks if the correct end statement has been used."
-  ;; Re-indent end line
-  (if idlwave-reindent-end
-      (idlwave-indent-line))
   ;; All end statements are reserved words
   (let* ((pos (point))
 	 end end1)
@@ -2034,7 +2148,7 @@
 	(idlwave-block-jump-out -1 'nomark)
 	(when (setq end1 (cdr (idlwave-block-master)))
 	  (cond
-	   ((null end1)) ; no-opeartion
+	   ((null end1)) ; no-operation
 	   ((string= (downcase end) (downcase end1))
 	    (sit-for 1))
 	   ((string= (downcase end) "end")
@@ -2050,7 +2164,10 @@
 	    (beep)
 	    (message "Warning: Shouldn't this be \"%s\" instead of \"%s\"?" 
 		     end1 end)
-	    (sit-for 1))))))))
+	    (sit-for 1)))))))
+  ;; Re-indent end line
+  (if idlwave-reindent-end
+      (idlwave-indent-line)))
 
 (defun idlwave-block-master ()
   (let ((case-fold-search t))
@@ -2084,10 +2201,16 @@
 	    (bolp))
     (let ((idlwave-show-block nil))
       (newline-and-indent)))
-  (insert "end")
-  (idlwave-show-begin))
-
-(defun idlwave-surround (&optional before after escape-chars length)
+  (let ((last-abbrev-location (point)))  ; for upcasing
+    (insert "end")
+    (idlwave-show-begin)))
+
+(defun idlwave-gtr-pad-hook (char) 
+  "Let the > symbol expand around -> if present.  The new token length
+is returned."  
+  2)
+
+(defun idlwave-surround (&optional before after escape-chars length ec-hook)
   "Surround the LENGTH characters before point with blanks.
 LENGTH defaults to 1.
 Optional arguments BEFORE and AFTER affect the behavior before and
@@ -2103,32 +2226,39 @@
 - the character before point is inside a string or comment
 - the char preceeding the string to be surrounded is a member of ESCAPE-CHARS.
   This hack is used to avoid padding of `>' when it is part of
-  the '->' operator.  In this case, ESCAPE-CHARS would be '(?-)."
-
-  (setq length (or length 1))   ; establish a default for LENGTH
-
-  (when (and idlwave-surround-by-blank
-	     (not (idlwave-quoted))
-	     (not (memq (char-after (- (point) (1+ length))) escape-chars)))
-    (backward-char length)
-    (save-restriction
-      (let ((here (point)))
-	(skip-chars-backward " \t")
-	(if (bolp)
-	    ;; avoid clobbering indent
-	    (progn
-	      (move-to-column (idlwave-calculate-indent))
-	      (if (<= (point) here)
-		  (narrow-to-region (point) here))
-	      (goto-char here)))
-	(idlwave-make-space before))
-      (skip-chars-forward " \t"))
-    (forward-char length)
-    (idlwave-make-space after)
-    ;; Check to see if the line should auto wrap
-    (if (and (equal (char-after (1- (point))) ?\ )
-	     (> (current-column) fill-column))
-	(funcall auto-fill-function))))
+  the '->' operator.  In this case, ESCAPE-CHARS would be '(?-).
+
+If a function is passed in EC-HOOK, and an ESCAPE-CHARS match occurs,
+the named function will be called with a single argument of the
+preceeding character.  Then idlwave-surround will run as usual if
+EC-HOOK returns non-nil, and a new length will be taken from the
+return value."
+  (when (and idlwave-surround-by-blank (not (idlwave-quoted)))
+    (let* ((length (or length 1)) ; establish a default for LENGTH
+	   (prev-char (char-after (- (point) (1+ length)))))
+      (when (or (not (memq prev-char escape-chars))
+		(and (fboundp ec-hook) 
+		     (setq length 
+			   (save-excursion (funcall ec-hook prev-char)))))
+	(backward-char length)
+	(save-restriction
+	  (let ((here (point)))
+	    (skip-chars-backward " \t")
+	    (if (bolp)
+		;; avoid clobbering indent
+		(progn
+		  (move-to-column (idlwave-calculate-indent))
+		  (if (<= (point) here)
+		      (narrow-to-region (point) here))
+		  (goto-char here)))
+	    (idlwave-make-space before))
+	  (skip-chars-forward " \t"))
+	(forward-char length)
+	(idlwave-make-space after)
+	;; Check to see if the line should auto wrap
+	(if (and (equal (char-after (1- (point))) ?\ )
+		 (> (current-column) fill-column))
+	    (funcall auto-fill-function))))))
 
 (defun idlwave-make-space (n)
   "Make space at point.
@@ -2226,7 +2356,9 @@
                   ;; Split the string.
                   (progn (insert (setq beg (char-after beg)) " + "
                                  idlwave-continuation-char beg)
-                         (backward-char 1))
+                         (backward-char 1)
+			 (newline-and-indent)
+			 (forward-char 1))
                 ;; Do not split the string.
                 (beep)
                 (message "Warning: continuation inside string!!")
@@ -2234,8 +2366,8 @@
             ;; Not splitting a string.
 	    (if (not (member (char-before) '(?\  ?\t)))
 		(insert " "))
-            (insert idlwave-continuation-char))
-          (newline-and-indent))
+            (insert idlwave-continuation-char)
+	    (newline-and-indent)))
       (indent-new-comment-line))
     ;; Indent previous line
     (setq beg (- (point-max) (point)))
@@ -2466,15 +2598,16 @@
   ;; - it is not in a comment
   ;; - not in a string constant
   ;; - not in parenthesis (like a[0:3])
+  ;; - not followed by another ":" in explicit class, ala a->b::c
   ;; As many in this mode, this function is heuristic and not an exact
   ;; parser. 
-  (let ((start (point))
-        (end (idlwave-find-key ":" 1 'nomark
-			       (save-excursion
-				 (idlwave-end-of-statement) (point)))))
+  (let* ((start (point))
+	 (eos (save-excursion (idlwave-end-of-statement) (point)))
+	 (end (idlwave-find-key ":" 1 'nomark eos)))
     (if (and end
              (= (nth 0 (parse-partial-sexp start end)) 0)
-	     (not (string-match "\\?" (buffer-substring start end))))
+	     (not (string-match "\\?" (buffer-substring start end)))
+	     (not (string-match "^::" (buffer-substring end eos))))
         (progn
           (forward-char)
           (point))
@@ -2561,18 +2694,22 @@
 	       (idlwave-surround 0 0))
 	      (t)))))	       
 
-(defun idlwave-indent-and-action ()
-  "Call `idlwave-indent-line' and do expand actions."
-  (interactive)
+(defun idlwave-indent-and-action (&optional arg)
+  "Call `idlwave-indent-line' and do expand actions.
+With prefix ARG non-nil, indent the entire sub-statement."
+  (interactive "p")
   (save-excursion
     (if	(and idlwave-expand-generic-end 
 	     (re-search-backward "\\<\\(end\\)\\s-*\\=" 
 				 (max 0 (- (point) 10)) t)
 	     (looking-at "\\(end\\)\\([ \n\t]\\|\\'\\)"))
 	(progn (goto-char (match-end 1))
-	       (idlwave-show-begin))))
-  (idlwave-indent-line t)
-  )
+	       ;;Expand the END abbreviation, just as RET or Space would have.
+	       (if abbrev-mode (expand-abbrev)
+		 (idlwave-show-begin)))))
+  (if arg 
+      (idlwave-indent-statement)
+    (idlwave-indent-line t)))
 
 (defun idlwave-indent-line (&optional expand)
   "Indents current IDL line as code or as a comment.
@@ -2670,6 +2807,15 @@
       (indent-region beg (point) nil))
     (message "Indenting subprogram...done.")))
 
+(defun idlwave-indent-statement ()
+  "Indent current statement, including all continuation lines."
+  (interactive)
+  (save-excursion
+    (idlwave-beginning-of-statement)
+    (let ((beg (point)))
+      (idlwave-end-of-statement)
+      (indent-region beg (point) nil))))
+
 (defun idlwave-calculate-indent ()
   "Return appropriate indentation for current line as IDL code."
   (save-excursion
@@ -2688,7 +2834,7 @@
      (t (let ((the-indent
                ;; calculate indent based on previous statement
                (save-excursion
-                 (cond
+		 (cond
                   ((idlwave-previous-statement)
                    0)
                   ;; Main block
@@ -2707,73 +2853,140 @@
           ;; adjust the indentation based on the current statement
           (cond
            ;; End block
-           ((idlwave-look-at idlwave-end-block-reg t)
-            (+ the-indent idlwave-end-offset))
+           ((idlwave-look-at idlwave-end-block-reg)
+	    (+ the-indent idlwave-end-offset))
            (the-indent)))))))
 
 ;;
-;; Parenthesses balacing/indent
+;; Parentheses balacing/indent
 ;;
 
+(defun idlwave-calculate-paren-indent (beg-reg end-reg close-exp)
+  "Calculate the continuation indent inside a paren group.
+Returns a cons-cell with (open . indent), where open is the 
+location of the open paren"
+  (let ((open (nth 1 (parse-partial-sexp beg-reg end-reg))))
+    ;; Found an innermost open paren.
+    (when open
+      (goto-char open)
+      ;; Line up with next word unless this is a closing paren.
+      (cons open
+	    (cond
+	     ;; This is a closed paren - line up under open paren.
+	     (close-exp
+	      (current-column))
+	     ;; Empty (or just comment) - just line up next to paren
+	     ((progn
+		;; Skip paren
+		(forward-char 1)
+		(looking-at "[ \t$]*\\(;.*\\)?$"))
+	      (current-column))
+	     ;; Line up with first word after blank space
+	     ((progn
+		(skip-chars-forward " \t")
+		(current-column))))))))
+
 (defun idlwave-calculate-cont-indent ()
   "Calculates the IDL continuation indent column from the previous statement.
 Note that here previous statement means the beginning of the current
-statement if this statement is a continuation of the previous line.
-Intervening comments or comments within the previous statement can
-screw things up if the comments contain parentheses characters."
+statement if this statement is a continuation of the previous line."
   (save-excursion
     (let* (open
            (case-fold-search t)
            (end-reg (progn (beginning-of-line) (point)))
            (close-exp (progn (skip-chars-forward " \t") (looking-at "\\s)")))
-           (beg-reg (progn (idlwave-previous-statement) (point))))
-      ;;
-      ;; If PRO or FUNCTION declaration indent after name, and first comma.
-      ;;
-      (if (idlwave-look-at "\\<\\(pro\\|function\\)\\>")
-          (progn
-            (forward-sexp 1)
-            (if (looking-at "[ \t]*,[ \t]*")
-                (goto-char (match-end 0)))
-            (current-column))
-        ;;
-        ;; Not a PRO or FUNCTION
-        ;;
-        ;; Look for innermost unmatched open paren
-        ;;
-        (if (setq open (car (cdr (parse-partial-sexp beg-reg end-reg))))
-            ;; Found innermost open paren.
-            (progn
-              (goto-char open)
-	      ;; Line up with next word unless this is a closing paren.
-              (cond
-               ;; This is a closed paren - line up under open paren.
-               (close-exp
-                (current-column))
-               ;; Empty - just add regular indent. Take into account
-               ;; the forward-char
-               ((progn
-                  ;; Skip paren
-                  (forward-char 1)
-                  (looking-at "[ \t$]*$"))
-                (+ (current-column) idlwave-continuation-indent -1))
-               ;; Line up with first word
-               ((progn
-                  (skip-chars-forward " \t")
-                  (current-column)))))
-          ;; No unmatched open paren. Just a simple continuation.
-          (goto-char beg-reg)
-          (+ (idlwave-current-indent)
-             ;; Make adjustments based on current line
-             (cond
-              ;; Else statement
-              ((progn
-                 (goto-char end-reg)
-                 (skip-chars-forward " \t")
-                 (looking-at "else"))
-               0)
-              ;; Ordinary continuation
-              (idlwave-continuation-indent))))))))
+           (beg-reg (progn (idlwave-previous-statement) (point)))
+	   (cur-indent (idlwave-current-indent))
+	   (else-cont (and (goto-char end-reg) (looking-at "[ \t]*else")))
+	   (basic-indent 	   ;; The basic, non-fancy indent
+	    (+ cur-indent idlwave-continuation-indent))
+	   (fancy-nonparen-indent  ;; A smarter indent for routine/assignments
+	    ;; Try without parens first:
+	    (progn
+	      (goto-char beg-reg)
+	      (while (idlwave-look-at "&"))  ; skip over continued statements
+	      (cond
+	       ;; A continued Procedure call or definition
+	       ((progn
+		  (idlwave-look-at "\\(pro\\|function\\)")
+		  (looking-at "[ \t]*\\([a-zA-Z0-9$_]+[ \t]*->[ \t]*\\)?[a-zA-Z][:a-zA-Z0-9$_]*[ \t]*\\(,\\)[ \t]*"))
+		(goto-char (match-end 0))
+		;; Comment only, or blank line with "$"?  Align with ,
+		(if (save-match-data (looking-at "[ \t$]*\\(;.*\\)?$"))
+		    (goto-char (match-end 2)))
+		(current-column))
+
+	       ;; Continued assignment (with =), 
+	       ((looking-at "[ \t]*[a-zA-Z0-9$_]+[ \t]*\\(=\\)[ \t]*")
+		(goto-char (match-end 0))
+		;; Comment only?  Align with =
+		(if (save-match-data (looking-at "[ \t$]*\\(;.*\\)?$"))
+		    (progn 
+		      (goto-char (match-end 1))
+		      (if idlwave-surround-by-blank 
+			  (1+ (current-column))
+			(current-column)))
+		  (current-column))))))
+	   (fancy-nonparen-indent-allowed
+ 	    (and fancy-nonparen-indent
+		 (< (- fancy-nonparen-indent basic-indent)
+		    idlwave-max-extra-continuation-indent)))
+	   (fancy-paren-indent-cons     ;; A smarter indent for paren groups
+	    ;; Look for any enclosing parens
+	    (idlwave-calculate-paren-indent beg-reg end-reg close-exp))
+	   (fancy-paren-open (car fancy-paren-indent-cons))
+	   (fancy-paren-indent (cdr fancy-paren-indent-cons))
+	   (fancy-paren-indent-allowed
+	    (and fancy-paren-indent
+		 (or idlwave-indent-to-open-paren ;; override
+		     (< (- fancy-paren-indent basic-indent)
+			idlwave-max-extra-continuation-indent))))
+	    fancy-enclosing-parent-indent)
+      (cond 
+       ;; else continuations are always standard
+       (else-cont 
+	cur-indent)
+
+       ;; an allowed parenthesis-indent
+       (fancy-paren-indent-allowed 
+	fancy-paren-indent)
+
+       ;; a disallowed paren indent nested inside one or more other
+       ;; parens: indent relative to the first allowed enclosing paren
+       ;; set, if any... if it's actually a greater indent, just use
+       ;; the fancy-paren-indent anyway.
+       ((and fancy-paren-indent
+	     (not fancy-paren-indent-allowed)
+	     (setq fancy-enclosing-paren-indent
+		   (let ((enclose-open fancy-paren-open)
+			 enclose-indent-cons
+			 enclose-indent)
+		     (catch 'loop
+		       (while (setq enclose-indent-cons
+				    (idlwave-calculate-paren-indent 
+				     beg-reg (max (1- enclose-open) beg-reg)
+				     nil)
+				    enclose-open   (car enclose-indent-cons)
+				    enclose-indent (cdr enclose-indent-cons))
+			 (if (< (- enclose-indent basic-indent)
+				idlwave-max-extra-continuation-indent)
+			     (throw 'loop enclose-indent)))))))
+	(min fancy-paren-indent
+	     (+ fancy-enclosing-paren-indent idlwave-continuation-indent)))
+	       	
+       ;; a disallowed paren indent inside another type: indent relative
+       ((and fancy-paren-indent 	
+	     (not fancy-paren-indent-allowed)
+	     fancy-nonparen-indent-allowed )
+	(+ fancy-nonparen-indent idlwave-continuation-indent))
+
+       ;; an allowed nonparen-only indent
+       (fancy-nonparen-indent-allowed
+	fancy-nonparen-indent)
+
+       ;; everything else
+       (t 
+	basic-indent)))))
 
 (defun idlwave-find-key (key-re &optional dir nomark limit)
   "Move to next match of the regular expression KEY-RE.
@@ -2855,9 +3068,16 @@
           ((current-column)))))
 
 (defun idlwave-is-continuation-line ()
-  "Tests if current line is continuation line."
+  "Tests if current line is continuation line.
+Blank or comment-only lines following regular continuation lines (with
+`$') count as continuations too."
   (save-excursion
-    (idlwave-look-at "\\<\\$")))
+    (or 
+     (idlwave-look-at "\\<\\$")
+     (catch 'loop
+       (while (and (looking-at "^[ \t]*\\(;.*\\)?$") 
+		   (eq (forward-line -1) 0))
+	 (if (idlwave-look-at "\\<\\$") (throw 'loop t)))))))
 
 (defun idlwave-is-comment-line ()
   "Tests if the current line is a comment line."
@@ -3215,31 +3435,36 @@
   (interactive "P")
   (or nomark (push-mark))
   ;; make sure we catch the current line if it begins the unit
-  (end-of-line)
-  (idlwave-beginning-of-subprogram)
-  (beginning-of-line)
-  ;; skip function or procedure line
-  (if (idlwave-look-at "\\<\\(pro\\|function\\)\\>")
-      (progn
-        (idlwave-end-of-statement)
-        (if (> (forward-line 1) 0) (insert "\n"))))
-  (if idlwave-file-header
-      (cond ((car idlwave-file-header)
-             (insert-file (car idlwave-file-header)))
-            ((stringp (car (cdr idlwave-file-header)))
-             (insert (car (cdr idlwave-file-header)))))))
-
+  (if idlwave-header-to-beginning-of-file
+      (goto-char (point-min))
+    (end-of-line)
+    (idlwave-beginning-of-subprogram)
+    (beginning-of-line)
+    ;; skip function or procedure line
+    (if (idlwave-look-at "\\<\\(pro\\|function\\)\\>")
+	(progn
+	  (idlwave-end-of-statement)
+	  (if (> (forward-line 1) 0) (insert "\n")))))
+  (let ((pos (point)))
+    (if idlwave-file-header
+	(cond ((car idlwave-file-header)
+	       (insert-file (car idlwave-file-header)))
+	      ((stringp (car (cdr idlwave-file-header)))
+	       (insert (car (cdr idlwave-file-header))))))
+    (goto-char pos)))
 
 (defun idlwave-default-insert-timestamp ()
   "Default timestamp insertion function"
   (insert (current-time-string))
   (insert ", " (user-full-name))
-  (insert " <" (user-login-name) "@" (system-name) ">")
+  (if (boundp 'user-mail-address)
+      (insert " <" user-mail-address ">") 
+    (insert " <" (user-login-name) "@" (system-name) ">"))
   ;; Remove extra spaces from line
   (idlwave-fill-paragraph)
   ;; Insert a blank line comment to separate from the date entry -
   ;; will keep the entry from flowing onto date line if re-filled.
-  (insert "\n;\n;\t\t"))t
+  (insert "\n;\n;\t\t"))
 
 (defun idlwave-doc-modification ()
   "Insert a brief modification log at the beginning of the current program.
@@ -3915,10 +4140,31 @@
 ;; The code to get routine info from different sources.
 
 (defvar idlwave-system-routines)
+(defvar idlwave-catalog-process nil
+  "The background process currently updating the catalog.")
+
 (defun idlwave-routines ()
   "Provide a list of IDL routines.
 This routine loads the builtin routines on the first call.  Later it
 only returns the value of the variable."
+  (if (and idlwave-catalog-process
+	   (processp idlwave-catalog-process))
+      (progn
+	(cond
+	 ((equal (process-status idlwave-catalog-process) 'exit)
+	  (message "updating........")
+	  (setq idlwave-catalog-process nil)
+	  (idlwave-update-routine-info '(4)))
+	 ((equal (process-status idlwave-catalog-process) 'run)
+	  ;; Keep it running...
+	  )
+	 (t
+	  ;; Something is wrong, get rid of the process
+	  (message "Problem with catalog process") (beep)
+	  (condition-case nil
+	      (kill-process idlwave-catalog-process)
+	    (error nil))
+	  (setq idlwave-catalog-process nil)))))
   (or idlwave-routines
       (progn
 	(idlwave-update-routine-info)
@@ -3929,6 +4175,52 @@
   "List of functions which should run after a global rinfo update.
 Does not run after automatic updates of buffer or the shell.")
 
+(defun idlwave-rescan-catalog-directories ()
+  "Rescan the previously selected directories. For batch processing."
+  (idlwave-update-routine-info '(16)))
+
+(defun idlwave-rescan-asynchronously ()
+  "Dispatch another emacs instance to update the idlwave catalog.
+After the process finishes normally, the first access to routine info
+will re-read the catalog."
+  (interactive)
+  (if (processp idlwave-catalog-process)
+      (if (eq (process-status idlwave-catalog-process) 'run)
+	  (if (yes-or-no-p "A catalog-updating process is running.  Kill it? ")
+	      (progn
+		(condition-case nil
+		    (kill-process idlwave-catalog-process)
+		  (error nil))
+		(error "Process killed, no new process started"))
+	    (error "Quit"))
+	(condition-case nil
+	    (kill-process idlwave-catalog-process)
+	  (error nil))))
+  (if (or (not idlwave-libinfo-file)
+	  (not (stringp idlwave-libinfo-file))
+	  (not (file-regular-p idlwave-libinfo-file)))
+      (error "No catalog has been produced yet"))
+  (let* ((emacs (expand-file-name (invocation-name) (invocation-directory)))
+	 (args (list "-batch"
+		     "-l" (expand-file-name "~/.emacs")
+		     "-l" "idlwave"
+		     "-f" "idlwave-rescan-catalog-directories"))
+	 (process (apply 'start-process "idlcat" 
+			 nil emacs args)))
+    (setq idlwave-catalog-process process)
+    (set-process-sentinel 
+     process
+     (lambda (pro why)
+       (when (string-match "finished" why)
+	 (setq idlwave-routines nil
+	       idlwave-system-routines nil
+	       idlwave-catalog-process nil)
+	 (or (idlwave-start-load-rinfo-timer)
+	     (idlwave-update-routine-info '(4))))))
+    (message "Background job started to update catalog file")))
+
+
+(defvar idlwave-load-rinfo-idle-timer)
 (defun idlwave-update-routine-info (&optional arg)
   "Update the internal routine-info lists.
 These lists are used by `idlwave-routine-info' (\\[idlwave-routine-info])
@@ -3947,29 +4239,48 @@
 for currently compiled routines.
 
 With prefix ARG, also reload the system and library lists.
-With two prefix ARG's, also rescans the library tree."
+With two prefix ARG's, also rescans the library tree.
+With three prefix args, dispatch asynchronous process to do the update."
   (interactive "P")
-  (if (equal arg '(16))
-      (idlwave-create-libinfo-file t)
-    (let* ((reload (or arg
-		       idlwave-buffer-case-takes-precedence
-		       (null idlwave-system-routines))))
+  ;; Stop any idle processing
+  (if (or (and (fboundp 'itimerp)
+	       (itimerp idlwave-load-rinfo-idle-timer))
+	  (and (fboundp 'timerp)
+	       (timerp idlwave-load-rinfo-idle-timer)))
+      (cancel-timer idlwave-load-rinfo-idle-timer))
+  (cond
+   ((equal arg '(64))
+    ;; Start a background process which updates the catalog.
+    (idlwave-rescan-asynchronously))
+   ((equal arg '(16))
+    ;; Update the catalog now, and wait for it.
+    (idlwave-create-libinfo-file t))
+   (t
+    (let* ((load (or arg
+		     idlwave-buffer-case-takes-precedence
+		     (null idlwave-routines)))
+	   ;; The override-idle means, even if the idle timer has done some
+	   ;; preparing work, load and renormalize everything anyway.
+	   (override-idle (or arg idlwave-buffer-case-takes-precedence)))
       
       (setq idlwave-buffer-routines nil
 	    idlwave-compiled-routines nil
 	    idlwave-unresolved-routines nil)
       ;; Reset the appropriate hashes
-      (idlwave-reset-sintern (cond (reload t)
-				   ((null idlwave-system-routines) t)
-				   (t 'bufsh)))
+      (if (get 'idlwave-reset-sintern 'done-by-idle)
+	  ;; reset was already done in idle time, so skip this step now once
+	  (put 'idlwave-reset-sintern 'done-by-idle nil)
+	(idlwave-reset-sintern (cond (load t)
+				     ((null idlwave-system-routines) t)
+				     (t 'bufsh))))
       
       (if idlwave-buffer-case-takes-precedence
 	  ;; We can safely scan the buffer stuff first
 	  (progn
 	    (idlwave-update-buffer-routine-info)
-	    (and reload (idlwave-load-system-rinfo)))
+	    (and load (idlwave-load-system-rinfo override-idle)))
 	;; We first do the system info, and then the buffers
-	(and reload (idlwave-load-system-rinfo))
+	(and load (idlwave-load-system-rinfo override-idle))
 	(idlwave-update-buffer-routine-info))
 
       ;; Let's see if there is a shell
@@ -3992,15 +4303,94 @@
 	(when ask-shell
 	  ;; Ask the shell about the routines it knows.
 	  (message "Querying the shell")
-	  (idlwave-shell-update-routine-info nil t))))))
-
-(defun idlwave-load-system-rinfo ()
+	  (idlwave-shell-update-routine-info nil t)))))))
+
+(defvar idlwave-load-rinfo-steps-done (make-vector 5 nil))
+(defvar idlwave-load-rinfo-idle-timer nil)
+(defun idlwave-start-load-rinfo-timer ()
+  (if (or (and (fboundp 'itimerp)
+	       (itimerp idlwave-load-rinfo-idle-timer))
+	  (and (fboundp 'timerp)
+	       (timerp idlwave-load-rinfo-idle-timer)))
+      (cancel-timer idlwave-load-rinfo-idle-timer))
+  (setq idlwave-load-rinfo-steps-done (make-vector 5 nil))
+  (setq idlwave-load-rinfo-idle-timer nil)
+  (if (and idlwave-init-rinfo-when-idle-after
+	   (numberp idlwave-init-rinfo-when-idle-after)
+	   (not (equal 0 idlwave-init-rinfo-when-idle-after))
+	   (not idlwave-routines))
+      (condition-case nil
+	  (progn
+	    (setq idlwave-load-rinfo-idle-timer
+		  (run-with-idle-timer
+		   idlwave-init-rinfo-when-idle-after
+		   nil 'idlwave-load-rinfo-next-step)))
+	(error nil))))
+
+
+
+(defun idlwave-load-rinfo-next-step ()
+  (let ((inhibit-quit t)
+	(arr idlwave-load-rinfo-steps-done))
+    (if	(catch 'exit
+	  (when (not (aref arr 0))
+	    (message "Loading idlw-rinfo.el in idle time...")
+	    (load "idlw-rinfo" 'noerror 'nomessage)
+	    (message "Loading idlw-rinfo.el in idle time...done")
+	    (aset arr 0 t)
+	    (throw 'exit t))
+	  (when (not (aref arr 1))
+	    (message "Normalizing idlwave-system-routines in idle time...")
+	    (idlwave-reset-sintern t)
+	    (put 'idlwave-reset-sintern 'done-by-idle t)
+	    (setq idlwave-system-routines
+		  (idlwave-sintern-rinfo-list idlwave-system-routines 'sys))
+	    (message "Normalizing idlwave-system-routines in idle time...done")
+	    (aset arr 1 t)
+	    (throw 'exit t))
+	  (when (not (aref arr 2))
+	    (when (and (stringp idlwave-libinfo-file)
+		       (file-regular-p idlwave-libinfo-file))
+	      (condition-case nil
+		  (progn 
+		    (message "Loading library catalog in idle time...")
+		    (load-file idlwave-libinfo-file)
+		    (message "Loading library catalog in idle time...done")
+		    (aset arr 2 t)
+		    (throw 'exit t))
+		(error (throw 'exit nil)))))
+	  (when (not (aref arr 3))
+	    (when idlwave-library-routines
+	      (message "Normalizing idlwave-library-routines in idle time...")
+	      (setq idlwave-library-routines (idlwave-sintern-rinfo-list
+					      idlwave-library-routines 'sys))
+	      (message "Normalizing idlwave-library-routines in idle time...done"))
+	    (aset arr 3 t)
+	    (throw 'exit t))
+	  (when (not (aref arr 4))
+	    (message "Finishing initialization in idle time...")
+	    (idlwave-routines)
+	    (message "Finishing initialization in idle time...done")
+	    (throw 'exit nil)))
+	(progn
+	  ;; restart the timer
+	  (if (sit-for 1)
+	      (idlwave-load-rinfo-next-step)
+	    (setq idlwave-load-rinfo-idle-timer
+		  (run-with-idle-timer
+		   idlwave-init-rinfo-when-idle-after
+		   nil 'idlwave-load-rinfo-next-step)))
+	  ))))
+
+(defun idlwave-load-system-rinfo (&optional force)
   ;; Load and case-treat the system and lib info files.
-  (load "idlw-rinfo" t)
-  (message "Normalizing idlwave-system-routines...")
-  (setq idlwave-system-routines
-	(idlwave-sintern-rinfo-list idlwave-system-routines 'sys))
-  (message "Normalizing idlwave-system-routines...done")
+  (when (or force (not (aref idlwave-load-rinfo-steps-done 0)))
+    (load "idlw-rinfo" 'noerror 'nomessage))
+  (when (or force (not (aref idlwave-load-rinfo-steps-done 1)))
+    (message "Normalizing idlwave-system-routines...")
+    (setq idlwave-system-routines
+	  (idlwave-sintern-rinfo-list idlwave-system-routines 'sys))
+    (message "Normalizing idlwave-system-routines...done"))
   (setq idlwave-routines (copy-sequence idlwave-system-routines))
   (setq idlwave-last-system-routine-info-cons-cell
 	(nthcdr (1- (length idlwave-routines)) idlwave-routines))
@@ -4008,13 +4398,16 @@
 	     (file-regular-p idlwave-libinfo-file))
     (condition-case nil
 	(progn
-	  (load-file idlwave-libinfo-file)
+	  (when (or force (not (aref idlwave-load-rinfo-steps-done 2)))
+	    (load-file idlwave-libinfo-file))
 	  (setq idlwave-true-path-alist nil)
-	  (message "Normalizing idlwave-library-routines...")
-	  (setq idlwave-library-routines (idlwave-sintern-rinfo-list
-					  idlwave-library-routines 'sys))
-	  (message "Normalizing idlwave-library-routines...done"))
+	  (when (or force (not (aref idlwave-load-rinfo-steps-done 3)))
+	    (message "Normalizing idlwave-library-routines...")
+	    (setq idlwave-library-routines (idlwave-sintern-rinfo-list
+					    idlwave-library-routines 'sys))
+	    (message "Normalizing idlwave-library-routines...done")))
       (error nil)))
+
   (run-hooks 'idlwave-after-load-rinfo-hook))
 
 
@@ -4467,10 +4860,13 @@
 
     ;; Define the routine info list
     (insert "\n(setq idlwave-library-routines\n    '(")
-    (mapcar (lambda (x)
-	      (insert "\n    ")
-	      (insert (with-output-to-string (prin1 x))))
-	    idlwave-library-routines)
+    (let ((standard-output (current-buffer)))
+      (mapcar (lambda (x)
+		(insert "\n    ")
+		(prin1 x)
+		(goto-char (point-max)))
+;		(insert (with-output-to-string (prin1 x))))
+	      idlwave-library-routines))
     (insert (format "))\n\n;;; %s ends here\n"
 		    (file-name-nondirectory idlwave-libinfo-file)))
     (goto-char (point-min))
@@ -4609,7 +5005,7 @@
 
 pro idlwave_get_class_tags, class
   res = execute('tags=tag_names({'+class+'})')
-  if res then print,'IDLWAVE-CLASS-TAGS: '+class+string(format='(1000(\" \",A))',tags)
+  if res then print,'IDLWAVE-CLASS-TAGS: '+class+' '+strjoin(tags,' ',/single)
 end
 ;; END OF IDLWAVE SUPPORT ROUTINES
 " 
@@ -4625,25 +5021,27 @@
   ;; Save and compile the procedure.  The compiled procedure is then
   ;; saved into an IDL SAVE file, to allow for fast RESTORE.
   ;; We need to RESTORE the procedure each time we use it, since
-  ;; the user may have killed or redefined it.  In particluar,
+  ;; the user may have killed or redefined it.  In particular,
   ;; .RESET_SESSION will kill all user procedures.
   (unless (and idlwave-idlwave_routine_info-compiled
-	       (file-readable-p idlwave-shell-temp-rinfo-save-file))
+	       (file-readable-p (idlwave-shell-temp-file 'rinfo)))
     (save-excursion
       (set-buffer (idlwave-find-file-noselect
-		   idlwave-shell-temp-pro-file))
+		   (idlwave-shell-temp-file 'pro)))
       (erase-buffer)
       (insert idlwave-routine-info.pro)
       (save-buffer 0))
     (idlwave-shell-send-command 
      (concat ".run " idlwave-shell-temp-pro-file)
      nil 'hide)
+;    (message "SENDING SAVE") ; ????????????????????????
     (idlwave-shell-send-command
      (format "save,'idlwave_routine_info','idlwave_print_info_entry',FILE='%s',/ROUTINES" 
-	     idlwave-shell-temp-rinfo-save-file)
+	     (idlwave-shell-temp-file 'rinfo))
      nil 'hide))
 
   ;; Restore and execute the procedure, analyze the output
+;  (message "SENDING RESTORE & EXECUTE") ; ????????????????????????
   (idlwave-shell-send-command
    (format "RESTORE, '%s' & idlwave_routine_info"
 	   idlwave-shell-temp-rinfo-save-file)
@@ -4670,14 +5068,15 @@
   it completes a keyword of the relevant function or procedure.
 - In the first arg of `OBJ_NEW', it completes a class name.
 
-When several completions are possible, a list will be displayed in the 
+When several completions are possible, a list will be displayed in the
 *Completions* buffer.  If this list is too long to fit into the
-window, scrolling can be achieved by repeatedly pressing \\[idlwave-complete].
+window, scrolling can be achieved by repeatedly pressing
+\\[idlwave-complete].
 
 The function also knows about object methods.  When it needs a class
 name, the action depends upon `idlwave-query-class', which see.  You
-can force IDLWAVE to ask you for a class name with a \\[universal-argument] prefix
-argument to this command.
+can force IDLWAVE to ask you for a class name with a
+\\[universal-argument] prefix argument to this command.
 
 See also the variables `idlwave-keyword-completion-adds-equal' and
 `idlwave-function-completion-adds-paren'.
@@ -4697,6 +5096,9 @@
 8  <=>  'function-method-keyword
 9  <=>  'class
 
+As a special case, the universal argument C-u forces completion of
+function names in places where the default would be a keyword.
+
 For Lisp programmers only:
 When we force a keyword, optional argument MODULE can contain the module name.
 When we force a method or a method keyword, CLASS can specify the class."
@@ -4740,8 +5142,10 @@
 
      ((eq what 'procedure)
       ;; Complete a procedure name
-      (let* ((class-selector (idlwave-determine-class (nth 3 where-list) 'pro))
-	     (super-classes (idlwave-all-class-inherits class-selector))
+      (let* ((cw-list (nth 3 where-list))
+	     (class-selector (idlwave-determine-class cw-list 'pro))
+	     (super-classes (unless (idlwave-explicit-class-listed cw-list)
+			      (idlwave-all-class-inherits class-selector)))
 	     (isa (concat "procedure" (if class-selector "-method" "")))
 	     (type-selector 'pro))
 	(setq idlwave-completion-help-info 
@@ -4759,8 +5163,10 @@
 
      ((eq what 'function)
       ;; Complete a function name
-      (let* ((class-selector (idlwave-determine-class (nth 3 where-list) 'fun))
-	     (super-classes (idlwave-all-class-inherits class-selector))
+      (let* ((cw-list (nth 3 where-list))
+	     (class-selector (idlwave-determine-class cw-list 'fun))
+	     (super-classes (unless (idlwave-explicit-class-listed cw-list)
+			      (idlwave-all-class-inherits class-selector)))
 	     (isa (concat "function" (if class-selector "-method" "")))
 	     (type-selector 'fun))
 	(setq idlwave-completion-help-info 
@@ -4776,6 +5182,10 @@
 	 isa
 	 'idlwave-attach-method-classes)))
 
+     ((and (memq what '(procedure-keyword function-keyword))
+	   (equal arg '(4)))
+      (idlwave-complete 3))
+
      ((eq what 'procedure-keyword)
       ;; Complete a procedure keyword
       (let* ((where (nth 3 where-list))
@@ -5104,6 +5514,14 @@
       (setq list (cdr list)))
     (nreverse rtn)))
 
+(defun idlwave-explicit-class-listed (info)
+  "Return whether or not the class is listed explicitly, ala a->b::c.
+INFO is as returned by idlwave-what-function or -procedure."
+  (let ((apos (nth 3 info)))
+    (if apos
+	(save-excursion (goto-char apos)
+			(looking-at "->[a-zA-Z][a-zA-Z0-9$_]*::")))))
+
 (defun idlwave-determine-class (info type)
   ;; Determine the class of a routine call.  INFO is the structure returned
   ;; `idlwave-what-function' or `idlwave-what-procedure'.
@@ -5187,14 +5605,15 @@
 	   )))
 
 (defun idlwave-where ()
-  "Find out where we are.
+  "Find out where we are. 
 The return value is a list with the following stuff:
-(PRO-LIST FUNC-LIST COMPLETE-WHAT CW-LIST LAST-CHAR)
+\(PRO-LIST FUNC-LIST COMPLETE-WHAT CW-LIST LAST-CHAR)
 
 PRO-LIST       (PRO POINT CLASS ARROW)
 FUNC-LIST      (FUNC POINT CLASS ARROW)
 COMPLETE-WHAT  a symbol indicating what kind of completion makes sense here
-CW-LIST        Like PRO-LIST, for what can be copmpleted here.
+CW-LIST        (PRO-OR-FUNC POINT CLASS ARROW)  Like PRO-LIST, for what can 
+               be completed here.
 LAST-CHAR      last relevant character before point (non-white non-comment,
                not part of current identifier or leading slash).
 
@@ -5203,9 +5622,9 @@
 FUNC:   Function name
 POINT:  Where is this
 CLASS:  What class has the routine (nil=no, t=is method, but class unknown)
-ARROW:  Where is the arrow?"
+ARROW:  Location of the arrow"
   (idlwave-routines)
-  (let* (;(bos (save-excursion (idlwave-beginning-of-statement) (point)))
+  (let* (;(bos (save-excursion (idlwave-beginning-of-statement) (point))) 
          (bos (save-excursion (idlwave-start-of-substatement 'pre) (point)))
  	 (func-entry (idlwave-what-function bos))
          (func (car func-entry))
@@ -5261,8 +5680,8 @@
 	(if (re-search-backward "->[ \t]*\\(\\([$a-zA-Z0-9_]+\\)::\\)?[$a-zA-Z0-9_]*\\=" bos t)
 	    (setq cw-arrow (match-beginning 0)
 		  cw-class (if (match-end 2)
-                               (idlwave-sintern-class (match-string 2))
-                              t))))))
+			       (idlwave-sintern-class (match-string 2))
+			     t))))))
     (list (list pro pro-point pro-class pro-arrow)
           (list func func-point func-class func-arrow)
           cw
@@ -5333,9 +5752,9 @@
       (idlwave-start-of-substatement 'pre)
       (setq string (buffer-substring (point) pos))
       (if (string-match 
-	   "\\`[ \t]*\\([a-zA-Z][a-zA-Z0-9$_]*\\)[ \t]*\\(,\\|\\'\\)" string)
-	  (setq pro (match-string 1 string)
-		pro-point (+ (point) (match-beginning 1)))
+	   "\\`\\(.*&\\)?[ \t]*\\([a-zA-Z][a-zA-Z0-9$_]*\\)[ \t]*\\(,\\|\\'\\)" string)
+	  (setq pro (match-string 2 string)
+		pro-point (+ (point) (match-beginning 2)))
 	(if (and (idlwave-skip-object)
 		 (setq string (buffer-substring (point) pos))
 		 (string-match 
@@ -5404,7 +5823,7 @@
 	 ((memq (preceding-char) '(?\; ?\$)) (throw 'exit nil))
 	 ((eq (preceding-char) ?\n)
 	  (beginning-of-line 0)
-	  (if (looking-at "\\([^;]\\)*\\$[ \t]*\\(;.*\\)?\n")
+	  (if (looking-at "\\([^;\n]*\\)\\$[ \t]*\\(;[^\n]*\\)?\n")
 	      ;; continuation line
 	      (goto-char (match-end 1))
 	    (throw 'exit nil)))
@@ -5592,6 +6011,93 @@
 ;;----------------------------------------------------------------------
 ;;----------------------------------------------------------------------
 ;;----------------------------------------------------------------------
+(defvar rtn)
+(defun idlwave-pset (item)
+  (set 'rtn item))
+
+(defun idlwave-popup-select (ev list title &optional sort)
+  "Select an item in LIST with a popup menu.
+TITLE is the title to put atop the popup.  If SORT is non-nil,
+sort the list before displaying"
+  (let ((maxpopup idlwave-max-popup-menu-items)
+	rtn menu resp)
+    (cond ((null list))
+	  ((= 1 (length list))
+	   (setq rtn (car list)))
+	  ((featurep 'xemacs)
+	   (if sort (setq list (sort list (lambda (a b) 
+					    (string< (upcase a) (upcase b))))))
+	   (setq menu
+		 (append (list title)
+			 (mapcar (lambda (x) (vector x (list 'idlwave-pset
+							     x)))
+				 list)))
+	   (setq menu (idlwave-split-menu-xemacs menu maxpopup))
+	   (setq resp (get-popup-menu-response menu))
+	   (funcall (event-function resp) (event-object resp)))
+	  (t
+	   (if sort (setq list (sort list (lambda (a b) 
+					    (string< (upcase a) (upcase b))))))
+	   (setq menu (cons title
+			    (list
+			     (append (list "")
+				     (mapcar (lambda(x) (cons x x)) list)))))
+	   (setq menu (idlwave-split-menu-emacs menu maxpopup))
+	   (setq rtn (x-popup-menu ev menu))))
+    rtn))
+
+(defun idlwave-split-menu-xemacs (menu N)
+  "Split the MENU into submenus of maximum length N."
+  (if (<= (length menu) (1+ N))
+      ;; No splitting needed
+      menu
+    (let* ((title (car menu))
+	   (entries (cdr menu))
+	   (menu (list title))
+	   (cnt 0)
+	   (nextmenu nil))
+      (while entries
+	(while (and entries (< cnt N))
+	  (setq cnt (1+ cnt)
+		nextmenu (cons (car entries) nextmenu)
+		entries (cdr entries)))
+	(setq nextmenu (nreverse nextmenu))
+	(setq nextmenu (cons (format "%s...%s"
+				     (aref (car nextmenu) 0)
+				     (aref (nth (1- cnt) nextmenu) 0))
+			     nextmenu))
+	(setq menu (cons nextmenu menu)
+	      nextmenu nil
+	      cnt 0))
+      (nreverse menu))))
+
+(defun idlwave-split-menu-emacs (menu N)
+  "Split the MENU into submenus of maximum length N."
+  (if (<= (length (nth 1 menu)) (1+ N))
+      ;; No splitting needed
+      menu
+    (let* ((title (car menu))
+	   (entries (cdr (nth 1 menu)))
+	   (menu nil)
+	   (cnt 0)
+	   (nextmenu nil))
+      (while entries
+	(while (and entries (< cnt N))
+	  (setq cnt (1+ cnt)
+		nextmenu (cons (car entries) nextmenu)
+		entries (cdr entries)))
+	(setq nextmenu (nreverse nextmenu))
+	(prin1 nextmenu)
+	(setq nextmenu (cons (format "%s...%s"
+				     (car (car nextmenu))
+				     (car (nth (1- cnt) nextmenu)))
+			     nextmenu))
+	(setq menu (cons nextmenu menu)
+	      nextmenu nil
+	      cnt 0))
+      (setq menu (nreverse menu))
+      (setq menu (cons title menu))
+      menu)))
 
 (defvar idlwave-completion-setup-hook nil)
 
@@ -5791,6 +6297,15 @@
 	(goto-char (match-end 0)))
       (nreverse names))))
 
+(defun idlwave-in-structure ()
+  "Return t if point is inside an IDL structure."
+  (let ((beg (point)))
+    (save-excursion
+      (if (not (or (idlwave-in-comment) (idlwave-in-quote)))
+	  (if (idlwave-find-structure-definition nil nil 'back)
+	      (let ((borders (idlwave-struct-borders)))
+		(or (= (car borders) (cdr borders)) ;; struct not yet closed...
+		    (and (> beg (car borders)) (< beg (cdr borders))))))))))
 
 (defun idlwave-struct-borders ()
   "Return the borders of the {...} after point as a cons cell."
@@ -5803,12 +6318,12 @@
       (cons beg (point)))))
 
 (defun idlwave-find-structure-definition (&optional var name bound)
-  "Search forward for a structure definition.
+  "Search forward for a structure definition.  
 If VAR is non-nil, search for a structure assigned to variable VAR.
-If NAME is non-nil, search for a named structure NAME.
-If BOUND is an integer, limit the search.
-If BOUND is the symbol `all', we search first back and then forward
-through the entire file."
+If NAME is non-nil, search for a named structure NAME.  If BOUND is an
+integer, limit the search.  If BOUND is the symbol `all', we search
+first back and then forward through the entire file.  If BOUND is the
+symbol `back' we search only backward."
   (let* ((ws "[ \t]*\\(\\$.*\n[ \t]*\\)?")
 	 (case-fold-search t)
 	 (lim (if (integerp bound) bound nil))
@@ -5818,9 +6333,9 @@
 		"\\(\\)")
 	      "=" ws "\\({\\)"
 	      (if name (concat ws "\\<" (downcase name) "[^a-zA-Z0-9_$]") ""))))
-    (if (or (and (eq bound 'all)
+    (if (or (and (or (eq bound 'all) (eq bound 'back))
 		 (re-search-backward re nil t))
-	    (re-search-forward re lim t))
+	    (and (not (eq bound 'back)) (re-search-forward re lim t)))
 	(goto-char (match-beginning 3)))))
 
 (defvar idlwave-class-info nil)
@@ -5902,7 +6417,7 @@
 
 (defun idlwave-all-class-inherits (class)
   "Return a list of all superclasses of CLASS (recursively expanded).
-The list is cashed in `idlwave-class-info' for faster access."
+The list is cached in `idlwave-class-info' for faster access."
   (cond
    ((not idlwave-support-inheritance) nil)
    ((eq class nil) nil)
@@ -6177,7 +6692,6 @@
   ;; work.
   (setq this-command last-command)
   (idlwave-do-mouse-completion-help ev))
-  
 
 (defvar idlwave-help-is-loaded nil
   "Is online help avaiable?")
@@ -6489,12 +7003,11 @@
 
 (defun idlwave-fix-keywords (name type class keywords)
   ;; This fixes the list of keywords.
-  (let ((case-fold-search t)
-	name1 type1)
+  (let ((case-fold-search t))
 
     ;; If this is the OBJ_NEW function, try to figure out the class and use
     ;; the keywords from the corresponding INIT method.
-    (if (and (equal name "OBJ_NEW")
+    (if (and (equal (upcase name) "OBJ_NEW")
 	     (or (eq major-mode 'idlwave-mode)
 		 (eq major-mode 'idlwave-shell-mode)))
 	(let* ((bos (save-excursion (idlwave-beginning-of-statement) (point)))
@@ -6516,32 +7029,36 @@
     ;; If the class is `t', combine all keywords of all methods NAME
     (when (eq class t)
       (loop for x in (idlwave-routines) do
-	(and (nth 2 x)                         ; non-nil class
-	     (or (and (eq (nth 1 x) type)      ; default type
-		      (eq (car x) name))       ; default name
-		 (and (eq (nth 1 x) type1)     ; backup type
-		      (eq (car x) name1)))     ; backup name
-	     (mapcar (lambda (k) (add-to-list 'keywords k))
-		     (nth 5 x))))
+	    (and (nth 2 x)                ; non-nil class
+		 (eq (nth 1 x) type)      ; correct type
+		 (eq (car x) name)        ; correct name
+		 (mapcar (lambda (k) (add-to-list 'keywords k))
+			 (nth 5 x))))
       (setq keywords (idlwave-uniquify keywords)))
-
-    ;; If we have inheritance, add all keywords from superclasses
-    ;; :-(  Taken out because JD says it does not work this way.
-;    (when (and (stringp class)
-;	       (or (assq (idlwave-sintern-keyword "_extra") keywords)
-;		   (assq (idlwave-sintern-keyword "_ref_extra") keywords))
-;	       (boundp 'super-classes))
-;      (loop for x in (idlwave-routines) do
-;	(and (nth 2 x)                           ; non-nil class
-;	     (or (eq (nth 2 x) class)            ; the right class
-;		 (memq (nth 2 x) super-classes)) ; an inherited class
-;	     (or (and (eq (nth 1 x) type)        ; default type
-;		      (eq (car x) name))         ; default name
-;		 (and (eq (nth 1 x) type1)       ; backup type
-;		      (eq (car x) name1)))       ; backup name
-;	     (mapcar (lambda (k) (add-to-list 'keywords k))
-;		     (nth 5 x))))
-;      (setq keywords (idlwave-uniquify keywords)))
+    
+    ;; If we have inheritance, add all keywords from superclasses, if
+    ;; the user indicated that method in
+    ;; `idlwave-keyword-class-inheritance'
+    (when (and 
+	   idlwave-keyword-class-inheritance
+	   (stringp class)
+	   (or (assq (idlwave-sintern-keyword "_extra") keywords)
+	       (assq (idlwave-sintern-keyword "_ref_extra") keywords))
+	   (boundp 'super-classes)
+	   ;; Check if one of the keyword-class regexps matches the name
+	   (let ((regexps idlwave-keyword-class-inheritance) re)
+	     (catch 'exit
+	       (while (setq re (pop regexps))
+		 (if (string-match re name) (throw 'exit t))))))
+      (loop for x in (idlwave-routines) do
+	    (and (nth 2 x)                           ; non-nil class
+		 (or (eq (nth 2 x) class)            ; the right class
+		     (memq (nth 2 x) super-classes)) ; an inherited class
+		 (eq (nth 1 x) type)                 ; correct type
+		 (eq (car x) name)                   ; correct name
+		 (mapcar (lambda (k) (add-to-list 'keywords k))
+			 (nth 5 x))))
+      (setq keywords (idlwave-uniquify keywords)))
     
     ;; Return the final list
     keywords))
@@ -7025,7 +7542,7 @@
 	(if (memq routine done)
 	    (setq dtwins nil)
 	  (setq dtwins (idlwave-study-twins twins)))
-	;; Mark all twins as delt with
+	;; Mark all twins as dealt with
 	(setq done (append twins done))
 	(when (or (> (length dtwins) 1)
 		  (> (idlwave-count-eq 'lib (nth 2 (car dtwins))) 1)
@@ -7426,9 +7943,11 @@
      ["Update Routine Info" idlwave-update-routine-info t]
      "--"
      "IDL Library Catalog"
-     ["Select Catalog Directories" idlwave-create-libinfo-file t]
+     ["Select Catalog Directories" (idlwave-create-libinfo-file nil) t]
      ["Scan Directories" (idlwave-update-routine-info '(16))
-      idlwave-path-alist]
+      (and idlwave-path-alist (not idlwave-catalog-process))]
+     ["Scan Directories &" (idlwave-update-routine-info '(64))
+      (and idlwave-path-alist (not idlwave-catalog-process))]
      "--"
      "Routine Shadows"
      ["Check Current Buffer" idlwave-list-buffer-load-path-shadows t]
@@ -7589,11 +8108,18 @@
     (set-buffer "*Help*")
     (setq truncate-lines t)))
 
+;; Add .pro files to speedbar for support, if it's loaded
+(eval-after-load "speedbar" '(speedbar-add-supported-extension ".pro"))
+
 ;; Try to load online help, but catch any errors.
 (condition-case nil
     (idlwave-require-online-help)
   (error nil))
 
+;; Set an idle timer to load the routine info.
+;; Will only work on systems which support this.
+(or idlwave-routines (idlwave-start-load-rinfo-timer))
+
 ;; Run the hook
 (run-hooks 'idlwave-load-hook)