Files
CydandClaude Fable 5 db7745fcd0 sda4: commit the Glaze developer hard-drive dump
Un-ignored: the dev drive is the ground truth the restoration and
emulator work constantly reference (DPL3/LIBDPL + VRENDER i860 renderer
source, BT/RP live+dev game trees, VGL_LABS pod boot, scene/audio
content). Kept in-repo for the pod-owner community.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 19:41:15 -05:00

141 lines
3.1 KiB
Plaintext

/*
** BRIEF -- Basic Reconfigurable Interactive Editing Facility
**
** Written by Dave Nanian and Michael Strickman.
*/
/*
** routines.cb:
**
** This file contains macros that allow a programmer to select a
** C routine from a menu and then go to it. It makes a few assumptions
** about programming style: routines must begin in column one, and
** the line with the declaration must end with a close paren (")").
*/
#include "dialog.h"
/*
** routines:
**
** This macro implements the "go to a routine" feature of BRIEF. It
** scans the file for routine declarations, and builds a menu that gets
** passed to the BRIEF dialog manager. If a routine is selected from this
** menu, on exit "_r_line" will have a non-zero value, and we go to that
** line of the file.
*/
int _r_line;
void routines ()
{
int menu_buf,
old_buf_id,
max_width,
line,
loc;
string menu_line,
routine_name;
_r_line = 0;
save_position ();
top_of_buffer ();
old_buf_id = inq_buffer ();
menu_buf = create_buffer ("Routines", NULL, 1);
message ("Scanning for routines...");
while (search_fwd ("<[~ \t#/\\*;\n\\{\\}( ]"))
{
routine_name = trim (read ());
loc = strlen (routine_name);
if (loc > 1 && substr (routine_name, loc, 1) == ")")
{
_r_line++;
message ("Scanning for routines [#%d]...", _r_line);
loc = search_string ("[~ \t (\\*]\\c[ \t]@(", routine_name);
routine_name = substr (routine_name, 1, --loc) + "\n";
routine_name = substr (routine_name, search_string ("[~ \t\\*][~ \t\\*]@>", routine_name));
routine_name = substr (routine_name, 1, strlen (routine_name) - 1);
inq_position (line);
if (strlen (routine_name) > max_width)
max_width = strlen (routine_name);
set_buffer (menu_buf);
insert ("\n%s\t%d;", routine_name, line);
set_buffer (old_buf_id);
}
next_char ();
}
_r_line = 0;
restore_position ();
set_buffer (menu_buf);
inq_position (line);
top_of_buffer ();
if (line > 1)
{
int num_lines,
num_cols;
delete_line ();
tabs (80);
inq_screen_size (num_lines, num_cols);
if ((line += 3) > (num_lines - 5))
line = num_lines - 5;
if ((max_width += 2) < 15)
max_width = 15;
if (max_width >= num_cols - 3)
max_width = num_cols - 3;
max_width = (max_width + 1) / 2;
num_cols = (num_cols + 1 ) / 2;
set_buffer (old_buf_id);
_process_menu (num_cols - max_width, line, num_cols + max_width, 3, NULL, "", NULL, menu_buf, "_r_action", TRUE);
if (_r_line)
goto_line (_r_line);
}
else
{
set_buffer (old_buf_id);
delete_buffer (menu_buf);
message ("No routines found.");
}
}
/*
** _r_action:
**
** This routine is called by the dialog manager when a routine is
** selected.
*/
int _r_action (int event_type, ...)
{
string button_text;
get_parm (0, event_type);
switch (event_type)
{
case DIALOG_PICK_MENU:
case DIALOG_F10:
{
get_parm (2, button_text);
_r_line = atoi (substr (button_text, rindex (button_text, "\t") + 1));
_dialog_esc ();
}
}
returns (TRUE);
}