The Online Pub Revision List ---------------------------- Version 2.00g1 0913 - Lost the old revision list to a HD crash. This is what was added as far as I can remember: Poker, Slots, MatchGame, 90% support for language file, partial new PubColour support (output only), new word splitter, basic config. file support, and a rename from The RemoteAccess Pub (RAP) to The Done-Right Online Pub-Chat Door (DROPChat). It was at this point that I began rewriting. 0920 - Abandoned the rewrite since I was not enjoying it, and since I discovered that the rewrite was only going to end up being more-or-less the same as this version with just better names. I can do just as much by just gradually overhauling this version. Renamed program from DROPChat to The Online Pub (TOP), because I've discovered that most of the users using teleconferencing programs want a professional appearance, and a name like DROPChat doesn't offer that in my opinion. Fixed the infamous "rescan bug" again (it was lost in the crash). MAY have fixed the dreaded "memory flaw" by not using sizeof with pointers, but I won't know this until some testing starts. It's about the only thing left that I can think of. Reduced stack size from 32k to 8k. One part in the RA code was creating a 8000 byte local array, which accounted for most of the need for the increase. No overflows so far. 0950 - Added processing support for the new configuration file system. This uses OpenDoors' built in config. file system, which is more flexible. As with before, only a few settings are actually USED. I still need to add in support in both the processor and the structure for new options appearing in the rewrite, and also some new ones I have thought of. Also removed a call to od_kernel() that was happening before od_init() in LAN and Local modes. 1000 - About 67% of the DC1 configuration options are now actually used in the program. This means I will be able to FINALLY get rid of the annoying 5 parameter command line. The command line still remains intact until I test the new options, however the work path and /H switch are no longer needed, which actually results in a 3 parameter command line. 1010 - Completely removed all of the old command line parameters, except for the EDIT and PACK switches, which are optional, and also the node number, which is also optional. Added a VERY cheap Node Config. Editor to allow me to choose the type of each node and save the NODECFG.TOP file. The editor is currently accessable by using NODES as the sole command line parameter. The NODECFG.TOP file is not yet supported by TOP itself. 1020 - Added basic support for the Node Config. The SolidNode parameter, and the comport modification parameters are not supported yet. 1700 - Added basic support for MULTI-CHANNELS! Right now, channels from 0 to over 2 BILLION are supported with the JOIN command. In the near future I'll make this an unsigned long and use channels 0 to 4B-1 for "normal" chat, channels 4B to 4.001B-1 for user's personal channels, and the rest for defineable "conferences". Message types MSG_INCHANNEL and MSG_OUTCHANNEL are used for channel notificaitons. The WHO command now needs severe modifications because right now there's no way to find out where another user is. 1750 - Updated fixname() and filter_string() to recognize new PubColour. 1850 - Fixed poker Name display problem (patched it to use wordret) and the infamous "always tossout the lowest node" bug in poker. Converted language file system to a Config. file style system, where each entry takes the format of a keyword followed by the actual language text. This allows the addition of new language items without having to recompile all of the time, and also gets rid of the old DROPLang compiler. In addition, I can sort the items any way I want with nothing more than some cut and paste work in a text editor. Also fixed a few cases in PROCMSGS where outnum[] wasn't being used so the raw numbers were outputting garbage. 1851 - Sort of fixed the GA bug. They work now, but ANYTHING typed that starts with GA will also trigger a GA. Oh well, better than them not working at all, for now. 2500 - Overhauled SCAN to be more like MajorBBS. Changed pressing ENTER to display the tiny "who's on" list (handles only), like MajorBBS. Added support for the first TASK flag (TASK_EDITING). Changed leftover internal occurences of "drc" and "rap" to "top". 2501 - Fixed small bug in outchecksuffix() that was causing the - to be left on when the length was converted, resulting in weird results. 2502 - TOP now wipes the node's record in NODEIDX while unregistering the node. 3000 - Implemented Crash Protection. A new lastaccess variable in the NODEIDX is used to determine when a node last accessed the file. Under normal operation, this value is kept up-to-date either when the NODEIDX is saved, or when CrashProtDelay-10 seconds have elapsed (the -10 is to insure the value will be updated in time). The updating is maintained by the new top_kernel() function, which is hooked into od_kernel() using od_control.od_ker_exec. top_kernel() also checks the other nodes every CrashProtDelay seconds, and deletes nodes who's lastaccess time is too long ago. CrashProtDelay config. keyword added as a supplement. node variable added to maintain an up-to-date node_idx_typ record for the current node, which also saves stack memory. 3200 - Changed around Output routines. top_output() now calls the new top_outstring() which outputs to a string, interpreting @ codes. Then top_output() displays the string while parsing ^ codes. This allows the addition of the new top_outlog(), which can be used for Log entries using language items. It calls top_outstring() then od_log_write(). Also changed od_emulate() calls to od_putch() in an attempt to speed up output. Right now even local output seems faster, but that may just be wishful thinking. 3201 - Went back to old output routines for now, since the new ones are buggy with long unbroken strings. I should note here that using od_putch() instead of od_emulate() _HAS_ sped up output considerably! 3202 - Changed around output routines AGAIN. Now, top_output() takes a new parameter as its first: outmode. Outmode is either OUT_SCREEN or OUT_STRING. OUT_SCREEN acts as before, and OUT_STRING causes top_output() to return a pointer to outputstr, a global variable where the resulting output is held. top_outstring() and top_outlog() are gone, and log entries are once again written manually, though all that's actually needed is to call od_log_write(top_output(OUT_STRING, ...)). 3220 - Converted some hardcoded text to language prompts, mostly log entries that now use the new OUT_STRING feature of top_output(). 3221 - Hopefully fixed a problem with Poker aborting with a floating point error at the end of some hands. 3222 - Internal modification - moved ver to a static global variable defined and set in GLOBAL.C. This will make recompiling faster since INIT.C doesn't have to compile after every change. 3223 - Any array that used MAXNODES has now been made Dynamic, meaning the MaxNodes keyword will work more effectively now. It may also work with >255 values, but I haven't verified this yet. Added MaxNodes and MaxActions keywords, though I forget exactly when. Forgot to log them. 3224 - Corrected a small problem that caused allocation for extra language items if comments were used in the language file. 3230 - Added PokerMinBet, PokerMaxBet, and PokerAnte config. keywords and support for them in the program. Moved nodecfg variable to a global and made some adjustments to farmalloc() it earlier than other vars. 3231 - Made Personal Preference Options available to all systems for testing purposes. I'm not sure if I'll keep it this way for the release. On one hand I'd like to join the ASP and get TOP as an ASP approved program, and on the other I'd like to reward registered users. I guess I'll make the decision when the release time comes. 3232 - Included ASSERT.H and added an assert() test to the division after a poker hand for a divide by 0 error. The error I attempted to fix in revision 3221 is still there. 3233 - Fixed a couple of cosmetic bugs, including renaming a few language items (HandleChange, SexChange, EXMsgChange, DescChange) by adding the word Msg after them to avoid a couple of possible future name conflicts. I had renamed these in the language file but not in the program. Also changed version number from 1.90 to 2.00, since there are more than enough changes to call this a major new version. 3234 - Removed that stupid 2 second delay after "setting up" I put in there to make TOP look like it was doing something. Updated @L token to new language format (Format is now @L"LangItemName"). This also allows users to define their own language tokens for "common" items and use them globally, saving space. Fixed a couple of other cosmetic bugs, including the extra space between the "who's in" list and the short help. 3240 - Channel value changed to unsigned long as noted in the revision 1700 notes. Channel field added to NODEIDX. Corrected bug in SCAN which was displaying the user's current channel for everybody online. Changed detection of '\r' to '\n' to try and circumvent that pesky ANSI "bleed" bug. 3241 - Upgraded the show_file() function a little to make some of the extra needs optional. Moved the MiniHelp to an ANSI file (MINIHELP.A??). Upgraded the external ANSI files to reflect the current commands. 3242 - Support for solidnode variable in Node Cfg. added. Poker index file now cleared when a node enters TOP. MIDX and NODE files now truncated upon entry of TOP. 3243 - Updated copyright dates to say 1995. 3250 - Added the rest of the node configuration and support for it at initialization. Added the DefaultCyberCash keyword and support for it. Added Enough Cash checks to MatchGame and Poker. 3251 - Raised max. slots bet to 500000. Fixed slots speed (based on bps rate). Hopefully fixed problem with TOP Node Cfg. OpenDoors needs a 0-based port, and TOP was using a 1-based port. 4150 - Completely overhauled BBS interface. Function pointers are now used to call common BBS functions such as paging, loading a node's info, etc., and the PAGE and NODES command now each just call a single generic routine which calls the BBS functions. Overhauled RA support to the new method. Max support hasn't been touched yet pending testing of RA support. Corrected a few cases of od_emulate() in BBS functions. Removed an unused variable in nearly all Node functions which was taking up 256 bytes a shot (about 1.5k there!). Also noting that the fix in 3251 worked, but there still needs to be some safety checking with the port number. 4250 - Maximus support updated to the new interface, though it does not seem to be working at the moment. It crashes the system right away. Also made a few minor fixes to the mods installed in 4150. RA support is working perfectly now. 4350 - SuperBBS support added. Most of it uses the RA calls. 4351 - Fixed problem where Max and SBBS were crashing. I (embarassingly) forgot to uncomment the max_init() call, and there wasn't even a sbbs_init() call, so that's how I found the error. 4352 - Tidied up everything to do with SBBS and RA BBS integration. 4353 - checkcmdmatch() now checks the entire command line instead of aborting right away, and returns the highest value possible. SBBS support changed so the useron file is NOT kept open during run, since it seems to interfere with SBBS working. 4354 - Minor mods to the SBBS code - fixed wrong status type display and am testing something which will hopefully ensure the proper nodes are detected. Also fixed improper display of SBBS status codes. 4355 - Scrapped 4354 change to mods. Fixed bug where TOP was taking a GOOD return code from bbs_call_loaduseron as a BAD one! Fixed places where a 0-based node was NOT being used, causing problems for all of the BBS interfaces! 4400 - Internal change to use 0-based node numbers everywhere. This allows node 0 to be a local node, and allows BBSs which use node 0 to use it without problem. 4401 - Possibly fixed cause of SBBS crashing bug by changing the way the file is opened (DENYNONE now, was DENYRW). 4500 - Added generic Field editor which will be used for all of the online editors in the program, including, perhaps, the profile editor, for ANSI users only of course. 4550 - Added user selector which will be used for the user editor. Corrected bug that prevented CR/LFs from being written to RA/SBBS pages. 4560 - Fixed editor so it won't try to show NULL variables. Added disabled field support to editor. Added a few fields of the user editor for testing. 4561 - Fixed cheap bug in poker that prevented anybody but the first person from calling/discarding. 4660 - Added Directed messages (> and DIRECT TO commands). Modified dispatch_message() to echo messages if they're done to the sending node regardless of other settings. 4700 - Added most of the rest of the user editor, though it still doesn't actually save the edited values yet. Tried disabling crash protection to see if it was causing crashes, but this is not the case, so it is now definitely something in the RA BBS-specific module. 4701 - Reenabled crash protection. 4710 - User editor saves and other nodes load the edited info. now. Some user editor fields still are disabled though since they require more detailed editing. 4720 - Node editor no longer uses OD so the comport doesn't matter. top_output() modified to use a new OUT_LOCAL mode, which will use normal conio calls instead of OD output calls. 4721 - Found and fixed SERIOUS flaw in BBS node loading code (RA and SBBS). Fields in the USERON file that were longer than the ones in TOP weren't being truncated, leading to overshooting the buffer. The reverse was also true, though this was less of a concern as nearly all of the info. was being taken from the USERON file so it wasn't going to be too long. However, both ways have been fixed. 4722 - Found stupid problem with the node editor in that it was still using OD's input routine. Fixed. Had to write my own input routine (my_input_str() for now) but that wasn't hard. 4723 - Fixed reported bugs about TOP using the Work Path instead of the BBS Multi Path. Also made title page file name TOPTITLE.A?? instead of TOPTITL.A??. The E was eliminated because the old DROPChat name made the title page filename DROPTITL.A??. 4724 - Added DisableLogging language item test to see if there's a problem with emessage distribution. Setting this item to "On" will disable sending of an emessage. 4725 - Caught another occurence of the problems described in 4721. Doubt it will fix crashing after doing a NODES command though. Added outproc and outdefattrib vars for future use. 4726 - Found and fixed ANOTHER SERIOUS PROBLEM in new RA/SBBS code. During a useron save, the size of the useron file was ALWAYS being changed even if it was big enough. Furthermore it was being made one record too small! This COULD be the cause of the NODES-related crashing, but we'll have to see. 4727 - Fixed small problem that caused the channel in the nodeidx to get corrupted whenever a person went into the Profile Editor. I wasn't using the new global node variable which stores the nodeidx info. when saving. 4750 - Rewrote most of the command processor. It's still buggy at this point in time. 4751 - Changed strcpy() call in xxx_pascal_string() functions to memmove() in a desperate attempt to fix the RA/SBBS crashing. memmove() calls should be a little more stable. Small problem in ra_saveuseron() and sbbs_saveuseron() corrected. 4752 - CrashProtDelay can now be set to 0 to disable Crash Protection in cases where it's causing "vanishing acts". 4800 - RA USERON support overhauled, it's a little more efficient now. Pascal string commands now have PROPER errorchecking, which was long overdue and probably why RA support was barfing out. unbuild_pascal_string() now takes the maximum length of the C string as its first parameter to facilitate errorchecking. build_pascal_string() now returns the length of the string, not including the Pascal length byte. 4810 - RA debugging stuff removed, it seems to work now! SBBS SUSERON support overhauled, using the new RA USERON support as a framework. 4811 - Optimized build_pascal_string() a little more. Forced all bbs_call function calls to far. Found & fixed serious problem in new SBBS SUSERON support - the SUSERON file wasn't being opened! 4812 - Added check_nodes_used() call to start of bbs_useron(). Tracked down a problem where TOP was copying a statustype regardless of whether or not the status number was valid. Local testing indicates this could very well be the cause of the RA/SBBS crashing that has been haunting me for so long! Real-time testing will be needed to say for sure though. 4813 - Fixed problems with command processor. Was using a bad method of comparing the strings. All of the other quirks (i.e. "/sewqrp" yielding a whisper to Starhawk as "wqrp") all lie in the command checks themselves now. 4814 - Re-updated SBBS support so it doesn't leave the SUSERON file open. Hopefully this will mean it works properly from the SBBS side. 4815 - Fixed SBBS support. It was ignoring the Line In Use bit so that's why it wasn't working probably. 4816 - Fixed possible problem in top_output() with controlled length params. If lenbuf couldn't be allocated it would still be memset() and that would be potentially dangerous if it ever failed. Added NULL function checks to the bbs_call calls for added safety. Who knows, maybe it'll give clues to why RA support is crashing? 5000 - Added support for Channel Definitions and CHANNELS.TOP file. Added CHANNELS command and MaxChannelDefs config keyword. Still need to do some work with regard to using the channel topics and stuff, and at the moment you can't change to a conference yet. Personal channels are not implemented, and SCAN needs updating to support channel names. Moderator functions also need to be implemented, along with banning for normal channels and invitations for personal channels. 5100 - Conferences can now be joined. Channel Aliases can also be used. 5110 - Added "You're in channel xxx" and "Topic: xxx" displays. 5111 - SCAN enhanced to show channel names. 5112 - Added length checks to top_output()'s parameter field-length processor. It now seems apparent that the crash in RA Support is actually due to a bug in top_output() and not the RA Support at all! I don't know if this will fix it, but it's a good place to start. Corrected getlang() so it returns a string with a single \0 in it and not a NULL pointer, which will make things prettier if a language prompt isn't given. the argptrs[] array is now initialized to \0s as well which should make things prettier if a "too high" parameter number is given. 5113 - It now seems very likely that the problem in 5112 was the cause of the RA crashing. Testing of 5112 showed that only PART of the "Yes" language item (used for page status) was copied! Modified top_output() to count the number of ^^ codes and add 2 bytes for each to lenbuf to try and counter the problem described. whos_in_pub() modified to only display users in the current channel. Problem with "leftover" non-channel messages fixed (forgot to 0 the message idx byte for the unneeded messages). 5114 - Added security checking to the JOIN command. Also added displaying of Personal Channels for future use. 5115 - Moved almost all string literals to language items in about the first 1/2 of the modules. Still have the other half to go. Added changes to allow TOP to recompile under BC++/2 2.0, and fixes to smooth out porting problems. One fix includes a problem with user searching. An uninitialized variable was being used as a condition while searching for a user's name, which under OS/2 caused the entire user searching procedure to be bypassed! Some other uninitialized variable problems fixed too. 5500 - Converted to a brand new Poker which doesn't rely on the "first node" method anymore. Also converted 95% of poker text to lang file, with the rest to come once testing is done. Changed "more" prompts to call a function and to (by default) delete themselves onscreen once used. New poker hooks put in, naturally. Added data1 & minsec values to the message structure and new global variables to accompany them. 5501 - Seem to have fixed all of the MAJOR bugs in Poker. Fortunately there weren't any that were hard to fix. Added new OUT_STRINGNF type for top_output() which tells TOP _not_ to filter colour codes when outputting to a string, in case the string is going to be displayed later. 6000 - Actions rewritten. Multiple lists are now supported. Each list can be assigned to specific security levels and/or channels. TOPACT.EXE is the action compiler to convert the text files to binary, until an editor for the binary files can be made. The ACTION LIST command hasn't yet been reimplemented. 6100 - Several more text movements to the language file. Added @< (backspace) code to output function. It should also be noted that I have decided to remove support for multiple-word commands. It makes things too difficult to manage. I will be converting away from this shortly and after that the command processor should run in tip-top shape. Added mnemonics to TOPACT for miniumum & maximum security settings, and several ranges of channel settings. 6200 - Reimplemented ACTION LIST command. 6210 - Fixed more bugs with Poker. It is now playable and should work well enough to be tested by the beta people. 6211 - Fixed TOP/DOS's shelling! Had to take out the preshell() and postshell() functions, that cleared things up. Ironic, since those functions were actually supposed to _prevent_ crashing, but I guess that crashing was due to something else. Fixed a problem in TOPACT that wasn't incrementing the counter and thus not properly compiling the files. 6220 - Redid checkcmdmatch() a little. It now _always_ matches exactly, and expects a word rather than an entire string. Commands in the language file must now be one word. Using an underscore to indicate two words won't work. Most of the major commands have been converted, and the rest will be done after some testing has been completed. Also fixed problem where doing an action to ALL wasn't working. 6221 - @R (Repeat character) language token now works. I couldn't make it repeat other language tokens, unfortunately, but I may put in support for some tokens (@X comes to mind) later. 6222 - Corrected whispering - it is now FINALLY done properly, using the normal command processor and no tricks. Corrected directed messages similarly. Also moved whispering and directed messages to nearly the end of the command checking function, just for safety. Also made slight modification to find_node_from_name() so that it would zero the return string if there was no remaining string after the handle, to assist in invalid command checking. 6223 - Converted the last of the main commands to the new command processor. 6230 - Modified main_loop() so that typing no longer blocks out messages. This is in preparation for the input/output split windows. 6500 - Implemented the basic dual window (input/output) pub chat mode. 6501 - Added CHANGE CHATMODE command to toggle between normal/dual window chat mode. 7000 - Added most of the new command-oriented help system. Still have to diversify the help for commands with multiple words (like CHANGE). 7010 - Added CHANGE LISTED command to toggle whether or not a user's channel number should be displayed to other users. Added channellisted field to the node_idx_typ struct. 7020 - Added these subcommands to the CHANGE command: SEX, EMESSAGE, XMESSAGE. 7021 - Added the structlength field to the start of the node_idx_typ and msg_typ, for third party developers. Added the MSG_EXTCOMMAND for future third-party support. Added code to support the AllowActions keyword. Added ability to once again block text while typing, as well as the option to have your own text echoed to you during chat (handy for dual-window mode). Both options are controlled from the Profile Editor. 7022 - Added the two previous CHANGE toggles to the profile editor as well. Added ANSI checking in both CHANGE CHATMODE and the Profile Editor. AVATAR is not currently allowed for DW mode because I don't know the cursor store/restore codes yet. Changed CHANNELS command to CONFLIST, and updated help file name to reflect the change. 7023 - Added debugging log to INIT.C and searching in USER.C to help track the persistant crashing. Debug mode is triggered by the DEBUG switch after the node number. 7024 - DEBUG switch now turns on Fortify, the memory checker I got off one of the PDN echoes. This may provide additional insight into why these persistant but random crashes are happening. At release of this beta, I had it reporting nothing. Hopefully in a crash situation, it will report something to one of the testers. Also used Fortify to track down a slight but potentially fatal flaw in checkcmdmatch(). I forgot to allocate space for the \0 in the tmpstore string. 7025 - New Maximus support fixed. The logic for whether it was a new IPC file was screwed. Corrected bugs in BBS support that didn't bring TOP to the proper screen location in dual-window mode before displaying incoming pages. 7026 - Fixed problem where directed messages were working like whispers. That's what I get for cutting and pasting. Fixed several minor bugs which I forgot to detail. Added support for the AllowNewHandles keyword. If it's off, TOP will take the name from the drop file or name prompt and use that in chat. Changed extension of all temporary files to .TCH, which will make them easier to find and safer to delete. 7030 - Added internal security levels and support for most of the security-related configuration keywords. Optimized PROCINP.C a little so it returns after processing (faster). Added SYSOP SETSEC commmand. Tried to add support for the MaxPWTries keyword, but it was already done (I changed the constant to the config value a long time ago). Added support for local beeping control. The short scan (ENTER) now only displays the users in the current channel. Extremely cheap user security setter added to TOP EDIT running method. TOP PACK now can globally set user securities. It now runs TOP PACK [] []. 7040 - Fixed LOOKUP command to now use the language file and respect the cfg.usehandles setting. Renamed TOP.CFG to CFG.TOP for consistency. Changed the style of the node configuration. It is now a text configuration file, with the same options. Fixed problem where RAP was ignoring the "Ready" flag in USERON.BBS, thus showing users that were on while RA was in WFC mode. 7041 - Found flaw related to the new node configuration loader. The kludge value for cfg.maxmsglen was too high (256 instead of 255), which would cause memory overruns. 7500 - Simple character-by-character chat mode added for private chats. CHAT command added to engage this chat mode. 7501 - top_output() now recognizes the outproc... variables and will act appropriately. Modified the places that require certain code processing to be turned off to use these variables. Private chat mode now informs the user who didn't press ESC that chat mode has been exitted, instead of just dumping the user back to the Pub. 7502 - Added &%, &@, and &^ language parameter modifiers to top_output() to dynamically toggle processing of codes. The &% token doesn't actually have an effect, yet. I need to figure out a way to inform the message processor not to use action codes first. 7503 - Fixed problem with secret actions not working (still using old command recognition method). Fixed problem where TOP wouldn't ask for a sex for new users when the BBS is RA 2.0x. I _thought_ that OD would get the sex from the EXITINFO.BBS file, but after taking a look, it doesn't. Fixed problem with Sysop commands not working. Also removed the shorthand form of the Sysop commands. Finally fixed the problem with the toss/zap comment displaying garbage sometimes. 7504 - Added /LOGOFF and /! commands for people to logoff from inside TOP. 7505 - Fixed a few small problems with the language file. 7506 - Added credit display to the TIME command. Added support for credit deduction in top_kernel(). Added cfg.usecredits variable & support. 7510 - Reenabled support for personal actions. TOP will create a "fake" action list as list number 0 and copy the info. from the user file to there on startup. 7511 - Fixed problem with last-list actions not working. Fixed problem with directed messages and whispers not reporting people not logged in. It doesn't work exactly as I want it to (i.e. /fdfhg reports "fdfhg not logged in" instead of "whisper not sent") but it works enough. Fixed serious bug where if the name after a bad action was too long, TOP would crash. Sometime a long time ago I forgot that tmphand[] may not just have to hold normal handles but also failed handle inputs, and thus made it too small. 7512 - Modified PRIVCHAT.C to call a share-aware file delete function (sh_unlink()). Fixed credit kernel to use credits by 1 minute instead of 1 second, which is how RA does it. Implemented possible temporary fix for the reported "whisper-losing-first-character" bug. Added %e (he/she) action token. 7513 - Added the ability for actions to read and show external files from the TOPANSIPath (%p token). Added OUT_EMULATE mode to top_output() to accomodate that and future file-display routines. Fixed stupid stack overflow error that occured when private chat was exitted. The share aware sh_unlink() function was calling itself instead of the regular unlink() to do the actual deletion. Finally fixed the damn midnight clock overwrap bug. I had to kludge in my own myclock() function to manually compensate for the sudden loss of a day's worth of clock ticks that happens at midnight under DOS. Whether this is a DOS or BC++ 3 bug I do not know. 7514 - Fixed careless error. TOP tried to free the action-picture buffer even when it wasn't being used, and the buffer was not initialized to NULL so the dofree() shell had no way of blocking the problem. Also changed all uninitialized pointers to initialize to NULL to prevent the same mistake in the future. Updated copyright dates to say 1996. Got rid of all occurences of actionfil since it's no longer needed with multiple lists. 7515 - Fixed cheap error where directed messages were being sent privately. I'm not being careful with my cutting and pasting. Upgraded some of the profile editor to use the language file, the rest will come. It's crashing right now but I'll fix that after it's all converted. Optimized message-sending to remove some needless code-duplication. 7516 - Converted the rest of the profile editor to use language items. Renamed CFG.TOP to TOP.CFG, NODECFG.TOP to NODES.CFG, and CHANNELS.TOP to CHANNELS.CFG. Fixed potentially serious bug where TOP wasn't allocating space for the personal action list pointer in addition to the rest of the lists. Thanks to Fortify for that one. Also made small change in INIT.C to not try to disable Fortify if the FORTIFY macro is not defined, in preparation for a public release with no debug code. Added @E (Erase Screen) output token. 7520 - Converted every other known instance of hardcoded text to language items, except the CHANGE and SYSOP command screens which need to be converted to help screens. Removed support for the user editor and generic editor module. Maybe in the future I'll put them back. 7530 - Added crude personal channel support. Modified JOIN command to not exit the channel until it is confirmed that the user can enter the new channel. 8000 - Implemented Channel Management Interface (CMI). Channel data is stored in CHANIDX.TCH in the work path, and contains information like the moderator, topic, and who is banned or invited. This is in addition to the information used from the CHANNELS.CFG file. Currently, there is no external difference from how channels used to be. 8010 - Added MODERATOR command and SETTOPIC subcommand. For testing purposes, right now anybody can change any channel's topic. Modified cmi_load() to check if the channel is not deleted before using it. 8100 - Modified cmi_setspec() to handle full and not found cases, as well as fixed it to use the requested node instead of the current one . Modified cmi_adduser() and cmi_subuser() to act on the current buffer channel instead of loading a new one. It makes it easier on me this way. Modified action processor and TOPACT so that "N/A" in the response text field will cause no response to an action to be shown. Changed TOP so that channel 0 is now a generic broadcast channel for sending and receiving messages. All nodes will accept messages on channel 0 no matter which channel the user has joined. Channel 1 is now the lowest (and default) channel. This also solves my dilemma over whether or not to allow users access to channel 0. I thought some may find it confusing since the default channel on most BBS programs is always 1. Now I don't have to worry. Support for SETMOD and Ban/Invite commands added, though they are not yet acknowledged by other nodes. 8500 - Fixed initial problems with CMI loading/saving. Implemented remaining moderator commands on the receiving end. Added support for DefaultChannel keyword. Optimized some areas that displayed channel names to use a function I had written originally for this purpose in CHANNELS.C but forgot about. Joining (by command or force) a new channel now shows a summary of that channel upon entering. Changed the channelname() function so it takes a channel number instead of a channel definition, so it can be used with all functions. 8501 - Added moderatorship check before doing a moderator command. Node deregistering now scans and removes the node from any specnode[] field from all channels. Fixed slight cosmetic bug with the channel name when joining. When a user is "evicted" from their current channel a MSG_INCHANNEL message will now be sent to the new channel. Sysops now are exempted from channel and moderator restrictions. Users are now "evicted" from a personal channel if the user it belongs to exits TOP. Inadvertantly found and fixed places where I totally forgot to write the user's security to the node index. Optimized check_dupe_handles() to only read in the 31 handle bytes and not the entire user record, which cuts the search time to 1/3 of the time needed before. Need to do the same to the user search code at the start of TOP later. 8502 - Fixed silly problem with SBBS support. I had reordered and renamed the BBS constants and forgot they were duplicated in TOP.H. Because the SBBS constant was reordered in one place and not in the other, SBBS support wouldn't work. The BBS constants are no longer duplicated in TOP.H. 8503 - Corrected a few cosmetic bugs directly related to commands. Added cheap fix code to restore the amount of credits after exiting so RA doesn't deduct them again causing a double loss of credits. 8504 - Made slight change to nodeinfo time saving to try to prevent crash protection failing. Doubt it will work though. Added support for configured unlisted channels in the WHO command. Added ability to turn actions off and back on. 8600 - Added ability to define custom commands that shell out to programs. This is done via the new SPAWN.CFG file. No external command list is displayed yet, though. 8601 - TOP now looks for the NODES.CFG file in the same directory as TOP.EXE. Added checking for pages inside private chat. Temporarily disabled spawning while some work is done to it. 8602 - Removed ability to perform some commands (FORGET, REMEMBER, CHAT) on yourself. Added checking to see if a user is on your channel for some commands (WHISPER, DIRECT, actions). Fixed slight problem with TOP reporting no name when something is done to a user that has forgot you. 8700 - Finalized configuration options. Implemented support for all remaining configuration options. Removed support for those options which are not being used in the first release. Fixed TOP so it properly uses the TASK environment variable. 8701 - May have fixed the problem with crash protection. I appeared to be subtracting the current time from the old time, instead of vice versa. Fixed problem with profile editor not showing pref2 settings correctly (pref1 was being tested instead). 8800 - Added Private Chat task support. Added chat disable during tasks by using channel 0xFFFFFFFF as a "busy" channel. Removed most debug code (except Fortify and the wdl, which will remain for the gamma versions), recompiled with more optimizations. Added MSG_FORCERESCAN type and support. 8801 - Added extra logging. Added support for the LogFile field of the node configuration. Added global msgminsec and msgmaxsec variables for future use. 8900 - Implemented the show_helpfile() function to simplify help file displays throughout TOP. Implemented support for help on all commands, including multi-word commands, as well as non-command topics. Added ability for sysops to join channel 0 to make global announcements. 8901 - Fixed several problems in Private Chat which were introduced in recent modifications. One was the exitting was not being detected properly, thus stranding nodes sometimes. Also, an accidentally inserted send of a MSG_INEDITOR message caused the pcnode variable to be reset to -1, which prevented proper operation. Damn my cutting and pasting! Also fixed private chat's CPU hogging. There is still a slight problem if a user exits Private Chat before the other user is ready, because each node deletes the EPR* files before entering chat. Right now, I will take this problem over the one caused by potential "loose" EPR* files, because a) it is less serious than a loose EPR* file, and b) it is less likely to occur. 8902 - Fixed problems with cmi_busy(). I tried to cut corners and paid for it. The curchannel variable wasn't being set which was one problem. Also, the messages needed to be processed while the channel was still 0xFFFFFFFF so the node wouldn't think it was back in the channel and display them. Optimized the mused variable with the lastmsgused variable, all in process_messages(). This means TOP no longer requires special conditions about whether or not to display the message prefix - it can determine this on its own. Fixed long-time cosmetic bug in Dual Window mode. Extra CR/LFs were sometimes being shown. Fixing this bug involved overhauling a lot of the language file as well as globalizing the onflag variable. Probably too much work for a simple non-destructive cosmetic bug, but at least it looks nice now. 9000 - Implemented new registration system for OS/2 and updated DOS registration to use new key and reg. type. Fixed some flaws in the language file usage. Fixed problems resulting from command channel-checking. Redid check_nodes_used() so it also checks the handles, which does away with the load_online_handles() function. This was also necessary for nodes to catch other nodes who did not join TOP in their channel. activenodes[] now converts all users not in the current channel to the value 2 for easy testing. msgglobaldata variable added to make global sending of messages easier. Some messages that needed to be globalized (FORGET, REMEMBER, etc.) now are sent globally. MSG_FORCERESCAN is no longer used at this time though support for it will stay in in case I need it later. Disabled ability to do ban/inviting commands to self. Fixed globalness of sysop commands. Fixed problem with cmi_unbusy() not properly rejoining the channel. Fixed cross-channel chatting. Fixed profile editor message sending. Fixed SYSOP SETSEC command. Fixed short credit screen. Fixed cfg.actionusesec usage with actions themselves. Changed TOP to test user.security instead of od_control.user_security. Fixed CHANNELS.CFG and .TAC loaders to use the TOPPath setting. Fixed stupid passing of NULL on some messages, which TOP/2 didn't like. Added NoRegName keyword and support. Fixed problem with displayed "vanished" nodes. Released as TOP v2.00g1. Version 2.00 9001 - Recompiled TOP/DOS with OD 6.00. Changed giveup_slice() calls to od_sleep(0) calls. Changed BBS code to use the new bbs_call_pageedit function hook. Moved page editor to the ra_longpageditor() function, which now also uses the new od_multiline_edit() function introduced in OD 6.00. It still needs to use the od_fsedit() call from Doors/2, though. The max_shortpageeditor() also needs to be added. Added modifications to compile with OD for Win95 and BC++ 4.52 and released a limited beta version to see if it works. 9002 - Fixed a spot in the new user procedure where TOP used AllowNewHandles instead of AllowHandles. Added support in the node config for OD 6.00's new RTS/CTS support. 9100 - Added basic Censor and required CENSOR.CFG loading information. It still needs to be able to distinguish whole words or parts of words. 9110 - Added ability for sysops to pick the default new user preferences to suit their own language file and system. This is done by the DefaultPrefs keyword. 9111 - Fixed compilation error in the Win95 version. I had Dynamic runtime library linkage turned on, which meant the users needed a .DLL that I didn't include. However, it was found to crash so more work will need to be done. A000 - Implemented the long-awaited Biography feature, including configurable questions file, editor, and "fill out all" mode. The editor is entered using the BIO command. Changed LOOKUP command to call up a user's Biography instead of the cheap summary from before. Created find_user_from_name() function to get a user's record num and data from a name. Modified startup code to use this function, which will speed up the initial name search a bit as the new function only reads the name and handle during searching. A100 - Added Maximus/2 MCP support at last. Unfortunately, Max/2 doesn't make this easy. It does not disconnect its own pipe, leaving double nodes on the who's on list, and causing all pages to be sent to nodes twice. There is no correction for this at this time. The module BBSMAXMC, which contains this support, compiles only in the OS/2 version of TOP. Added the max_shortpageeditor() function for one-line pages. Moved MECCA string display code to its own function. A110 - Corrected small bugs with MCP support. Added ActionPrefix keyword to allow periods or other characters or words to prefix action commands (eg. ".yawn"). A111 - Changed from using atexit() to od_control.od_before_exit, since the former wasn't working under OS/2. Put in a printf() so this can be confirmed during testing; this will need to be removed later. Reenabled the ability to process & tokens, which also required the creation of an argnum variable to store the argument number instead of getting in dynamically each time - probably what I should have done in the first place. I am not convinced that the & processing is stable with regard to the process flags remaining FALSE for subsequent outputs, but it seems to work fine so I'll leave it as it is for now. A112 - Added a language item to display if a user is typing text and gets interrupted by an incoming message. Unfortunately, the detection for this situation isn't working so it will need to be fixed later. Also discovered that the censor replacement text doesn't work if the text isn't the same length as the offending text. This may have been done by design (I forget), but it needs to be changed in future. A120 - Added the USERLIST command. A121 - Removed some remaining Press Any Key prompts (hopefully all of them, but we'll see). A122 - Got rid of few (unimportant) instances of regular int variables being used instead of XINT. There are a few more, but these require header changes which I'm not willing to do just yet. MCP support now won't poll node 0, which Max/2 does not use. The last MCP message is now saved and the next incoming message is compared to it, in an attempt to circumvent Max/2's double-paging (described above). A match also removes the last message, so if a user sends the same message twice it won't be ignored. Fixed a problem where the MCP msgbuf isn't freed after it's used, and though that's not a big problem under OS/2 with only small amounts of memory in question, it's still obviously not a wanted effect. A123 - Fixed a bug in the bio editor that was using the question number instead of the record number when saving responses. Fixed a very stupid oversight where I forgot to add CMI support when joining Conferences, which made them totally unpredictable. This should fix a reported problem where the security wasn't being checked as well. Fixed problems with channels being wrongly displayed as Unlisted under OS/2, and to a lesser extent under DOS. A124 - Temporarily disabled the profanity censor as it is causing problems. A125 - Fixed the profanity censor by telling it not to try to censor words that are longer than the remainder of the string to be checked. Also fixed the censor so it will now properly use replacement words that are not the same length as the one being censored. I was using the wrong string length here. A126 - Removed references to the user description, as the Bio makes that obsolete. Changed fixname(), trim_string(), and filter_string() to check for 0 length strings and ignore them. Added message processing for the MSG_INBIOEDITOR and MSG_OUTBIOEDITOR types, which was omitted when the Bio Editor was added. A127 - Replaced a key line of code (the call to find_max_score()) that accidentally got deleted in the last version. Gotta be more careful with that Ctrl-Y key I guess. A128 - Removed all references to the description field completely. Added the sendtimemsgs() function which uses the od_control.od_time_msg_func hook to trap "time left" or "inactivity" messages and echo them to the user as proper MSG_GENERIC messages. The blocktimemsgs global variable has also been added, which is set to TRUE while TOP is processing messages, thus preventing the sendtimemsgs() function from causing sharing errors. If a time message is received while this variable is TRUE, TOP will just use od_printf() to inform the user. This may be enhanced in the future so it does not interfere with displays that may be on the screen. Removed the printf() that displays when TOP has exited abruptly. Added a process_messages() call to before_exit(), which is needed so "sorry, time is up" messages can be seen. I thought I put this in long ago, but either I didn't, or it was causing problems so I took it out. A200 - Rewrote the name parser function (find_node_from_name()). It now looks for exact matches first, then looks for partial matches. It uses much less memory and should also be faster! The find_max_score() function is also no longer used, as name scoring is done inside the main function on a "save high score only" basis. A201 - Fixed a stupid mistake with the new processor. I was copying the data for newstring to the handle string by accident. A202 - Added a temporary fix for %P tokens in personal actions. It may become permanent depending on how the attempt to fix the crashing related to unfound %P files goes. A203 - Fixed where I foolishly forgot to make the above fix work for just personal actions. Added the FixNames configuration keyword to control whether or not the fixname() function does anything. A250 - Fixed a problem where TOP was letting Max/2 MCP pages and other messages get through, which making a mess of the prompt line. I had forgotten to make TOP check to make sure the messages were of CMSG_HEY_DUDE type. Added the ForceBio option which forces users to fill out their biographies before they can chat. The Bio editor now sends out MSG_BIOCHG whenever users change anything in their biographies. Fixed a minor bug where I didn't put the user in "busy channel" mode while they're in the bio editor. Also changed TOP to use constants relating to the busy and maximum channel numbers. Added FORCEOFF setting to FixNames keyword so TOP will auto-correct the capitalization of existing users' handles or names. Added a TOP icon and more information for the About window in TOP/95. Corrected a small mistake in checking for failed Bio string questions under the minimum length requested. Changed all remaining instances of int to XINT, except of course where int is needed (eg. WinMain() in TOP/95). Fixed a non-initialized variable in the new name parser which was causing TOP/2 to exit with a TRAP 5. A251 - Revised some of the errorlevels to make more logical sense, and to get rid of the conditions with unassigned errorlevels that were just using 44. Moved the error message and log message for a sharing violation error (in the openfile() function) to the language file. Obviously I had thought it wasn't necessary to do so, but I want to be complete so it's there now. A260 - Removed support for the FixNames keyword. Unfortunately, OpenDoors and Doors/2 have an auto-capitalizer for names as well, and until I have the time to work around this, FixNames won't work. In order to preserve the use of the .DLL files for the OS/2 and Win95 versions, I can't just change the door kits and recompile, so something else will have to be figured out. Made %m mandatory in personal action singular & plural text to prevent "fake" messages from users. Wrote the 2G1TO200 upgrade program which will enforce the same requirements on existing personal actions. Changed Max/2 MCP support so the BBSIPCPath can now be set to the pipe defined for Maximus. Corrected two small bugs in Maximus support. One was with MCP support where the header wasn't being properly added to messages, and the other was with regular support where not a large enough buffer was being used to hold the MaxPageHeader language item. REALLY fixed the TOP/2 unlisted channels bug. I'd made a silly typo that stopped it from working. Fixed the detection for when a user is typing and is interrupted by a message so that the language item (*** or whatever) will now display properly. A270 - Extended censor coverage to all input strings in TOP, except for strings >= 512 bytes written with the long page editor, which are too big for the censor to handle right now. Corrected a small mistake on my part in the long page editor. I was using the FS language strings for the regular page editor and regular strings for the FS editor. Fixed a cosmetic bug where a CR/LF would be sent if you were typing and somebody you've forgotten sent a message to you. Fixed where *** was being sent to people even with Block Msgs While Typing turned on. Fixed the very long standing "rogue MECCA code" problem with Maximus pages (damn typos!). A280 - Finally enhanced the find_node_from_name() function to take the entire last word as part of the handle, not just the significant letters. This means that if two people with similar handles are in TOP and one person leaves while another person is whispering to him/her, TOP will say that it can't find the handle, rather than sending the message to the other person because the first letters matched. Also changed the same function to only copy the first word or 30 characters of what the user typed, whatever is less. This means if a user does an invalid whisper, the user won't get the entire message dumped back at him/her. A281 - Implemented "whole word" feature of the censor. Fixed a crash with the Bio editor using the censor. I wasn't giving the response string a big enough buffer. I should really change that 256-byte minimum on the censor buffer, though. Changed the 511 byte limit on long page censoring to 255, for the same reason. Fixed the BIO command so it only works if it's the only word typed, like the other commands. Fixed a problem with multi-word handles and the new name processor. Fixed another problem with the name processor logic that stopped the not-specific-enough detection from working with any command where the handle doesn't end the string. Fixed a third name processor problem with the returning of invalid/unspecific handles. Only showing the first word wasn't enough if the error was in the second or later words, so this has been removed (though the 30 character limit is still in place). A300 - Implemented SHARE detection in TOP/DOS. Fixed problems with Dual Window chat mode. Finally fixed the problem with & tokens and talktypes. They still won't work but internal modifications have been made so that language token processing is turned off after the talktypetextstart length has been processed. Fixed a small problem with the wrong handle being used in invite/ban notifications. Finally added single-line paging (eg. /P 4 Hey there!"). Fixed problems with the page function return values that were causing the page confirm/error messages to not be sent properly. Censor enhanced to ignore colour codes in the middle of words. Released as v2.00. Version 2.01 A301 - Restarted development after a year off. Demand is becoming significant for me to get something done. It was probably always there but I was both unwilling and unable to seek it out, until now. Now that I have a new HD I can keep TOP "in easy reach" to work on it as well. More important, I enjoy working on TOP and wish to resume at least minor development. Fixed the bug that prevented the Win95 version from working. I had forgotten to exclude the clock_tick timeslicing macro from Win95 compilation, and Win95 didn't like it. TOP/DOS is now compiled using BC 4.52 instead of 3.0. Now that I'm running Win95 and always have access to the Windows IDE that 4.52 uses, there's little point in my keeping BC 3.0 installed. Also, thanks to system upgrades, TOP can now be fully compiled in under a minute. It used to take at least five. A310 - Fixed the bug that prevented high ASCII from working. Apparently BC doesn't like ?: tests inside parentheses. Updated copyright dates to say 1997. ASCII 127 (delete) is now interpreted as a backspace. It was previously treated as displayable, but this is not always the case on some terminals. The CHANGE command now issues MSG_SEXCHG and MSG_EXMSGCHG messages when the appropriate commands are entered. Removed the trim_string() calls that change the real name and handles passed from the drop file. Apparently they are a security risk. Directed messages now echo if the user has text echoing turned on. Fixed slight logic error that allowed backspaces even with no text typed. A311 - Commented the source code in preparation for making it available. The buffer that holds action output has been expanded to hold 1000 extra bytes. If too many tokens were used in personal actions it was possible to crash TOP. The extra bytes should solve this problem for personal actions and normal actions. The only possible way it could still occur is if a sysop goes nuts with tokens in a pictorial action. Fixed a small bug where the XMsgPrefix wasn't being used (again due to cutting and pasting). Updated copyright dates to say 1998. Fixed small bug where the OpenDoors security was not being updated to the actual security in local/LAN mode, which occurred due to careless searching and replacing. A320 - Started fixing bugs found while making comments. Got rid of an old RAPColour code compensator in the trim_string() function. Fixed where the censor was using the number of non-comment lines in CENSOR.CFG, which made the count too high and wasted memory. It now divides the number of counted lines by 3, the number of lines per definition. The channel summary now stops as soon as it finds another user in the channel, instead of continuing to count the users. The count is no longer used so aborting saves time. Fixed another problem in the name processor with multi-word handles. Now specifying one full word of a multi-word handle will work properly with things like secret actions. TOP should (hopefully) now get the user's DND status from the BBS useron file and save it in the NODEIDX. There's no way for me to test this, unfortunately. RA credit support enhanced slightly. Now a negative number _will_ cause TOP to deduct the credits, while a positive number will not (the old behaviour). I've had old reports saying RA won't deduct while my original tester said it would, so now TOP supports both ways. Maybe it's a RA 2.00/2.50 thing. A321 - Found and fixed a memory leak in the Profile Editor that has been around for quite a while, probably since multiple action lists were added. Thanks to Fortify once again! I forgot to add one byte for the terminating \0 when reallocating the action pointers in the personal action editor. Personally I have not had this bug cause a problem but I had a report of an infrequent TRAP on an OS/2 test system, and I suspect it was because of this leak.