Revision: 76154
          http://sourceforge.net/p/brlcad/code/76154
Author:   starseeker
Date:     2020-06-18 17:10:24 +0000 (Thu, 18 Jun 2020)
Log Message:
-----------
Go ahead and merge the burst changes back from the branch - this should be 
fairly self contained.

Modified Paths:
--------------
    brlcad/trunk/regress/burst/CMakeLists.txt
    brlcad/trunk/regress/burst/ktank.b
    brlcad/trunk/src/burst/CMakeLists.txt
    brlcad/trunk/src/libbu/units.c

Added Paths:
-----------
    brlcad/trunk/regress/burst/echo.b
    brlcad/trunk/regress/burst/ktank_colors.ids
    brlcad/trunk/src/burst/burst.cpp
    brlcad/trunk/src/burst/burst.h
    brlcad/trunk/src/burst/grid.cpp
    brlcad/trunk/src/burst/idents.cpp
    brlcad/trunk/src/burst/old/
    brlcad/trunk/src/burst/paint.cpp

Removed Paths:
-------------
    brlcad/trunk/src/burst/Hm.c
    brlcad/trunk/src/burst/HmGetc.c
    brlcad/trunk/src/burst/HmGlob.c
    brlcad/trunk/src/burst/Mm.h
    brlcad/trunk/src/burst/Sc.c
    brlcad/trunk/src/burst/Sc.h
    brlcad/trunk/src/burst/ascii.h
    brlcad/trunk/src/burst/burst.c
    brlcad/trunk/src/burst/burst.h
    brlcad/trunk/src/burst/error.c
    brlcad/trunk/src/burst/extern.h
    brlcad/trunk/src/burst/fb.c
    brlcad/trunk/src/burst/glob.c
    brlcad/trunk/src/burst/grid.c
    brlcad/trunk/src/burst/gridrotate.c
    brlcad/trunk/src/burst/idents.c
    brlcad/trunk/src/burst/paint.c
    brlcad/trunk/src/burst/plot.c
    brlcad/trunk/src/burst/prnt.c
    brlcad/trunk/src/burst/trie.c
    brlcad/trunk/src/burst/ui.c

Property Changed:
----------------
    brlcad/trunk/
    brlcad/trunk/NEWS
    brlcad/trunk/doc/
    brlcad/trunk/include/
    brlcad/trunk/regress/
    brlcad/trunk/src/libbu/

Index: brlcad/trunk
===================================================================
--- brlcad/trunk        2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk        2020-06-18 17:10:24 UTC (rev 76154)

Property changes on: brlcad/trunk
___________________________________________________________________
Modified: svn:mergeinfo
## -1,5 +1,5 ##
 
/brlcad/branches/RELEASE:57439,57447-57860,69901-69913,70323-70333,71915-72242,72525-72534,72826-72858,74376-74454,74964-75140,75372-75685
-/brlcad/branches/bioh:75720-75736,75740-75742,75860-75891,75894-75986
+/brlcad/branches/bioh:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153
 
/brlcad/branches/brep-debug:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69168,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927,69995-69996,70148-70149,70347-70349,70377,70526-70527,71006-71007,71009-71022,71046-71047,71049,71096-71100
 /brlcad/branches/bullet:62518
 /brlcad/branches/cmake:43219
Index: brlcad/trunk/NEWS
===================================================================
--- brlcad/trunk/NEWS   2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk/NEWS   2020-06-18 17:10:24 UTC (rev 76154)

Property changes on: brlcad/trunk/NEWS
___________________________________________________________________
Modified: svn:mergeinfo
## -1,5 +1,5 ##
 
/brlcad/branches/RELEASE/NEWS:57439,57447-57860,68609-68613,69901-69913,70323-70333,71915-72242,72525-72534,72826-72858,74376-74454,74964-75140
-/brlcad/branches/bioh/NEWS:75894-75986
+/brlcad/branches/bioh/NEWS:75894-75986,76088-76153
 
/brlcad/branches/brep-debug/NEWS:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69168,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927,69995-69996,70148-70149,70347-70349,70377,70526-70527,71006-71007,71009-71022,71046-71047,71049,71096-71100
 /brlcad/branches/bullet/NEWS:62518
 /brlcad/branches/cmake/NEWS:43219
Index: brlcad/trunk/doc
===================================================================
--- brlcad/trunk/doc    2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk/doc    2020-06-18 17:10:24 UTC (rev 76154)

Property changes on: brlcad/trunk/doc
___________________________________________________________________
Modified: svn:mergeinfo
## -1,5 +1,5 ##
 
/brlcad/branches/RELEASE/doc:57439,57447-57860,69901-69913,71917-72242,72525-72534,72826-72858,74376-74454,74964-75140
-/brlcad/branches/bioh/doc:75894-75986
+/brlcad/branches/bioh/doc:75894-75986,76088-76153
 
/brlcad/branches/brep-debug/doc:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927
 /brlcad/branches/bullet/doc:62518
 /brlcad/branches/cmake/doc:43219
Index: brlcad/trunk/include
===================================================================
--- brlcad/trunk/include        2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk/include        2020-06-18 17:10:24 UTC (rev 76154)

Property changes on: brlcad/trunk/include
___________________________________________________________________
Modified: svn:mergeinfo
## -1,5 +1,5 ##
 
/brlcad/branches/RELEASE/include:57439,57447-57860,69901-69913,71915-72242,72525-72534,72826-72858,74376-74454,74964-75140,75372-75681
-/brlcad/branches/bioh/include:75720-75736,75740-75742,75860-75891,75894-75986
+/brlcad/branches/bioh/include:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153
 
/brlcad/branches/brep-debug/include:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927
 /brlcad/branches/bullet/include:62518
 /brlcad/branches/cmake/include:43219
Index: brlcad/trunk/regress
===================================================================
--- brlcad/trunk/regress        2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk/regress        2020-06-18 17:10:24 UTC (rev 76154)

Property changes on: brlcad/trunk/regress
___________________________________________________________________
Modified: svn:mergeinfo
## -1,5 +1,5 ##
 
/brlcad/branches/RELEASE/regress:57439,57447-57860,69901-69913,71917-72242,72525-72534,72826-72858,74376-74454,75372-75681
-/brlcad/branches/bioh/regress:75860-75891,75894-75986
+/brlcad/branches/bioh/regress:75860-75891,75894-75986,76088-76153
 
/brlcad/branches/brep-debug/regress:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927
 /brlcad/branches/bullet/regress:62518
 /brlcad/branches/cmake/regress:43219
Modified: brlcad/trunk/regress/burst/CMakeLists.txt
===================================================================
--- brlcad/trunk/regress/burst/CMakeLists.txt   2020-06-18 15:37:23 UTC (rev 
76153)
+++ brlcad/trunk/regress/burst/CMakeLists.txt   2020-06-18 17:10:24 UTC (rev 
76154)
@@ -3,6 +3,7 @@
   ktank_air.ids
   ktank_armor.ids
   ktank_crit.ids
+  ktank_colors.ids
   )
 
 BRLCAD_REGRESSION_TEST(regress-burst "burst;ktank.g" EXEC burst)
@@ -29,6 +30,7 @@
 
 CMAKEFILES(
   CMakeLists.txt
+  echo.b
   ${BURST_INPUT_FILES}
   )
 

Copied: brlcad/trunk/regress/burst/echo.b (from rev 76153, 
brlcad/branches/bioh/regress/burst/echo.b)
===================================================================
--- brlcad/trunk/regress/burst/echo.b                           (rev 0)
+++ brlcad/trunk/regress/burst/echo.b   2020-06-18 17:10:24 UTC (rev 76154)
@@ -0,0 +1,39 @@
+attack-direction   35 25
+critical-comp-file ccf.file
+deflect-spall-cone yes
+dither-cells       yes
+enclose-target
+enclose-portion    1 2 3 4
+#error-file         error.file
+grid-file          grid.file
+ground-plane       yes 10 2 -2 3 -3
+burst-air-file     ba.file
+histogram-file     histo.file
+image-file         image.file
+input-2d-shot      10 20
+input-3d-shot      10 20 30
+max-barriers       3
+max-spall-rays     7
+plot-file          plot.file
+read-2d-shot-file  2dshot.file
+read-3d-shot-file  3dshot.file
+burst-armor-file   armor.file
+read-burst-file    rburst.file
+read-input-file    input.file
+report-overlaps    yes
+shotline-burst     yes
+shotline-file      shotline.file
+target-file        target.file
+target-objects     obj1 obj2 obj3
+units              inches
+units              feet
+units              millimeters
+units              centimeters
+units              meters
+write-input-file   inputs.file
+burst-coordinates  20 30 40
+burst-distance     10.0
+burst-file         burst.file
+cell-size          11.0
+color-file         color.file
+cone-half-angle    45

Modified: brlcad/trunk/regress/burst/ktank.b
===================================================================
--- brlcad/trunk/regress/burst/ktank.b  2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk/regress/burst/ktank.b  2020-06-18 17:10:24 UTC (rev 76154)
@@ -7,7 +7,7 @@
 burst-air-file         ktank_air.ids
 burst-armor-file       ktank_armor.ids
 critical-comp-file     ktank_crit.ids
-#color-file            ktank_burst_colors
+color-file             ktank_colors.ids
 burst-distance         0
 cell-size              16
 attack-direction       0 0

Copied: brlcad/trunk/regress/burst/ktank_colors.ids (from rev 76153, 
brlcad/branches/bioh/regress/burst/ktank_colors.ids)
===================================================================
--- brlcad/trunk/regress/burst/ktank_colors.ids                         (rev 0)
+++ brlcad/trunk/regress/burst/ktank_colors.ids 2020-06-18 17:10:24 UTC (rev 
76154)
@@ -0,0 +1 @@
+100 120 0 252 0

Modified: brlcad/trunk/src/burst/CMakeLists.txt
===================================================================
--- brlcad/trunk/src/burst/CMakeLists.txt       2020-06-18 15:37:23 UTC (rev 
76153)
+++ brlcad/trunk/src/burst/CMakeLists.txt       2020-06-18 17:10:24 UTC (rev 
76154)
@@ -1,42 +1,36 @@
+# Until the new code is proved out, keep the original around
+# as burst-old
+add_subdirectory(old)
+
+set(LDIR "${BRLCAD_SOURCE_DIR}/src/other/linenoise")
+
 set(BURST_INCLUDE_DIRS
+  ${BU_INCLUDE_DIRS}
   ${FB_INCLUDE_DIRS}
   ${RT_INCLUDE_DIRS}
   ${CMAKE_CURRENT_SOURCE_DIR}
+  ${CMAKE_SOURCE_DIR}/src/other/linenoise
   )
 list(REMOVE_DUPLICATES BURST_INCLUDE_DIRS)
 include_directories(${BURST_INCLUDE_DIRS})
 
 set(burst_SOURCES
-  Hm.c
-  HmGetc.c
-  HmGlob.c
-  Sc.c
-  burst.c
-  error.c
-  fb.c
-  glob.c
-  grid.c
-  gridrotate.c
-  idents.c
-  paint.c
-  plot.c
-  prnt.c
-  trie.c
-  ui.c
+  burst.cpp
+  grid.cpp
+  idents.cpp
+  paint.cpp
+  ${LDIR}/utf8.c
+  ${LDIR}/linenoise.c
   )
 
+BRLCAD_ADDEXEC(burst "${burst_SOURCES}" "librt;libfb;libbu;${M_LIBRARY}")
 
-BRLCAD_ADDEXEC(burst "${burst_SOURCES}" "librt;libfb;${M_LIBRARY}")
-
-set(burst_noinst_HEADERS
+set(burst_ignore
   CMakeLists.txt
-  ascii.h
   burst.h
-  extern.h
-  Mm.h
-  Sc.h
+  burst.format
   )
-CMAKEFILES(${burst_noinst_HEADERS} burst.format)
+CMAKEFILES(${burst_ignore})
 
 # Local Variables:
 # tab-width: 8

Deleted: brlcad/trunk/src/burst/Hm.c
===================================================================
--- brlcad/trunk/src/burst/Hm.c 2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk/src/burst/Hm.c 2020-06-18 17:10:24 UTC (rev 76154)
@@ -1,1130 +0,0 @@
-/*                            H M . C
- * BRL-CAD
- *
- * Copyright (c) 2004-2020 United States Government as represented by
- * the U.S. Army Research Laboratory.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * version 2.1 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this file; see the file named COPYING for more
- * information.
- *
- */
-/** @file burst/Hm.c
- *
- * This code is derived in part from menuhit(9.3) in AT&T 9th Edition
- * UNIX, Version 1 Programmer's Manual.
- */
-
-#include "common.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-
-#include "bu/file.h"
-
-#include "./Sc.h"
-#include "./Mm.h"
-#include "./extern.h"
-
-#if defined(HAVE_FDOPEN) && !defined(HAVE_DECL_FDOPEN)
-extern FILE *fdopen(int fd, const char *mode);
-#endif
-
-#define ErLog brst_log
-
-#define HmDEBUG 0
-
-#ifndef Max
-#  define Max(_a, _b)  ((_a)<(_b)?(_b):(_a))
-#  define Min(_a, _b)  ((_a)>(_b)?(_b):(_a))
-#endif
-
-#define HmRingbell()   (void) putchar('\07'),  (void) fflush(stdout)
-
-/* Keys for manipulating menus. */
-#define Ctrl(c_)       ((c_)&037)
-#define M_DEBUG                Ctrl('?')
-#define M_DOWN         'd'
-#define M_HELP         'h'
-#define M_MYXMOUSE     Ctrl('X')
-#define M_NOSELECT     'q'
-#define M_REDRAW       Ctrl('L')
-#define M_SELECT       ' '
-#define M_UP           'u'
-
-
-/* Alternate keys for conformance to standard conventions. */
-#define A_UP           Ctrl('P')
-#define A_DOWN         Ctrl('N')
-#define A_HELP         '?'
-
-#define P_OFF          (0)
-#define P_ON           (1)
-#define P_FORCE                (1<<1)
-
-#define PutMenuChar(_c, _co, _ro, _map, _bit) {\
-       static int lro = -1, lco = -1;\
-       if ((_map) & (_bit) || (_bit) == 0) {\
-               if (lco++ != (_co)-1 || lro != (_ro)) {\
-                       (void) ScMvCursor(_co, _ro);\
-                       lco = _co;\
-               }\
-               (void) putchar((_c));\
-               }\
-       (_bit) <<= 1;\
-       (_co)++;\
-}
-
-
-static int HmDirty = 0;
-static int HmPkgInit = 0;
-
-static HmWindow *windows = NULL;
-
-#define HmENTRY (itemp-win->menup->item)
-#define HmHEIGHT Min(win->height, HmMaxVis)
-typedef struct nmllist HmLList;
-struct nmllist
-{
-    HmItem *itemp;
-    HmLList *next;
-};
-
-
-/*
-  void HmBanner(char *pgmname, int borderchr)
-
-  Print program name and row of border characters to delimit the top
-  of the scrolling region.
-*/
-void
-HmBanner(const char *pgmname, int borderchr)
-{
-    int column;
-    char *p;
-#define HmBUFLEN 81
-    static char HmPgmName[HmBUFLEN] = "No name";
-    static int HmBorderChr = '_';
-    if (pgmname != NULL) {
-       bu_strlcpy(HmPgmName, pgmname, sizeof(HmPgmName));
-       HmBorderChr = borderchr;
-    }
-    (void) ScMvCursor(HmLftMenu, HmYBORDER);
-    for (column = 1; column <= 3; column++)
-       (void) putc(HmBorderChr, stdout);
-    for (p = HmPgmName; column <= ScCO && *p != '\0'; column++, p++)
-       (void) putc((int)(*p), stdout);
-    for (; column <= ScCO; column++)
-       (void) putc(HmBorderChr, stdout);
-    return;
-}
-
-
-/*
-  void HmPrntItem(HmItem *itemp)       (DEBUG)
-
-  Print contents of itemp.
-*/
-static void
-HmPrntItem(HmItem *itemp)
-{
-    (void) ErLog("\t\tHmPrntItem(0x%x)\n", itemp);
-    for (; itemp->text != (char *) NULL; itemp++) {
-       (void) ErLog("\t\t\ttext=\"%s\"\n", itemp->text);
-       (void) ErLog("\t\t\thelp=\"%s\"\n", itemp->help == (char *) NULL ? 
"(null)" : itemp->help);
-       (void) ErLog("\t\t\tnext=0x%x\n", itemp->next);
-       (void) ErLog("\t\t\tdfn=0x%x\n", itemp->dfn);
-       (void) ErLog("\t\t\tbfn=0x%x\n", itemp->bfn);
-       (void) ErLog("\t\t\thfn=0x%x\n", itemp->hfn);
-       (void) ErLog("\t\t\tdata=%d\n", itemp->data);
-       (void) ErLog("\t\t\t----\n");
-    }
-    (void) ErLog("\t\t\ttext=0x%x\n", itemp->text);
-    return;
-}
-
-
-/*
-  void HmPrntMenu(menup)       (DEBUG)
-
-  Print "windows" stack.
-*/
-static void
-HmPrntMenu(HmMenu *menup)
-{
-    (void) ErLog("\tHmPrntMenu(0x%x)\n", menup);
-    (void) ErLog("\t\tgenerator=0x%x\n", menup->generator);
-    (void) ErLog("\t\tprevtop=%d\n", menup->prevtop);
-    (void) ErLog("\t\tprevhit=%d\n", menup->prevhit);
-    (void) ErLog("\t\tsticky=%s\n", menup->sticky ? "true" : "false");
-    HmPrntItem(menup->item);
-    return;
-}
-
-
-/*
-  void HmPrntWindows(void)     (DEBUG)
-
-  Print "windows" stack.
-*/
-static void
-HmPrntWindows(void)
-{
-    HmWindow *win;
-    (void) ErLog("HmPrntWindows()\n");
-    for (win = windows; win != (HmWindow *) NULL; win = win->next) {
-       (void) ErLog("\twin=0x%x\n", win);
-       (void) ErLog("\tmenup=0x%x\n", win->menup);
-       (void) ErLog("\tmenux=%d\n", win->menux);
-       (void) ErLog("\tmenuy=%d\n", win->menuy);
-       (void) ErLog("\twidth=%d\n", win->width);
-       (void) ErLog("\theight=%d\n", win->height);
-       (void) ErLog("\tdirty=0x%x\n", win->dirty);
-       (void) ErLog("\tnext=0x%x\n", win->next);
-       HmPrntMenu(win->menup);
-    }
-    return;
-}
-
-
-/*
-  void HmFreeItems(Hmitem *itemp)
-
-  Free storage (allocated with malloc) for an array of HmItem's.
-*/
-static void
-HmFreeItems(HmItem *itemp)
-{
-    HmItem *citemp;
-    int count;
-    for (citemp = itemp, count = 1;
-        citemp->text != (char *) NULL;
-        citemp++, count++
-       ) {
-       MmStrFree(citemp->text);
-       if (citemp->help != (char *) NULL)
-           MmStrFree(citemp->help);
-    }
-    MmVFree(count, HmItem, itemp);
-    return;
-}
-
-
-/*
-  void HmFreeLList(HmLList *listp)
-
-  Free storage (allocated with malloc) for a linked-list of
-  HmItem's.
-*/
-static void
-HmFreeLList(HmLList *listp)
-{
-    HmLList *tp;
-    for (; listp != (HmLList *) NULL; listp = tp) {
-       MmFree(HmItem, listp->itemp);
-       tp = listp->next;
-       MmFree(HmLList, listp);
-    }
-    return;
-}
-
-
-/*
-  void HmPutItem(HmWindow *win, HmItem *itemp, int flag)
-
-  Display menu entry itemp.
-
-  Win is the menu control structure for itemp.
-
-  Flag is a bit flag and the following bits are meaningful:
-
-  P_FORCE means draw the entire entry regardless of the
-  value of the dirty bitmap.
-  P_ON means this entry is current so highlight it.
-*/
-static void
-HmPutItem(HmWindow *win, HmItem *itemp, int flag)
-{
-    int label_len = strlen(itemp->text);
-    static char buf[HmMAXLINE];
-    char *p = buf;
-    int col = win->menux;
-    int row = win->menuy+
-       (HmENTRY-win->menup->prevtop)+1;
-    int width = win->width;
-    int bitmap = flag & P_FORCE ?
-       ~0 : win->dirty[row-win->menuy];
-    int bit = 1;
-    int writemask = 0;
-    if (bitmap == 0)
-       return;
-    if (itemp->text[0] & 0200) {
-       /* right-justified */
-       int i;
-       label_len--;
-       for (i = 0; i < width - label_len; i++)
-           *p++ = itemp->text[0] & 0177;
-       for (i = 1; itemp->text[i] != '\0'; i++)
-           *p++ = itemp->text[i];
-    } else                             /* left-justified */
-       if (itemp->text[label_len-1] & 0200) {
-           int i;
-           label_len--;
-           for (i = 0; !(itemp->text[i] & 0200); i++)
-               *p++ = itemp->text[i];
-           for (; i < width; i++)
-               *p++ = itemp->text[label_len] & 0177;
-       } else {
-           /* centered */
-           int i, j;
-           for (i = 0; i < (width - label_len)/2; i++)
-               *p++ = ' ';
-           for (j = 0; itemp->text[j] != '\0'; j++)
-               *p++ = itemp->text[j];
-           for (i += j; i < width; i++)
-               *p++ = ' ';
-       }
-    *p = '\0';
-
-    PutMenuChar('|', col, row, bitmap, bit);
-    if (flag & P_ON)
-       (void) ScSetStandout();
-    else
-       (void) ScClrStandout();
-
-    /* Optimized printing of entry. */
-    if (bitmap == ~0) {
-       (void) fputs(buf, stdout);
-       col += p-buf;
-       bit <<= p-buf;
-    } else {
-       int i;
-       for (i = 0; i < p-buf; i++)
-           writemask |= 1<<(i+1);
-       for (i = 0; i < p-buf; i++) {
-           if ((bitmap & writemask) == writemask)
-               break;
-           writemask &= ~bit;
-           PutMenuChar(buf[i], col, row, bitmap, bit);
-       }
-       if (i < p-buf) {
-           (void) ScMvCursor(col, row);
-           (void) fputs(&buf[i], stdout);
-           col += (p-buf) - i;
-           bit <<= (p-buf) - i;
-       }
-    }
-
-    if (flag & P_ON)
-       (void) ScClrStandout();
-    PutMenuChar('|', col, row, bitmap, bit);
-    return;
-}
-
-
-/*
-  void HmPutBorder(HmWindow *win, row, char mark)
-
-  Draw the horizontal border for row of win->menup using mark
-  for the corner characters.
-*/
-static void
-HmPutBorder(HmWindow *win, int row, char mark)
-{
-    int i;
-    int col = win->menux;
-    int bitmap = win->dirty[row - win->menuy];
-    static char buf[HmMAXLINE];
-    char *p = buf;
-    if (bitmap == 0)
-       return; /* No dirty bits. */
-    *p++ = mark;
-    for (i = 0; i < win->width; i++)
-       *p++ = '-';
-    *p++ = mark;
-    *p = '\0';
-    if (bitmap == ~0) {
-       /* All bits dirty. */
-       (void) ScMvCursor(col, row);
-       (void) fputs(buf, stdout);
-    } else {
-       int bit = 1;
-
-       for (i = 0; i < p - buf; i++)
-           PutMenuChar(buf[i], col, row, bitmap, bit);
-    }
-    return;
-}
-
-
-/*
-  void HmSetbit(HmWindow *win, int col, int row)
-
-  Mark as dirty, the bit in win->dirty that corresponds to
-  col and row of the screen.
-*/
-static void
-HmSetbit(HmWindow *win, int col, int row)
-{
-    int bit = col - win->menux;
-#if HmDEBUG && 0
-    (void) ErLog("HmSetbit:menu{<%d, %d>, <%d, %d>}col=%d, row=%d\n",
-                win->menux, win->menux+win->width+1,
-                win->menuy, win->menuy+HmHEIGHT+1,
-                col, row
-       );
-#endif
-    win->dirty[row-win->menuy] |= bit == 0 ? 1 : 1 << bit;
-#if HmDEBUG && 0
-    (void) ErLog("\tdirty[%d]=0x%x\r\n",
-                row-win->menuy, win->dirty[row-win->menuy]
-       );
-#endif
-    return;
-}
-
-
-/*
-  void HmClrmap(HmWindow *win)
-
-  Mark as clean, the entire dirty bitmap for win.
-*/
-static void
-HmClrmap(HmWindow *win)
-{
-    int row;
-    int height = HmHEIGHT;
-    for (row = 0; row <= height+1; row++)
-       win->dirty[row] = 0;
-    return;
-}
-
-
-/*
-  void HmSetmap(HmWindow *win)
-
-  Mark as dirty the entire dirty bitmap for win.
-*/
-static void
-HmSetmap(HmWindow *win)
-{
-    int row;
-    int height = HmHEIGHT;
-    for (row = 0; row <= height+1; row++)
-       win->dirty[row] = ~0; /* 0xffff... */
-    return;
-}
-
-
-/*
-  HmWindow *HmInWin(x, y, HmWindow *win)
-
-  Return pointer to top window in stack, starting with win whose
-  boundaries contain the screen coordinate <x, y>.  If the point
-  is outside of all these windows, return 0.
-*/
-static HmWindow *
-HmInWin(int x, int y, HmWindow *win)
-{
-#if HmDEBUG && 0
-    if (win != (HmWindow *) NULL)
-       (void) ErLog("HmInWin:x=%d y=%d win{<%d, %d>, <%d, %d>}\r\n",
-                    x, y,
-                    win->menux, win->menux+win->width+1,
-                    win->menuy, win->menuy+HmHEIGHT+1
-           );
-#endif
-    for (; win != (HmWindow *) NULL; win = win->next) {
-       int height = HmHEIGHT;
-       if (! (x < win->menux || x > win->menux + win->width + 1 ||
-              y < win->menuy || y > win->menuy + height + 1)
-           )
-           return win;
-    }
-    return (HmWindow *) NULL;
-}
-
-
-/*
-  void HmDrawWin(HmWindow *win)
-
-  Draw win->menup on screen.  Actually, only characters flagged as
-  dirty are drawn.
-*/
-static void
-HmDrawWin(HmWindow *win)
-{
-    HmItem *itemp;
-    int height;
-
-#if HmDEBUG && 1
-    (void) ErLog("HmDrawWin:win{<%d, %d>, <%d, %d>}\r\n",
-                win->menux, win->menux+win->width+1,
-                win->menuy, win->menuy+HmHEIGHT+1
-       ); {
-       int i;
-       for (i = 0; i <= HmHEIGHT+1; i++)
-           (void) ErLog("\tdirty[%d]=0x%x\r\n", i, win->dirty[i]);
-    }
-#endif
-    HmPutBorder(win, win->menuy, win->menup->prevtop > 0 ? '^' : '+');
-    for (itemp = win->menup->item + win->menup->prevtop;
-        HmENTRY-win->menup->prevtop < HmMaxVis && itemp->text != (char *) NULL;
-        itemp++
-       )
-       HmPutItem(win, itemp,
-                 HmENTRY == win->menup->prevhit ? P_ON : P_OFF
-           );
-    height = HmHEIGHT;
-    HmPutBorder(win, win->menuy+height+1, HmENTRY < win->height ? 'v' : '+');
-    HmClrmap(win);
-    (void) fflush(stdout);
-    return;
-}
-
-
-/*
-  void HmHelp(HmWindow *win, int entry)
-
-  Display help message for item indexed by entry in win->menup
-  on line HmYCOMMO.  This message will be erased when the user
-  strikes a key (or uses the mouse).
-*/
-static void
-HmHelp(HmWindow *win, int entry)
-{
-    (void) ScMvCursor(HmLftMenu, HmYCOMMO);
-    (void) ScClrEOL();
-    (void) ScSetStandout();
-    (void) printf("%s", win->menup->item[entry].help);
-    (void) ScClrStandout();
-    (void) fflush(stdout);
-    return;
-}
-
-
-/*
-  void HmError(const char *str)
-
-  Display str on line HmYCOMMO.
-*/
-void
-HmError(const char *str)
-{
-    (void) ScMvCursor(HmLftMenu, HmYCOMMO);
-    (void) ScClrEOL();
-    (void) ScSetStandout();
-    (void) fputs(str, stdout);
-    (void) ScClrStandout();
-    (void) fflush(stdout);
-    return;
-}
-
-
-/*
-  void HmLiftWin(HmWindow *win)
-
-  Remove win->menup from screen, marking any occluded portions
-  of other menus as dirty so that they will be redrawn by HmHit().
-*/
-static void
-HmLiftWin(HmWindow *win)
-{
-    int row, col;
-    int lastcol = -1, lastrow = -1;
-    int endcol = win->menux + win->width + 2;
-    int endrow = win->menuy +
-       HmHEIGHT + HmHGTBORDER;
-#if HmDEBUG && 1
-    (void) ErLog("HmLiftWin:win{<%d, %d>, <%d, %d>}\r\n",
-                win->menux, win->menux+win->width+1,
-                win->menuy, win->menuy+HmHEIGHT+1
-       );
-#endif
-    for (row = win->menuy; row < endrow; row++) {
-       for (col = win->menux; col < endcol; col++) {
-           HmWindow *olwin;
-           if ((olwin = HmInWin(col, row, win->next))
-               != (HmWindow *) NULL
-               ) {
-               HmSetbit(olwin, col, row);
-               HmDirty = 1;
-           } else {
-               if (lastcol != col-1 || lastrow != row)
-                   (void) ScMvCursor(col, row);
-               lastcol = col; lastrow = row;
-               (void) putchar(' ');
-           }
-       }
-    }
-    (void) fflush(stdout);
-    return;
-}
-
-
-/*
-  void HmPushWin(HmWindow *win)
-
-  Add window to top of "windows" stack.
-*/
-static void
-HmPushWin(HmWindow *win)
-{
-    win->next = windows;
-    windows = win;
-    return;
-}
-
-
-/*
-  void HmPopWin(HmWindow *win)
-
-  Delete window from top of "windows" stack.
-*/
-static void
-HmPopWin(HmWindow *win)
-{
-    windows = win->next;
-    return;
-}
-
-
-/*
-  void HmRefreshWin(HmWindow *win)
-
-  Draw any dirty portions of all windows in stack starting at win.
-*/
-static void
-HmRefreshWin(HmWindow *win)
-{
-    if (win == (HmWindow *) NULL) {
-       HmDirty = 0;
-       return;
-    }
-    HmRefreshWin(win->next);
-    HmDrawWin(win);
-    return;
-}
-/*
-  void HmRedraw(void)
-
-  Force a redraw of all active menus.
-*/
-void
-HmRedraw(void)
-{
-    HmWindow *win;
-    int reset = 0;
-
-#if HmDEBUG && 1
-    HmPrntWindows();
-#endif
-    (void) ScClrText();        /* clear entire screen */
-
-    /* See if we changed the maximum items displayed parameter. */
-    if (HmMaxVis != HmLastMaxVis)
-       reset = 1;
-    for (win = windows; win != (HmWindow *) NULL; win = win->next) {
-       if (reset) {
-           /* Correct window to reflect new maximum. */
-           /* Reset scrolling state-info in each window. */
-           if (win->menup->prevhit >= HmMaxVis)
-               win->menup->prevtop = win->menup->prevhit -
-                   HmMaxVis + 1;
-           else
-               win->menup->prevtop = 0;
-           /* Must reallocate "dirty" bit map to fit new size. */
-           MmVFree(Min(win->height, HmLastMaxVis)+HmHGTBORDER,
-                   int, win->dirty);
-           if ((win->dirty =
-                MmVAllo(HmHEIGHT+HmHGTBORDER, int)
-                   ) == NULL) {
-               return;
-           }
-       }
-       HmSetmap(win); /* force all bits on in "dirty" bitmap */
-    }
-    HmLastMaxVis = HmMaxVis;
-    HmRefreshWin(windows);     /* redisplay all windows */
-    HmBanner((char *) NULL, 0);        /* redraw banner */
-    return;
-}
-
-
-/*
-  void HmTtySet(void)
-
-  Set up terminal handler and MYX-menu options for menu interaction.
-*/
-void
-HmTtySet(void)
-{
-}
-
-/*
-  void HmTtyReset(void)
-
-  Reset terminal handler and MYX-menu options to user settings.
-*/
-void
-HmTtyReset(void)
-{
-}
-
-/*
-  void HmInit(int x, int y, int maxvis)
-
-  Initialize position of top-level menu.  Specify maximum
-  number of menu items visible at once.  Place these values
-  in global variables.  Determine as best we can whether MYX
-  is available and place int result in HmMyxflag.  Return
-  true for success and false for failure to open "/dev/tty".
-*/
-int
-HmInit(int UNUSED(x), int UNUSED(y), int UNUSED(maxvis))
-{
-    return 0;
-}
-
-
-/*
-  void HmWidHgtMenu(HmWindow *win)
-
-  Determine width and height of win->menup, and store in win.
-*/
-static void
-HmWidHgtMenu(HmWindow *win)
-{
-    HmItem *itemp;
-
-    /* Determine width of menu, allowing for border.           */
-    for (itemp = win->menup->item; itemp->text != (char *) NULL; itemp++) {
-       int len = 0;
-       int i;
-       for (i = 0; itemp->text[i] != '\0'; i++) {
-           if (! (itemp->text[i] & 0200))
-               len++;
-       }
-       win->width = Max(win->width, len);
-    }
-    win->height = HmENTRY;
-    return;
-}
-
-
-/*
-  int HmFitMenu(HmWindow *nwin, HmWindow *cwin)
-
-  If nwin->menup will fit below cwin->menup on screen, store
-  position in nwin, and return 1.  Otherwise, return 0.
-*/
-static int
-HmFitMenu(HmWindow *nwin, HmWindow *cwin)
-{
-    if (cwin == (HmWindow *) NULL)
-       return 0;
-    else
-       if (HmFitMenu(nwin, cwin->next))
-           return 1;
-       else
-           /* Look for space underneath this menu.                             
*/
-           if (cwin->menux + nwin->width + 1 <= ScCO
-               &&      cwin->menuy + cwin->height + nwin->height + HmHGTBORDER
-               < HmMaxVis + HmTopMenu
-               ) {
-               nwin->menux = cwin->menux;
-               nwin->menuy = cwin->menuy + cwin->height + HmHGTBORDER - 1;
-               return 1;
-           } else {
-               return 0;
-           }
-}
-
-
-/*
-  void HmPosMenu(HmWindow *win)
-
-  Find best screen position for win->menup.
-*/
-static void
-HmPosMenu(HmWindow *win)
-{
-    /* Determine origin (top-left corner) of menu.                     */
-    if (win->next != (HmWindow *) NULL) {
-       win->menux = win->next->menux + win->next->width + 1;
-       win->menuy = win->next->menuy;
-       if (win->menux + win->width + 2 > ScCO) {
-           if (! HmFitMenu(win, win->next)) {
-               /* No space, so overlap top-level menu. */
-               win->menux = HmLftMenu;
-               win->menuy = HmTopMenu;
-           }
-       }
-    } else {
-       /* Top-level menu. */
-       win->menux = HmLftMenu;
-       win->menuy = HmTopMenu;
-    }
-    return;
-}
-
-
-/*
-  void HmMyxMouse(int *x, int *y)
-
-  Read and decode screen coordinates from MYX "editor ptr".
-  Implicit return in x and y.
-*/
-static void
-HmMyxMouse(int *x, int *y)
-{
-    int c;
-
-    c = HmGetchar();
-    switch (c) {
-       case Ctrl('A') :
-           *x = HmGetchar() - ' ' + 96;
-           break;
-       case Ctrl('B') :
-           *x = HmGetchar() - ' ' + 192;
-           break;
-       default :
-           *x = c - ' ';
-           break;
-    }
-    c = HmGetchar();
-    switch (c) {
-       case Ctrl('A') :
-           *y = HmGetchar() - ' ' + 96;
-           break;
-       case Ctrl('B') :
-           *y = HmGetchar() - ' ' + 192;
-           break;
-       default :
-           *y = c - ' ';
-           break;
-    }
-    (*x)++;
-    (*y)++;
-    return;
-}
-
-
-/*
-  HmItem *HmHit(HmMenu *menup)
-
-  Present menup to the user and return a pointer to the selected
-  item, or 0 if there was no selection made.  For more details,
-  see "Hm.h".
-*/
-HmItem *
-HmHit(HmMenu *menup)
-{
-    HmItem *itemp;
-    HmItem *retitemp = NULL;
-    HmWindow *win;
-    int done = 0;
-    int dynamic = 0;
-    static int HmLevel = 0;
-
-#if HmDEBUG
-    ErLog("HmHit(0x%x)\n", menup);
-#endif
-    if (HmPkgInit == 0) {
-       HmInit(HmLftMenu, HmTopMenu, HmMaxVis);
-       HmPkgInit = 1;
-    }
-    if (++HmLevel == 1)
-       HmTtySet();
-
-    /* If generator function is provided, dynamically allocate the
-       menu items.
-    */
-    if ((dynamic = (menup->item == (HmItem *) NULL))) {
-       int i;
-       HmItem *gitemp;
-       HmLList llhead, **listp;
-       for (i = 0, listp = &llhead.next;
-            ;
-            i++,   listp = &(*listp)->next
-           ) {
-           if ((*listp = MmAllo(HmLList)) == NULL
-               ||      ((*listp)->itemp = MmAllo(HmItem)) == NULL
-               ) {
-               goto clean_exit;
-           }
-           itemp = (*listp)->itemp;
-           if ((gitemp = (*menup->generator)(i)) == (HmItem *) NULL) {
-               itemp->text = (char *) NULL;
-               (*listp)->next = (HmLList *) NULL;
-               break;
-           }
-           if (gitemp->text != (char *) NULL) {
-               if ((itemp->text = MmStrDup(gitemp->text))
-                   == (char *) NULL
-                   ) {
-                   goto clean_exit;
-               }
-           } else
-               itemp->text = (char *) NULL;
-           if (gitemp->help != (char *) NULL) {
-               if ((itemp->help = MmStrDup(gitemp->help))
-                   == (char *) NULL
-                   ) {
-                   goto clean_exit;
-               }
-           } else
-               itemp->help = (char *) NULL;
-           itemp->next = gitemp->next;
-           itemp->dfn = gitemp->dfn;
-           itemp->bfn = gitemp->bfn;
-           itemp->hfn = gitemp->hfn;
-           itemp->data = gitemp->data;
-#if HmDEBUG && 0
-           HmPrntItem(itemp);
-#endif
-       }
-#if HmDEBUG && 0
-       HmPrntLList(llhead.next);
-#endif
-       /* Steal the field that the user isn't using temporarily to
-          emulate the static allocation of menu items.
-       */
-       if (i > 0) {
-           int ii;
-           HmLList *lp;
-           if ((menup->item = MmVAllo(i+1, HmItem)) == NULL) {
-               goto clean_exit;
-           }
-           for (ii = 0, lp = llhead.next;
-                lp != (HmLList *) NULL;
-                ii++,   lp = lp->next
-               )
-               menup->item[ii] = *lp->itemp;
-       }
-       HmFreeLList(llhead.next);
-       if (i == 0) /* Zero items, so return NULL */
-           goto clean_exit;
-    }
-    if ((win = MmAllo(HmWindow)) == NULL) {
-#if HmDEBUG
-       ErLog("HmHit, BUG: memory pool possibly corrupted.\n");
-#endif
-       goto clean_exit;
-    }
-    win->menup = menup;
-    win->width = 0;
-    HmPushWin(win);
-    HmWidHgtMenu(win);
-    HmPosMenu(win);
-
-    if (menup->prevhit < 0 || menup->prevhit >= win->height)
-       menup->prevhit = 0;
-    itemp = &menup->item[menup->prevhit];
-
-    if ((win->dirty = MmVAllo(HmHEIGHT+HmHGTBORDER, int)) == NULL) {
-       goto clean_exit;
-    }
-    if (HmDirty)
-       HmRefreshWin(windows);
-    HmSetmap(win);
-    HmDrawWin(win);
-    while (! done) {
-       int c;
-       if (HmDirty)
-           HmRefreshWin(windows);
-       (void) ScMvCursor(HmXPROMPT, HmYPROMPT);
-       (void) ScClrEOL();
-       (void) ScMvCursor(win->menux+win->width+2,
-                         win->menuy+(HmENTRY-win->menup->prevtop)+1);
-       (void) fflush(stdout);
-       c = HmGetchar();
-       (void) ScMvCursor(HmLftMenu, HmYCOMMO);
-       (void) ScClrEOL();
-       switch (c) {
-           case M_UP :
-           case A_UP :
-               if (HmENTRY == 0)
-                   HmRingbell();
-               else {
-                   HmPutItem(win, itemp, P_OFF | P_FORCE);
-                   itemp--;
-                   menup->prevhit = HmENTRY;
-                   if (HmENTRY < win->menup->prevtop) {
-                       win->menup->prevtop -=
-                           HmENTRY > HmMaxVis/2 ?
-                           HmMaxVis/2+1 : HmENTRY+1;
-                       HmSetmap(win);
-                       HmDrawWin(win);
-                   } else
-                       HmPutItem(win, itemp, P_ON | P_FORCE);
-               }
-               break;
-           case M_DOWN :
-           case A_DOWN :
-               if (HmENTRY >= win->height-1)
-                   HmRingbell();
-               else {
-                   HmPutItem(win, itemp, P_OFF | P_FORCE);
-                   itemp++;
-                   menup->prevhit = HmENTRY;
-                   if (HmENTRY - win->menup->prevtop >= HmMaxVis) {
-                       win->menup->prevtop +=
-                           win->height-HmENTRY > HmMaxVis/2 ?
-                           HmMaxVis/2 : win->height-HmENTRY;
-                       HmSetmap(win);
-                       HmDrawWin(win);
-                   } else
-                       HmPutItem(win, itemp, P_ON | P_FORCE);
-               }
-               break;
-           case M_MYXMOUSE : {
-               static int mousex, mousey;
-               HmItem *lastitemp;
-               if (HmGetchar() != Ctrl('_') || HmGetchar() != '1')
-                   goto m_badinput;
-               HmMyxMouse(&mousex, &mousey);
-               if (HmInWin(mousex, mousey, win) != win) {
-                   /* Mouse cursor outside of menu. */
-                   HmRingbell();
-                   break;
-               }
-               if (mousey == win->menuy && win->menup->prevtop == 0) {
-                   /* Top border of menu and can't scroll. */
-                   goto m_noselect;
-               }
-               if (mousey == win->menuy + HmHEIGHT + 1
-                   &&  win->height <= HmMaxVis + win->menup->prevtop
-                   ) {
-                   /* Bottom border of menu and can't scroll. */
-                   HmRingbell();
-                   break;
-               }
-               lastitemp = itemp;
-               itemp = win->menup->item +
-                   win->menup->prevtop +
-                   (mousey - (win->menuy + 1));
-               if (itemp == lastitemp)
-                   /* User hit item twice in a row, so select it. */
-                   goto m_select;
-               HmPutItem(win, lastitemp, P_OFF | P_FORCE);
-               menup->prevhit = HmENTRY;
-               if (HmENTRY - win->menup->prevtop >= HmMaxVis) {
-                   win->menup->prevtop +=
-                       win->height-HmENTRY > HmMaxVis/2 ?
-                       HmMaxVis/2 : win->height-HmENTRY;
-                   HmSetmap(win);
-                   HmDrawWin(win);
-               } else
-                   if (HmENTRY < win->menup->prevtop) {
-                       win->menup->prevtop -=
-                           HmENTRY > HmMaxVis/2 ?
-                           HmMaxVis/2+1 : HmENTRY+1;
-                       HmSetmap(win);
-                       HmDrawWin(win);
-                   } else {
-                       HmPutItem(win, itemp, P_ON | P_FORCE);
-                   }
-               break;
-           }
-           case M_HELP :
-           case A_HELP :
-               HmHelp(win, HmENTRY);
-               break;
-               m_select :
-           case M_SELECT :
-                   if (itemp->next != (HmMenu *) NULL) {
-                       HmItem *subitemp;
-                       if (itemp->dfn != (void (*)()) NULL) {
-                           int level = HmLevel;
-                           HmTtyReset();
-                           HmLevel = 0;
-                           (*itemp->dfn)(itemp);
-                           HmLevel = level;
-                           HmTtySet();
-                       }
-                       subitemp = HmHit(itemp->next);
-                       if (itemp->bfn != (void (*)()) NULL) {
-                           int level = HmLevel;
-                           HmTtyReset();
-                           HmLevel = 0;
-                           (*itemp->bfn)(itemp);
-                           HmLevel = level;
-                           HmTtySet();
-                       }
-                       if (subitemp != (HmItem *) NULL) {
-                           retitemp = subitemp;
-                           done = ! menup->sticky;
-                       }
-                   } else {
-                       retitemp = itemp;
-                       if (itemp->hfn != (void (*)()) NULL) {
-                           int level = HmLevel;
-                           HmTtyReset();
-                           HmLevel = 0;
-                           (*itemp->hfn)(itemp);
-                           HmLevel = level;
-                           HmTtySet();
-                       }
-                       done = ! menup->sticky;
-                   }
-               break;
-               m_noselect :
-           case M_NOSELECT :
-                   done = 1;
-               break;
-           case M_REDRAW :
-               HmRedraw();
-               break;
-           case M_DEBUG :
-               HmPrntWindows();
-               break;
-               m_badinput :
-           default :
-                   HmError("Type 'd' down, 'u' up, 'h' help, <space> to 
select, 'q' no selection.");
-               break;
-       }
-       (void) fflush(stdout);
-    }
-    /* Free storage of dynamic menu.                           */
-    if (dynamic) {
-       if (retitemp != (HmItem *) NULL) {
-           /* Must make copy of item we are returning. */
-           static HmItem dynitem;
-           dynitem = *retitemp;
-           retitemp = &dynitem;
-       }
-       HmFreeItems(menup->item);
-       menup->item = 0;
-    }
-
-    HmLiftWin(win);
-    HmPopWin(win);
-    MmVFree(HmHEIGHT+HmHGTBORDER, int, win->dirty);
-    MmFree(HmWindow, win);
-    clean_exit :
-       if (HmLevel-- == 1)
-           HmTtyReset();
-    return retitemp;
-}
-
-
-/*
- * Local Variables:
- * mode: C
- * tab-width: 8
- * indent-tabs-mode: t
- * c-file-style: "stroustrup"
- * End:
- * ex: shiftwidth=4 tabstop=8
- */

Deleted: brlcad/trunk/src/burst/HmGetc.c
===================================================================
--- brlcad/trunk/src/burst/HmGetc.c     2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk/src/burst/HmGetc.c     2020-06-18 17:10:24 UTC (rev 76154)
@@ -1,59 +0,0 @@
-/*                        H M G E T C . C
- * BRL-CAD
- *
- * Copyright (c) 2004-2020 United States Government as represented by
- * the U.S. Army Research Laboratory.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * version 2.1 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this file; see the file named COPYING for more
- * information.
- *
- */
-/** @file burst/HmGetc.c
- *
- */
-
-#include "common.h"
-
-#include <stdio.h>
-#include <signal.h>
-
-#include "./burst.h"
-
-int
-HmGetchar(void)
-{
-    int c;
-
-    while ((c = getc(HmTtyFp)) == EOF)
-       ;
-
-    return c;
-}
-
-
-int
-HmUngetchar(int c)
-{
-    return ungetc(c, HmTtyFp);
-}
-
-
-/*
- * Local Variables:
- * mode: C
- * tab-width: 8
- * indent-tabs-mode: t
- * c-file-style: "stroustrup"
- * End:
- * ex: shiftwidth=4 tabstop=8
- */

Deleted: brlcad/trunk/src/burst/HmGlob.c
===================================================================
--- brlcad/trunk/src/burst/HmGlob.c     2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk/src/burst/HmGlob.c     2020-06-18 17:10:24 UTC (rev 76154)
@@ -1,44 +0,0 @@
-/*                        H M G L O B . C
- * BRL-CAD
- *
- * Copyright (c) 2004-2020 United States Government as represented by
- * the U.S. Army Research Laboratory.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * version 2.1 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this file; see the file named COPYING for more
- * information.
- *
- */
-/** @file burst/HmGlob.c
- *
- */
-
-#include "common.h"
-
-#include <stdio.h>
-
-FILE *HmTtyFp = NULL;   /* read keyboard, not stdin */
-int HmLftMenu = 1;     /* default top-level menu position */
-int HmTopMenu = 1;
-int HmMaxVis = 10;     /* default maximum menu items displayed */
-int HmLastMaxVis = 10; /* track changes in above parameter */
-int HmTtyFd;           /* read keyboard, not stdin */
-
-/*
- * Local Variables:
- * mode: C
- * tab-width: 8
- * indent-tabs-mode: t
- * c-file-style: "stroustrup"
- * End:
- * ex: shiftwidth=4 tabstop=8
- */

Deleted: brlcad/trunk/src/burst/Mm.h
===================================================================
--- brlcad/trunk/src/burst/Mm.h 2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk/src/burst/Mm.h 2020-06-18 17:10:24 UTC (rev 76154)
@@ -1,55 +0,0 @@
-/*                            M M . H
- * BRL-CAD
- *
- * Copyright (c) 2004-2020 United States Government as represented by
- * the U.S. Army Research Laboratory.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * version 2.1 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this file; see the file named COPYING for more
- * information.
- *
- */
-/** @file burst/Mm.h
- *
- */
-
-#ifndef BURST_MM_H
-#define BURST_MM_H
-
-/* Emulate MUVES Mm package using malloc. */
-
-#include "common.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "bu/malloc.h"
-#include "bu/str.h"
-
-#define MmAllo(typ)            (typ *) bu_malloc(sizeof(typ), CPP_FILELINE)
-#define MmFree(typ, ptr) bu_free((char *) ptr, CPP_FILELINE)
-#define MmVAllo(ct, typ)       (typ *) bu_malloc((ct)*sizeof(typ), 
CPP_FILELINE)
-#define MmVFree(ct, typ, ptr) bu_free((char *) ptr, CPP_FILELINE)
-#define MmStrDup(str) bu_strdup(str)
-#define MmStrFree(str) bu_free(str, CPP_FILELINE)
-
-#endif  /* BURST_MM_H */
-
-/*
- * Local Variables:
- * mode: C
- * tab-width: 8
- * indent-tabs-mode: t
- * c-file-style: "stroustrup"
- * End:
- * ex: shiftwidth=4 tabstop=8
- */

Deleted: brlcad/trunk/src/burst/Sc.c
===================================================================
--- brlcad/trunk/src/burst/Sc.c 2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk/src/burst/Sc.c 2020-06-18 17:10:24 UTC (rev 76154)
@@ -1,260 +0,0 @@
-/*                            S C . C
- * BRL-CAD
- *
- * Copyright (c) 2004-2020 United States Government as represented by
- * the U.S. Army Research Laboratory.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * version 2.1 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this file; see the file named COPYING for more
- * information.
- *
- */
-/** @file burst/Sc.c
- *
- */
-
-#include "common.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef HAVE_SYS__IOCTL_H
-#  include <sys/_ioctl.h>
-#else
-#  ifdef HAVE_SYS_IOCTL_H
-#    include <sys/ioctl.h>
-#    define _winsize winsize   /* For compatibility with _ioctl.h.     */
-#  endif
-#endif
-
-#include "bu/str.h"
-
-#include "./Sc.h"
-
-
-static FILE *out_fp;           /* Output stream.       */
-static int fd_stdout = 1;
-
-/* This is a global buffer for the terminal capabilities entry.        */
-char ScTermcap[ScTCAPSIZ];
-
-/* This is a global buffer for the name of the terminal.       */
-char ScTermname[ScTERMSIZ] = "UNKNOWN";
-
-/* Individual terminal control strings (TCS).                  */
-char *ScBC, /* Backspace character.                    */
-    *ScPC, /* Padding character.                       */
-    *ScUP, /* Cursor up one line.                      */
-    *ScCS, /* Change scrolling region.         */
-    *ScSO, /* Begin standout mode.                     */
-    *ScSE, /* End standout mode.                       */
-    *ScCE, /* Clear to end of line.                    */
-    *ScCL, /* Clear display and home cursor.   */
-    *ScHO, /* Home cursor.                             */
-    *ScCM, /* Screen-relative cursor motion.   */
-    *ScTI, /* Initialize terminal.                     */
-    *ScAL, /* Insert line.                             */
-    *ScDL, /* Delete line.                             */
-    *ScSR, /* Scroll text down.                        */
-    *ScSF; /* Scroll text up.                  */
-
-/* Individual terminal parameters.                             */
-int ScLI, /* Number of lines on screen.                */
-    ScCO; /* Number of columns on screen.              */
-
-
-/*
-  This function prevents the default "PutChr" from being pulled in
-  from the termcap library (-ltermlib).  DO NOT change its name or
-  STDOUT will be assumed as the output stream for terminal control.
-  Some applications might want to open "/dev/tty" so that they can
-  use STDOUT for something else.
-*/
-int
-PutChr(int c) {
-    return putc((char)c, out_fp);
-}
-
-
-/*
-  ScInit() must be invoked before any other function in the Sc package.
-  Stream fp must be open for writing and all terminal control sequences
-  will be sent to fp, giving the application the option of using STDOUT
-  for other things.  Besides setting the output stream, ScInit() does
-  the following:
-
-  Initializes the terminal.  Fills terminal name and capabilities
-  into external buffers.  Gets terminal control strings into external
-  variables.  Gets individual terminal parameters into external
-  variables.  Returns "1" for success, "0" for failure and
-  prints appropriate diagnostics on STDERR if $TERM is not set or
-  there is a problem in retrieving the corresponding termcap entry.
-*/
-int
-ScInit(FILE *fp) {
-    char *term; /* Name of terminal from environment. */
-    out_fp = fp;
-    fd_stdout = fileno(out_fp);
-    if ((term = getenv("TERM")) == NULL) {
-       (void) fprintf(stderr, "TERM not set or exported!\n");
-       return 0;
-    }
-    bu_strlcpy(ScTermname, term, ScTERMSIZ);
-
-    return 1;          /* All is well.                         */
-}
-
-
-/*
-  Clear from the cursor to the end of that line.
-*/
-int
-ScClrEOL(void) {
-    if (ScCE == NULL)
-       return 0;
-    return 1;
-}
-
-
-/*
-  Reset the scrolling region to the entire screen.
-*/
-int
-ScClrScrlReg(void) {
-    if (ScCS == NULL)
-       return 0;
-    return 1;
-}
-
-
-/*
-  End standout mode.
-*/
-int
-ScClrStandout(void) {
-    if (ScSE == NULL)
-       return 0;
-    return 1;
-}
-
-
-/*
-  Clear the screen and "home" the cursor.
-*/
-int
-ScClrText(void) {
-    if (ScCL == NULL)
-       return 0;
-    return 1;
-}
-
-
-/*
-  Insert a the line under the cursor.
-*/
-int
-ScInsertLn(void) {
-    if (ScAL == NULL)
-       return 0;
-    return 1;
-}
-
-
-/*
-  Delete the line under the cursor.
-*/
-int
-ScDeleteLn(void) {
-    if (ScDL == NULL)
-       return 0;
-    return 1;
-}
-
-
-/*
-  Scroll backward 1 line.
-*/
-int
-ScDnScroll(void) {
-    if (ScSR == NULL)
-       return 0;
-    return 1;
-}
-
-
-/*
-  Move the cursor to the top-left corner of the screen.
-*/
-int
-ScHmCursor(void) {
-    if (ScHO == NULL)
-       return 0;
-    return 1;
-}
-
-
-/*
-  Move the cursor to screen coordinates x, y (for column and row,
-  respectively).
-*/
-int
-ScMvCursor(int UNUSED(x), int UNUSED(y)) {
-    if (ScCM == NULL)
-       return 0;
-    return 1;
-}
-
-
-/*
-  Set the scrolling region to be from "top" line to "btm" line,
-  inclusive.
-*/
-int
-ScSetScrlReg(int UNUSED(top), int UNUSED(btm)) {
-    if (ScCS == NULL)
-       return 0;
-    return 1;
-}
-
-
-/*
-  Begin standout mode.
-*/
-int
-ScSetStandout(void) {
-    if (ScSO == NULL)
-       return 0;
-    return 1;
-}
-
-
-/*
-  Scroll text forward 1 line.
-*/
-int
-ScUpScroll(void) {
-    if (ScSF == NULL)
-       return 0;
-    return 1;
-}
-
-
-/*
- * Local Variables:
- * mode: C
- * tab-width: 8
- * indent-tabs-mode: t
- * c-file-style: "stroustrup"
- * End:
- * ex: shiftwidth=4 tabstop=8
- */

Deleted: brlcad/trunk/src/burst/Sc.h
===================================================================
--- brlcad/trunk/src/burst/Sc.h 2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk/src/burst/Sc.h 2020-06-18 17:10:24 UTC (rev 76154)
@@ -1,167 +0,0 @@
-/*                            S C . H
- * BRL-CAD
- *
- * Copyright (c) 2004-2020 United States Government as represented by
- * the U.S. Army Research Laboratory.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * version 2.1 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this file; see the file named COPYING for more
- * information.
- *
- */
-/** @file burst/Sc.h
- *
- */
-
-/**
-   <Sc.h> -- MUVES "Sc" (Screen manager) package definitions
-**/
-
-#ifndef BURST_SC_H
-#define BURST_SC_H
-#include "./burst.h"
-
-/**
-   int ScInit(FILE *fp)
-
-   ScInit() must be invoked before any other function in the Sc
-   package.  Stream fp must be open for writing and all terminal
-   control sequences will be sent to fp, giving the application
-   the option of using STDOUT for other things.  Besides setting
-   the output stream, ScInit() does the following:
-
-   Initializes the terminal.
-
-   Fills terminal name and capabilities into these externals:
-
-   char ScTermname[ScTERMSIZ]  (terminal name from $TERM)
-   char ScTermcap[ScTCAPSIZ]   (terminal capabilities entry)
-
-   Gets terminal control strings into external variables (here
-   are some that don't have individual functions to output them,
-   the ones that DO are below):
-
-   char *ScBC (backspace character)
-   char *ScPC (padding character)
-   char *ScUP (move the cursor up one line)
-   char *ScTI (initialize the terminal)
-
-   Gets individual terminal parameters into these externals:
-
-   int ScLI (number of lines on screen)
-   int ScCO (number of columns on screen)
-
-   Returns "1" for success, "0" for failure and prints
-   appropriate diagnostics on STDERR if $TERM is not set or
-   there is a problem in retrieving the corresponding termcap
-   entry.
-**/
-    extern int ScInit(FILE *fp);
-
-/**
-
-Below are functions paired with terminal control strings that
-they output to the stream specified with ScInit().  It is not
-recommended that the control strings be used directly, but it
-may be useful in certain applications to check their value;
-if ScInit() has not been invoked or the corresponding terminal
-capability does not exist, its control string will be NULL,
-AND the function will return "false".  Otherwise, they will
-return "true" (assuming that it worked).  There is no way to
-be sure of this.
-
-char *ScCE (clear from under the cursor to end of line)
-int ScClrEOL(void)
-
-char *ScCS (change scrolling region)
-int ScClrScrlReg(void)
-
-char *ScSE (end standout mode)
-int ScClrStandout(void)
-
-char *ScCL (clear screen, and home cursor)
-int ScClrText(void)
-
-char *ScAL (insert a line under the cursor)
-int ScInsertLn(void)
-
-char *ScDL (delete the line under the cursor)
-int ScDeleteLn(void)
-
-char *ScSR (scroll text backwards 1 line)
-int ScDnScroll(void)
-
-char *ScHO (move cursor to top-left corner of screen)
-int ScHmCursor(void)
-
-char *ScCM (move cursor to column and row <x, y>)
-int ScMvCursor(x, y)
-
-char *ScCS (set scrolling region from top to btm incl.)
-int ScSetScrlReg(top, btm)
-
-char *ScSO (begin standout mode)
-int ScSetStandout(void)
-
-char *ScSF (scroll text forwards 1 line)
-int ScUpScroll(void)
-
-**/
-extern char *ScBC;
-extern char *ScPC;
-extern char *ScUP;
-extern char *ScCS;
-extern char *ScSO;
-extern char *ScSE;
-extern char *ScCE;
-extern char *ScCL;
-extern char *ScHO;
-extern char *ScCM;
-extern char *ScTI;
-extern char *ScDL;
-extern char *ScSR;
-extern char *ScSF;
-
-extern int ScLI;
-extern int ScCO;
-
-extern int ScClrEOL(void);
-extern int ScClrScrlReg(void);
-extern int ScClrStandout(void);
-extern int ScClrText(void);
-extern int ScDeleteLn(void);
-extern int ScDnScroll(void);
-extern int ScHmCursor(void);
-extern int ScInsertLn(void);
-extern int ScMvCursor(int x, int y);
-extern int ScSetScrlReg(int top, int btm);
-extern int ScSetStandout(void);
-extern int ScUpScroll(void);
-
-#define ScTCAPSIZ 1024
-#define ScTERMSIZ 80
-
-extern char ScTermcap[];
-extern char ScTermname[];
-
-#endif         /* BURST_SC_H */
-
-
-/*
- * Local Variables:
- * mode: C
- * tab-width: 8
- * indent-tabs-mode: t
- * c-file-style: "stroustrup"
- * End:
- * ex: shiftwidth=4 tabstop=8
- */

Deleted: brlcad/trunk/src/burst/ascii.h
===================================================================
--- brlcad/trunk/src/burst/ascii.h      2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk/src/burst/ascii.h      2020-06-18 17:10:24 UTC (rev 76154)
@@ -1,66 +0,0 @@
-/*                         A S C I I . H
- * BRL-CAD
- *
- * Copyright (c) 2004-2020 United States Government as represented by
- * the U.S. Army Research Laboratory.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * version 2.1 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this file; see the file named COPYING for more
- * information.
- *
- */
-/** @file burst/ascii.h
- *
- */
-
-#ifndef BURST_ASCII_H
-#define BURST_ASCII_H
-
-#define NUL '\000'
-#define SOH '\001'
-#define STX '\002'
-#define INTR '\003'
-#define EOT '\004'
-#define ACK '\006'
-#define BEL '\007'
-#define BS '\010'
-#define HT '\011'
-#define LF '\012'
-#define FF '\014'
-#define CRET '\015'
-#define DLE '\020'
-#define DC1 '\021'
-#define DC2 '\022'
-#define DC3 '\023'
-#define DC4 '\024'
-#define KILL '\025'
-#define CAN '\030'
-#define ESC '\033'
-#define GS '\035'
-#define RS '\036'
-#define US '\037'
-#define SP '\040'
-#define DEL '\177'
-
-#define Ctrl(chr) ((int)chr&037)
-
-#endif /* BURST_ASCII_H */
-
-/*
- * Local Variables:
- * mode: C
- * tab-width: 8
- * indent-tabs-mode: t
- * c-file-style: "stroustrup"
- * End:
- * ex: shiftwidth=4 tabstop=8
- */

Deleted: brlcad/trunk/src/burst/burst.c
===================================================================
--- brlcad/trunk/src/burst/burst.c      2020-06-18 15:37:23 UTC (rev 76153)
+++ brlcad/trunk/src/burst/burst.c      2020-06-18 17:10:24 UTC (rev 76154)
@@ -1,391 +0,0 @@
-/*                         B U R S T . C
- * BRL-CAD
- *
- * Copyright (c) 2004-2020 United States Government as represented by
- * the U.S. Army Research Laboratory.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * version 2.1 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this file; see the file named COPYING for more
- * information.
- *
- */
-/** @file burst/burst.c
- *
- */
-
-#include "common.h"
-
-#include <assert.h>
-#include <stdio.h>
-#include <signal.h>
-
-#include "bu/app.h"
-#include "bu/getopt.h"
-#include "bu/file.h"
-#include "bu/opt.h"
-#include "bu/str.h"
-#include "bu/exit.h"
-#include "bu/log.h"
-#include "bu/vls.h"
-
-#include "./burst.h"
-#include "./extern.h"
-#include "./ascii.h"
-
-
-#define DEBUG_BURST 0 /* 1 enables debugging for this module */
-
-/*
-  int getCommand(char *name, char *buf, int len, FILE *fp)
-
-  Read next command line into buf and stuff the command name into name
-  from input stream fp.  buf must be at least len bytes long.
-
-  RETURN:      1 for success
-
-  0 for end of file
-*/
-static int
-getCommand(char *name, char *buf, int len, FILE *fp)
-{
-    assert(name != NULL);
-    assert(buf != NULL);
-    assert(fp != NULL);
-    while (bu_fgets(buf, len, fp) != NULL) {
-       if (buf[0] != CHAR_COMMENT) {
-           if (sscanf(buf, "%1330s", name) == 1) {
-               /* LNBUFSZ */
-               buf[strlen(buf)-1] = NUL; /* clobber newline */
-               return 1;
-           } else /* Skip over blank lines. */
-               continue;
-       } else {
-           /* Generate comment command. */
-           bu_strlcpy(name, CMD_COMMENT, LNBUFSZ);
-           return 1;
-       }
-    }
-    return 0; /* EOF */
-}
-
-
-/*
-  void setupSigs(void)
-
-  Initialize all signal handlers.
-*/
-
-static void
-setupSigs(void)
-{
-    int i;
-    for (i = 0; i < NSIG; i++)
-       switch (i) {
-           case SIGINT :
-               if ((norml_sig = signal(i, SIG_IGN)) == SIG_IGN)
-                   abort_sig = SIG_IGN;
-               else {
-                   norml_sig = intr_sig;
-                   abort_sig = abort_RT;
-                   (void) signal(i,  norml_sig);
-               }
-               break;
-#ifdef SIGPIPE
-           case SIGPIPE :
-               (void) signal(i, SIG_IGN);
-               break;
-#endif
-           default:
-               break;
-       }
-    return;
-}
-
-/*
-  void readBatchInput(FILE *fp)
-
-  Read and execute commands from input stream fp.
-*/
-void
-readBatchInput(FILE *fp)
-{
-    assert(fp != (FILE *) NULL);
-    batchmode = 1;
-    while (getCommand(cmdname, cmdbuf, LNBUFSZ, fp)) {
-       Func *cmdfunc;
-       if ((cmdfunc = getTrie(cmdname, cmdtrie)) == NULL) {
-           int i, len = strlen(cmdname);
-           brst_log("ERROR -- command syntax:\n");
-           brst_log("\t%s\n", cmdbuf);
-           brst_log("\t");
-           for (i = 0; i < len; i++)
-               brst_log(" ");
-           brst_log("^\n");
-       } else
-           if (BU_STR_EQUAL(cmdname, CMD_COMMENT)) {
-               /* special handling for comments */
-               cmdptr = cmdbuf;
-               cmdbuf[strlen(cmdbuf)-1] = '\0'; /* clobber newline */
-               (*cmdfunc)((HmItem *) 0);
-           } else {
-               /* Advance pointer past nul at end of
-                  command name. */
-               cmdptr = cmdbuf + strlen(cmdname) + 1;
-               (*cmdfunc)((HmItem *) 0);
-           }
-    }
-    batchmode = 0;
-    return;
-}
-
-static const char usage[] =
-    "Usage: burst [-p|-P] [file]\n"
-    "\tThe -p/-P options specifies whether to plot points or lines."
-;
-
-/*
-  int main(int argc, char *argv[])
-*/
-int
-main(int argc, const char *argv[])
-{
-    struct burst_state s;
-    const char *bfile = NULL;
-    int burst_opt; /* unused, for option compatibility */
-    int plot_lines = 0;
-    int plot_points = 0;
-    int ret_ac;
-
-    bu_setprogname(argv[0]);
-
-    struct bu_opt_desc d[4];
-    struct bu_vls pmsg = BU_VLS_INIT_ZERO;
-
-    BU_OPT(d[0],  "p", "", "",  NULL,   &plot_points, "Plot points");
-    BU_OPT(d[1],  "P", "", "",  NULL,   &plot_lines,  "Plot lines");
-    BU_OPT(d[2],  "b", "", "",  NULL,   &burst_opt,   "Batch mode");
-    BU_OPT_NULL(d[3]);
-
-    burst_state_init(&s);
-
-
-    /* Interactive mode is gone - until we strip all the leftovers out
-     * of the code, let it know we're not in tty mode */
-    tty = 0;
-
-    bu_setlinebuf(stderr);
-
-    /* Skip first arg */
-    argv++; argc--;
-
-    /* no options imply a request for usage */
-    if (argc < 1 || !argv || argv[0] == NULL) {
-       (void)fprintf(stderr, "%s\n", usage);
-       return EXIT_SUCCESS;
-    }
-
-    /* Process options */
-    ret_ac = bu_opt_parse(&pmsg, argc, argv, d);
-    if (ret_ac < 0) {
-       (void)fprintf(stderr, "%s\n", bu_vls_cstr(&pmsg));
-       bu_vls_free(&pmsg);
-       (void)fprintf(stderr, "%s\n", usage);
-       return EXIT_FAILURE;
-    }
-    bu_vls_free(&pmsg);
-
-    if (ret_ac) {
-       if (!bu_file_exists(argv[0], NULL)) {
-           (void)fprintf(stderr, "ERROR: Input file [%s] does not exist!\n", 
argv[0]);
-           (void)fprintf(stderr, "%s\n", usage);
-           return EXIT_FAILURE;
-       } else {
-           bfile = argv[0];
-       }
-    }
-
-    tmpfp = bu_temp_file(tmpfname, TIMER_LEN);
-    if (!tmpfp) {
-       bu_exit(EXIT_FAILURE, "ERROR: Unable to create temporary file.\n");
-    }
-
-    setupSigs();
-
-    /* must be called before any output is produced */
-    if (!initUi()) {
-       fclose(tmpfp);
-       return EXIT_FAILURE;
-    }
-
-#if DEBUG_BURST
-    prntTrie(cmdtrie, 0);
-#endif
-    assert(airids.i_next == NULL);
-    assert(armorids.i_next == NULL);
-    assert(critids.i_next == NULL);
-
-    if (bfile) {
-       FILE *fp = fopen(bfile, "rb");
-       readBatchInput(fp);
-       fclose(fp);
-    } else {
-       readBatchInput(stdin);
-    }
-
-    fclose(tmpfp);
-    return EXIT_SUCCESS;
-}
-
-
-/*
-  void exitCleanly(int code)
-
-  Should be only exit from program after success of initUi().
-*/
-void
-exitCleanly(int code)
-{
-    if (tty)
-       closeUi(); /* keep screen straight */
-    (void) fclose(tmpfp);
-    if (!bu_file_delete(tmpfname))
-       locPerror(tmpfname);
-    exit(code);
-}
-
-void
-burst_state_init(struct burst_state *s)
-{
-    //Colors colorids;
-    s->fbiop = NULL;
-    s->burstfp = NULL;
-    s->gridfp = NULL;
-    s->histfp = NULL;
-    s->outfp = NULL;
-    s->plotfp = NULL;
-    s->shotfp = NULL;
-    s->shotlnfp = NULL;
-    s->tmpfp = NULL;
-    s->mainhmenu = NULL;
-    //Ids airids;
-    //Ids armorids;
-    //Ids critids;
-    s->pixgrid = NULL;
-    VSET(s->pixaxis, 255,   0,   0);
-    VSET(s->pixbhit, 200, 255, 200);
-    VSET(s->pixbkgr, 150, 100, 255);
-    VSET(s->pixblack,  0,   0,   0);
-    VSET(s->pixcrit, 255, 200, 200);
-    VSET(s->pixghit, 255,   0, 255);
-    VSET(s->pixmiss, 200, 200, 200);
-    VSET(s->pixtarg, 255, 255, 255);
-    s->cmdtrie = NULL;
-    s->plotline = 0;
-    s->batchmode = 0;
-    s->cantwarhead = 0;
-    s->deflectcone = DFL_DEFLECT;
-    s->dithercells = DFL_DITHER;
-    s->fatalerror = 0;
-    s->groundburst = 0;
-    s->reportoverlaps = DFL_OVERLAPS;
-    s->reqburstair = 1;
-    s->shotburst = 0;
-    s->tty = 1;
-    s->userinterrupt = 0;
-    memset(s->airfile, 0, LNBUFSZ);
-    memset(s->armorfile, 0, LNBUFSZ);
-    memset(s->burstfile, 0, LNBUFSZ);
-    memset(s->cmdbuf, 0, LNBUFSZ);
-    memset(s->cmdname, 0, LNBUFSZ);
-    memset(s->colorfile, 0, LNBUFSZ);
-    memset(s->critfile, 0, LNBUFSZ);
-    memset(s->errfile, 0, LNBUFSZ);
-    memset(s->fbfile, 0, LNBUFSZ);
-    memset(s->gedfile, 0, LNBUFSZ);
-    memset(s->gridfile, 0, LNBUFSZ);
-    memset(s->histfile, 0, LNBUFSZ);
-    memset(s->objects, 0, LNBUFSZ);
-    memset(s->outfile, 0, LNBUFSZ);
-    memset(s->plotfile, 0, LNBUFSZ);
-    memset(s->scrbuf, 0, LNBUFSZ);
-    memset(s->scriptfile, 0, LNBUFSZ);
-    memset(s->shotfile, 0, LNBUFSZ);
-    memset(s->shotlnfile, 0, LNBUFSZ);
-    memset(s->title, 0, TITLE_LEN);
-    memset(s->timer, 0, TIMER_LEN);
-    memset(s->tmpfname, 0, TIMER_LEN);
-    s->cmdptr = NULL;
-    s->bdist = DFL_BDIST;
-    VSET(s->burstpoint, 0.0, 0.0, 0.0);
-    s->cellsz = DFL_CELLSIZE;
-    s->conehfangle = DFL_CONEANGLE;
-    VSET(s->fire, 0.0, 0.0, 0.0);
-    s->griddn = 0.0;
-    s->gridlf = 0.0;
-    s->gridrt = 0.0;
-    s->gridup = 0.0;
-    VSET(s->gridhor, 0.0, 0.0, 0.0);
-    VSET(s->gridsoff, 0.0, 0.0, 0.0);
-    VSET(s->gridver, 0.0, 0.0, 0.0);
-    s->grndbk = 0.0;
-    s->grndht = 0.0;
-    s->grndfr = 0.0;
-    s->grndlf = 0.0;
-    s->grndrt = 0.0;
-    VSET(s->modlcntr, 0.0, 0.0, 0.0);
-    s->modldn = 0.0;
-    s->modllf = 0.0;
-    s->modlrt = 0.0;
-    s->modlup = 0.0;
-    s->raysolidangle = 0.0;
-    s->standoff = 0.0;
-    s->unitconv = 1.0;
-    s->viewazim = DFL_AZIMUTH;
-    s->viewelev = DFL_ELEVATION;
-    s->pitch = 0.0;
-    s->yaw = 0.0;
-    VSET(s->xaxis, 1.0, 0.0, 0.0);
-    VSET(s->zaxis, 0.0, 0.0, 1.0);
-    VSET(s->negzaxis, 0.0, 0.0, -1.0);
-    co = 0;
-    devwid = 0;
-    devhgt = 0;
-    firemode = FM_DFLT;
-    gridsz = 512;
-    gridxfin = 0;
-    gridyfin = 0;
-    gridxorg = 0;
-    gridyorg = 0;
-    gridwidth = 0;
-    gridheight = 0;
-    li = 0;
-    nbarriers = DFL_BARRIERS;
-    noverlaps = 0;
-    nprocessors = 0;
-    nriplevels = DFL_RIPLEVELS;
-    s->nspallrays = DFL_NRAYS;
-    s->units = DFL_UNITS;
-    s->zoom = 1;
-    s->rtip = RTI_NULL;
-    s->norml_sig = NULL;       /* active during interactive operation */
-    s->abort_sig = NULL; /* active during ray tracing only */
-}
-
-/*
- * Local Variables:
- * mode: C
- * tab-width: 8
- * indent-tabs-mode: t
- * c-file-style: "stroustrup"
- * End:
- * ex: shiftwidth=4 tabstop=8
- */

Copied: brlcad/trunk/src/burst/burst.cpp (from rev 76153, 
brlcad/branches/bioh/src/burst/burst.cpp)
===================================================================
--- brlcad/trunk/src/burst/burst.cpp                            (rev 0)
+++ brlcad/trunk/src/burst/burst.cpp    2020-06-18 17:10:24 UTC (rev 76154)
@@ -0,0 +1,1891 @@
+/*                        B U R S T . C P P
+ * BRL-CAD
+ *
+ * Copyright (c) 2004-2020 United States Government as represented by
+ * the U.S. Army Research Laboratory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this file; see the file named COPYING for more
+ * information.
+ */
+/** @file burst/burst.cpp
+ *
+ */
+
+#include "common.h"
+
+#include <cstdio>
+#include <fstream>
+#include <iostream>
+#include <sstream>
+#include <string>
+
+#include <stdlib.h>
+#include <string.h>
+
+extern "C" {
+#include "linenoise.h"
+}
+
+#include "bu/app.h"
+#include "bu/cmd.h"
+#include "bu/getopt.h"
+#include "bu/file.h"
+#include "bu/opt.h"
+#include "bu/str.h"
+#include "bu/exit.h"
+#include "bu/log.h"
+#include "bu/units.h"
+#include "bu/vls.h"
+
+#include "fb.h"
+#include "raytrace.h"
+
+#include "./burst.h"
+
+#define DEFAULT_BURST_PROMPT "burst> "
+
+/* logging function that takes care of writing output to errfile if it is 
defined */
+void
+brst_log(struct burst_state *s, int TYPE, const char *fmt, ...)
+{
+    va_list ap;
+    va_start(ap, fmt);
+    if (s->errfile) {
+       vfprintf(s->errfile, fmt, ap);
+    }
+    if (TYPE == MSG_OUT) {
+       vfprintf(stderr, fmt, ap);
+    }
+}
+
+/* Forward declare so we can use this function in a command
+ * called by this function */
+int burst_process_line(struct burst_state *s, const char *line);
+
+#define PURPOSEFLAG "--print-purpose"
+#define HELPFLAG "--print-help"
+static int
+_burst_cmd_msgs(void *UNUSED(bs), int argc, const char **argv, const char *us, 
const char *ps)
+{
+    //struct burst_state *s = (struct burst_state *)bs;
+    if (argc == 2 && BU_STR_EQUAL(argv[1], HELPFLAG)) {
+       printf("Usage: %s\n%s\n", us, ps);
+       return 1;
+    }
+    if (argc == 2 && BU_STR_EQUAL(argv[1], PURPOSEFLAG)) {
+       printf("%s\n", ps);
+       return 1;
+    }
+    return 0;
+}
+
+
+void
+burst_state_init(struct burst_state *s)
+{
+    s->quit = 0;
+
+    BU_PTBL_INIT(&s->colorids);
+    s->fbiop = NULL;
+    s->burstfp = NULL;
+    s->gridfp = NULL;
+    s->histfp = NULL;
+    s->outfp = NULL;
+    s->plotfp = NULL;
+    s->shotfp = NULL;
+    s->shotlnfp = NULL;
+    BU_PTBL_INIT(&s->airids);
+    BU_PTBL_INIT(&s->armorids);
+    BU_PTBL_INIT(&s->critids);
+    s->pixgrid = NULL;
+    VSET(s->pixaxis, 255,   0,   0);
+    VSET(s->pixbhit, 200, 255, 200);
+    VSET(s->pixbkgr, 150, 100, 255);
+    VSET(s->pixblack,  0,   0,   0);
+    VSET(s->pixcrit, 255, 200, 200);
+    VSET(s->pixghit, 255,   0, 255);
+    VSET(s->pixmiss, 200, 200, 200);
+    VSET(s->pixtarg, 255, 255, 255);
+    s->plotline = 0;
+    s->batchmode = 0;
+    s->cantwarhead = 0;
+    s->deflectcone = DFL_DEFLECT;
+    s->dithercells = DFL_DITHER;
+    s->fatalerror = 0;
+    s->groundburst = 0;
+    s->reportoverlaps = DFL_OVERLAPS;
+    s->reqburstair = 1;
+    s->shotburst = 0;
+    s->userinterrupt = 0;
+    bu_vls_init(&s->airfile);
+    bu_vls_init(&s->armorfile);
+    bu_vls_init(&s->burstfile);
+    bu_vls_init(&s->cmdbuf);
+    bu_vls_init(&s->cmdname);
+    bu_vls_init(&s->colorfile);
+    bu_vls_init(&s->critfile);
+    s->errfile = NULL;
+    bu_vls_init(&s->fbfile);
+    bu_vls_init(&s->gedfile);
+    bu_vls_init(&s->gridfile);
+    bu_vls_init(&s->histfile);
+    bu_vls_init(&s->objects);
+    bu_vls_init(&s->outfile);
+    bu_vls_init(&s->plotfile);
+    bu_vls_init(&s->shotfile);
+    bu_vls_init(&s->shotlnfile);
+    memset(s->timer, 0, TIMER_LEN);
+    bu_vls_init(&s->cmdhist);
+    s->bdist = DFL_BDIST;
+    VSET(s->burstpoint, 0.0, 0.0, 0.0);
+    s->cellsz = DFL_CELLSIZE;
+    s->conehfangle = DFL_CONEANGLE;
+    VSET(s->fire, 0.0, 0.0, 0.0);
+    s->griddn = 0.0;
+    s->gridlf = 0.0;
+    s->gridrt = 0.0;
+    s->gridup = 0.0;
+    VSET(s->gridhor, 0.0, 0.0, 0.0);
+    VSET(s->gridsoff, 0.0, 0.0, 0.0);
+    VSET(s->gridver, 0.0, 0.0, 0.0);
+    s->grndbk = 0.0;
+    s->grndht = 0.0;
+    s->grndfr = 0.0;
+    s->grndlf = 0.0;
+    s->grndrt = 0.0;
+    VSET(s->modlcntr, 0.0, 0.0, 0.0);
+    s->modldn = 0.0;
+    s->modllf = 0.0;
+    s->modlrt = 0.0;
+    s->modlup = 0.0;
+    s->raysolidangle = 0.0;
+    s->standoff = 0.0;
+    s->unitconv = 1.0;
+    s->viewazim = DFL_AZIMUTH;
+    s->viewelev = DFL_ELEVATION;
+    s->pitch = 0.0;
+    s->yaw = 0.0;
+    VSET(s->xaxis, 1.0, 0.0, 0.0);
+    VSET(s->zaxis, 0.0, 0.0, 1.0);
+    VSET(s->negzaxis, 0.0, 0.0, -1.0);
+    s->co = 0;
+    s->devwid = 0;
+    s->devhgt = 0;
+    s->firemode = FM_DFLT;
+    s->gridsz = 512;
+    s->gridxfin = 0;
+    s->gridyfin = 0;
+    s->gridxorg = 0;
+    s->gridyorg = 0;
+    s->gridwidth = 0;
+    s->gridheight = 0;
+    s->li = 0;
+    s->nbarriers = DFL_BARRIERS;
+    s->noverlaps = 0;
+    s->nprocessors = 0;
+    s->nriplevels = DFL_RIPLEVELS;
+    s->nspallrays = DFL_NRAYS;
+    s->zoom = 1;
+    s->rtip = RTI_NULL;
+    s->norml_sig = NULL; /* active during interactive operation */
+    s->abort_sig = NULL; /* active during ray tracing only */
+    s->cmds = NULL;
+}
+
+
+extern "C" int
+_burst_cmd_attack_direction(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "attack-direction azim_angle elev_angle";
+    const char *purpose_string = "specify azimuth and elevation of attack 
relative to target";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct burst_state *s = (struct burst_state *)bs;
+    struct bu_vls msg = BU_VLS_INIT_ZERO;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 3) {
+       printf("Usage: attack-direction az(deg) el(deg)\n");
+       return BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[1], (void *)&s->viewazim) < 0) {
+       brst_log(s, MSG_OUT, "problem reading azimuth: %s\n", 
bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[2], (void *)&s->viewelev) < 0) {
+       brst_log(s, MSG_OUT, "problem reading elevation: %s\n", 
bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t%g %g\n", argv[0], s->viewazim, s->viewelev);
+
+    // After echoing, convert to radians for internal use
+    s->viewazim /= RAD2DEG;
+    s->viewelev /= RAD2DEG;
+
+    bu_vls_free(&msg);
+    return ret;
+}
+
+
+extern "C" int
+_burst_cmd_critical_comp_file(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "critical-comp-file file";
+    const char *purpose_string = "input critical component idents from file";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: critical-comp-file file\n");
+       return BRLCAD_ERROR;
+    }
+
+    brst_log(s, MSG_LOG, "Reading critical component idents...\n");
+
+    if (!readIdents(&s->critids, argv[1])) {
+       brst_log(s, MSG_OUT, "failed to open critical component file: %s\n", 
argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    brst_log(s, MSG_LOG, "Reading critical component idents... done.\n");
+
+    bu_vls_sprintf(&s->critfile, "%s", argv[1]);
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t%s\n", argv[0], bu_vls_cstr(&s->critfile));
+
+    return ret;
+}
+
+
+extern "C" int
+_burst_cmd_deflect_spall_cone(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "deflect-spall-cone flag";
+    const char *purpose_string = "deflect axis of spall cone half way towards 
exit normal";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: deflect-spall-cone yes|no\n");
+       return BRLCAD_ERROR;
+    }
+
+    int tval = bu_str_true(argv[1]);
+    int fval = bu_str_false(argv[1]);
+
+    if (!tval && !fval) {
+       brst_log(s, MSG_OUT, "Invalid boolean string: %s\n", argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    s->deflectcone = (fval) ? 0 : tval;
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t%s\n", argv[0], s->deflectcone ? "yes" : "no");
+
+    return BRLCAD_OK;
+}
+
+extern "C" int
+_burst_cmd_dither_cells(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "dither-cells flag";
+    const char *purpose_string = "if yes, randomly offset shotline within grid 
cell";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: dither-cells yes|no\n");
+       return BRLCAD_ERROR;
+    }
+
+    int tval = bu_str_true(argv[1]);
+    int fval = bu_str_false(argv[1]);
+
+    if (!tval && !fval) {
+       brst_log(s, MSG_OUT, "Invalid boolean string: %s\n", argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    s->dithercells = (fval) ? 0 : tval;
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%s\n", argv[0], s->dithercells ? "yes" : "no");
+
+    return BRLCAD_OK;
+}
+
+extern "C" int
+_burst_cmd_enclose_target(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "enclose-target";
+    const char *purpose_string = "generate rectangular grid of shotlines for 
full target envelope";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    struct burst_state *s = (struct burst_state *)bs;
+    s->firemode = FM_GRID;
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "enclose-target\n");
+
+    return BRLCAD_OK;
+}
+
+extern "C" int
+_burst_cmd_enclose_portion(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "enclose-portion left right bottom top";
+    const char *purpose_string = "generate partial envelope by specifying grid 
boundaries";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct bu_vls msg = BU_VLS_INIT_ZERO;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 5) {
+       brst_log(s, MSG_OUT, "Usage: enclose-portion left right bottom top\n");
+       return BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[1], (void *)&s->gridlf) < 0) {
+       brst_log(s, MSG_OUT, "problem reading left border of grid: %s\n", 
bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[2], (void *)&s->gridrt) < 0) {
+       brst_log(s, MSG_OUT, "problem reading right border of grid: %s\n", 
bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[3], (void *)&s->griddn) < 0) {
+       brst_log(s, MSG_OUT, "problem reading bottom border of grid: %s\n", 
bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[4], (void *)&s->gridup) < 0) {
+       brst_log(s, MSG_OUT, "problem reading top border of grid: %s\n", 
bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%g %g %g %g\n", argv[0], s->gridlf, s->gridrt, 
s->griddn, s->gridup);
+
+    // After echoing, convert to mm
+    s->gridlf /= s->unitconv;
+    s->gridrt /= s->unitconv;
+    s->griddn /= s->unitconv;
+    s->gridup /= s->unitconv;
+
+    bu_vls_free(&msg);
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_error_file(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "error-file file";
+    const char *purpose_string = "divert all diagnostics to file";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: error-file file\n");
+       return BRLCAD_ERROR;
+    }
+
+    /* If we had a previous file open, close it */
+    if (s->errfile) {
+       fclose(s->errfile);
+       s->errfile = NULL;
+    }
+
+    /* If we're given a NULL argument, disable the error file */
+    if (BU_STR_EQUAL(argv[1], "NULL") || BU_STR_EQUAL(argv[1], "/dev/NULL")) {
+       return ret;
+    }
+
+    /* Try to open the file - we want to write messages to the file
+     * as they are generated. */
+    s->errfile = fopen(argv[1], "wb");
+    if (!s->errfile) {
+       brst_log(s, MSG_OUT, "failed to open error file: %s\n", argv[1]);
+       ret = BRLCAD_ERROR;
+    }
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%s\n", argv[0], argv[1]);
+
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_execute(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "execute";
+    const char *purpose_string = "initiate a run (no output produced without 
this command)";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s) return BRLCAD_ERROR;
+
+    if (!bu_vls_strlen(&s->gedfile)) {
+       brst_log(s, MSG_OUT, "Execute failed: no target file has been 
specified\n");
+       return BRLCAD_ERROR;
+    }
+
+    // Echo command
+    brst_log(s, MSG_OUT, "execute\n");
+
+    return execute_run(s);
+}
+
+extern "C" int
+_burst_cmd_grid_file(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "grid-file file";
+    const char *purpose_string = "save shotline locations (Y' Z') in file";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: grid-file file\n");
+       return BRLCAD_ERROR;
+    }
+
+    /* If we had a previous file open, close it */
+    if (s->gridfp) {
+       fclose(s->gridfp);
+       s->gridfp = NULL;
+    }
+
+    /* If we're given a NULL argument, disable the grid file */
+    if (BU_STR_EQUAL(argv[1], "NULL") || BU_STR_EQUAL(argv[1], "/dev/NULL")) {
+       bu_vls_trunc(&s->gridfile, 0);
+       return ret;
+    }
+
+    /* Try to open the file */
+    s->gridfp = fopen(argv[1], "wb");
+    if (!s->gridfp) {
+       brst_log(s, MSG_OUT, "failed to open grid file: %s\n", argv[1]);
+       ret = BRLCAD_ERROR;
+    }
+
+    bu_vls_sprintf(&s->gridfile, "%s", argv[1]);
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%s\n", argv[0], bu_vls_cstr(&s->gridfile));
+
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_ground_plane(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "ground-plane flag [Z +X -X +Y -Y]";
+    const char *purpose_string = "if yes, burst on ground";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct bu_vls msg = BU_VLS_INIT_ZERO;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2 && argc != 7) {
+       brst_log(s, MSG_OUT, "Usage: ground-plane no|yes height xpos xneg ypos 
yneg\n");
+       return BRLCAD_ERROR;
+    }
+
+    int tval = bu_str_true(argv[1]);
+    int fval = bu_str_false(argv[1]);
+
+    if (!tval && !fval) {
+       brst_log(s, MSG_OUT, "Invalid boolean string: %s\n", argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    s->groundburst = (fval) ? 0 : tval;
+
+    if (!s->groundburst) {
+       // Echo command (logCmd in original code)
+       brst_log(s, MSG_OUT, "%s\t\tno\n", argv[0]);
+       return ret;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[2], (void *)&s->grndht) < 0) {
+       brst_log(s, MSG_OUT, "problem reading distance of target origin above 
ground plane: %s\n", bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[3], (void *)&s->grndfr) < 0) {
+       brst_log(s, MSG_OUT, "problem reading distance out positive X-axis of 
target to edge: %s\n", bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[4], (void *)&s->grndbk) < 0) {
+       brst_log(s, MSG_OUT, "problem reading distance out negative X-axis of 
target to edge: %s\n", bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[5], (void *)&s->grndlf) < 0) {
+       brst_log(s, MSG_OUT, "problem reading distance out positive Y-axis of 
target to edge: %s\n", bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[6], (void *)&s->grndrt) < 0) {
+       brst_log(s, MSG_OUT, "problem reading distance out negative Y-axis of 
target to edge: %s\n", bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\tyes %g %g %g %g %g\n", argv[0], s->grndht, 
s->grndfr, s->grndbk, s->grndlf, s->grndrt);
+
+    /* after printing, convert to mm */
+    s->grndht /= s->unitconv;
+    s->grndfr /= s->unitconv;
+    s->grndbk /= s->unitconv;
+    s->grndlf /= s->unitconv;
+    s->grndrt /= s->unitconv;
+
+    bu_vls_free(&msg);
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_help(void *bs, int argc, const char **argv)
+{
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (argc == 1 || BU_STR_EQUAL(argv[1], "help")) {
+       printf("Available commands:\n");
+       const struct bu_cmdtab *ctp = NULL;
+       int ret;
+       const char *helpflag[2];
+       helpflag[1] = PURPOSEFLAG;
+       size_t maxcmdlen = 0;
+       for (ctp = s->cmds; ctp->ct_name != (char *)NULL; ctp++) {
+           maxcmdlen = (maxcmdlen > strlen(ctp->ct_name)) ? maxcmdlen : 
strlen(ctp->ct_name);
+       }
+       for (ctp = s->cmds; ctp->ct_name != (char *)NULL; ctp++) {
+           printf("  %s%*s", ctp->ct_name, (int)(maxcmdlen - 
strlen(ctp->ct_name)) + 2, " ");
+           if (!BU_STR_EQUAL(ctp->ct_name, "help")) {
+               helpflag[0] = ctp->ct_name;
+               bu_cmd(s->cmds, 2, helpflag, 0, (void *)s, &ret);
+           } else {
+               printf("print help\n");
+           }
+       }
+    } else {
+       int ret;
+       const char **helpargv = (const char **)bu_calloc(argc+1, sizeof(char 
*), "help argv");
+       helpargv[0] = argv[1];
+       helpargv[1] = HELPFLAG;
+       for (int i = 2; i < argc; i++) {
+           helpargv[i+1] = argv[i];
+       }
+       bu_cmd(s->cmds, argc, helpargv, 0, (void *)s, &ret);
+       bu_free(helpargv, "help argv");
+    }
+
+    return BRLCAD_OK;
+}
+
+extern "C" int
+_burst_cmd_burst_air_file(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "burst-air-file file";
+    const char *purpose_string = "input burst air idents from file";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: burst-air-file file\n");
+       return BRLCAD_ERROR;
+    }
+
+    brst_log(s, MSG_LOG, "Reading burst air idents...\n");
+
+    if (!readIdents(&s->airids, argv[1])) {
+       brst_log(s, MSG_OUT, "failed to open burst air idents file: %s\n", 
argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    brst_log(s, MSG_LOG, "Reading burst air idents... done.\n");
+
+    bu_vls_sprintf(&s->airfile, "%s", argv[1]);
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%s\n", argv[0], bu_vls_cstr(&s->airfile));
+
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_histogram_file(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "histogram-file file";
+    const char *purpose_string = "write hit frequency histogram to file";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: histogram-file file\n");
+       return BRLCAD_ERROR;
+    }
+
+    /* If we had a previous file open, close it */
+    if (s->histfp) {
+       fclose(s->histfp);
+       s->histfp = NULL;
+    }
+
+    /* If we're given a NULL argument, disable the grid file */
+    if (BU_STR_EQUAL(argv[1], "NULL") || BU_STR_EQUAL(argv[1], "/dev/NULL")) {
+       bu_vls_trunc(&s->histfile, 0);
+       return ret;
+    }
+
+    /* Try to open the file */
+    s->histfp = fopen(argv[1], "wb");
+    if (!s->histfp) {
+       brst_log(s, MSG_OUT, "failed to open histogram file: %s\n", argv[1]);
+       ret = BRLCAD_ERROR;
+    }
+
+    bu_vls_sprintf(&s->histfile, "%s", argv[1]);
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%s\n", argv[0], bu_vls_cstr(&s->histfile));
+
+
+    return BRLCAD_OK;
+}
+
+extern "C" int
+_burst_cmd_image_file(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "image-file file";
+    const char *purpose_string = "generate frame buffer image on a specified 
file or device";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: image-file file\n");
+       return BRLCAD_ERROR;
+    }
+
+    bu_vls_sprintf(&s->fbfile, "%s", argv[1]);
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%s\n", argv[0], bu_vls_cstr(&s->fbfile));
+
+    return BRLCAD_OK;
+}
+
+extern "C" int
+_burst_cmd_input_2d_shot(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "input-2d-shot Y' Z'";
+    const char *purpose_string = "input single shotline location as grid 
offsets";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct bu_vls msg = BU_VLS_INIT_ZERO;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 3) {
+       brst_log(s, MSG_OUT, "Usage: input-2d-shot Y Z\n");
+       return BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[1], (void *)&s->fire[X]) < 0) {
+       brst_log(s, MSG_OUT, "problem reading coordinate: %s\n", 
bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+    if (bu_opt_fastf_t(&msg, 1, &argv[2], (void *)&s->fire[Y]) < 0) {
+       brst_log(s, MSG_OUT, "problem reading coordinate: %s\n", 
bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%g %g\n", argv[0], s->fire[X], s->fire[Y]);
+
+    /* after printing, convert to mm */
+    s->fire[X] /= s->unitconv;
+    s->fire[Y] /= s->unitconv;
+
+    s->firemode = FM_SHOT;
+
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_input_3d_shot(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "input-3d-shot X Y Z";
+    const char *purpose_string = "input single shotline location in target 
coordinates";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct bu_vls msg = BU_VLS_INIT_ZERO;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 4) {
+       brst_log(s, MSG_OUT, "Usage: input-3d-shot X Y Z\n");
+       return BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[1], (void *)&s->fire[X]) < 0) {
+       brst_log(s, MSG_OUT, "problem reading coordinate: %s\n", 
bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[2], (void *)&s->fire[Y]) < 0) {
+       brst_log(s, MSG_OUT, "problem reading coordinate: %s\n", 
bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    if (bu_opt_fastf_t(&msg, 1, &argv[3], (void *)&s->fire[Z]) < 0) {
+       brst_log(s, MSG_OUT, "problem reading coordinate: %s\n", 
bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%g %g %g\n", argv[0], s->fire[X], s->fire[Y], 
s->fire[Z]);
+
+    /* after printing, convert to mm */
+    s->fire[X] /= s->unitconv;
+    s->fire[Y] /= s->unitconv;
+    s->fire[Z] /= s->unitconv;
+
+    s->firemode = FM_SHOT | FM_3DIM;
+
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_max_barriers(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "max-barriers count";
+    const char *purpose_string = "specify the maximum number of components to 
report along spall ray";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct bu_vls msg = BU_VLS_INIT_ZERO;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: max-barriers #\n");
+       return BRLCAD_ERROR;
+    }
+
+    if (bu_opt_int(&msg, 1, &argv[1], (void *)&s->nbarriers) < 0) {
+       brst_log(s, MSG_OUT, "problem reading spall barriers per ray count: 
%s\n", bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%d\n", argv[0], s->nbarriers);
+
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_max_spall_rays(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "max-spall-rays count";
+    const char *purpose_string = "specify the desired number of spall rays 
generated per burst point";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct bu_vls msg = BU_VLS_INIT_ZERO;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: max-spall-rays #\n");
+       return BRLCAD_ERROR;
+    }
+
+    if (bu_opt_int(&msg, 1, &argv[1], (void *)&s->nspallrays) < 0) {
+       brst_log(s, MSG_OUT, "problem reading maximum rays per burst: %s\n", 
bu_vls_cstr(&msg));
+       ret = BRLCAD_ERROR;
+    }
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%d\n", argv[0], s->nspallrays);
+
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_plot_file(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "plot-file file";
+    const char *purpose_string = "generate plot data in file";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: plot-file file\n");
+       return BRLCAD_ERROR;
+    }
+
+    /* Try to open the file - we want to write output to the file
+     * as it is generated. */
+    s->plotfp = fopen(argv[1], "wb");
+    if (!s->plotfp) {
+       brst_log(s, MSG_OUT, "failed to open plot file: %s\n", argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    bu_vls_sprintf(&s->plotfile, "%s", argv[1]);
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%s\n", argv[0], bu_vls_cstr(&s->plotfile));
+
+    return BRLCAD_OK;
+}
+
+extern "C" int
+_burst_cmd_quit(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "quit";
+    const char *purpose_string = "quit the appliation";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    s->quit = 1;
+
+    return BRLCAD_OK;
+}
+
+extern "C" int
+_burst_cmd_read_2d_shot_file(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "read-2d-shot-file file";
+    const char *purpose_string = "read shot locations from file as grid 
offsets (see input-2d-shot)";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: read-2d-shot-file file\n");
+       return BRLCAD_ERROR;
+    }
+
+    /* If we had a previous file open, close it */
+    if (s->shotfp) {
+       fclose(s->shotfp);
+       s->shotfp = NULL;
+    }
+
+    /* If we're given a NULL argument, disable the error file */
+    if (BU_STR_EQUAL(argv[1], "NULL") || BU_STR_EQUAL(argv[1], "/dev/NULL")) {
+       s->firemode = 0;
+       bu_vls_trunc(&s->shotfile, 0);
+       return ret;
+    }
+
+    s->shotfp = fopen(argv[1], "rb");
+    if (!s->shotfp) {
+       brst_log(s, MSG_OUT, "failed to open critical component file: %s\n", 
argv[1]);
+       ret = BRLCAD_ERROR;
+    }
+
+    bu_vls_sprintf(&s->shotfile, "%s", argv[1]);
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t%s\n", argv[0], bu_vls_cstr(&s->shotfile));
+
+    s->firemode = FM_SHOT | FM_FILE;
+
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_read_3d_shot_file(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "read-3d-shot-file file";
+    const char *purpose_string = "read shot locations from file in target 
coordinates (see input-3d-shot)";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: read-3d-shot-file file\n");
+       return BRLCAD_ERROR;
+    }
+
+    /* If we had a previous file open, close it */
+    if (s->shotfp) {
+       fclose(s->shotfp);
+       s->shotfp = NULL;
+    }
+
+    /* If we're given a NULL argument, disable the error file */
+    if (BU_STR_EQUAL(argv[1], "NULL") || BU_STR_EQUAL(argv[1], "/dev/NULL")) {
+       s->firemode = 0;
+       bu_vls_trunc(&s->shotfile, 0);
+       return ret;
+    }
+
+    s->shotfp = fopen(argv[1], "rb");
+    if (!s->shotfp) {
+       brst_log(s, MSG_OUT, "failed to open critical component file: %s\n", 
argv[1]);
+       ret = BRLCAD_ERROR;
+    }
+    bu_vls_sprintf(&s->shotfile, "%s", argv[1]);
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t%s\n", argv[0], bu_vls_cstr(&s->shotfile));
+
+    s->firemode = FM_SHOT | FM_FILE | FM_3DIM;
+
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_burst_armor_file(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "burst-armor-file file";
+    const char *purpose_string = "input burst armor idents from file";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: burst-armor-file file\n");
+       return BRLCAD_ERROR;
+    }
+
+    brst_log(s, MSG_LOG, "Reading burst armor idents...\n");
+
+    if (!readIdents(&s->armorids, argv[1])) {
+       brst_log(s, MSG_OUT, "failed to open burst air idents file: %s\n", 
argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    brst_log(s, MSG_LOG, "Reading burst armor idents... done.\n");
+
+    bu_vls_sprintf(&s->armorfile, "%s", argv[1]);
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t%s\n", argv[0], bu_vls_cstr(&s->armorfile));
+
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_read_burst_file(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "read-burst-file file";
+    const char *purpose_string = "read burst point locations from file (see 
burst-coordinates)";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: read-burst-file file\n");
+       return BRLCAD_ERROR;
+    }
+
+    /* If we had a previous file open, close it */
+    if (s->burstfp) {
+       fclose(s->burstfp);
+       s->burstfp= NULL;
+    }
+
+    /* If we're given a NULL argument, disable the error file */
+    if (BU_STR_EQUAL(argv[1], "NULL") || BU_STR_EQUAL(argv[1], "/dev/NULL")) {
+       s->firemode = 0;
+       bu_vls_trunc(&s->burstfile, 0);
+       return ret;
+    }
+
+    s->burstfp = fopen(argv[1], "rb");
+    if (!s->burstfp) {
+       brst_log(s, MSG_OUT, "failed to open 3-D burst input file: %s\n", 
argv[1]);
+       ret = BRLCAD_ERROR;
+    }
+
+    bu_vls_sprintf(&s->burstfile, "%s", argv[1]);
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%s\n", argv[0], bu_vls_cstr(&s->burstfile));
+
+    s->firemode = FM_BURST | FM_3DIM | FM_FILE;
+
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_read_input_file(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "read-input-file file";
+    const char *purpose_string = "read key word commands from file";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    std::ifstream fs;
+    fs.open(argv[1]);
+    if (!fs.is_open()) {
+       brst_log(s, MSG_OUT, "Unable to open command file: %s\n", argv[1]);
+       return BRLCAD_ERROR;
+    }
+    std::string bline;
+    while (std::getline(fs, bline)) {
+       if (burst_process_line(s, bline.c_str()) != BRLCAD_OK) {
+           brst_log(s, MSG_OUT, "Error processing line: %s\n", bline.c_str());
+           fs.close();
+           return BRLCAD_ERROR;
+       }
+       /* build up a command history buffer for write-input-file */
+       bu_vls_printf(&s->cmdhist, "%s\n", bline.c_str());
+    }
+    fs.close();
+
+    return ret;
+}
+
+extern "C" int
+_burst_cmd_report_overlaps(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "report-overlaps file";
+    const char *purpose_string = "if yes, log overlap diagnostics";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: report-overlaps yes|no\n");
+       return BRLCAD_ERROR;
+    }
+
+    int tval = bu_str_true(argv[1]);
+    int fval = bu_str_false(argv[1]);
+
+    if (!tval && !fval) {
+       brst_log(s, MSG_OUT, "Invalid boolean string: %s\n", argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    s->reportoverlaps = (fval) ? 0 : tval;
+
+    // Echo command (logCmd in original code)
+    brst_log(s, MSG_OUT, "%s\t\t%s\n", argv[0], s->reportoverlaps ? "yes" : 
"no");
+
+    return BRLCAD_OK;
+}
+
+extern "C" int
+_burst_cmd_shotline_burst(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "shotline-burst flag [flag]";
+    const char *purpose_string = "if yes, generate burst points along 
shotlines";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2 && argc != 3) {
+       brst_log(s, MSG_OUT, "Usage: shotline-burst yes|no\n");
+       return BRLCAD_ERROR;
+    }
+
+    int tval = bu_str_true(argv[1]);
+    int fval = bu_str_false(argv[1]);
+
+    if (!tval && !fval) {
+       brst_log(s, MSG_OUT, "Invalid boolean string: %s\n", argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    s->shotburst = (fval) ? 0 : tval;
+
+    if (s->shotburst) {
+       if (argc == 3) {
+           tval = bu_str_true(argv[2]);
+           fval = bu_str_false(argv[2]);
+
+           if (!tval && !fval) {
+               brst_log(s, MSG_OUT, "Invalid boolean string: %s\n", argv[2]);
+               return BRLCAD_ERROR;
+           }
+           s->reqburstair = (fval) ? 0 : tval;
+       } else {
+           s->reqburstair = s->shotburst;
+       }
+
+       // Echo command (logCmd in original code)
+       brst_log(s, MSG_OUT, "%s\t\t%s %s\n", argv[0], s->shotburst ? "yes" : 
"no", s->reqburstair ? "yes" : "no");
+
+       s->firemode &= ~FM_BURST; /* disable discrete burst points */
+    } else {
+       // Echo command (logCmd in original code)
+       brst_log(s, MSG_OUT, "%s\t\t%s\n", argv[0], s->shotburst ? "yes" : 
"no");
+    }
+
+    return BRLCAD_OK;
+}
+
+extern "C" int
+_burst_cmd_shotline_file(void *bs, int argc, const char **argv)
+{
+    const char *usage_string = "shotline-file file";
+    const char *purpose_string = "output shot line data to file";
+    if (_burst_cmd_msgs(bs, argc, argv, usage_string, purpose_string)) {
+       return BRLCAD_OK;
+    }
+
+    int ret = BRLCAD_OK;
+    struct burst_state *s = (struct burst_state *)bs;
+
+    if (!s || !argc || !argv) return BRLCAD_ERROR;
+
+    if (argc != 2) {
+       brst_log(s, MSG_OUT, "Usage: shotline-file file\n");
+       return BRLCAD_ERROR;
+    }
+

@@ Diff output truncated at 100000 characters. @@
This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
BRL-CAD Source Commits mailing list
brlcad-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to