/* * SNOOPDOS.H vi:ts=4 * * Copyright (c) Eddy Carroll, September 1994. * * This header file defines all the global variables and structures * used by the various SnoopDos code modules. * * Exactly one module should #define MAIN before including this file, * to ensure that the variables are defined (as opposed to declared). */ #undef GLOBAL #undef INIT #ifdef MAIN # define GLOBAL # define INIT(x) = x #else # define GLOBAL extern # define INIT(x) #endif #ifndef SNOOPTEXT_H #define CATCOMP_NUMBERS #include "snooptext.h" #endif #define MSG(x) TextTable[x] #define MAX(x,y) ((x) > (y) ? (x) : (y)) #define MIN(x,y) ((x) < (y) ? (x) : (y)) #define BTOC(addr) ((void *)(((ULONG)(addr)) << 2)) #define SETTINGS_BASENAME "SnoopDos.prefs" #define LOGFILE_NAME "SnoopDos.log" #define PORT_NAME "SNOOPDOS" // #define PATCHES_NAME "SnoopDos Patches" /* Up to beta 11 */ #define PATCHES_NAME "SnoopDos Patchlist" /* Beta 12 onwards */ #define HELP_BASENAME "SnoopDos" #define HELP_AREXX_PORT "SNOOPDOS_HELP" #define APPICON_NAME "SnoopDos" #define BACKGROUND_NAME "SnoopDos Support Process" #define MINSTACKSIZE 12288 /* Minimum stack size we can run with */ /* * Global constants */ #define MAX_STR_LEN 200 /* Max. string length for misc stuff */ #define MAX_SHORT_LEN 40 /* Max. short string len for misc stuff */ #define MAX_LOCK_LEN 100 /* Max. length of a lock string */ #define MIN_BUF_SIZE 4096 /* Min. size of history buffer */ #define PC_NAMELEN 40 /* Max. length of cached task names */ #define MAX_SEGTRACKER_LEN 50 /* Max. len of segtracker module name */ #define MAX_FORM_LEN 50 /* Max number of format %'s in form str */ #define NUM_PCACHE_ENTRIES 16 /* No. of task IDs to cache */ #define NUM_PACKET_ENTRIES 5 /* No. of outstanding packets to cache */ #define NUM_CACHED_TASKS 10 /* No. of task entries to cache */ #define MAX_DOS_DEVICES 100 /* Maximum no of DOS devs we recognise */ #define LOGBUFFER_SIZE 8192 /* Size of buffer for file logging */ #define SAVEBUFFER_SIZE 4096 /* Size of i/o buffer for saving buffer */ #define MAX_LOAD_NESTING 3 /* Only 3 levels of nested config files */ #define MAX_FIELD_LEN 99 /* Maximum width of a format field */ /* * Constants associated with specific functions */ #define SETBUF_KEEPOLD 0 /* Keep old buffer when allocating new */ #define SETBUF_FORCENEW 1 /* Force new, even if means losing old */ /* --- for ShowBuffer() --- */ #define DISPLAY_QUICK 1 /* Redraw buffer using quickest method */ #define DISPLAY_ALL 2 /* Force redraw of all lines in buffer */ #define DISPLAY_NONE 4 /* Only update vars, don't refresh */ /* --- for CreateEvent() --- */ #define NO_EXPAND 0 /* Don't expand filenames to full paths */ #define EXPAND_NAME 1 /* Do expand filenames to full paths */ /* --- for InstallNewFormat() --- */ #define NEW_LISTVIEW 0 /* Indicates new listview format */ #define NEW_STRING 1 /* Indicates new string format */ /* -- for MainLoop() -- */ #define DEFAULT_WIDTH 832 /* Default window width */ #define DEFAULT_HEIGHT 300 /* Default window height */ /* -- CurrentLogType -- */ #define LT_FILE 0 /* Currently logging to a file */ #define LT_DEVICE 1 /* Currently logging to a device */ #define LT_DEBUG 2 /* Currently logging to debug device */ /* -- MonitorMode -- */ #define MONITOR_NORMAL 0 /* Monitoring normal activity */ #define MONITOR_PAUSED 1 /* Currently paused */ #define MONITOR_DISABLED 2 /* Currently disabled */ /* -- ShowGadget() -- */ #define GADGET_DOWN 0 /* Show gadget in selected state */ #define GADGET_UP 1 /* Show gadget in unselected state */ /* -- SelectFont() -- */ #define FONTSEL_WINDOW 0 /* Request new window font */ #define FONTSEL_BUFFER 1 /* Request new buffer font */ /* -- SelectFile() -- */ #define FILESEL_LOADCONFIG 0 /* Request name of existing config file */ #define FILESEL_SAVECONFIG 1 /* Request name of new config file */ #define FILESEL_DEFLOGNAME 2 /* Request name of default log file */ #define FILESEL_NEWLOGNAME 3 /* Request name of new log file */ #define FILESEL_SAVEBUFFER 4 /* Request name of save buffer file */ #define FILESEL_SAVEWINDOW 5 /* Request name of save window file */ /* -- SaveConfig() -- */ #define SAVE_NOICON 0 /* Don't save icon with settings file */ #define SAVE_ICON 1 /* Try and save icon with settings file */ /* -- SetLogGadget() -- */ #define LG_NOREFRESH 0 /* Don't refresh main log mode gadgets */ #define LG_REFRESH 1 /* Do refresh main win log mode gadgets */ /* -- RecalcMainWindow() -- */ #define NOREDRAW_GADGETS 0 /* Don't redraw gadgets after recalc */ #define REDRAW_GADGETS 1 /* Do redraw gadgets after recalc */ /* -- UpdateDeviceList() -- */ #define SCANDEV_DELAY 0 /* Wait before checking for new devices */ #define SCANDEV_IMMEDIATE 1 /* Check for new devices immediately */ /* -- CreateCustomImage() -- */ #define IMAGE_FONT 0 /* Request image for font button */ #define IMAGE_FILE 1 /* Request image for file button */ /* -- SaveBuffer() -- */ #define SAVEBUF_WINDOW 0 /* Save only visible portion of buffer */ #define SAVEBUF_ALL 1 /* Save entire buffer */ #define SAVEBUF_CLIPBOARD ((char *)(-1)) /* Indicates saving to clipboard */ #define SAVEBUF_PROMPT 0 /* Prompt user before overwriting file */ #define SAVEBUF_OVERWRITE 1 /* Always verwrite existing file */ #define KB_SHORTCUT_SIZE 256 /* Size of array for keyboard shortcuts */ /* * Macro (courtesy of Doug Walker) used to allocate longword-aligned * data on the stack. We can't use __aligned inside our patches * because the caller may not have a longword-aligned stack. */ #define D_S(name, type) char c_##name[sizeof(type)+3];\ type *name = (type *)((long)(c_##name+3) & ~3) /* * This is the template used to match tasks, when we exclude the * Workbench and Shell tasks from the list. %s refers to the user's * chosen pattern. We really want to use a pattern of (A & B) where * A is the pattern that excludes Workbench/Shell and B is the * user pattern. Since AmigaDOS doesn't support an & operator, we * need to use boolean logic to transform this to ~(~A | ~B) which * produces the string below. * * PAT_EASY_EXCLUDE is used when there is no match string -- it's a * slightly simpler (and hopefully faster) version of the exclude * system tasks string. */ #define PAT_COMPLEX_EXCLUDE "~((Workbench|Shell Process|Background CLI)|~(%s))" #define PAT_EASY_EXCLUDE "~(Workbench|Shell Process|Background CLI)" /* * Some list stuff */ typedef struct List List; typedef struct MsgPort MsgPort; typedef struct Node Node; typedef struct SignalSemaphore Semaphore; typedef struct Task Task; typedef struct Process Process; typedef struct Requester Requester; #define HeadNode(list) ((void *)((list)->lh_Head)) #define TailNode(list) ((void *)((list)->lh_TailPred)) #define NextNode(node) ((void *)((Node *)(node))->ln_Succ) #define PrevNode(node) ((void *)((Node *)(node))->ln_Pred) #define FORLIST(list,p) for ((p) = (void *)(list)->lh_Head; \ ((Node *)(p))->ln_Succ; \ (p) = (void *)((Node *)(p))->ln_Succ) /* * Now our gadget IDs * * If you're changing the order of the first 20-30 boolean gadgets, * then be sure to make corresponding changes to the tables contained * in PATCHES.C and SETTINGS.C. */ typedef enum { GID_DUMMY, /* Make sure gadget ID never equals zero */ #define FIRST_BOOL_GADGET GID_FINDPORT #define FIRST_SYS_GADGET GID_FINDPORT GID_FINDPORT, GID_FINDRESIDENT, GID_FINDSEMAPHORE, GID_FINDTASK, GID_LOCKSCREEN, GID_OPENDEVICE, GID_OPENFONT, GID_OPENLIBRARY, GID_OPENRESOURCE, GID_READTOOLTYPES, GID_SENDREXX, #define LAST_SYS_GADGET GID_SENDREXX #define NUM_SYS_GADGETS (LAST_SYS_GADGET - FIRST_SYS_GADGET + 1) #define FIRST_DOS_GADGET GID_CHANGEDIR GID_CHANGEDIR, GID_DELETE, GID_EXECUTE, GID_GETVAR, GID_LOADSEG, GID_LOCKFILE, GID_MAKEDIR, GID_MAKELINK, GID_OPENFILE, GID_RENAME, GID_RUNCOMMAND, GID_SETVAR, GID_SYSTEM, #define LAST_DOS_GADGET GID_SYSTEM #define NUM_DOS_GADGETS (LAST_DOS_GADGET - FIRST_DOS_GADGET + 1) GID_READTOOLTYPES2, /* Dummy entry to match GID_READTOOLTYPES */ GID_LOADSEG2, /* Dummy entry to match GID_LOADSEG */ GID_GETVAR2, /* Dummy entry to match GID_GETVAR */ GID_SETVAR2, /* Dummy entry to match GID_SETVAR */ GID_ADDDOSENTRY, /* AddDosEntry() (to catch new devices) */ #define GID_NUMPATCHES (GID_SETVAR2 + 1) /* Number of patches we have */ /* * Make sure all gadgets corresponding to patchable DOS functions * appear first in the above list, since they are used to index * directly into the patch list. * * Note that we have four additional "dummy" gadget IDs which don't * corresond to actual gadgets. These are used for monitoring * the following function pairs: * * GID_READTOOLTYPES: FindToolType()/MatchToolValue() * GID_LOADSEG: LoadSeg/NewLoadSeg() * GID_GETVAR: GetVar()/FindVar() * GID_SETVAR: SetVar()/DeleteVar() * * Whenever the main gadget ID is changed, the library patch code * uses the secondary gadget ID to ensure that _both_ functions * are enabled/disabled. (In fact, this is done at patch time, in * UpdatePatches(), not at the time the gadget itself is clicked.) */ /* * Now the remaining gadgets in the function window */ GID_ONLYFAILS, GID_SHOWCLINUM, GID_SHOWPATHS, GID_USEDEVNAMES, GID_MONPACKETS, GID_MONALLPACKETS, GID_MONROMCALLS, GID_IGNOREWB, /* * Now total the number of gadgets so far. Note that these are used * to index into the FuncSettings->Opts array, so don't change * the order of any of the above arbitrarily. * * If you DO need to change the order for some reason, make sure to * edit the DefaultSettings array below as well to reflect the new * order! */ #define LAST_BOOL_GADGET GID_IGNOREWB #define GID_NUMFUNCSETS (LAST_BOOL_GADGET+1) /* Number of function gadgets */ /* * Now the remaining gadget IDs */ GID_PAUSE, GID_DISABLE, GID_OPENLOG, GID_APPENDLOG, GID_STARTLOG, GID_SERIALLOG, GID_CLOSELOG, GID_SETUP, GID_HIDE, GID_QUIT, GID_SAVESET, GID_FUNCTION, GID_STATUS, GID_LEFTARROW, GID_RIGHTARROW, GID_UPARROW, GID_DOWNARROW, GID_HSCROLLER, /* Two scrollers must come after the four arrows */ GID_VSCROLLER, #define GID_STARTSCROLL GID_LEFTARROW #define GID_ENDSCROLL GID_VSCROLLER GID_MATCHNAME, GID_SELSYSTEM, GID_SELDOS, GID_FUNCUSE, GID_FUNCCANCEL, GID_FUNCUNDO, GID_SETUSE, GID_SETCANCEL, GID_SETUNDO, GID_FORMUSE, GID_FORMCANCEL, GID_FORMUNDO, GID_FORMWIDTH, GID_HIDEMETHOD, GID_OPENON, GID_LOGMODE, GID_FILEIO, GID_BUFFERSIZE, GID_BUFFORMAT, GID_LOGFORMAT, GID_HOTKEY, GID_SCREENNAME, GID_LOGFILE, GID_WINDOWFONT, GID_BUFFERFONT, GID_FORMATEDIT, GID_FORMATCOPY, GID_FILEPROMPT, GID_WFONTPROMPT, GID_BFONTPROMPT, GID_NUM_GADGETS, /* * All the gadget IDs should appear above this point, since the * symbols are used to index into the Gadget[] array. */ /* * Next come the internal menu IDs */ MID_OPENLOG, MID_CLOSELOG, MID_PAUSE, MID_DISABLE, MID_STEP, MID_CHANGEPRI, MID_HELP, MID_ABOUT, MID_HIDE, MID_QUIT, MID_SETUP, MID_FUNCTION, MID_FORMAT, MID_SETWIDTH, MID_ROWQUAL, MID_SPACE_NONE, MID_SPACE_1P, MID_SPACE_2P, MID_REF_SIMPLE, MID_REF_SMART, MID_ALIGN_LEFT, MID_ALIGN_RIGHT, MID_STATUS, MID_GADGETS, MID_AUTO_OPEN, MID_DISABLE_HIDDEN, MID_LOAD, MID_SAVE, MID_SAVEAS, MID_RESET, MID_LASTSAVED, MID_RESTORE, MID_ICONS, MID_COPYWIN, MID_COPYBUF, MID_SAVEWIN, MID_SAVEBUF, MID_CLEARBUF } GadgetID; typedef enum { MODE_SETTINGS, /* Executing command in a settings file */ MODE_CMDLINE, /* Executing command on the CLI cmd line */ MODE_TOOLTYPE, /* Executing command in an icon tooltype */ MODE_REXX, /* Executing command received from ARexx */ MODE_INTERNAL, /* Executing an internal command */ } ModeEnum; typedef enum { HIDE_INVIS, /* Make invisible */ HIDE_ICON, /* Create Workbench AppIcon */ HIDE_TOOLS, /* Create Workbench Tools menu icon */ HIDE_NONE, /* No hide method */ HIDE_MAX } HideType; typedef enum { SCREEN_DEFAULT, /* Open window on default public screen */ SCREEN_FRONT, /* Open window on frontmost public screen */ SCREEN_NAMED, /* Open window on named public screen */ SCREEN_MAX } ScreenType; typedef enum { LOGMODE_PROMPT, /* Prompt user for filename */ LOGMODE_APPEND, /* Append filename to existing file */ LOGMODE_OVERWRITE, /* Overwrite existing file */ LOGMODE_SERIALPORT, /* Send output to debugger using RawPutChar */ LOGMODE_MAX } LogType; typedef enum { FILE_AUTOMATIC, /* Determine i/o type automatically */ FILE_IMMEDIATE, /* Use immediate i/o (no buffering) */ FILE_BUFFERED, /* Use buffered i/o */ FILE_MAX } FileIOType; typedef enum { ROWQUAL_ANY, /* Ignore any qualifier when selecting rows */ ROWQUAL_NONE, /* Only select rows if no qualifier given */ ROWQUAL_SHIFT, /* Only select rows if qualifier is shift */ ROWQUAL_ALT, /* Only select rows if qualifier is alt */ ROWQUAL_CTRL, /* Only select rows if qualifier is ctrl */ ROWQUAL_ALL /* Only select rows if any qualifier given */ } RowQualifierType; /* * Now structures used throughout SnoopDos */ /* * This first structure holds details of the actual events * * Note that some of these fields are initially defined as NULL or \0 * when the event is created, and then filled in when they first need * to be displayed by the mainline code. These are date[], time[], * segname[], hunk, and offset. This is partly because it's dangerous * to call the Date/Time functions via a SetFunction'd patch, and * partly to save time by only decoding those quantities if they're * actually required. * * Typically, enough room will be allocated in one of the buffers to * contain both the event and the strings it points to (procname, * filename, segname). Segname is tricky, since it isn't always * necessarily required. It's handled by allocating sufficient room * if segtracking is enabled, or setting it to point to the string * "" otherwise. (Note that calladdr is used to * determine the segtracker-related info.) * * The sequence number is montonically increasing, from the first event * recorded, and is used to allow easy traversal of the buffer. * A seqnum of zero indicates that this event is currently unused. * We use signed rather than unsigned because we occasionally need * to subtract one from another and check if the difference is +ve * or -ve. */ typedef struct Event { struct MinNode mnode; /* Used for linking events together */ LONG seqnum; /* Sequence number of this event (from 0) */ char *procname; /* Name of calling process */ char *action; /* Type of action (Open, Lock, Load, etc.) */ char *filename; /* Name of the file being acted on */ char *options; /* Options associated with this function */ char *result; /* Result (usually Okay or Fail) */ ULONG processid; /* Address of process that called us */ ULONG calladdr; /* Address we were called from */ struct DateStamp datestamp; /* Date and time when we were called */ char date[10]; /* String of date when we were called */ char time[10]; /* String of time when we were called */ char *segname; /* Pointer to name of caller (segtracker) */ ULONG offset; /* Offset we were called from (segtracker) */ UWORD hunk; /* Hunk we were called from (segtracker) */ UBYTE status; /* Status of this event (see ES_* enums) */ UBYTE flags; /* See EFLG_* defines below */ } Event; #define EFLG_NONE 0 /* Default: No flags set */ #define EFLG_DONEDATE 0x01 /* Set if date has been converted to text */ #define EFLG_DONESEG 0x02 /* Set if segment info has been looked up */ /* * These next two flags are used when logging events to a disk file */ #define EFLG_LOGPARTIAL 0x04 /* Set if partial entry for line was logged */ #define EFLG_LOGDONE 0x08 /* Set if entire entry for line was logged */ /* * These enums define the state of the current event; they are used by * the mainline code while updating the display to ensure we don't try * and access garbage values. * * ES_CREATING indicates that the event should not be accessed. * * ES_UPDATING indicates that all fields are valid, but some may not * be complete. Thus, the mainline code should continue to output the * contents of this event to the screen whenever it gets a chance. * This is intended to allow Result string to be set after all the * others have already been set (so that the line can be output both * before and after the actual DOS call is made -- that way, if the * call is causing a crash, we can see which call it was.) * * ES_READY indicates that the patch code has finished filling in the * event, and the mainline code can go ahead and consider it complete. * * ES_ACCEPTED means that the mainline code has seen the line in the * ES_READY state and no longer has to worry about having to check it. * * Note that while the patch code is responsible for setting the first * three states, the mainline code sets the final ES_ACCEPTED state. */ typedef enum { ES_CREATING, /* This event is being created */ ES_UPDATING, /* This event is being updated */ ES_READY, /* This event is ready to be displayed */ ES_ACCEPTED /* This event was successfully displayed */ } EventStatus; /* * This next structure is used to link all the buffers together. Each * buffer holds a number of variable-size data structures describing * the contents of the buffer. */ typedef struct Buffer { struct MinNode mnode; /* Used for linking buffers together */ ULONG size; /* Total size of this buffer in bytes */ ULONG free; /* No. of free bytes remaining in this blk */ BYTE *nextfree; /* Pointer to next free location in buffer */ struct Event firstevent[1];/* Contains first event in buffer */ } Buffer; /* * This next structure is used to define the layout of a display format * that can be output to our window or to a disk file. The basic idea * is to encode a string such as "%20f %5d %4r" into an internal form * that can be efficiently scanned to produce the desired result. * * Our chosen form is simple, yet efficient. We simply build an array * of this structure, and scan it until we hit an EF_END type. */ typedef struct EventFormat { char type; /* Type of event (see enum FormatID below) */ char width; /* Width of event column in bytes */ short titlemsgid; /* Message ID of column title */ } EventFormat; typedef enum { EF_END, EF_ACTION, EF_CALLADDR, EF_DATE, EF_HUNKOFFSET, EF_PROCID, EF_FILENAME, EF_PROCNAME, EF_OPTIONS, EF_RESULT, EF_SEGNAME, EF_TIME, EF_COUNT } FormatID; #define MAX_BUFFER_WIDTH (((MAX_FIELD_LEN + 1) * EF_COUNT) + 1) /* * This structure is used to initialise the format fields -- it maps * format types onto corresponding %x sequences and text descriptions */ typedef struct { char type; /* Type of this format field */ char idchar; /* Lowercase ascii char used to identify it */ char defwidth; /* Default width if none specified */ short titlemsgid; /* Message ID of title */ } FieldInit; /* * This structure holds all the settings that will be used * by SnoopDos. We collect them into a single structure to * make it easy to do things like Load/Save settings, * Restore an earlier set of settings, Cancel out of a * settings requester, etc. * * There are actually three types of settings: those set via * the Setup... requester, those set via the Functions... * requester, and everything else. */ typedef struct SetupSettings { UBYTE HideMethod; /* Icon, Tools menu or invisible */ UBYTE ScreenType; /* Workbench, Frontmost, or public */ UBYTE LogMode; /* Prompt, Append, Overwrite */ UBYTE FileIOType; /* Immediate, Buffered, Automatic */ ULONG BufferSize; /* In kilobytes */ char HotKey[MAX_SHORT_LEN]; /* Standard commodities string */ char ScreenName[MAX_SHORT_LEN]; /* Only used with Public ScreenType */ char LogFile[MAX_STR_LEN]; /* Log name if Logmode not Prompt */ char WindowFont[MAX_SHORT_LEN]; /* Default window font */ char BufferFont[MAX_SHORT_LEN]; /* Default buffer font */ UWORD WinFontSize; /* Size of window font */ UWORD BufFontSize; /* Size of buffer font */ char BufferFormat[MAX_STR_LEN]; /* Format string for buffer */ char LogfileFormat[MAX_STR_LEN]; /* Format string for logfile */ } SetupSettings; typedef struct FuncSettings { UBYTE Opts[GID_NUMFUNCSETS]; /* One byte for each setting */ char Pattern[MAX_STR_LEN]; /* Current pattern to match */ } FuncSettings; typedef struct Settings { SetupSettings Setup; FuncSettings Func; UBYTE AutoOpenMain; /* If true, auto-open win on output */ UBYTE DisableWhenHidden; /* If true, disable when hidden */ UBYTE ShowStatus; /* If true, display status line */ UBYTE ShowGadgets; /* If true, display gadgets in win */ UBYTE MakeIcons; /* If true, create icons for config */ UBYTE TextSpacing; /* 0, 1 or 2: spacing between lines */ UBYTE SimpleRefresh; /* True = Simple, False = Smart */ UBYTE RightAlign; /* Right-align target name field */ UBYTE RowQualifier; /* Cur qualifier for row selection */ UBYTE pad; /* Keep things neatly aligned */ WORD MainWinLeft; /* X pos of main window */ WORD MainWinTop; /* Y pos of main window */ WORD MainWinWidth; /* Width of main window */ WORD MainWinHeight; /* Height of main window */ WORD SetupWinLeft; /* X pos of setup window */ WORD SetupWinTop; /* Y pos of setup window */ WORD FuncWinLeft; /* X pos of function window */ WORD FuncWinTop; /* Y pos of function window */ WORD FormWinLeft; /* X pos of format window */ WORD FormWinTop; /* Y pos of format window */ WORD IconPosLeft; /* X pos of AppIcon (-1 = default) */ WORD IconPosTop; /* Y pos of AppIcon (-1 = default) */ ULONG StackLimit; /* Stack limit on patched functions */ } Settings; /* * These are used when selecting what settings to activate. OR them * together to create combinations. */ #define SET_NONE 0 /* No settings changed */ #define SET_FUNC 1 /* Activate function settings */ #define SET_SETUP 2 /* Activate setup settings */ #define SET_MAIN 4 /* Activate main window settings */ #define SET_ALL (SET_FUNC | SET_SETUP | SET_MAIN) /* * These are the default settings used via "Reset to Defaults" */ GLOBAL Settings DefaultSettings #ifdef MAIN = { /* * First our setup settings */ { HIDE_ICON, /* Hide method */ SCREEN_DEFAULT, /* Screen type */ LOGMODE_PROMPT, /* Log method */ FILE_AUTOMATIC, /* File I/O type */ 32, /* Buffer size (KB) */ "ctrl alt d", /* Commodities hotkey */ "Workbench", /* Public screen name */ "ram:SnoopDos.log", /* Default log filename */ "", /* Window font filled in at startup */ "", /* Font size filled in at startup */ 0, /* Buffer font filled in at startup */ 0, /* Font size filled in at startup */ "%u %p %a %n %o %r",/* Buffer format string */ "" /* Log format string same as buffer */ }, /* * Now our function settings. Make sure that these match the * order of the GID_* gadget IDs corresponding to each section * which are defined near the start of this file. */ { 0, /* Dummy value, never used */ 0, /* FindPort */ 0, /* FindResident */ 0, /* FindSemaphore */ 0, /* FindTask */ 1, /* LockScreen */ 0, /* OpenDevice */ 0, /* OpenFont */ 0, /* OpenLibrary */ 0, /* OpenResource */ 1, /* ReadToolTypes */ 0, /* SendRexx */ 1, /* ChangeDir */ 1, /* Delete */ 1, /* Execute */ 0, /* GetVar */ 1, /* LoadSeg */ 0, /* Lock */ 1, /* MakeDir */ 1, /* MakeLink */ 1, /* Open */ 1, /* Rename */ 0, /* RunCommand */ 0, /* SetVar */ 0, /* System */ 0, /* Dummy: ReadToolTypes2 */ 0, /* Dummy: LoadSeg2 */ 0, /* Dummy: GetVar2 */ 0, /* Dummy: SetVar2 */ 0, /* Dummy: AddDosEntry */ 0, /* OnlyShowFails */ 1, /* Show CLI number */ 0, /* ShowPaths */ 0, /* UseDevNames */ 0, /* MonPackets */ 0, /* Monitor ALL packets */ 0, /* Monitor ROM calls */ 1, /* IgnoreWB */ /* * Note that by putting the pattern string at the end, * we can force a warning from the compiler if we update * the GID_* definitions and forget to update the above * list accordingly. */ "" /* Default to no special pattern */ }, /* * Now the remaining settings */ 0, /* No auto-open on output */ 0, /* No disable when hidden */ 1, /* Show status line */ 1, /* Show gadgets */ 1, /* Create icons */ 0, /* 0 spacing between text lines */ 0, /* No simple refresh window */ 0, /* No right aligned target name */ ROWQUAL_ANY, /* Any row qualifier will do */ 0, /* Padding byte */ -1, -1, -1, -1, /* Main window size/pos (-1 = dflt) */ -1, -1, /* Setup win position (-1 = dflt) */ -1, -1, /* Func window position (-1 = dflt) */ -1, -1, /* Format window pos (-1 = dflt) */ -1, -1, /* Icon pos (-1 = dflt) */ 1000 /* Stack limit for monitored funcs */ } #endif /* MAIN */ ; /* * Some definitions to make it easier to access current global settings */ #define OnlyShowFails CurSettings.Func.Opts[GID_ONLYFAILS] #define ShowCLINum CurSettings.Func.Opts[GID_SHOWCLINUM] #define ShowPaths CurSettings.Func.Opts[GID_SHOWPATHS] #define UseDevNames CurSettings.Func.Opts[GID_USEDEVNAMES] #define MonPackets CurSettings.Func.Opts[GID_MONPACKETS] #define ShowAllPackets CurSettings.Func.Opts[GID_MONALLPACKETS] #define MonROMCalls CurSettings.Func.Opts[GID_MONROMCALLS] #define IgnoreWBShell CurSettings.Func.Opts[GID_IGNOREWB] #define MatchName CurSettings.Func.Pattern #define DefaultLogMode CurSettings.Setup.LogMode #define DefaultLogName CurSettings.Setup.LogFile #define BufFormat CurSettings.Setup.BufferFormat #define LogFormat CurSettings.Setup.LogfileFormat #define WindowFontName CurSettings.Setup.WindowFont #define WindowFontSize CurSettings.Setup.WinFontSize #define BufferFontName CurSettings.Setup.BufferFont #define BufferFontSize CurSettings.Setup.BufFontSize #define AutoOpen CurSettings.AutoOpenMain #define DisableOnHide CurSettings.DisableWhenHidden #define StatusLine CurSettings.ShowStatus #define GadgetsLine CurSettings.ShowGadgets #define BoxInterGap CurSettings.TextSpacing #define CreateIcons CurSettings.MakeIcons #define RefreshTag (CurSettings.SimpleRefresh ? WA_SimpleRefresh : \ WA_SmartRefresh) #define NoCareRefreshBool (CurSettings.SimpleRefresh ? FALSE : TRUE) #define RightAligned CurSettings.RightAlign #define RowQual CurSettings.RowQualifier /* * Now, our global variables */ GLOBAL struct Library *AslBase; /* ASL library base */ GLOBAL struct Library *DiskfontBase; /* Diskfont library base */ GLOBAL struct Library *GadToolsBase; /* GadTools library base */ GLOBAL struct Library *LayersBase; /* Layers library base */ GLOBAL struct Library *IconBase; /* Icon library base */ GLOBAL struct GfxBase *GfxBase; /* Graphics library base */ GLOBAL struct Library *RexxSysBase; /* REXX library base */ GLOBAL struct Library *UtilityBase; /* Utility library base */ GLOBAL struct Library *CxBase; /* Commodities base */ GLOBAL struct Library *AmigaGuideBase; /* AmigaGuide base */ GLOBAL struct Library *WorkbenchBase; /* Workbench base */ GLOBAL struct Library *KeymapBase; /* Keymap base */ GLOBAL struct IntuitionBase *IntuitionBase; /* Intuition library base */ GLOBAL Settings CurSettings; /* Our current settings */ GLOBAL Settings RestoreSettings; /* Settings we started with */ GLOBAL char *TextTable[NUM_OF_MSGS]; /* Message table for text */ GLOBAL char Language[34]; /* Name of current locale */ GLOBAL char WindowFontDesc[MAX_SHORT_LEN]; /* Font description */ GLOBAL char BufferFontDesc[MAX_SHORT_LEN]; /* Font description */ /* * The name used to hold our configuration file, our ASL-selected * log name, and our ASL save buffer name */ GLOBAL char DefaultConfigName[MAX_LOCK_LEN]; GLOBAL char ConfigFileName[MAX_LOCK_LEN]; GLOBAL char BufferFileName[MAX_LOCK_LEN] INIT(LOGFILE_NAME); GLOBAL char ChosenLogName[MAX_LOCK_LEN] INIT(LOGFILE_NAME); /* * This array holds the actual gadget pointer for (almost) all the * gadgets we create; we need this pointer so that we can change * the state of the gadget when the window is open. */ GLOBAL struct Gadget *Gadget[GID_NUM_GADGETS]; GLOBAL struct DrawInfo *ScreenDI; /* Screen render info */ GLOBAL struct Screen *SnoopScreen; /* Screen window is on */ GLOBAL struct Image *SizeImage; /* Size gadget image */ GLOBAL int TitlebarHeight; /* Height of win titlebar */ GLOBAL int ScreenWidth; /* Width of SnoopDos screen */ GLOBAL int ScreenHeight; /* Height of " screen */ GLOBAL int ScreenResolution; /* SYSISIZE_(LOWRES|MEDRES) */ GLOBAL int CurWindowWidth; /* Current window width */ GLOBAL int CurWindowHeight; /* Current window height */ /* * When ClearMainRHS is set to 1, the right hand side of the main * window will be fully erased on the next redraw (normally, we only * draw out as far as the rightmost entry it the current format, to * save some time). * * When PurgeFuncGadgets is 1, the function gadgets will be freed the * next time the functions window is closed (usually set when the * font has been changed). */ GLOBAL int ClearMainRHS; GLOBAL int PurgeFuncGadgets; GLOBAL char SystemFontName[60]; /* Name of system font */ GLOBAL struct FontRequester *WindowFR; /* Window font requester */ GLOBAL struct FontRequester *BufferFR; /* Buffer font requester */ GLOBAL struct Window *MainWindow; /* Main SnoopDos window */ GLOBAL struct Window *FuncWindow; /* Functions window */ GLOBAL struct Window *FormWindow; /* Format window */ GLOBAL struct Window *SetWindow; /* Settings window */ GLOBAL struct VisualInfo *MainVI; /* Main window visual info */ GLOBAL struct VisualInfo *FuncVI; /* Func window visual info */ GLOBAL struct VisualInfo *FormVI; /* Form window visual info */ GLOBAL struct VisualInfo *SetVI; /* Set window visual info */ GLOBAL struct MsgPort *MainWindowPort; /* Msg port for main window */ GLOBAL struct MsgPort *FuncWindowPort; /* Msg port for func window */ GLOBAL struct MsgPort *FormWindowPort; /* Msg port for form window */ GLOBAL struct MsgPort *SetWindowPort; /* Msg port for set window */ GLOBAL struct MsgPort *SnoopPort; /* ARexx message port */ GLOBAL char StatusLineText[150]; /* Cur. msg in status line */ GLOBAL char CurrentTitle[200]; /* Cur. main window title */ GLOBAL ULONG MainWindowMask; /* Sig mask for main window */ GLOBAL ULONG FuncWindowMask; /* Sig mask for func window */ GLOBAL ULONG FormWindowMask; /* Sig mask for format win */ GLOBAL ULONG SetWindowMask; /* Sig mask for set window */ GLOBAL ULONG NewEventMask; /* Sig mask for new DOS evt */ GLOBAL ULONG WorkbenchMask; /* Sig mask for WBench msgs */ GLOBAL ULONG CommodityMask; /* Sig mask for CX msgs */ GLOBAL ULONG ScanDosListMask; /* Sig mask to rescan devs */ GLOBAL ULONG AmigaGuideMask; /* Sig mask for AmigaGuide */ GLOBAL ULONG RexxPortMask; /* Sig mask for Rexx msgs */ GLOBAL int BorderLeft; /* Width of left border in window */ GLOBAL int BorderRight; /* Width of right border in window */ GLOBAL int BorderTop; /* Height of top border in window */ GLOBAL int BorderBottom; /* Height of bottom border in win */ GLOBAL int SquareAspect; /* True if aspect ratio is 1:1 */ GLOBAL int GadgetHeight; /* According to aspect ratio */ GLOBAL int GadgetSpacing; /* According to aspect ratio */ GLOBAL int QuitFlag; /* If true, user said quit */ GLOBAL int HideOnStartup; /* True if HIDE found in config */ GLOBAL int CommodityPriority; /* Pri to install Commodity at */ GLOBAL int NoPatchRamLib; /* If true, skip patching ramlib */ GLOBAL ULONG SegTrackerActive; /* Add ev space for ST info */ GLOBAL ULONG RomStart; /* Start ROM address */ GLOBAL ULONG RomEnd; /* End ROM address */ /* * These variables all deal with the list of monitored events. * All events are numbered in a monotonically increasing manner. * We keep track of the sequence number associated with each * pointer, so that we can easily tell if a pointer is valid * or not by checking if it falls within the range of the * sequence number associated with the first and last events * on the list. (In practice, we only need to check the first * sequence number.) * * LastDrawnTopSeq is similar to TopSeq, but differs in the case * where what's displayed in the window has scrolled off the * top of the buffer since the window was last refreshed. In * this case, we can detect that LastDrawnTopSeq is now < FirstSeq * and refresh the window accordingly (when we get an IDCMP_REFRESH * request), rather than refreshing part of the window one way and * part the other. * * The EndComplete* variables give the highest event that is * "complete", i.e. that has been set to type ES_ACCEPTED, and * which no longer needs to be refreshed. */ GLOBAL List EventList; /* List of captured events */ GLOBAL Semaphore BufSem; /* Controls access to list */ GLOBAL Semaphore PauseSem; /* Controls pausing */ GLOBAL LONG NextSeq; /* # of newest event */ GLOBAL LONG BaseSeq; /* All others are > this */ GLOBAL LONG FirstSeq; /* # of event at window top */ GLOBAL LONG RealFirstSeq; /* as FSeq but ALWAYS right */ GLOBAL LONG TopSeq; /* # of event at window top */ GLOBAL LONG LastDrawnTopSeq; /* # of event disp'd at top */ GLOBAL LONG BottomSeq; /* # of event at window bot */ GLOBAL LONG MaxScannedSeq; /* # of highest ev scanned */ GLOBAL LONG EndSeq; /* # of highest ev scanned */ GLOBAL LONG EndCompleteSeq; /* # of h. complete ev scnd */ GLOBAL LONG BufferWidth; /* Max width of current buf */ GLOBAL LONG LogWidth; /* Max width of log output */ GLOBAL Event *TopEvent; /* Event at top of screen */ GLOBAL Event *BottomEvent; /* Event at bot of screen */ GLOBAL Event *EndEvent; /* Highest event scanned */ GLOBAL Event *EndCompleteEvent; /* Max complete event scand */ GLOBAL int HotKeyActive; /* True if valid hotkey */ GLOBAL APTR *TaskWindowPtr; /* Points to pr_WindowPtr */ GLOBAL APTR SaveWindowPtr; /* Saved value for DOS reqs */ GLOBAL int MonitorType; /* See MONITOR_??? defines */ GLOBAL int Paused; /* If true, we're paused */ GLOBAL int Disabled; /* If true, we're disabled */ GLOBAL int LastKnownState; /* State when we did HIDE */ GLOBAL int LogActive; /* If true, we're logging */ GLOBAL int GotLastSaved; /* 1=Last Saved is valid */ GLOBAL int DisableNestCount; /* #times DisableWin called */ GLOBAL Requester MainRequester; /* For disabling main win */ GLOBAL Requester SetRequester; /* For disableing setup win */ GLOBAL Requester FuncRequester; /* For disabling func win */ GLOBAL Requester FormRequester; /* For disabling form win */ GLOBAL int CurrentLogType; /* See LT_??? defines above */ GLOBAL char CurrentLogName[120]; /* Name of current logfile */ GLOBAL struct DateStamp PauseDateStamp; /* Time we paused at */ GLOBAL struct DateStamp DisableDateStamp; /* Time we disabled at */ GLOBAL EventFormat BufferEFormat[MAX_FORM_LEN];/* Format specifier for buf */ GLOBAL EventFormat LogEFormat[MAX_FORM_LEN]; /* Format specifier for log */ /* * Prototypes for LANGUAGE.C */ void InitTextTable(void); void InitLocale(char *catalogname); void CleanupLocale(void); /* * Prototypes for BUFFER.C */ void InitBuffers(void); int SetTotalBufferSize(ULONG newsize, int alwaystry); void ClearBuffer(void); void CleanupBuffers(void); Event *GetNewEvent(int stringsize); void CopyEvents(UBYTE *newbuf, ULONG newsize, UBYTE *oldbuf, ULONG oldsize); int ParseFormatString(char *formatstr, EventFormat *evformat, int maxfields); void BuildFormatString(EventFormat *evformat, char *formatstr, int maxlen); char *UnderlineTitles(EventFormat *ef, char *outstr, char underchar); void CheckSegTracker(void); /* * Prototypes for PATCHES.C */ void LoadFuncSettings(FuncSettings *func); void HandlePatternMsgs(void); void UpdateDeviceList(int method); void InitRamLibPatch(void); /* * Prototypes for SNOOPDOS.C */ void InstallSettings(Settings *set, int which); void mysprintf(char *outstr, char *fmtstr, ...); char *GetFontDesc(char *fontdesc, char *fontname, int size); /* * Prototypes for MAINWIN.C */ void CleanupMainWindow(void); void InitMenus(void); void ClearWindowBuffer(void); void ShowBuffer(LONG seqnum, int displaytype); void DrawSelectedLine(int row, int highlight); void HandleNewEvents(void); void UpdateMainVScroll(void); void SetMenuOptions(void); void InstallNewFormat(int type); void ReOpenMainWindow(void); void RecordWindowSizes(void); void SetMonitorMode(int modetype); void ScrollHorizontal(int amount); void SetLogGadget(int logmode, int refresh); int SaveBuffer(int savetype, char *savename, int overwrite); int OpenLog(int logmode, char *filename); void CloseLog(); void WriteLog(char *string); void ShowStatus(char *msg); void UpdateStatus(void); int ShowSnoopDos(void); void HideSnoopDos(void); BOOL OpenMainWindow(void); void CloseMainWindow(void); int CheckForScreen(void); void UpdateMainHScroll(void); void UpdateMainVScroll(void); void SetMainHideState(int hidestate); int IsDiskFile(char *filename); /* * Prototypes for SUBWIN.C */ void CleanupSubWindow(void); void HandleFormatMsgs(void); void HandleSettingsMsgs(void); void HandleFunctionMsgs(void); char *GetFuncName(int gadgetid); int OpenFormatWindow(void); void CloseFormatWindow(void); void CloseFunctionWindow(void); void CloseSettingsWindow(void); void ShowFuncOpts(UBYTE newopts[], int firstid, int lastid); void ResetFuncToSelected(void); /* * Prototypes for MISCWIN.C */ void InitFonts(void); int SetupScreen(void); void CleanupScreen(void); void ShowError(char *errormsg, ...); int GetResponse(char *prompts, char *reqmsg, ...); int SelectFont(struct Window *win, int fonttype); int SelectFile(char *newname, char *defname, struct Window *win, int type); void AddKeyShortcut(UBYTE *shortcut, int gadid, int msgid); struct TextFont *MyOpenFont(struct TextAttr *textattr); int ShowAGuide(char *cmdstring); void HandleAGuideMsgs(void); void CleanupAGuide(void); struct Image *CreateCustomImage(int imagetype, int height); void FreeCustomImage(struct Image *image); int ConvertIMsgToChar(struct IntuiMessage *imsg); void ShowGadget(struct Window *win, struct Gadget *gad, int type); /* * Prototypes for HOTKEY.C */ int InstallHotKey(char *hotkey); void HandleHotKeyMsgs(void); void CleanupHotKey(void); void CleanupIcons(void); void WriteIcon(char *filename); void RemoveProgramFromWorkbench(void); int AddProgramToWorkbench(int hidetype); void HandleWorkbenchMsgs(void); struct DiskObject *GetProgramIcon(void); /* * Prototypes for SETTINGS.C */ int LoadConfig(char *filename, int mode, Settings *set); int SaveConfig(char *filename, int saveicon); int ExecCommand(char *cmdline, int mode, Settings *set); int InitRexxPort(void); void HandleRexxMsgs(void); void CleanupRexxPort(void); void InitSettings(void); int ParseStartupOpts(int argc, char **argv); void ShowCommands(BPTR file);